# LFI2RCE via Eternal waiting {{#include ../../banners/hacktricks-training.md}} ## Osnovne informacije Podrazumevano, kada se fajl otpremi na PHP (čak i ako to ne očekuje), generisaće 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 slučaju lokalne inkluzije fajla, **ako uspete da uključite taj otpremljeni fajl, dobićete RCE**. Imajte na umu da podrazumevano **PHP dozvoljava otpremanje samo 20 fajlova u jednoj zahtev** (postavljeno u `/etc/php//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 napad PHP protokola (nećete moći ako kontrolišete samo poslednji deo putanje), otkrivanje putanje datoteke, zloupotrebu očekivanih datoteka, ili **uzrokovanje segmentacione greške u PHP-u tako da otpremljene privremene datoteke nisu obrisane**.\ Ova tehnika je **veoma slična prethodnoj, ali bez potrebe da se pronađe zero day**. ### Tehnika večnog čekanja U ovoj tehnici **samo treba da kontrolišemo relativnu putanju**. Ako uspemo da otpremimo datoteke i učinimo da **LFI nikada ne završi**, imaćemo "dovoljno vremena" da **brute-force-ujemo otpremljene datoteke** i **pronađemo** bilo koju od otpremljenih. **Prednosti ove tehnike**: - Samo treba da kontrolišete relativnu putanju unutar include - Ne zahteva nginx ili neočekivani nivo pristupa log datotekama - Ne zahteva 0 day da izazove segmentacionu grešku - Ne zahteva otkrivanje putanje **Glavni problemi** ove tehnike su: - Potrebna je specifična datoteka(e) da budu prisutne (može ih biti više) - **Luda** količina potencijalnih imena datoteka: **56800235584** - Ako server **ne koristi cifre**, ukupna potencijalna količina je: **19770609664** - Po defaultu **samo 20 datoteka** može biti otpremljeno u **jednom zahtevu**. - **Maksimalan broj paralelnih radnika** korišćenog servera. - Ova granica sa prethodnim može učiniti da ovaj napad traje predugo - **Timeout za PHP zahtev**. Idealno bi trebalo da bude večan ili da ubije PHP proces bez brisanja privremeno otpremljenih datoteka, inače će to takođe biti problem Dakle, kako možete **učiniti da PHP include nikada ne završi**? Samo uključivanjem datoteke **`/sys/kernel/security/apparmor/revision`** (**nažalost, nije dostupna u Docker kontejnerima...**). Pokušajte jednostavno pozivajući: ```bash php -a # open php cli include("/sys/kernel/security/apparmor/revision"); ``` ## Apache2 Podrazumevano, Apache podržava **150 paralelnih konekcija**, prema [https://ubiq.co/tech-blog/increase-max-connections-apache/](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](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04). Podrazumevano, (kako mogu da vidim u svojim testovima), **PHP proces može trajati večno**. Hajde da uradimo malo matematike: - Možemo koristiti **149 konekcija** da generišemo **149 \* 20 = 2980 temp fajlova** sa našim webshell-om. - Zatim, koristimo **poslednju konekciju** 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) > [!WARNING] > Imajte na umu da u prethodnom primeru **potpuno DoS-ujemo druge klijente**! Ako je Apache server unapređen i mogli bismo da zloupotrebimo **4000 konekcija** (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 mod-a za apache za pokretanje PHP skripti **web stranica koristi** **PHP-FMP** (to poboljšava efikasnost web stranice, tako da je uobičajeno naći ga), postoji nešto drugo što se može učiniti da se poboljša tehnika. PHP-FMP omogućava da se **konfiguriše** **parametar** **`request_terminate_timeout`** u **`/etc/php//fpm/pool.d/www.conf`**.\ Ovaj parametar označava maksimalan broj sekundi **kada** **zahtev za PHP mora da se završi** (beskonačno podrazumevano, ali **30s ako je parametar otkomentarisana**). Kada se zahtev obrađuje od strane PHP-a, označeni broj sekundi, on je **ubijen**. To znači da, ako je zahtev učitavao privremene fajlove, jer je **php obrada zaustavljena**, ti **fajlovi neće biti obrisani**. Stoga, ako možete da napravite zahtev koji traje to vreme, možete **generisati hiljade privremenih fajlova** koji neće biti obrisani, što će **ubrati proces pronalaženja njih** i smanjiti verovatnoću DoS-a platformi trošeći sve konekcije. Dakle, da bismo **izbegli DoS**, pretpostavimo da **napadač koristi samo 100 konekcija** u isto vreme i maksimalno vreme obrade php-a od **php-fmp** (`request_terminate_timeout`**)** je **30s**. Stoga, broj **temp fajlova** koji se može generisati **po sekundi** je `100*20/30 = 66.67`. Zatim, da generiše **10000 fajlova** napadaču bi bilo potrebno: **`10000/66.67 = 150s`** (da generiše **100000 fajlova** vreme bi bilo **25min**). Zatim, napadač bi mogao koristiti tih **100 konekcija** da izvrši **brute-force pretragu**. Pretpostavljajući brzinu od 300 req/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 srednje veličine instanci:
> [!WARNING] > Imajte na umu da bi za aktiviranje vremenskog ograničenja bilo **dovoljno uključiti ranjivu LFI stranicu**, tako da uđe u večnu petlju uključivanja. ## Nginx Izgleda da podrazumevano Nginx podržava **512 paralelnih konekcija** u isto vreme (i ovaj broj se može poboljšati). {{#include ../../banners/hacktricks-training.md}}