En esta parte de la serie de artículos, veremos cómo podemos observar el funcionamiento interno de un malware. En la parte 1 y parte 2 hemos trabajado en el análisis del comportamiento del ejemplar. En este artículo, veremos el nivel de código del espécimen analizado en la Parte 2.
Usaremos OllyDbg y cargaremos la muestra en él. Tan pronto como se carga la muestra, echemos un vistazo a los nombres (tipos de cadenas, funciones importadas, etc.). A continuación se muestra una instantánea de la ventana Nombres en ollydbg para este espécimen.
¡Conviértete en un ingeniero inverso certificado!
Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender
Es bueno que veamos referencias a ReadFile y CryptDecrypt. Parece que el espécimen está intentando leer algún archivo y también llamar a la función de descifrado de Windows. Si recuerdas, vimos una versión cifrada de un archivo .tmp en la Parte 2. Para ver si nuestra comprensión es correcta o no, veamos las referencias de ReadFile.
Luego síguelo en el desensamblador.
Debajo de lo que podemos ver está la referencia de ReadFile en el código.
Necesitamos observar qué es la lectura de ReadFile, por lo que debemos colocar un punto de interrupción en esta declaración. Después de colocar un punto de interrupción, ejecutamos el ejemplo y a continuación se muestra el contenido de la pila.
Según la documentación de la función Microsoft ReadFile, hFile es «un identificador del dispositivo (por ejemplo, un archivo, secuencia de archivos, disco físico, volumen, búfer de consola, unidad de cinta, socket, recurso de comunicaciones, ranura de correo o tubería)». Esto significa que es un puntero a un archivo. Miremos los identificadores y veamos en qué se resuelve este identificador:
Bingo, esto es lo que esperábamos que leyera el archivo .tmp. Sin embargo, el contenido de este archivo .tmp está cifrado y, por lo tanto, no sabemos qué hace el malware en el sistema subyacente. Recuerde que hemos visto una función llamada CryptDecrypt que podría revelar el contenido de este archivo .tmp.
Descubra la función CryptDecrypt (la forma más sencilla es ir a la ventana Nombres buscar referencias y luego seguir en el desensamblador). A continuación se muestra la función CryptDecrypt, necesitamos ver qué devuelve esta función, por lo que colocaremos el punto de interrupción en la instrucción justo después de la función cryptdecrypt donde la función verifica el valor en eax y haremos el salto respectivo.
¿Por qué eax? Debido a que eax contiene el valor de retorno de la función y según la documentación de CryptDecrypt, si la función tiene éxito, la función devuelve un valor distinto de cero, que es exactamente nuestro caso.
Al mirar la pila de estos, encontramos el siguiente texto ASCII. ¿Recuerdas ads.php? Sí, era la URL que el espécimen intentaba preguntar a través de un GET.
Estos son, de hecho, el contenido del archivo .tmp. Sin embargo, dado que nuestro servidor web no contiene ningún archivo ads.php, el espécimen no pudo completar la acción ni recibir ningún comando del servidor. Solucionaremos esto, pero primero debemos decodificar la respuesta del espécimen que vimos anteriormente que está encriptada. En la URL anterior, vemos un parámetro codificar=5b que podría ser la clave; el autor está utilizando para ofuscar el contenido.
Es común encontrar al autor usando una clave de un byte en algoritmos como XOR, ROT, ROR, etc. Si recuerda, hemos guardado el contenido anteriormente, pero para un resumen rápido, a continuación hay contenido ofuscado que debemos desofuscar. .
Primero convertiremos el archivo a formato sin formato y luego usaremos una utilidad traducir.py con ‘byte ^ 0x5b’ para decidir el contenido.
Además, lo encontramos a continuación en decodedtest.txt.
Bien, ahora sabemos que el malware está enumerando el sistema para ejecutar servicios. Sin embargo, ¿cómo se desencadena esto? Si recordamos, vimos lo siguiente en el archivo .tmp.
Parece que el malware está intentando salirse con la suya con algunas firmas de comandos y está usando cexe como alias para exec, tixe como alias para la salida, etc. Dado que el malware busca ads.php, crearemos una página representativa en nuestro trozo del servidor web.
Según nuestra suposición, cexe es un alias de exec, por lo que debería usar una ruta ejecutable como argumento. Este será un comando que se pasará a través de ads.php al espécimen para ejecutarlo en el sistema. Creamos esta página en nuestro servidor web.
Resultando en
Luego ejecutamos la muestra y enrutamos el tráfico utilizando fakedns. Observamos los siguientes paquetes.
Además, como era de esperar, el malware comienza a ejecutar calc.exe en el host en un intervalo de 30 segundos (suspensión = 30000).
¡Conviértete en un ingeniero inverso certificado!
Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender
Así que eso es todo: acumulamos una buena cantidad de IoC y ahora entendíamos bien el funcionamiento de la muestra de malware. Para reiterar, debemos trabajar paso a paso y darle al malware lo que necesita y luego analizar el resultado de la acción.