LFI2RCE via Eternal waiting

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

Podrazumevano, kada se datoteka otpremi u PHP (čak i ako se ne očekuje), generisaće se privremena datoteka u /tmp sa imenom poput php[a-zA-Z0-9]{6}, iako sam video neke Docker slike gde generisane datoteke ne sadrže cifre.

U slučaju lokalne uključenosti datoteke, ako uspete da uključite tu otpremljenu datoteku, dobićete RCE.

Imajte na umu da podrazumevano PHP dozvoljava samo otpremanje 20 datoteka u jednom zahtevu (postavljeno u /etc/php/<verzija>/apache2/php.ini):

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

Takođe, broj potencijalnih imena datoteka je 62*62*62*62*62*62 = 56800235584

Druge tehnike

Druge tehnike se oslanjaju na napade na PHP protokole (nećete moći ako kontrolišete samo poslednji deo putanje), otkrivanje putanje datoteke, zloupotrebu očekivanih datoteka, ili pravljenje da PHP doživi grešku segmentacije tako da privremene datoteke koje su otpremljene nisu obrisane. Ova tehnika je veoma slična prethodnoj ali bez potrebe za pronalaženjem nultog dana.

Tehnika večnog čekanja

U ovoj tehnici potrebno je samo kontrolisati relativnu putanju. Ako uspemo da otpremimo datoteke i da LFI nikada ne završi, imaćemo "dovoljno vremena" da bruteforsujemo otpremljene datoteke i pronađemo bilo koju od njih.

Prednosti ove tehnike:

  • Potrebno je samo kontrolisati relativnu putanju unutar uključivanja

  • Ne zahteva nginx ili neočekivan nivo pristupa log datotekama

  • Ne zahteva nulti dan da bi izazvao grešku segmentacije

  • Ne zahteva otkrivanje putanje

Glavni problemi ove tehnike su:

  • Potrebno je da određena datoteka(budu) prisutna(e) (može ih biti više)

  • Ludilo potencijalnih imena datoteka: 56800235584

  • Ako server ne koristi cifre, ukupan potencijalni broj je: 19770609664

  • Podrazumevano, samo 20 datoteka može biti otpremljeno u jednom zahtevu.

  • Maksimalan broj paralelnih radnika korišćenog servera.

  • Ovo ograničenje zajedno sa prethodnim može učiniti da ovaj napad traje predugo

  • Vreme isteka za PHP zahtev. Idealno bi bilo da bude večno ili da ubije PHP proces bez brisanja privremeno otpremljenih datoteka, inače će takođe biti problem

Dakle, kako možete da učinite da PHP uključivanje nikada ne završi? Samo uključivanjem datoteke /sys/kernel/security/apparmor/revision (nažalost nije dostupno u Docker kontejnerima).

Pokušajte to samo pozivajući:

php -a # open php cli
include("/sys/kernel/security/apparmor/revision");

Apache2

Podrazumevano, Apache podržava 150 istovremenih veza, prema https://ubiq.co/tech-blog/increase-max-connections-apache/ moguće je povećati ovaj broj do 8000. Pratite ovo da biste koristili PHP sa tim modulom: https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04.

Podrazumevano, (kako mogu videti u svojim testovima), PHP proces može trajati večno.

Hajde da uradimo malo matematike:

  • Možemo koristiti 149 veza da generišemo 149 * 20 = 2980 privremenih fajlova sa našim webshell-om.

  • Zatim, koristimo poslednju vezu da bruteforce potencijalne fajlove.

  • Pri brzini od 10 zahteva/s vreme je:

  • 56800235584 / 2980 / 10 / 3600 ~= 530 sati (50% šanse u 265h)

  • (bez decimala) 19770609664 / 2980 / 10 / 3600 ~= 185h (50% šanse u 93h)

Imajte na umu da u prethodnom primeru potpuno DoS-ujemo druge klijente!

Ako se Apache server poboljša i možemo zloupotrebiti 4000 veza (na pola puta do maksimalnog broja). Mogli bismo kreirati 3999*20 = 79980 fajlova i broj bi bio smanjen na oko 19.7h ili 6.9h (10h, 3.5h 50% šanse).

PHP-FMP

Ako umesto korišćenja regularnog php moda za apache za pokretanje PHP skripti, web stranica koristi PHP-FMP (što poboljšava efikasnost web stranice, pa je često pronaći), postoji nešto drugo što se može uraditi da se poboljša tehnika.

PHP-FMP omogućava da se konfiguriše parametar request_terminate_timeout u /etc/php/<php-verzija>/fpm/pool.d/www.conf. Ovaj parametar označava maksimalni broj sekundi kada zahtev ka PHP mora biti završen (beskonačno podrazumevano, ali 30s ako je parametar odkomentarisan). Kada zahtev bude obrađen od strane PHP-a nakon navedenog broja sekundi, on je ubijen. To znači da ako je zahtev bio u procesu otpremanja privremenih fajlova, zbog toga što je php obrada zaustavljena, ti fajlovi neće biti obrisani. Dakle, ako možete da napravite zahtev koji traje toliko dugo, možete generisati hiljade privremenih fajlova koji neće biti obrisani, što će ubrzati proces njihovog pronalaženja i smanjiti verovatnoću DoS-a platforme konzumiranjem svih veza.

Dakle, da biste izbegli DoS pretpostavimo da će napadač koristiti samo 100 veza istovremeno i maksimalno vreme obrade PHP-a od strane php-fmp (request_terminate_timeout) je 30s. Dakle, broj privremenih fajlova koji mogu biti generisani po sekundi je 100*20/30 = 66.67.

Zatim, da bi generisao 10000 fajlova napadač bi trebao: 10000/66.67 = 150s (da bi generisao 100000 fajlova vreme bi bilo 25min).

Zatim, napadač bi mogao koristiti te 100 veza da izvrši bruteforce pretragu. **** Pretpostavljajući brzinu od 300 zahteva/s vreme potrebno za eksploataciju je sledeće:

  • 56800235584 / 10000 / 300 / 3600 ~= 5.25 sati (50% šanse u 2.63h)

  • (sa 100000 fajlova) 56800235584 / 100000 / 300 / 3600 ~= 0.525 sati (50% šanse u 0.263h)

Da, moguće je generisati 100000 privremenih fajlova na EC2 instanci srednje veličine:

Imajte na umu da bi bilo dovoljno uključiti ranjivu LFI stranicu da bi se pokrenuo tajmaut, tako što bi ušao u večni uključujući petlju.

Nginx

Izgleda da podrazumevano Nginx podržava 512 paralelnih veza istovremeno (i ovaj broj može biti poboljšan).

Last updated