LFI2RCE via Eternal waiting

Support HackTricks

Basic Information

Kwa kawaida, wakati faili inapoupwa kwenye PHP (hata kama haitarajiwi), itaunda faili la muda katika /tmp lenye jina kama php[a-zA-Z0-9]{6}, ingawa nimeona picha za docker ambapo faili zilizozalishwa hazina nambari.

Katika uingizaji wa faili wa ndani, ikiwa utaweza kuingiza faili hiyo iliyopakiwa, utapata RCE.

Kumbuka kwamba kwa kawaida PHP inaruhusu kupakia faili 20 tu katika ombi moja (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 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 isimalizike 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 jumuisho

  • 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 haiitumii 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 kuisha 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 jumuisho la PHP lisimalizike kamwe? Kwa kuingiza tu faili /sys/kernel/security/apparmor/revision (haipatikani katika kontena za Docker kwa bahati mbaya...).

Jaribu kwa kuitwa:

php -a # open php cli
include("/sys/kernel/security/apparmor/revision");

Apache2

Kwa kawaida, Apache inasaidia michango 150 ya pamoja, kufuata 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.

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)

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 mod 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 kukutana nayo), kuna kitu kingine kinachoweza kufanywa kuboresha mbinu hiyo.

PHP-FMP inaruhusu kuunda parameta request_terminate_timeout katika /etc/php/<php-version>/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 hiyo haijafutwa). Wakati ombi linafanyiwa kazi na PHP kwa idadi iliyotajwa ya sekunde, inakatwa. Hii inamaanisha, kwamba ikiwa ombi lilikuwa linaongeza faili za muda, kwa sababu usindikaji wa php umesitishwa, hizo faili hazitafutwa. Kwa hivyo, ikiwa unaweza kufanya ombi kudumu wakati huo, unaweza kuunda maelfu ya faili za muda ambazo hazitafutwa, ambayo itafanya mchakato wa kuzitafuta uwe wa haraka 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 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 ~= 0.525 masaa (50% nafasi katika 0.263h)

Ndio, inawezekana kuunda faili 100000 za muda katika mfano wa EC2 wa ukubwa wa kati:

Kumbuka kwamba ili kuanzisha muda wa kukatiza 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).

Support HackTricks

Last updated