LFI2RCE via Eternal waiting

Reading time: 7 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Basic Information

Standaard, wanneer 'n lĂȘer na PHP opgelaai word (selfs al verwag dit nie), sal dit 'n tydelike lĂȘer in /tmp genereer met 'n naam soos php[a-zA-Z0-9]{6}, alhoewel ek sommige docker beelde gesien het waar die gegenereerde lĂȘers geen syfers bevat nie.

In 'n plaaslike lĂȘerinvoeging, as jy daarin slaag om daardie opgelaaide lĂȘer in te sluit, sal jy RCE kry.

Let daarop dat standaard PHP slegs toelaat om 20 lĂȘers in 'n enkele versoek op te laai (gestel in /etc/php/<version>/apache2/php.ini):

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

Ook, die aantal potensiĂ«le lĂȘernames is 62*62*62*62*62*62 = 56800235584

Ander tegnieke

Ander tegnieke berus op die aanval van PHP protokolle (jy sal nie in staat wees as jy net die laaste deel van die pad beheer nie), die pad van die lĂȘer openbaar, die verwagte lĂȘers misbruik, of maak PHP ly aan 'n segmentasiefout sodat opgelaaide tydelike lĂȘers nie verwyder word nie.
Hierdie tegniek is baie soortgelyk aan die laaste een, maar sonder om 'n nuldag te vind.

Ewige wag tegniek

In hierdie tegniek het ons net 'n relatiewe pad nodig om te beheer. As ons daarin slaag om lĂȘers op te laai en die LFI nooit te laat eindig nie, sal ons "genoeg tyd" hĂȘ om brute-force opgelaaide lĂȘers en vind enige van die opgelaaide.

Voordele van hierdie tegniek:

  • Jy moet net 'n relatiewe pad binne 'n insluiting beheer
  • Vereis nie nginx of 'n onverwagte vlak van toegang tot log lĂȘers nie
  • Vereis nie 'n 0-dag om 'n segmentasiefout te veroorsaak nie
  • Vereis nie 'n pad openbaar nie

Die hoofprobleme van hierdie tegniek is:

  • 'n Spesifieke lĂȘer(s) moet teenwoordig wees (daar mag meer wees)
  • Die mal hoeveelheid potensiĂ«le lĂȘernames: 56800235584
  • As die bediener nie syfers gebruik nie is die totale potensiĂ«le hoeveelheid: 19770609664
  • Standaard kan slegs 20 lĂȘers in 'n enkele versoek opgelaai word.
  • Die maksimum aantal parallelle werkers van die gebruikte bediener.
  • Hierdie limiet saam met die vorige kan maak dat hierdie aanval te lank duur
  • Tydsduur vir 'n PHP versoek. Ideaal gesproke moet dit ewige wees of die PHP-proses moet doodgemaak word sonder om die tydelike opgelaaide lĂȘers te verwyder, anders sal dit ook 'n pyn wees

So, hoe kan jy maak dat 'n PHP insluiting nooit eindig nie? Net deur die lĂȘer /sys/kernel/security/apparmor/revision in te sluit (nie beskikbaar in Docker houers ongelukkig...).

Probeer dit net deur te bel:

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

Apache2

Standaard ondersteun Apache 150 gelyktydige verbindings, volgens https://ubiq.co/tech-blog/increase-max-connections-apache/ is dit moontlik om hierdie getal tot 8000 op te gradeer. Volg dit om PHP met daardie module te gebruik: https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04.

Standaard, (soos ek in my toetse kan sien), kan 'n PHP-proses ewig duur.

Kom ons doen 'n bietjie wiskunde:

  • Ons kan 149 verbindings gebruik om 149 * 20 = 2980 tydelike lĂȘers met ons webshell te genereer.
  • Dan, gebruik die laaste verbinding om brute-force potensiĂ«le lĂȘers.
  • Teen 'n spoed van 10 versoeke/s is die tye:
  • 56800235584 / 2980 / 10 / 3600 ~= 530 ure (50% kans in 265h)
  • (sonder syfers) 19770609664 / 2980 / 10 / 3600 ~= 185h (50% kans in 93h)

warning

Let daarop dat ons in die vorige voorbeeld heeltemal ander kliënte DoSing!

As die Apache-bediener verbeter word en ons 4000 verbindings kan misbruik (halfpad na die maksimum getal). Ons kan 3999*20 = 79980 lĂȘers skep en die getal sou verminder tot ongeveer 19.7h of 6.9h (10h, 3.5h 50% kans).

PHP-FMP

As die webblad in plaas van die gewone php-mod vir apache om PHP-skripte uit te voer PHP-FMP gebruik (dit verbeter die doeltreffendheid van die webblad, so dit is algemeen om dit te vind), is daar iets anders wat gedoen kan word om die tegniek te verbeter.

PHP-FMP laat toe om die parameter request_terminate_timeout in /etc/php/<php-version>/fpm/pool.d/www.conf te konfigureer.
Hierdie parameter dui die maksimum aantal sekondes aan wanneer die versoek aan PHP moet beĂ«indig (oneindig per standaard, maar 30s as die parameter ontcommentaar is). Wanneer 'n versoek deur PHP verwerk word, word die aangeduide aantal sekondes, dit gekill. Dit beteken, dat as die versoek tydelike lĂȘers opgelaai het, omdat die php-verwerking gestop is, daardie lĂȘers nie verwyder gaan word. Daarom, as jy 'n versoek kan laat duur vir daardie tyd, kan jy duisende tydelike lĂȘers genereer wat nie verwyder sal word nie, wat die proses om hulle te vind versnel en die waarskynlikheid van 'n DoS op die platform verminder deur al die verbindings te verbruik.

So, om DoS te vermy, kom ons veronderstel dat 'n aanvaller slegs 100 verbindings terselfdertyd sal gebruik en die maksimum verwerkingstyd van php deur php-fmp (request_terminate_timeout) is 30s. Daarom is die aantal tydelike lĂȘers wat per sekonde gegenereer kan word 100*20/30 = 66.67.

Dan, om 10000 lĂȘers te genereer, sal 'n aanvaller nodig hĂȘ: 10000/66.67 = 150s (om 100000 lĂȘers te genereer, sal die tyd 25min wees).

Dan kan die aanvaller daardie 100 verbindings gebruik om 'n soek brute-force uit te voer. As ons 'n spoed van 300 req/s veronderstel, is die tyd wat nodig is om dit te ontgin soos volg:

  • 56800235584 / 10000 / 300 / 3600 ~= 5.25 ure (50% kans in 2.63h)
  • (met 100000 lĂȘers) 56800235584 / 100000 / 300 / 3600 ~= 0.525 ure (50% kans in 0.263h)

Ja, dit is moontlik om 100000 tydelike lĂȘers in 'n EC2 medium-grootte instansie te genereer:

warning

Let daarop dat dit genoeg sou wees om die kwesbare LFI-bladsy in te sluit om die tydsbeperking te aktiveer, sodat dit in 'n ewige insluitingslus ingaan.

Nginx

Dit lyk of Nginx standaard 512 parallel verbindings terselfdertyd ondersteun (en hierdie getal kan verbeter word).

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks