Bypass ya Disable Functions - dl Function

Tip

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) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

dl() inaruhusu PHP kupakia shared extension wakati wa runtime. Ikiwa unaweza kuifanya ipakishe attacker-controlled module, unaweza kusajili PHP function mpya ambayo ndani yake inaita execve, system, au primitive nyingine ya native na kwa hivyo kupita disable_functions.

Huu ni primitive halisi, lakini kwa targets za kisasa ni nadra zaidi kuliko maelezo ya zamani yanavyopendekeza.

Kwa nini bypass hii haipo sana leo

Vizuizi vikuu ni:

  • dl() inabidi ipo na isizuilwe
  • enable_dl inabidi bado iweze kuruhusu dynamic loading
  • SAPI ya target inabidi iweze kuunga mkono dl()
  • payload inabidi iwe valid PHP extension iliyokompyuliwa kwa same target ABI
  • extension inabidi ifikike kutoka configured extension_dir

Manual rasmi ya PHP ni ukaguzi wa ukweli muhimu zaidi hapa: dl() is only available for CLI and embed SAPIs, and for the CGI SAPI when run from the command line. Hii ina maana kwamba technique hii haina kawaida kupatikana kwenye requests za kawaida za PHP-FPM/mod_php, hivyo angalia SAPI kabla ya kutumia muda kujenga payload.

Pia kumbuka kwamba enable_dl ni setting ya INI_SYSTEM na, kuanzia PHP 8.3.0, PHP imeitaja kama deprecated, hivyo kwa kawaida huwezi kuibadilisha wakati wa runtime kutoka attacker-controlled PHP code.

If dl() is not viable, go back to the broader list of module/version dependent bypasses.

Triage ya haraka kutoka foothold

Kabla ya kujenga chochote, chukua vigezo kamili ambavyo module inapaswa kufanana navyo:

<?php
phpinfo();
echo "PHP_VERSION=" . PHP_VERSION . PHP_EOL;
echo "PHP_SAPI=" . php_sapi_name() . PHP_EOL;
echo "ZTS=" . (PHP_ZTS ? "yes" : "no") . PHP_EOL;
echo "INT_BITS=" . (PHP_INT_SIZE * 8) . PHP_EOL;
echo "enable_dl=" . ini_get("enable_dl") . PHP_EOL;
echo "extension_dir=" . ini_get("extension_dir") . PHP_EOL;
echo "disabled=" . ini_get("disable_functions") . PHP_EOL;
?>

What unachohitaji kujali:

  • PHP_SAPI: ikiwa hii ni fpm-fcgi au apache2handler, dl() kawaida si chaguo kwa web exploitation
  • extension_dir: payload lazima iload kutoka hapa
  • PHP Version, architecture, debug/non-debug, na ZTS/non-ZTS: module yako lazima iendane nao
  • disable_functions: thibitisha kama dl haipo kwa sababu imezimwa au kwa sababu SAPI haiku-support

Practical exploitation constraints

1. You normally need write access to extension_dir

Hii ndiyo kizuizi kikubwa zaidi.

dl() inachukua extension filename, na PHP inaload kutoka extension_dir. Kwa vitendo, hili linamaanisha kuwa upload ya kawaida ya file yoyote hadi /var/www/html/uploads haitoshi. Bado unahitaji path ya kuweka .so/.dll ambako PHP itapakia extensions kutoka.

Mazingira halisi ambapo hili linaweza kutumika:

  • CTFs au ma-labs yaliyounganishwa kwa makusudi ambapo extension_dir inaweza kuandikwa
  • Shared-hosting au container mistakes ambazo zinaonyesha extension path inayoweza kuandikwa
  • Primitive ya kuandika file yoyote tofauti ambayo tayari inafikia extension_dir
  • Scenarios za post-exploitation ambapo tayari umepanda hadhi vya kutosha kuweka files hapo

2. The module must match the target build

Kulingana tu na PHP_VERSION haitoshi. Extension pia inahitaji kuendana na:

  • OS na CPU architecture
  • libc/toolchain expectations
  • ZEND_MODULE_API_NO
  • debug vs non-debug build
  • ZTS vs NTS

Kama haya hayataendani, dl() itashindwa au kusababisha process icrash.

3. open_basedir is not the main defense here

Mara tu ukipoa kuweka module katika extension_dir na kuita dl(), code ya extension inatekelezwa ndani ya process ya PHP. Kwa hatua hiyo kizuizi muhimu kilikuwa si open_basedir, bali uwezo wa kuweka shared object halali katika path ya loading ya extensions.

Building the malicious extension

Njia ya jadi bado inafanya kazi:

  1. Recreate the victim build kadri iwezekanavyo
  2. Tumia phpize, ./configure, na make kujenga shared extension
  3. Export function ya PHP kama bypass_exec($cmd) inayozunguka native command execution
  4. Upload module iliyokomplewa ndani ya extension_dir
  5. Load nayo kwa dl() na ita function iliyotolewa

Attack hii ni ya zamani, lakini bado inahusiana kwa sababu changelogs za PHP 8.x zinaendelea kujumuisha dl()-specific crash fixes. Primitive bado ipo; sehemu ngumu ni kupata deployment ambapo inaweza kufikiwa na ambapo unaweza kuweka module inayofaa.

Minimal workflow

On the attacker box

mkdir bypass && cd bypass
phpize
./configure
make

Shared object itakayotolewa kawaida itakuwa chini ya modules/.

Ikiwa unajenga kwenye mazingira tofauti na yale ya lengo, chukua faili iliyotengenezwa kama rasimu hadi utakapothibitisha kuwa ABI inalingana na ile ya mhusika.

Kupakia na kutumia extension

Ikiwa lengo lina msaada wa kweli kwa dl() na module iko ndani ya extension_dir, upande wa runtime ni rahisi:

<?php
if (!extension_loaded('bypass')) {
dl('bypass.so'); // use the correct filename for the target platform
}
echo bypass_exec($_GET['cmd']);
?>

Kwenye Windows, jina la faili kwa kawaida litakuwa .dll, ilhali kwenye malengo ya aina ya Unix kawaida litakuwa .so.

Vidokezo vya mshambuliaji

  • Usidhani hii inafanya kazi kwa mbali kwa sababu tu function_exists("dl") inarudisha true katika nyaraka fulani au maelezo ya zamani; thibitisha SAPI hai
  • Jaribio la dl() lililoshindwa linaweza kusababisha mchakato wa PHP kufa ikiwa module haifai
  • Kuanzia PHP 8 na kuendelea, disabled functions zinaondolewa kutoka kwenye function table, hivyo uorodheshaji wa userland unaweza kutofautiana na machapisho ya zamani
  • Ikiwa huwezi kuandika kwenye extension_dir, mbinu hii kwa kawaida si ya vitendo kama FPM/FastCGI, LD_PRELOAD, au module-specific bypasses zilizoshughulikiwa tayari katika sehemu hii

Marejeo

Tip

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) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks