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:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite SUBSCRIPTION PLANS!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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).