LFI2RCE via Eternal waiting
Last updated
Last updated
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Kwa kawaida, wakati faili inapoupwa kwenye PHP (hata kama haitarajii), 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
):
Pia, idadi ya majina ya faili yanayoweza kuwa ni 62*62*62*62*62*62 = 56800235584
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 ile ya mwisho lakini bila kuhitaji kupata siku sifuri.
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 vingine 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:
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).
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 kuikuta), 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 imeondolewa maoni). Wakati ombi linafanyiwa kazi 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 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 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:
Kumbuka kwamba ili kuanzisha muda wa kukatisha itakuwa ya kutosha kujumuisha ukurasa wa LFI ulio hatarini, ili uingie katika mzunguko wa kujumuisha wa milele.
Inaonekana kwamba kwa kawaida Nginx inasaidia michango 512 ya sambamba kwa wakati mmoja (na nambari hii inaweza kuboreshwa).
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)