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

109 lines
7.5 KiB
Markdown

# LFI2RCE kupitia Kusubiri Milele
<details>
<summary><strong>Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)</strong></a><strong>!</strong></summary>
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako inatangazwa kwenye HackTricks** au **kupakua HackTricks kwa muundo wa PDF** Angalia [**MPANGO WA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**swag rasmi ya PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa [**NFTs**](https://opensea.io/collection/the-peass-family) ya kipekee
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Shiriki mbinu zako za kudukua kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
</details>
## Taarifa Msingi
Kwa chaguo-msingi, wakati faili inapakiwa kwenye PHP (hata kama haitegemei), itazalisha faili ya muda katika `/tmp` yenye jina kama **`php[a-zA-Z0-9]{6}`**, ingawa nimeona picha za docker ambapo faili zilizozalishwa hazina tarakimu.
Katika kuingiza faili ya ndani, **ikiwa utaweza kuingiza faili hiyo iliyoletwa, utapata RCE**.
Tafadhali kumbuka kuwa kwa chaguo-msingi **PHP inaruhusu kupakia faili 20 kwa ombi moja tu** (imewekwa katika `/etc/php/<version>/apache2/php.ini`):
```
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
```
Pia, **idadi ya majina ya faili yanayowezekana ni 62\*62\*62\*62\*62\*62 = 56800235584**
### Mbinu nyingine
Mbinu nyingine inategemea kushambulia itifaki za PHP (hutaweza ikiwa unadhibiti sehemu ya mwisho ya njia), kufichua njia ya faili, kutumia faili zinazotarajiwa, au **kufanya PHP ipate kosa la segementation ili faili za muda mfupi zilizopakiwa zisifutwe**.\
Mbinu hii ni **sawa sana na ile ya mwisho lakini bila haja ya kupata siku ya sifuri**.
### Mbinu ya kusubiri milele
Katika mbinu hii, **tunahitaji tu kudhibiti njia ya kihusishi**. Ikiwa tunaweza kupakia faili na kufanya **LFI isikome kamwe**, tutakuwa na "muda wa kutosha" kufanya **brute-force kwenye faili zilizopakiwa** na **kupata** moja yoyote kati ya zilizopakiwa.
**Faida za mbinu hii**:
* Unahitaji tu kudhibiti njia ya kihusishi ya kihusishi
* Hauhitaji nginx au kiwango kisichotarajiwa cha ufikiaji wa faili za kuingiza kwenye faili za kuingiza
* Hauhitaji siku ya sifuri kusababisha kosa la segementation
* Hauhitaji kufichua njia
**Matatizo makuu** ya mbinu hii ni:
* Inahitaji faili maalum (inaweza kuwa zaidi)
* Idadi **isiyo ya kawaida** ya majina ya faili yanayowezekana: **56800235584**
* Ikiwa seva **haitumii tarakimu**, idadi kamili ya uwezekano ni: **19770609664**
* Kwa chaguo-msingi, **faili 20 tu** zinaweza kupakiwa kwa **ombi moja**.
* Idadi **kubwa ya wafanyakazi wanaofanya kazi wakati mmoja** kwenye seva iliyotumiwa.
* Kikomo hiki pamoja na vikomo vingine vinaweza kufanya shambulio hili lisichukue muda mrefu sana
* **Muda wa kusubiri ombi la PHP**. Kwa ideali hii inapaswa kuwa ya milele au inapaswa kuua mchakato wa PHP bila kufuta faili zilizopakiwa za muda mfupi, ikiwa sivyo, hii pia itakuwa shida
Basi, unawezaje **kusababisha kuingiza kwa PHP isikome kamwe**? Kwa kuingiza faili **`/sys/kernel/security/apparmor/revision`** (**haipatikani kwenye kontena za Docker** kwa bahati mbaya...).
Jaribu tu kuita:
```bash
php -a # open php cli
include("/sys/kernel/security/apparmor/revision");
```
## Apache2
Kwa chaguo-msingi, Apache inasaidia **150 yaunganisho yanayofanya kazi wakati mmoja**, kufuatia [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) inawezekana kuongeza idadi hii hadi 8000. Fuata hii ili kutumia PHP na moduli hiyo: [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).
Kwa chaguo-msingi, (kama ninavyoona katika majaribio yangu), **mchakato wa PHP unaweza kudumu milele**.
Hebu tufanye hesabu:
* Tunaweza kutumia **unganisho 149** kuunda **2980 faili za muda** na webshell yetu.
* Kisha, tumia **unganisho la mwisho** kufanya **brute-force** kwenye faili zinazowezekana.
* Kwa kasi ya **ombi 10/s**, nyakati ni:
* 56800235584 / 2980 / 10 / 3600 \~= **masaa 530** (nafasi ya 50% katika masaa 265)
* (bila tarakimu) 19770609664 / 2980 / 10 / 3600 \~= masaa 185 (nafasi ya 50% katika masaa 93)
{% hint style="warning" %}
Tafadhali kumbuka kuwa katika mfano uliopita tunasababisha **DoS kamili kwa wateja wengine**!
{% endhint %}
Ikiwa seva ya Apache imeboreshwa na tunaweza kutumia **unganisho 4000** (nusu ya idadi kubwa). Tunaweza kuunda `3999*20 = 79980` **faili** na **idadi** itapunguzwa hadi takriban **masaa 19.7** au **masaa 6.9** (masaa 10, masaa 3.5 nafasi ya 50%).
## PHP-FMP
Ikiwa badala ya kutumia moduli ya kawaida ya php kwa apache kuendesha skripti za PHP, **ukurasa wa wavuti unatumia PHP-FMP** (hii inaboresha ufanisi wa ukurasa wa wavuti, kwa hivyo ni kawaida kuipata), kuna kitu kingine kinachoweza kufanywa kuboresha mbinu hii.
PHP-FMP inaruhusu **kuweka** **parameta** **`request_terminate_timeout`** katika **`/etc/php/<php-version>/fpm/pool.d/www.conf`**.\
Parameta hii inaonyesha idadi kubwa ya sekunde **wakati** **ombi kwa PHP lazima litamatike** (kwa chaguo-msingi ni isiyo na kikomo, lakini **30s ikiwa paramu haijafutwa**). Wakati ombi linapopitishwa na PHP kwa idadi iliyotajwa ya sekunde, ombi hilo linakuwa **limekatwa**. Hii inamaanisha kuwa ikiwa ombi lilikuwa linapakia faili za muda, kwa sababu **usindikaji wa php ulisimamishwa**, faili hizo **hazitafutwa**. Kwa hivyo, ikiwa unaweza kufanya ombi lidumu kwa muda huo, unaweza **kuunda maelfu ya faili za muda** ambazo hazitafutwa, ambazo zitasaidia **kupunguza muda wa kuzipata** na kupunguza uwezekano wa DoS kwa jukwaa kwa kuchukua unganisho zote.
Kwa hivyo, ili **kuepuka DoS**, hebu tuseme kuwa **mshambuliaji atatumia unganisho 100 tu** kwa wakati mmoja na muda wa usindikaji wa php kwa njia ya **php-fmp** (`request_terminate_timeout`**)** ni **30s**. Kwa hivyo, idadi ya **faili za muda** zinazoweza kuundwa **kwa sekunde** ni `100*20/30 = 66.67`.
Kisha, ili kuunda **faili 10000**, mshambuliaji atahitaji: **`10000/66.67 = 150s`** (kwa kuunda **faili 100000** wakati utakuwa **dakika 25**).
Kisha, mshambuliaji anaweza kutumia **unganisho hizo 100** kufanya **brute-force** ya utafutaji. Kwa kasi ya 300 ombi/s wakati unaohitajika kutekeleza hii ni kama ifuatavyo:
* 56800235584 / 10000 / 300 / 3600 \~= **masaa 5.25** (nafasi ya 50% katika masaa 2.63)
* (na faili 100000) 56800235584 / 100000 / 300 / 3600 \~= **masaa 0.525** (nafasi ya 50% katika masaa 0.263)
Ndiyo, inawezekana kuunda faili 100000 za muda kwenye kifaa cha ukubwa wa kati cha EC2:
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (3).png" alt=""><figcaption></figcaption></figure>
{% hint style="warning" %}
Tafadhali kumbuka kuwa ili kusababisha muda wa kumalizika, itakuwa **ya kutosha kuweka ukurasa ulio hatarini wa LFI**, ili iingie kwenye mzunguko wa kuingiza usio na mwisho.
{% endhint %}
## Nginx
Inaonekana kwa chaguo-msingi Nginx inasaidia **unganisho 512 yanayofanya kazi wakati mmoja** (na idadi hii inaweza kuboreshwa).