Hace unos días, escribí sobre un programa malicioso en PHP/JS que afectaba la plataforma osCommerce y empleaba una nueva técnica muy interesante para ofuscar el código malicioso. Hoy encontré un ejemplar más avanzado de un infector de PHP, también en una solución de comercio virtual.
Cuando llegué a trabajar hoy, un colega de nuestra oficina en Polonia me pidió que lo ayudara a encontrar un programa malicioso que estaba en la tienda online de su amigo. La página HTML, que se ve con el navegador, tenía un enlace a un script jquery.js en un dominio cx.cc generado al azar, aunque no había ninguna señal de este enlace en los archivos de origen del servidor. Fue fácil llegar a un veredicto: algún script PHP infectado estaba agregando el código de forma dinámica.
Analizamos todos los archivos PHP almacenados en el servidor y quedamos un poco confundidos: al principio no veíamos nada sospechoso. Pero, teniendo en mente el malware div_colors, comencé a estudiar el código línea por línea. Lo que por fin atrajo mi atención fue una pequeña función al principio de uno de los archivos PHP.
Este código debe su inocente apariencia a sus múltiples capas de ofuscación. La primera (y más complicada) es que la función finge que incluye comentarios. Si vemos esto con más detalle, notamos que las etiquetas de comentarios están ubicadas de forma errónea, comenzando el comentario al final de cada línea y cerrándolo al principio de otra. Es más fácil notarlo al usar el resaltador sintáctico. Otra cosa confusa es la descripción de la función que, con los nombres en el código, dan a entender que la función debería estar relacionada con algunas de las bibliotecas.
Y ahora lo más interesante: ¿Cómo funciona esta función? ¿Puede uno saberlo a primera vista? Aquí la clave es comprender lo que tenemos en los corchetes de la variable $session_key; “Nada” es la respuesta incorrecta 😉 Aunque no es muy obvio, hay mucho más que un gran espacio en blanco: Es una mezcla de espacios y tabuladores. Podemos notarlo con claridad cuando los caracteres que no son para impresión se ven en un editor.
La función divide esta mezcla de espacios en blanco en segmentos de 8 dígitos, y después cambia todos los caracteres TAB por “1” y todos los espacios por “0”. Así se obtiene el código binario, que después se transforma en el valor decimal e imprime como caracteres ASCII… ¡Muy innovador, Sr. escritor de virus!
La ejecución del archivo PHP que contiene esta función CoreLibrariesHandler(), produce un enlace malicioso adjunto al final de los archivos HTML:
El script redirige a otro script, que a su vez redirige a otro… y así sucesivamente, pero parece que el destino final ya está desconectado. Lo interesante es que la URL final es muy parecida a la del malware div_colors, lo que nos llevó a la conclusión de que ambos, div_colors y CoreLibraries, tienen el mismo origen.
Hemos agregado la firma para este script PHP a nuestra base de datos con el nombre de Trojan.PHP.Injecter.c.
Los peligrosos espacios en blanco