hacktricks/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md

110 lines
7.4 KiB
Markdown
Raw Normal View History

# LFI2RCE putem Večnog čekanja
2022-12-18 23:00:42 +00:00
<details>
2024-02-10 13:11:20 +00:00
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-12-18 23:00:42 +00:00
2024-02-10 13:11:20 +00:00
Drugi načini podrške HackTricks-u:
2024-01-01 17:15:10 +00:00
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
2024-02-10 13:11:20 +00:00
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
2024-02-10 13:11:20 +00:00
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-12-18 23:00:42 +00:00
</details>
2024-02-10 13:11:20 +00:00
## Osnovne informacije
2022-12-18 23:00:42 +00:00
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.
2022-12-18 23:00:42 +00:00
U slučaju lokalne uključenosti datoteke, **ako uspete da uključite tu otpremljenu datoteku, dobićete RCE**.
2022-12-18 23:00:42 +00:00
Imajte na umu da podrazumevano **PHP dozvoljava samo otpremanje 20 datoteka u jednom zahtevu** (postavljeno u `/etc/php/<verzija>/apache2/php.ini`):
2022-12-18 23:00:42 +00:00
```
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
```
2024-02-10 13:11:20 +00:00
Takođe, **broj potencijalnih imena datoteka je 62\*62\*62\*62\*62\*62 = 56800235584**
2022-12-18 23:00:42 +00:00
### Druge tehnike
2022-12-18 23:00:42 +00:00
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**.
2022-12-18 23:00:42 +00:00
2024-02-10 13:11:20 +00:00
### Tehnika večnog čekanja
2022-12-18 23:00:42 +00:00
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.
2022-12-18 23:00:42 +00:00
2024-02-10 13:11:20 +00:00
**Prednosti ove tehnike**:
2022-12-19 15:21:53 +00:00
* Potrebno je samo kontrolisati relativnu putanju unutar uključivanja
2024-02-10 13:11:20 +00:00
* Ne zahteva nginx ili neočekivan nivo pristupa log datotekama
* Ne zahteva nulti dan da bi izazvao grešku segmentacije
2024-02-10 13:11:20 +00:00
* Ne zahteva otkrivanje putanje
2022-12-19 15:21:53 +00:00
2024-02-10 13:11:20 +00:00
**Glavni problemi** ove tehnike su:
2022-12-18 23:00:42 +00:00
* 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.
2024-02-10 13:11:20 +00:00
* 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
2022-12-19 15:21:53 +00:00
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**).
2022-12-19 15:21:53 +00:00
2024-02-10 13:11:20 +00:00
Pokušajte to samo pozivajući:
2022-12-19 15:21:53 +00:00
```bash
php -a # open php cli
include("/sys/kernel/security/apparmor/revision");
```
2022-12-18 23:00:42 +00:00
## Apache2
Podrazumevano, Apache podržava **150 istovremenih veza**, 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).
2022-12-18 23:00:42 +00:00
Podrazumevano, (kako mogu videti u svojim testovima), **PHP proces može trajati večno**.
2022-12-18 23:00:42 +00:00
2024-02-10 13:11:20 +00:00
Hajde da uradimo malo matematike:
2022-12-18 23:00:42 +00:00
2024-02-10 13:11:20 +00:00
* 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:
2024-02-10 13:11:20 +00:00
* 56800235584 / 2980 / 10 / 3600 \~= **530 sati** (50% šanse u 265h)
* (bez decimala) 19770609664 / 2980 / 10 / 3600 \~= 185h (50% šanse u 93h)
2022-12-18 23:00:42 +00:00
{% hint style="warning" %}
2024-02-10 13:11:20 +00:00
Imajte na umu da u prethodnom primeru **potpuno DoS-ujemo druge klijente**!
2022-12-18 23:00:42 +00:00
{% endhint %}
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).
2022-12-18 23:00:42 +00:00
2022-12-19 15:21:53 +00:00
## 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.
2022-12-19 15:21:53 +00:00
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.
2022-12-19 15:21:53 +00:00
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`.
2022-12-19 15:21:53 +00:00
Zatim, da bi generisao **10000 fajlova** napadač bi trebao: **`10000/66.67 = 150s`** (da bi generisao **100000 fajlova** vreme bi bilo **25min**).
2022-12-19 15:21:53 +00:00
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:
2022-12-19 15:21:53 +00:00
2024-02-10 13:11:20 +00:00
* 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)
2022-12-19 15:21:53 +00:00
Da, moguće je generisati 100000 privremenih fajlova na EC2 instanci srednje veličine:
2022-12-19 16:08:19 +00:00
<figure><img src="../../.gitbook/assets/image (240).png" alt=""><figcaption></figcaption></figure>
2022-12-19 16:08:19 +00:00
{% hint style="warning" %}
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.
{% endhint %}
2022-12-18 23:00:42 +00:00
## Nginx
Izgleda da podrazumevano Nginx podržava **512 paralelnih veza** istovremeno (i ovaj broj može biti poboljšan).