# LFI2RCE kupitia Kusubiri Milele {{#include ../../banners/hacktricks-training.md}} ## Taarifa za Msingi Kwa kawaida, wakati faili inapoupwa kwenye PHP (hata kama haitarajii), itaunda faili ya muda katika `/tmp` yenye jina kama **`php[a-zA-Z0-9]{6}`**, ingawa nimeona picha zingine za docker ambapo faili zilizozalishwa hazina nambari. Katika uingizaji wa faili wa ndani, **ikiwa utaweza kuingiza faili hiyo iliyoupwa, utapata RCE**. Kumbuka kwamba kwa kawaida **PHP inaruhusu kupakia faili 20 tu katika ombi moja** (iliyowekwa katika `/etc/php//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 yanayoweza kuwa ni 62\*62\*62\*62\*62\*62 = 56800235584** ### Mbinu nyingine Mbinu nyingine zinategemea kushambulia protokali za PHP (hutoweza ikiwa unadhibiti sehemu ya mwisho ya njia), kufichua njia ya faili, kutumia faili zinazotarajiwa, au **kufanya PHP ipate makosa ya segmentation ili faili za muda zilizopakiwa zisifutwe**.\ Mbinu hii ni **sawa sana na ya mwisho lakini bila kuhitaji kupata siku sifuri**. ### Mbinu ya kusubiri milele Katika mbinu hii **tunahitaji tu kudhibiti njia ya jamaa**. Ikiwa tutafanikiwa kupakia faili na kufanya **LFI isikome kamwe**, tutakuwa na "wakati wa kutosha" ili **kujaribu nguvu faili zilizopakiwa** na **kupata** yoyote kati ya zile zilizopakiwa. **Faida za mbinu hii**: - Unahitaji tu kudhibiti njia ya jamaa ndani ya kujumuisha - Haihitaji nginx au kiwango kisichotarajiwa cha ufikiaji wa faili za log - Haihitaji siku sifuri ili kusababisha makosa ya segmentation - Haihitaji kufichua njia **Matatizo makuu** ya mbinu hii ni: - Inahitaji faili maalum kuwapo (huenda kuna zaidi) - **Kiasi cha ajabu** cha majina ya faili yanayoweza: **56800235584** - Ikiwa seva **haitumii nambari** jumla ya uwezo ni: **19770609664** - Kwa kawaida **faili 20 tu** zinaweza kupakiwa katika **ombio moja**. - **idadi ya juu ya wafanyakazi wa sambamba** wa seva inayotumika. - Kizuizi hiki pamoja na vya awali kinaweza kufanya shambulio hili kudumu kwa muda mrefu - **Muda wa kupita kwa ombi la PHP**. Kwa kawaida hii inapaswa kuwa milele au inapaswa kuua mchakato wa PHP bila kufuta faili za muda zilizopakiwa, ikiwa sivyo, hii pia itakuwa shida Basi, unaweza **aje kufanya kujumuisha PHP kusiishe kamwe**? Kwa kujumlisha tu faili **`/sys/kernel/security/apparmor/revision`** (**haipatikani katika kontena za Docker** kwa bahati mbaya...). Jaribu kwa kuitwa: ```bash php -a # open php cli include("/sys/kernel/security/apparmor/revision"); ``` ## Apache2 Kwa kawaida, Apache inasaidia **michango 150 ya pamoja**, kufuatia [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) inawezekana kuboresha nambari hii hadi **8000**. Fuata hii 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 kawaida, (kama ninavyoona katika majaribio yangu), **mchakato wa PHP unaweza kudumu milele**. Hebu tufanye hesabu: - Tunaweza kutumia **michango 149** kuzalisha **149 \* 20 = 2980 faili za muda** na webshell yetu. - Kisha, tumia **mchango wa mwisho** kufanya **brute-force** faili zinazoweza kuwa. - Kwa kasi ya **maombi 10/s** nyakati ni: - 56800235584 / 2980 / 10 / 3600 \~= **masaa 530** (50% nafasi katika masaa 265) - (bila nambari) 19770609664 / 2980 / 10 / 3600 \~= 185h (50% nafasi katika masaa 93) > [!WARNING] > Kumbuka kwamba katika mfano wa awali tunafanya **DoS kwa wateja wengine** kabisa! Ikiwa seva ya Apache imeboreshwa na tunaweza kutumia **michango 4000** (katika nusu ya nambari ya juu). Tunaweza kuunda `3999*20 = 79980` **faili** na **nambari** itakuwa **imepunguzwa** hadi karibu **19.7h** au **6.9h** (10h, 3.5h 50% nafasi). ## 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, hivyo ni kawaida kuikuta), kuna kitu kingine kinachoweza kufanywa kuboresha mbinu hiyo. PHP-FMP inaruhusu **kuunda** **parameta** **`request_terminate_timeout`** katika **`/etc/php//fpm/pool.d/www.conf`**.\ Parameta hii inaonyesha kiwango cha juu cha sekunde **wakati** **maombi kwa PHP yanapaswa kumalizika** (isiyo na kikomo kwa kawaida, lakini **30s ikiwa parameta imeondolewa maoni**). Wakati ombi linaposhughulikiwa na PHP kwa idadi iliyotajwa ya sekunde, inakatishwa. Hii inamaanisha, kwamba ikiwa ombi lilikuwa likipakia faili za muda, kwa sababu **usindikaji wa php umesitishwa**, hizo **faili hazitafutwa**. Kwa hivyo, ikiwa unaweza kufanya ombi kudumu muda huo, unaweza **kuunda maelfu ya faili za muda** ambazo hazitafutwa, ambayo itachochea **mchakato wa kuzipata** na kupunguza uwezekano wa DoS kwa jukwaa kwa kutumia michango yote. Hivyo, ili **kuepuka DoS** hebu tuone kwamba **mshambuliaji atatumia michango 100 tu** kwa wakati mmoja na muda wa usindikaji wa php kwa **php-fmp** (`request_terminate_timeout`**)** ni **30s**. Kwa hivyo, idadi ya **faili za muda** zinazoweza kuzalishwa **kwa sekunde** ni `100*20/30 = 66.67`. Kisha, ili kuunda **faili 10000** mshambuliaji angehitaji: **`10000/66.67 = 150s`** (kuunda **faili 100000** muda ungekuwa **dakika 25**). Kisha, mshambuliaji angeweza kutumia hizo **michango 100** kufanya **tafuta brute-force**. \*\*\*\* Tukikadiria kasi ya maombi 300 req/s muda unaohitajika kutumia hii ni kama ifuatavyo: - 56800235584 / 10000 / 300 / 3600 \~= **masaa 5.25** (50% nafasi katika masaa 2.63) - (ikiwa na faili 100000) 56800235584 / 100000 / 300 / 3600 \~= **masaa 0.525** (50% nafasi katika masaa 0.263) Ndio, inawezekana kuunda faili 100000 za muda katika mfano wa ukubwa wa kati wa EC2:
> [!WARNING] > Kumbuka kwamba ili kuanzisha muda wa kukatisha itakuwa **ya kutosha kujumuisha ukurasa wa LFI ulio hatarini**, ili uingie katika mzunguko wa kujumuisha wa milele. ## Nginx Inaonekana kwamba kwa kawaida Nginx inasaidia **michango 512 ya sambamba** kwa wakati mmoja (na nambari hii inaweza kuboreshwa). {{#include ../../banners/hacktricks-training.md}}