Disable Functions Bypass - dl Function

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

dl() lets PHP load a shared extension at runtime. If you can make it load an attacker-controlled module, you can register a new PHP function that internally calls execve, system, or any other native primitive and therefore bypass disable_functions.

Dit is ’n werklike primitief, maar op moderne teikens is dit baie minder algemeen as wat ouer beskrywings voorstel.

Waarom hierdie omseiling vandag ongewoon is

Die hoofhindernisse is:

  • dl() moet bestaan en mag nie gedeaktiveer wees nie
  • enable_dl moet steeds dinamiese laai toelaat
  • Die teiken SAPI moet dl() ondersteun
  • Die payload moet ’n geldige PHP-uitbreiding wees wat saamgestel is vir die selfde teiken ABI
  • Die uitbreiding moet toeganklik wees vanaf die gekonfigureerde extension_dir

Die amptelike PHP-handleiding is die belangrikste werklikheidstoets hier: dl() is slegs beskikbaar vir CLI en embed SAPIs, en vir die CGI SAPI wanneer dit vanaf die command line uitgevoer word. Dit beteken die tegniek is gewoonlik nie beskikbaar in normale PHP-FPM/mod_php web requests nie, dus kontroleer die SAPI voordat jy tyd spandeer om ’n payload te bou.

Neem ook kennis dat enable_dl ’n INI_SYSTEM instelling is en, sedert PHP 8.3.0, PHP dokumenteer dit as deprecated, so jy kan dit gewoonlik nie tydens runtime vanaf aanvaller-beheerde PHP-kode omskakel nie.

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

Vinnige triage vanaf ’n foothold

Voordat jy enigiets bou, versamel die presiese parameters waarmee die module moet ooreenstem:

<?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;
?>

Wat saak maak:

  • PHP_SAPI: as dit fpm-fcgi of apache2handler is, is dl() gewoonlik ’n doodloop vir web exploitation
  • extension_dir: die payload moet hiervandaan gelaai word
  • PHP Version, architecture, debug/non-debug, and ZTS/non-ZTS: jou module moet daarmee ooreenstem
  • disable_functions: bevestig of dl afwesig is omdat dit gedeaktiveer is of omdat die SAPI dit nie ondersteun nie

Praktiese uitbuitingsbeperkings

1. Jy benodig gewoonlik skryfreg na extension_dir

Dit is die grootste knelpunt.

dl() neem die uitbreidingslêernaam, en PHP laai dit vanaf extension_dir. In praktyk beteken dit dat ’n gewone arbitraire lêer-oplaai na /var/www/html/uploads nie voldoende is nie. Jy het steeds ’n pad nodig om ’n .so/.dll te plaas waar PHP werklik uitbreidings sal laai.

Realistiese situasies waar dit uitbuitbaar raak:

  • CTFs of doelbewus swak labs waar extension_dir skryfbaar is
  • Gedeelde hosting of kontainerfoute wat ’n skryfbare extension path openbaar
  • ’n Afsonderlike arbitraire lêerskryf-primitive wat reeds by extension_dir uitkom
  • Post-exploitation scenario’s waar jy reeds genoeg privileges verwerf het om lêers daar neer te sit

2. Die module moet by die teiken-bou pas

Net ooreenstem met PHP_VERSION is nie genoeg nie. Die extensie moet ook ooreenstem met:

  • OS en CPU-argitektuur
  • libc/toolchain verwagtinge
  • ZEND_MODULE_API_NO
  • debug vs non-debug build
  • ZTS vs NTS

As dit nie ooreenstem nie, sal dl() misluk of die proses laat crash.

3. open_basedir is nie die hoofverdediging hier nie

Sodra jy die module in extension_dir kan plaas en dl() kan aanroep, word die extensie-kode binne die PHP-proses uitgevoer. Op daardie punt was die relevante hindernis nie open_basedir nie, maar die vermoë om ’n geldige gedeelde objek in die extensie-laaipad te plaas.

Bou die kwaadwillige extensie

Die klassieke roete is steeds geldig:

  1. Herbou die teiken-bou so nou moontlik
  2. Gebruik phpize, ./configure, en make om ’n gedeelde extensie te bou
  3. Eksporteer ’n PHP-funksie soos bypass_exec($cmd) wat inheemse opdrag-uitvoering omsluit
  4. Laai die saamgestelde module op in extension_dir
  5. Laai dit met dl() en roep die geëksporteerde funksie aan

Die aanval is oud, maar steeds relevant omdat PHP 8.x changelogs voortgaan om dl()-spesifieke crash-fixes in te sluit. Die primitive bestaan steeds; die moeilike deel is om ’n ontplooiing te vind waar dit bereikbaar is en waar jy ’n ooreenstemmende module kan neerbring.

Minimale werkvloei

Op die aanvaller se masjien

mkdir bypass && cd bypass
phpize
./configure
make

Die resulterende gedeelde objek sal gewoonlik onder modules/ wees.

As jy op ’n ander omgewing bou as die teiken, behandel die geproduseerde lêer as ’n konsep totdat jy verifieer dat die ABI ooreenstem met dié van die slagoffer.

Laai en gebruik die uitbreiding

As die teiken werklik dl() ondersteun en die module binne extension_dir is, is die runtime-kant eenvoudig:

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

On Windows the filename will typically be a .dll, while on Unix-like targets it will usually be a .so.

Aanvaller notas

  • Moet nie aanvaar dit werk op afstand net omdat function_exists("dl") in sekere dokumentasie of ou skrywes true teruggee nie; valideer die regstreekse SAPI
  • ’n Mislukte dl()-poging kan die PHP-werker beëindig as die module onverenigbaar is
  • Vanaf PHP 8 af is gedeaktiveerde funksies uit die funksietabel verwyder, so userland-enumerasie kan van ouer plasings verskil
  • As jy nie na extension_dir kan skryf nie, is hierdie tegniek gewoonlik minder prakties as FPM/FastCGI, LD_PRELOAD, of module-spesifieke omseilings wat reeds in hierdie afdeling behandel is

Verwysings

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