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

126 lines
8.4 KiB
Markdown
Raw Normal View History

# LFI2RCE via Eternal waiting
2022-12-18 23:00:42 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-12-18 23:00:42 +00:00
<details>
2022-12-18 23:00:42 +00:00
<summary>Support HackTricks</summary>
2024-01-01 17:15:10 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-12-18 23:00:42 +00:00
</details>
{% endhint %}
2022-12-18 23:00:42 +00:00
## Basic Information
2022-12-18 23:00:42 +00:00
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.
2022-12-18 23:00:42 +00:00
U slučaju lokalne inkluzije fajla, **ako uspete da uključite taj otpremljeni fajl, dobićete RCE**.
2022-12-18 23:00:42 +00:00
Napomena: podrazumevano **PHP dozvoljava otpremanje samo 20 fajlova u jednoj zahtev** (postavljeno u `/etc/php/<version>/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 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**.
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 **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 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
* 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
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
* 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 ograničenja sa prethodnim mogu 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
2022-12-19 15:21:53 +00:00
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...**).
2022-12-19 15:21:53 +00:00
Pokušajte jednostavno 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 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).
2022-12-18 23:00:42 +00:00
Podrazumevano, (kako mogu da vidim 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
* 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:
2024-02-10 13:11:20 +00:00
* 56800235584 / 2980 / 10 / 3600 \~= **530 sati** (50% šanse u 265h)
* (bez cifara) 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 je Apache server unapređen i mogli bismo da zloupotrebimo **4000 konekcija** (na pola puta do maksimalnog broja). Mogli bismo da kreiramo `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 modula 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.
2022-12-19 15:21:53 +00:00
PHP-FMP omogućava da se **konfiguriše** **parametar** **`request_terminate_timeout`** u **`/etc/php/<php-version>/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 otkomentarisano**). Kada se zahtev obrađuje od strane PHP-a, označeni broj sekundi, on se **ubija**. To znači da, ako je zahtev učitavao privremene fajlove, zato što je **php obrada prekinuta**, 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 na platformi trošeći sve konekcije.
2022-12-19 15:21:53 +00:00
Dakle, da bismo **izbegli DoS**, pretpostavimo da **napadač koristi samo 100 konekcija** u isto vreme i maksimalno vreme obrade php-a od strane **php-fmp** (`request_terminate_timeout`**)** je **30s**. Stoga, broj **temp fajlova** koji se može generisati **po sekundi** je `100*20/30 = 66.67`.
2022-12-19 15:21:53 +00:00
Zatim, da generiše **10000 fajlova** napadač bi trebao: **`10000/66.67 = 150s`** (da generiše **100000 fajlova** vreme bi bilo **25min**).
2022-12-19 15:21:53 +00:00
Zatim, napadač bi mogao koristiti tih **100 konekcija** da izvrši **pretragu brute-force**. \*\*\*\* Pretpostavljajući brzinu od 300 req/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 srednjoj instanci:
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 za aktiviranje vremenskog ograničenja bilo **dovoljno uključiti ranjivu LFI stranicu**, tako da uđe u večnu petlju uključivanja.
{% endhint %}
2022-12-18 23:00:42 +00:00
## Nginx
Izgleda da podrazumevano Nginx podržava **512 paralelnih konekcija** u isto vreme (i ovaj broj se može poboljšati).
{% hint style="success" %}
Učite i vežbajte AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Učite i vežbajte GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Podržite HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakerske trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
{% endhint %}