Análisis dinámico de DLLs maliciosas

 

En esta entrada del blog, el equipo de análisis de malware del UNAM-CERT mostrará una forma de cómo podría analizarse un tipo de archivo DLL utilizando herramientas ya conocidas y desarrolladas de forma propia.

 

Una DLL (Dynamic Library Link) o biblioteca de enlace dinámico, es un archivo que contiene bloques de código (funciones o métodos) que se ejecutan por solicitud de algún programa, es en ese momento cuando se carga en memoria.

Diferentes programas pueden utilizar simultáneamente una misma DLL, debido a su esquema modular. Por ello, la desinstalación de un programa podría afectar a otras aplicaciones que hicieran uso de bibliotecas compartidas.

 

 

El archivo DLL utilizado para este análisis, fue creado como prueba de concepto (PoC) con algunas acciones maliciosas que son comunes. A continuación, se muestra que el archivo "malicious.dll", efectivamente corresponde a una biblioteca de enlace dinámico con ayuda del comando "file" para Windows.

 

 

Con la herramienta "CFF Explorer" se puede obtener información importante como: el lenguaje de programación con el cual fue creado el archivo, su tamaño en bytes, sus firmas md5/sha1, el nombre original del archivo, entre otros.

 

Para el archivo "malicious.dll" se muestra la siguiente información:

 

 

Es recomendable que, así como a los archivos ejecutables sospechosos, a las DLLs maliciosas también se les realice un análisis de cadenas, con el fin obtener más información. En este caso, utilizando "BinText", se puede apreciar que manda a llamar la interfaz de línea de comandos de Windows con el argumento "C:\WINDOWS\system32\calc.exe", lo cual es un indicio de que la DLL contiene código que ejecutará el binario de la calculadora de Windows.

 

 

Al desensamblar la DLL con "IDA Pro", se puede corroborar que, una vez que se inyecta en un proceso, se ejecuta "calc.exe". La llamada al sistema "ShellExecuteA" lleva a cabo una operación en un archivo específico, en este caso, abrir la calculadora de Windows.

 

 

A diferencia de los programas ejecutables, no se puede hacer doble clic sobre los archivos DLL para correrlos, puesto que no son una entidad autónoma, por lo cual requieren de un proceso para operar. Los sistemas operativos Windows cuentan con una utilería llamada "rundll32.exe" (versión de 32 bits) para ejecutar archivos DLL. Sin embargo, las acciones maliciosas serán atribuidas al proceso "rundll32.exe", por lo que, si se utiliza "ProcessMonitor" para dar seguimiento a las acciones de la DLL maliciosa, el filtro por nombre del proceso deberá ser para "rundll32.exe".

 

A continuación se muestra el árbol de procesos:

 

 

También, puede presentarse un problema al correr una DLL con el comando "rundll32.exe", si es que la biblioteca de enlace dinámico valida el proceso en cual debe ser inyectada. Una solución podría ser renombrar la utilería "rundll32.exe" por el nombre del proceso objetivo, lo cual implicaría hacer una inspección más a fondo en su código ensamblador.

 

La inyección de DLLs, es la inserción de código de las bibliotecas de enlace dinámico en el espacio de direcciones de algún proceso, para que se pueda ejecutar. En nuestro laboratorio, utilizaremos la herramienta "DLL_Injector.exe" programada en Visual Basic y la herramienta "DLL_Shot.exe" programada en C#, ambas desarrollada por el equipo de análisis de malware.

 

·         DLL_Injector: herramienta de interfaz gráfica para inyectar una o varias DLLs en un proceso.

 

 
 

·         DLL_Shot: herramienta de interfaz gráfica para identificar las DLLs activas inyectadas tanto en el proceso del malware como en otros procesos objetivo. Lo anterior, es mediante la comparación de las bibliotecas de enlace dinámico activas en el sistema, antes y después de la ejecución de malware o inyección de DLLs.

 

 

Para analizar la DLL iniciamos las herramientas de monitoreo: "Process Explorer", "TCPView", "Regshot", "DLL_Injector" y "DLL_Shot".

 

 

1) Ejecutar el programa en el cual se inyectará la DLL maliciosa, por ejemplo en el "Bloc de notas"

 

 

2) Listar los procesos en el sistema, desde la herramienta "DLL_Injector", con el botón "List" y seleccionar el proceso objetivo

 

 

3) Buscar la DLL maliciosa con el botón "Browse ..."

 

 

4) Tomamos el primer shot, tanto con la herramienta "Regshot" como con la herramienta "DLL_Shot"

 

 

5) Inyectar la DLL en el proceso objetivo con el botón "Inject"

 

 

6) Observar la actividad de los procesos

 

 

7) Observar la actividad de red

 

 

8) Tomar el segundo shot de las herramientas del paso 4

 

 

9) Comparar resultados

 

 

10) Analizar resultados

 

- En el paso 6, la actividad de procesos muestra que a partir del proceso "notepad.exe" troyanizado se levanta el proceso "calc.exe".

 

- En el paso 7, el proceso troyanizado abre el "puerto local 50500" en modo escucha, lo cual es un indicio de "Backdoor"(puerta trasera).

- En el paso 9, la actividad en el sistema de archivos fue la creación de una carpeta y un archivo con extensión "txt". En cuanto a las DLLs, se aprecia que el archivo "malicious.dll" se inyectó correctamente en el proceso "notepad.exe" y también se muestra la DLL "netcfgx.dll" cargada por el proceso "svchost.exe", la cual tiene como descripción Network Configuration Objects (objetos de configuración de red), que involucra protocolos de red y es compartida por varias aplicaciones de Windows.

 

Finalmente, una forma de verificar si el puerto local 50500, que fue abierto en modo escucha, tiene un shell asociado, es utilizando desde otro equipo el comando "telnet". A continuación se muestra la obtención del "cmd" de Windows:

 

 

Se establece una conexión de red al puerto 50500 desde un equipo Linux y otra instancia del proceso troyanizado se queda en modo escucha: