Análisis rápido de los ficheros maliciosos encontrados en Cyberhades

index.jpeg

Como prometía ayer en la entrada donde os contaba la incidencia en el blog, os comento en esta entrada el pequeño y rápido análisis de unos de los ficheros: bergpfh.php. El otro fichero es básicamente igual que éste, pero con un par de pequeños cambios, así que sólo hablaremos del primero.

Como os comentaba, los ficheros están ofuscados, aquí podéis ver el código original:

Para de-ofuscar (o llámalo como quieras) el fichero eché de mano de un poco de Ruby. Para los curiosos, aquí tenéis el código del script tal y como lo dejé, o sea, hecho una porquería:

De forma rápida, lo que hace el sccript es sustituir todo lo que está codificado en Base64 por su texto en claro correspondiente. Si ejecutas el script la salida del mismo es la siguiente:

Mucho mejor ¿no?

Pare entender el código un poco mejor, ya a mano, puse algunos espacios, tabuladores, etc. Como podemos ver el fichero consta básicamente de: el cuerpo principal, una función (l__0) que verifica ciertos parámetros del sistema y otras tres funciones más (l__1, l__2 y l__3) que son llamadas desde la función anterior.

El código principal

He añadido algunos comentarios para que se vea un poco más claro. Básicamente el código hace 3 comprobaciones, que si no se cumplen, la página sale con distintos códigos: 1z, 2z o 3z. Las comprobaciones son respectivamente: que, de acuerdo con el user agent, contenga la palabra “windows” y que el navegador del usuario sea: opera/9.80,msie 10,msie 9,msie 8 o msie 7 y la tercera comprobación es que el HTTP_REFERER no esté vacío.

Si las tres comprobaciones se cumplen, entonces guardamos en la variable $_5 el contenido que más tarde será usado para mandar en un POST request. El contenido de dicha variable está compuesto:

$_5=’d=’ .urlencode($_SERVER[‘HTTP_HOST’]) .’:’ .urlencode($_SERVER[‘REMOTE_ADDR’] .’:’ .$_4);

Más arriba podemos ver en las líneas 27 y 28 que el HTTP_HOST es convertido a minúsculas y si contiene la cadena “www.” como parte del mismo, es removida. Y el contenido de $_4 es el $_SERVER[HTTP_REFERER] (línea 23).

Siguiendo hacia abajo, nos encontramos en la línea 33 con otro punto importante, aquí es donde se llama a la función principal l__0 y el resultado de esta es guardado en $_7. Entre las líneas 42 y 48 vemos que $_7, o lo que es lo mismo la salida de la función l__0, se compara con la palabra “BAD” (faltan las comillas en el código), si la comparación coincide, la página termina, sino el usuario es redirigido hacia el contenido de $_7. Aquí ya podemos deducir que l__0 devuelve la palabra “BAD” o una URL y que la petición se hace a http://dbc.pinestry.com/rtk/get_url.php, que por el nombre del recurso (get_url) queda bastante claro que el objetivo es que devuelva una URL.

La función l__0

Esta función no hace más que comprobar ciertos funcionalidades del sistema. El objetivo, como comentamos antes, es acceder a http://dbc.pinestry.com/rtk/get_url.php y para ello, el código tiene 3 formas distintas de poder acceder a dicha página: acceso remoto a ficheros, esta es la primera comprobación que hace l__0, si el sistema tiene activada esta funcionalidad, entonces llama a la función l__1. Si no, el código intenta abrir un socket con dicho servidor, si el resultado es satisfactorio, el programa salta la función l__2 y como tercera alternativa, en caso que las dos anteriores fallaran, se comprueba si el sistema tiene acceso a curl, en cuyo caso se saltará a la función l__3.

Funciones l__1, l__2 y l__3

Las tres funciones hacen exactamente los mismo, pero de distinta forma. El objetivo es acceder a http://dbc.pinestry.com/rtk/get_url.php y devolver lo que dicha página nos devuelva.

Como podréis ver a través del código se hacen uso de las funciones round, sha1, mt_rand, etc. Ya lo pongo en los comentarios, y no parecen que tengan otra finalidad que la de simplemente distraer a los ojos de los curiosos.

Como comentaba al principio el otro fichero hace exactamente lo mismo, pero con una URL diferente. Aquí os dejo el código fuente:

Y para terminar, intenté varias veces acceder a la URL (http://dbc.pinestry.com/rtk/get_url.php), pero siempre me devuelve la palabra “BAD”. Lo intenté desde curl y a través de un pequeño script:

Bueno ya es bastante tarde para mi, así que lo dejo.