-
Notifications
You must be signed in to change notification settings - Fork 0
/
linux-capabilities-api.html
227 lines (199 loc) · 19.7 KB
/
linux-capabilities-api.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="utf-8">
<title> Linux Capabilities API
</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="0x656e" />
<meta name="description" content="Selamlar, Günlük olarak RSS feedlerimi takip etmeye özen gösteren birisiyim(Feedly). Bu feedler arasında bolca HTB(HackTheBox) write-up kaynağı da bulunuyor doğal olarak. İşte yine bir HTB makinesi ile ilgili write-up'ı okurken bunca yıldır Linux(End-User olarak) kullanan biri olarak karşılaşmadığım ve karşılaştığımda şaşırdığım bir komut gördüm. Neydi bu komut …" />
<meta name="keywords" content="Capabilities API Türkçe, Linux Yetkilendirme, SUID Bit İstismarı, Linux Yetki Yükseltme, Capabilities Nedir, Linux Capabilities Nedir, Linux Yetkilendirme Sistemleri">
<meta property="article:tag" content="Capabilities API Türkçe" />
<meta property="article:tag" content="Linux Yetkilendirme" />
<meta property="article:tag" content="SUID Bit İstismarı" />
<meta property="article:tag" content="Linux Yetki Yükseltme" />
<meta property="article:tag" content="Capabilities Nedir" />
<meta property="article:tag" content="Linux Capabilities Nedir" />
<meta property="article:tag" content="Linux Yetkilendirme Sistemleri" />
<link rel="canonical" href="https://enesergun.net/linux-capabilities-api.html"/>
<meta name="description" content=""/>
<!-- og definitions -->
<meta property="og:type" content="article" />
<meta property="og:url" content="https://enesergun.net/linux-capabilities-api.html" />
<meta property="og:title" content="Linux Capabilities API" />
<meta property="og:description" content="Selamlar, Günlük olarak RSS feedlerimi takip etmeye özen gösteren birisiyim(Feedly). Bu feedler arasında bolca HTB(HackTheBox) write-up kaynağı da bulunuyor doğal olarak. İşte yine bir HTB..." />
<meta property="og:image" content="https://w0.peakpx.com/wallpaper/212/918/HD-wallpaper-virtual-world-sunset-80s-landscape-retro-theme-tron.jpg" />
<link rel="stylesheet" href="theme/style.css">
<link href="https://enesergun.net/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Enes Ergün Atom Feed" />
</head>
<body>
<div class="container">
<header class="blog-header">
<h1><a href="https://enesergun.net" class="glitch glow" data-text="Enes Ergün">Enes Ergün</a></h1>
<p> Chaotic Neutral / ISTP-T - 30 lvl rogue - Cyber Security </p>
<nav>
<a href="https://enesergun.net/">INDEX</a>
<a href="https://enesergun.net/archives">ARCHIVES</a>
<a href="https://enesergun.net/categories">CATEGORIES</a>
</nav>
</header>
<div class="post">
<header>
<h1>Linux Capabilities API</h1>
<p class="date">Written on <time datetime="2020-02-02T14:00:00+03:00">Feb 02, 2020</time></p>
</header>
<article>
<p>Selamlar,</p>
<p>Günlük olarak RSS feedlerimi takip etmeye özen gösteren birisiyim(Feedly). Bu feedler arasında bolca HTB(HackTheBox) write-up kaynağı da bulunuyor doğal olarak. İşte yine bir HTB makinesi ile ilgili write-up'ı okurken bunca yıldır Linux(End-User olarak) kullanan biri olarak karşılaşmadığım ve karşılaştığımda şaşırdığım bir komut gördüm. Neydi bu komut?</p>
<div class="highlight"><pre><span></span><code>getcap -r / <span class="m">2</span>>/dev/null
</code></pre></div>
<p>Komutu anlatmak gerekirse recursive bir biçimde <code>/</code> yani en üst dizinden başlayarak tüm dosyaların kabiliyetlerini kontrol edecek ve eğer return code olarak <code>2</code> kodu dönülüyorsa bunu <code>/dev/null</code> uzayına gönderecek.</p>
<h2>Linux Yetkilendirme Sistemleri</h2>
<p>Bu zamana kadar genelde dosya yetkilerini kontrol ederken, sadece sembolik olan yetkilendirme sistemini kontrol ederdim. Bu sembolik yetkilendirme sistemi nedir derseniz, kendisi <code>chmod, chown</code> komutları ile birlikte kullandığınız <code>octal</code> numerik olarak belirtilen(sembolik) dosya yetkilendirme sistemidir.</p>
<p>Eğer bu konu hakkında bilgi sahibi değilseniz aşağıda vermiş olduğum kaynağı, kaynağın tümünü tüketebilirsiniz. Çok güzel bir kaynaktır.</p>
<p><a href="https://demirten.gitbooks.io/linux-sistem-programlama/content/users/">Linux Sistem Programlama</a></p>
<h2>Peki Enes Bunlar Ne İşe Yarayacak</h2>
<p>Öncelikle bir hacker olduğunuzu düşünün, bir linux sistemi ele geçirdiniz fakat o da ne? Sistem üzerinde Nginx'in tüm işlemleri özel bir kullanıcı ile yürütülüyor ve siz bu sistemde at koşturamıyorsunuz. Ne yapmamız gerek? Sistem üzerinde yetkimizi yükseltebileceğimiz bir şeyler aramamız gerekmekte.</p>
<p>Ne yapabiliriz? Mesela SUID Bit içeren dosyaları arayabiliriz.</p>
<div class="highlight"><pre><span></span><code>find / -perm -4000 -type f <span class="m">2</span>>/dev/null
</code></pre></div>
<p>Tamam bir executable dosya bulduk ama bunu nasıl kullanacağımızı bilmiyoruz? İster Google üzerinde aratın ya da bu iş için çok güzel bir site hazırlamışlar ona bakabilirsiniz.</p>
<p><a href="https://gtfobins.github.io/">GTFOBins</a> (Linux)</p>
<p><a href="https://lolbas-project.github.io/#">LOLBAS</a> (Windows)</p>
<p>vs.vs bir sürü senaryo üretilebilir fakat hiç dosya kapasiteleri(capabilities) aklınıza gelmiş miydi? Benim şahsen böyle bir şey olduğundan bile haberim yoktu. Zaten bu yüzden bu blog yazısının konusu bu.</p>
<h2>Capabilities API'a Neden İhtiyaç Var</h2>
<p>Eski kernel sürümlerinde Linux üzerinde yetkilendirme sistemi bu kadar gelişmiş değildi ve bazı kısıtlamalar yüzünden siber güvenlik açısından büyük riskler barındıran işlemler gerçekleştiriliyordu. </p>
<p>Örnek: Linux üzerinde Port olarak 1024'ün altında bir portta socket açacaksanız <code>root</code> kullanıcısı olmak zorundasınız. Peki sunucunuza Nginx kurdunuz ve web servisi yayınlayacaksınız. Bunu <code>root</code> kullanıcısı olarak kurup çalıştırdığınızda geçmiş olsun. </p>
<p>Örnek1: 1024 altında port açmak için <code>root</code> kullanıcısına ihtiyacınız var demiştik. Peki günlük olarak troubleshooting için kullandığımız <code>ping</code> komutu? Ping bildiğiniz üzere port kullanan bir yapıda değil ki zaten farklı bir protokol. Bknz: ICMP. Ping atabilmek için raw_socket açmak zorundasınız ve bu sadece <code>root</code> kullanıcısına özgü bir yetki. Takılıp kaldık mı? Hayır.</p>
<p>Bu arada ICMP temelli çalışan fakat işletim sistemine göre değişen <code>traceroute</code> ile ilgili aşağıya güzel bir link iliştiriyorum.</p>
<p><a href="https://medium.com/@gokhansengun/ping-ve-traceroute-nas%C4%B1l-%C3%A7al%C4%B1%C5%9F%C4%B1r-146e151ff83b">ping ve traceroute nasıl çalışır</a></p>
<p>Neyse devam. İşte bu kısımda takılıp kalmıyoruz SUID Bit devreye giriyor. Bu da ayrı bir yazı konusu aslında o yüzden direkt olarak size konu ile ilgili link vereceğim.</p>
<p><a href="https://www.syslogs.org/suid-ve-sgid-bitler-ve-bu-bitlere-sahip-dosyalarin-bulunmasi/">SUID ve SGID Bit</a></p>
<p>Tamam bunu okuduk ama diğer taraftan aşağıdakini de okumakta fayda var.</p>
<p><a href="https://canyoupwn.me/tr-suid-bit-istismari/">SUID Bit İstismarı</a></p>
<p>Evet zararlı kısmını da gösterdik. Şimdi konu gerçekten Capabilities API'a geldi. Şu an kullandığınız distroda ping komutunun nasıl çalıştığına(yetkisiz kullanıcı ile) baktınız mı hiç?</p>
<p>Hadi yetkilerine bakalım. Direkt olarak komutları ve çıktılarını aşağıya kopyalıyorum. Sonra üstünde konuşacağız.</p>
<div class="highlight"><pre><span></span><code>➜ /bin ls -la <span class="p">|</span> grep ping
-rwxr-xr-x <span class="m">1</span> root root <span class="m">75760</span> Jan <span class="m">5</span> <span class="m">2019</span> atk6-thcping6
-rwxr-xr-x <span class="m">1</span> root root <span class="m">48032</span> Aug <span class="m">7</span> <span class="m">02</span>:48 fping
lrwxrwxrwx <span class="m">1</span> root root <span class="m">5</span> Jan <span class="m">4</span> <span class="m">18</span>:47 fping6 -> fping
-rwxr-xr-x <span class="m">1</span> root root <span class="m">106344</span> Jul <span class="m">14</span> <span class="m">2019</span> l2ping
-rwxr-xr-x <span class="m">1</span> root root <span class="m">43248</span> Oct <span class="m">23</span> <span class="m">15</span>:53 mate-typing-monitor
-rwxr-xr-x <span class="m">1</span> root root <span class="m">752656</span> Nov <span class="m">26</span> <span class="m">12</span>:21 nping
-rwxr-xr-x <span class="m">1</span> root root <span class="m">73496</span> Oct <span class="m">5</span> <span class="m">17</span>:34 ping
lrwxrwxrwx <span class="m">1</span> root root <span class="m">4</span> Oct <span class="m">5</span> <span class="m">17</span>:34 ping4 -> ping
lrwxrwxrwx <span class="m">1</span> root root <span class="m">4</span> Oct <span class="m">5</span> <span class="m">17</span>:34 ping6 -> ping
-rwxr-xr-x <span class="m">1</span> root root <span class="m">6773</span> May <span class="m">21</span> <span class="m">2019</span> wifiping
➜ /bin id
<span class="nv">uid</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>ka1<span class="o">)</span> <span class="nv">gid</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>ka1<span class="o">)</span> <span class="nv">groups</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>ka1<span class="o">)</span>,20<span class="o">(</span>dialout<span class="o">)</span>,24<span class="o">(</span>cdrom<span class="o">)</span>,25<span class="o">(</span>floppy<span class="o">)</span>,27<span class="o">(</span>sudo<span class="o">)</span>,29<span class="o">(</span>audio<span class="o">)</span>,30<span class="o">(</span>dip<span class="o">)</span>,44<span class="o">(</span>video<span class="o">)</span>,46<span class="o">(</span>plugdev<span class="o">)</span>,109<span class="o">(</span>netdev<span class="o">)</span>,119<span class="o">(</span>debian-tor<span class="o">)</span>,126<span class="o">(</span>bluetooth<span class="o">)</span>,136<span class="o">(</span>scanner<span class="o">)</span>,998<span class="o">(</span>docker<span class="o">)</span>
➜ /bin ping <span class="m">8</span>.8.8.8
PING <span class="m">8</span>.8.8.8 <span class="o">(</span><span class="m">8</span>.8.8.8<span class="o">)</span> <span class="m">56</span><span class="o">(</span><span class="m">84</span><span class="o">)</span> bytes of data.
<span class="m">64</span> bytes from <span class="m">8</span>.8.8.8: <span class="nv">icmp_seq</span><span class="o">=</span><span class="m">1</span> <span class="nv">ttl</span><span class="o">=</span><span class="m">54</span> <span class="nv">time</span><span class="o">=</span><span class="m">15</span>.4 ms
</code></pre></div>
<p>Gördüğünüz gibi ping komutu <code>root:root</code> olarak yetkilendirilmiş bir biçimde üstelik herhangi bir <code>SUID Bit vb.</code> bir şey de yok fakat ben nasıl çalıştırabiliyorum?</p>
<p>Yine terminal çıktısı atayım.</p>
<p><code>bash
➜ /bin sudo getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
➜ /bin</code></p>
<p>Gördüğünüz gibi <code>ping</code> çalıştırılabilir dosyasında bir kapasite sınırı sonunda + olarak belirtilmiş bir yetkilendirme biçimi var.</p>
<p><strong>Not:</strong> Ping komutunun artık kullanıcı tarafında çalıştırılabilmesi için herhangi bir izne ihtiyacı yok. Sebebi ping socketinin direkt olarak kernela eklenmesi.(Ben öyle anladım?)</p>
<p>Kaynak: <a href="https://github.com/torvalds/linux/commit/c319b4d76b9e583a5d88d6bf190e079c4e43213d"> net: ipv4: add IPPROTO_ICMP socket kind </a></p>
<h2>Capabilities API</h2>
<p>Öncelik olarak Kernel sürümümüze özel olarak sistem üzerinde ne kadar farklı yetkilendirme yapabileceğimize bakalım. (Tüm Capabilities Yetkilerine)</p>
<div class="highlight"><pre><span></span><code>➜ ~ sudo capsh --print
Current: <span class="o">=</span> cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read+ep
Bounding <span class="nb">set</span> <span class="o">=</span>cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
Ambient <span class="nb">set</span> <span class="o">=</span>
Securebits: <span class="m">00</span>/0x0/1<span class="err">'</span>b0
secure-noroot: no <span class="o">(</span>unlocked<span class="o">)</span>
secure-no-suid-fixup: no <span class="o">(</span>unlocked<span class="o">)</span>
secure-keep-caps: no <span class="o">(</span>unlocked<span class="o">)</span>
secure-no-ambient-raise: no <span class="o">(</span>unlocked<span class="o">)</span>
<span class="nv">uid</span><span class="o">=</span><span class="m">0</span><span class="o">(</span>root<span class="o">)</span>
<span class="nv">gid</span><span class="o">=</span><span class="m">0</span><span class="o">(</span>root<span class="o">)</span>
<span class="nv">groups</span><span class="o">=</span><span class="m">0</span><span class="o">(</span>root<span class="o">)</span>
</code></pre></div>
<p>Gördüğünüz gibi yetkileri görmek için <code>capsh --print</code> komutunu kullanabilirsiniz. Daha detaylı bir kullanım için: </p>
<p><a href="http://man7.org/linux/man-pages/man1/capsh.1.html">Capsh manpages</a></p>
<p>Bir dosyaya ait kapasiteyi öğrenmek için de</p>
<p><code>sudo getcap dosya</code> komutunu kullanabilirsiniz. </p>
<p>Ping komutuna getcap ile baktığımızda yetkilendirme sonrasında +ep olarak bir şey görmüştük peki bu ifadeler neydi diye görmek isterseniz aşağıdaki tabloya bakabilirsiniz. </p>
<p><strong>Not:</strong> Direkt olarak <a href="https://demirten.gitbooks.io/linux-sistem-programlama/content/capabilities/">buradan</a> kopyalanmıştır.</p>
<table>
<thead>
<tr>
<th align="center">Capability</th>
<th align="left">Açıklama</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>permitted</strong></td>
<td align="left">Bu kümede ilgili process'in izin verilen ek capability listesi bulunur. İzin verilmesi o an aktif olarak kullanılabileceği anlamına gelmeyebilir, ek bir işlemle buradaki yetkilerin etkin (effective) capability kümesine dahil edilmesi mümkündür.</td>
</tr>
<tr>
<td align="center"><strong>effective</strong></td>
<td align="left">İlgili process'in o anki etkin capability listesini gösterir. Capability sistemini düzenleyen yardımcı fonksiyonlarla bir capability'den vazgeçilebileceği gibi tekrar geri de alınabilir. Ancak her durumda bu işlem sadece <em>permitted</em> grubunda zaten izin verilmiş olanlar arasından yapılabilir.</td>
</tr>
<tr>
<td align="center"><strong>inheritable</strong></td>
<td align="left">Process tarafından yeni bir process çalıştırıldığında, yeni çalıştırılan process'in <em>permitted</em> listesine miras yoluyla aktarılacak capability listesini gösterir.</td>
</tr>
</tbody>
</table>
<p><code>capsh</code> ile gördüğümüz bir sürü yetkilendirme ne işe yarıyor peki derseniz onunla ilgili de aşağıdaki sayfayı kullanabilirsiniz.</p>
<p><a href="http://man7.org/linux/man-pages/man7/capabilities.7.html">Capabilities man pages</a></p>
<h2>Bitiş</h2>
<p>Bu yazıda amacım derin bir biçimde <code>Capabilities API</code> ı incelemek değildi bu sebeple ilgili yazıyı yetersiz bulmuş olabilirsiniz. Amacım tamamen bakın böyle bir şey de varmış. Şuraya, buraya bakabilirsiniz veya hacklediğiniz bir sistemde bakabileceğiniz bir kapı daha açabilmektedir. Yorumlarınızı site üzerinden (Disqus) veya Twitter üzerinden <a href="https://twitter.com/0x656e">0x656e</a> yapabilirsiniz. Olumlu olumsuz benim için farketmez.</p>
<p>Yazı sonuna geldik. Evet bu yazının hazırlanmasında okuduğum, kullandığım linkleri aşağıda referanslar olarak görebilirsiniz. Bir klasik olarak yazı sonu şarkı paylaşımlarıma da aşağıdan ulaşabilirsiniz.</p>
<p><a href="http://www.youtube.com/watch?v=DdcusOXh_f8" title=""><img alt="" src="http://img.youtube.com/vi/DdcusOXh_f8/0.jpg"></a></p>
<p><a href="http://www.youtube.com/watch?v=iIwNthexyNM" title=""><img alt="" src="http://img.youtube.com/vi/iIwNthexyNM/0.jpg"></a></p>
<hr>
<p>Referanslar:</p>
<p><a href="https://linux-audit.com/linux-capabilities-101/">Linux Capabilities 101</a></p>
<p><a href="https://demirten.gitbooks.io/linux-sistem-programlama/content/capabilities/">Linux Sistem Programlama Capabilities</a></p>
<p><a href="https://0xrick.github.io/hack-the-box/waldo/">HTB Waldo Writeup</a></p>
</article>
<footer>
<p>This entry is posted in <a href="https://enesergun.net/category/linux.html">linux</a>.</p>
</footer>
<div class="comments">
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = '0x656e';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
</div>
<footer class="blog-footer">
<ul class="nav">
<li><a href="https://devilinside.me/"> Eşelyon</a></li>
<li><a href="https://medium.com/@brkalbyrk"> Berk Albayrak</a></li>
<li><a href="https://ahmtglr.wordpress.com/"> Ahmet Güler</a></li>
<li><a href="https://kaganisildak.com/"> Kağan Işıldak</a></li>
<li><a href="https://eybisi.run/"> Eybisi</a></li>
<li><a href="https://onur.im/"> Onur Aslan</a></li>
<li><a href="https://canyoupwn.me/"> Canyoupwn.me</a></li>
<li><a href="https://www.oguzozkeroglu.com"> Oğuz Özkeroğlu</a></li>
<li><a href="https://aligoren.com"> Ali Gören</a></li>
<li><a href="https://0xf61.gitlab.io/"> Emir Kurt</a></li>
<br>
<li><a href="www.twitter.com/eness_ergun">Twitter</a></li>
<li><a href="[email protected]">Mail</a></li>
</ul>
<p class="disclaimer">
Built with <a href="http://getpelican.com">Pelican</a>, and <a href="https://github.com/ka1nsha/MBPelican">MB Pelican</a> theme.
</p>
</footer>
</div>
</body>
</html>