hacktricks/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md
2024-02-10 13:11:20 +00:00

7.4 KiB

LFI2RCE putem večnog čekanja

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 fajl otpremi na PHP (čak i ako se ne očekuje), generisaće se privremeni fajl u /tmp sa imenom kao što je php[a-zA-Z0-9]{6}, iako sam video neke Docker slike gde generisani fajlovi ne sadrže cifre.

U lokalnom uključivanju fajla, ako uspete da uključite taj otpremljeni fajl, dobićete RCE.

Imajte na umu da podrazumevano PHP dozvoljava samo otpremanje 20 fajlova u jednom zahtevu (postavljeno u /etc/php/<version>/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

Ostale 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 izazivanje segmentacijske greške u PHP-u kako bi privremene datoteke koje su otpremljene nisu obrisane.
Ova tehnika je vrlo slična prethodnoj, ali ne zahteva pronalaženje nultog dana.

Tehnika večnog čekanja

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

Prednosti ove tehnike:

  • Samo trebate kontrolisati relativnu putanju unutar include-a
  • Ne zahteva nginx ili neočekivan nivo pristupa log datotekama
  • Ne zahteva nultu grešku da bi izazvala segmentacijsku grešku
  • Ne zahteva otkrivanje putanje

Glavni problemi ove tehnike su:

  • Potrebna je određena datoteka (može ih biti više)
  • Nevjerovatna količina potencijalnih imena datoteka: 56800235584
  • Ako server ne koristi cifre, ukupna potencijalna količina je: 19770609664
  • Podrazumijevano se samo 20 datoteka može otpremiti u jednom zahtjevu.
  • Maksimalan broj paralelnih radnika korištenog servera.
  • Ovo ograničenje zajedno sa prethodnim može učiniti da ovaj napad traje predugo
  • Vremensko ograničenje za PHP zahtjev. Idealno bi bilo da je vječno ili da ubije PHP proces bez brisanja privremeno otpremljenih datoteka, ako to nije slučaj, i to će biti problem

Dakle, kako možete napraviti da PHP include 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. Sledite 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 sam primetio 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 brute-force potencijalne fajlove.
  • Pri brzini od 10 zahteva/s, vreme je:
  • 56800235584 / 2980 / 10 / 3600 ~= 530 sati (50% šanse u 265h)
  • (bez cifara) 19770609664 / 2980 / 10 / 3600 ~= 185h (50% šanse u 93h)

{% hint style="warning" %} Imajte na umu da u prethodnom primeru potpuno DoS-ujemo druge klijente! {% endhint %}

Ako je Apache server poboljšan i možemo zloupotrebiti 4000 veza (polovina maksimalnog broja). Mogli bismo kreirati 3999*20 = 79980 fajlova i broj bi se smanjio 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, veb stranica koristi PHP-FMP (što poboljšava efikasnost veb stranice, pa je često prisutno), postoji nešto drugo što se može uraditi da se poboljša tehnika.

PHP-FMP omogućava konfigurisanje parametra request_terminate_timeout u /etc/php/<php-version>/fpm/pool.d/www.conf.
Ovaj parametar označava maksimalan broj sekundi kada zahtev ka PHP-u mora biti završen (podrazumevano je beskonačno, ali 30s ako je parametar odkomentarisan). Kada zahtev bude obrađen od strane PHP-a u označenom broju sekundi, on će biti ubijen. To znači da ako je zahtev bio u procesu otpremanja privremenih fajlova, jer je obrada PHP-a zaustavljena, ti fajlovi neće biti obrisani. Dakle, ako možete da produžite trajanje zahteva na to vreme, možete generisati hiljade privremenih fajlova koji neće biti obrisani, što će ubrzati proces pronalaženja i smanjiti verovatnoću DoS-a platforme konzumiranjem svih veza.

Dakle, da bismo 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 biste generisali 10000 fajlova, napadaču bi trebalo: 10000/66.67 = 150s (da biste generisali 100000 fajlova, vreme bi bilo 25 minuta).

Zatim, napadač može koristiti te 100 veza da izvrši brute-force pretragu. Pretpostavljajući brzinu od 300 zahteva/s, vreme potrebno za iskorišćavanje ovoga 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 instanci srednje veličine EC2:

{% hint style="warning" %} Imajte na umu da bi bilo dovoljno uključiti ranjivu LFI stranicu da biste pokrenuli prekoračenje vremena, tako da uđe u večno uključivanje. {% endhint %}

Nginx

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