Con este artículo, estamos completando una serie de publicaciones dedicadas al análisis de malware. En la
primera parte, realizamos un análisis detallado del archivo infectado recibido por correo por una empresa europea y encontramos el spyware AgentTesla allí. La
segunda parte describió los resultados de un análisis por fases del módulo principal AgentTesla.
Hoy, Ilya Pomerantsev, especialista en análisis de malware de CERT Group-IB, hablará sobre la primera etapa del análisis de malware: desempaquetado semiautomático de muestras de AgentTesla utilizando tres mini casos de la práctica de expertos de CERT Group-IB.
Por lo general, la primera etapa en el análisis de malware es la eliminación de la protección en forma de empaquetador, criptor, banda de rodadura o cargador de arranque. En la mayoría de los casos, este problema se resuelve iniciando el malware y volcando, pero hay situaciones en las que este método no es adecuado. Por ejemplo, si el malware es un encriptador, si protege sus regiones de memoria de un volcado, si el código contiene mecanismos para detectar una máquina virtual, o si, inmediatamente después de iniciarse, el malware realiza un reinicio. En tales casos, se utiliza el llamado desempaque "semiautomático", es decir, el investigador controla completamente el proceso y puede intervenir en cualquier momento. Considere este procedimiento utilizando tres muestras de la familia AgentTesla como ejemplo. Este es un malware relativamente inofensivo si deshabilita su acceso a la red.
Muestra número 1
El archivo fuente es un documento de MS Word que explota la vulnerabilidad CVE-2017-11882.
Como resultado, la carga útil se carga y se inicia.
El análisis del árbol de procesos y los marcadores de comportamiento muestra una inyección en el proceso
RegAsm.exe .
Los marcadores de comportamiento específicos de AgentTesla están disponibles.
La muestra descargada es un archivo
.NET ejecutable protegido por el protector del
Reactor .NET .
Ábralo en la utilidad
dnSpy x86 y avance al punto de entrada.
Entrando en la función
DateTimeOffset , encontramos el código de inicialización para el nuevo módulo
.NET . Pon un
punto de
interrupción en la línea de interés para nosotros y ejecuta el archivo.
En uno de los búferes devueltos, puede ver la firma MZ (
0x4D 0x5A ). Guárdalo
Un archivo ejecutable volcado es una biblioteca dinámica, que es un cargador, es decir extrae la carga útil de la sección de recursos y la inicia.
Al mismo tiempo, los recursos necesarios en sí mismos no están disponibles en el volcado. Están en la muestra principal.
La utilidad
dnSpy tiene dos características extremadamente útiles que nos ayudarán a crear rápidamente un Frankenstein a partir de dos archivos vinculados.
- El primero le permite "pegar" una biblioteca dinámica en la muestra principal.

- El segundo es reescribir el código de función en el punto de entrada para llamar al método deseado de la biblioteca dinámica insertada.
Guardamos nuestro "Frankenstein", colocamos un
punto de
interrupción en la línea que devuelve el búfer con los recursos descifrados y volcamos, por analogía con la etapa anterior.
El segundo volcado es un archivo ejecutable escrito en
VB.NET que está protegido por el protector
ConfuserEx que
conocemos .
Después de quitar la banda de rodadura, usamos las reglas de YARA previamente escritas y nos aseguramos de que el malware desempaquetado sea de hecho AgentTesla.
Muestra número 2
El archivo fuente es un documento de MS Excel. La macro incorporada conduce a la ejecución de código malicioso.
Como resultado, se inicia el script de PowerShell.
El script descifra el código en C # y le transfiere el control. El código en sí es un cargador, que también se ve en el informe de sandbox.
La carga útil es un archivo ejecutable
.NET .
Al abrir el archivo en
dnSpy x86 , puede ver que está ofuscado. Elimine la ofuscación con la utilidad
de4dot y vuelva al análisis.
Durante la investigación de código, puede descubrir la siguiente función:
Las cadenas codificadas
EntryPoint e
Invoke son
sorprendentes . Ponemos el
punto de
interrupción en la primera línea, comenzamos y
guardamos el valor del búfer
byte_0 .
El volcado es nuevamente una
aplicación .NET y está protegido por
ConfuserEx .
Elimine la ofuscación con
de4dot y cárguelo en
dnSpy . Entendemos por la descripción del archivo que encontramos el
cargador CyaX-Sharp .
Este gestor de arranque tiene una amplia funcionalidad anti-análisis.
Esta funcionalidad incluye eludir los sistemas de protección integrados de Windows, deshabilitar Windows Defender, así como los mecanismos para detectar sandboxes y máquinas virtuales. Es posible cargar la carga útil desde la red o almacenarla en la sección de recursos. El lanzamiento se realiza mediante una inyección en el propio proceso, en un duplicado del propio proceso, o en los procesos
MSBuild.exe ,
vbc.exe y
RegSvcs.exe , según el parámetro elegido por el atacante.
Sin embargo, para nosotros son menos importantes que la función
AntiDump agregada por
ConfuserEx . Su código fuente se puede encontrar en
GitHub .
Para deshabilitar la protección, use la
función dnSpy , que le permite editar el código
IL .
Guardamos y ponemos un
punto de
interrupción en la línea de llamada de la función de descifrado de carga útil. Está en el constructor de la clase principal.
Inicie y descargue la carga útil. Usando las reglas de YARA previamente escritas, nos aseguramos de que tengamos AgentTesla.
Muestra número 3
El archivo fuente es un archivo ejecutable
VB Native PE32 .
Un análisis de entropía muestra la presencia de un gran fragmento de datos cifrados.
Al analizar el formulario de solicitud en
VB Decompiler, puede observar un extraño fondo de píxeles.
La gráfica de entropía de la imagen
bmp es idéntica a la gráfica de entropía del archivo fuente, y el tamaño es 85% del tamaño del archivo.
La vista general de la imagen indica el uso de esteganografía.
Prestemos atención a la apariencia del árbol de procesos, así como a la presencia de un marcador de inyección.
Esto indica desembalaje. Para los cargadores en Visual Basic (también
conocido como
VBKrypt o
VBInjector ) es típico usar
shellcode para inicializar la carga útil, así como para ejecutar la inyección en sí.
El análisis en el
VB Decompiler reveló la presencia del evento
Load en el formulario
FegatassocAirballoon2 .
Vayamos a
IDA pro en la dirección especificada y estudiemos la función. El código está muy ofuscado. El fragmento que nos interesa se presenta a continuación.
Aquí es donde se escanea el espacio de direcciones del proceso en busca de firmas. Este enfoque es extremadamente dudoso.
Primero, la dirección de inicio del escaneo es
0x400100 . Este valor es estático y no se ajusta cuando se desplaza la base. En condiciones ideales de invernadero, apuntará al final del encabezado
PE del archivo ejecutable. Sin embargo, la base de datos no es estática, su valor puede cambiar y la búsqueda de la dirección real de la firma deseada, aunque no hace que la variable se desborde, puede llevar mucho tiempo.
En segundo lugar, el valor de la firma
iWGK . Creo que es obvio que 4 bytes es demasiado pequeño para garantizar la unicidad. Y si tiene en cuenta el primer punto, la probabilidad de cometer un error es bastante alta.
De hecho, el fragmento deseado se adjunta al final de la imagen
bmp encontrada previamente en el desplazamiento
0xA1D0D .
Shellcode se ejecuta en dos etapas. El primero descifra el cuerpo principal. En este caso, la clave está determinada por una búsqueda exhaustiva.
Volcar el
Shellcode descifrado y mirar las líneas.
Primero, ahora conocemos la función para crear un proceso hijo:
CreateProcessInternalW .
En segundo lugar, nos dimos cuenta del mecanismo de consolidación en el sistema.
De vuelta al proceso original. Establezca el
punto de
interrupción en
CreateProcessInternalW y continúe la ejecución. A continuación, observamos el paquete
NtGetContextThread / NtSetContextThread , que cambia la dirección del inicio de la ejecución a la dirección de
ShellCode .
El depurador nos conecta con el proceso creado,
activamos el evento Suspender en la carga / descarga de la biblioteca, reanudamos el proceso y esperamos la carga de las bibliotecas
.NET .
Luego, usando
ProcessHucker, volcamos las regiones que contienen la aplicación
.NET desempaquetada.
Paramos todos los procesos y eliminamos la copia de malware que se corrige en el sistema.
El archivo de volcado está protegido por el protector
.NET Reactor , que puede eliminarse fácilmente con la utilidad
de4dot .
Usando las reglas de YARA previamente escritas, nos aseguramos de tener a AgentTesla frente a nosotros.
Para resumir
Entonces, demostramos en detalle el proceso de desempaque semiautomático de muestras usando el ejemplo de tres mini-casos, y también analizamos el malware en base a un caso completo, descubriendo que la muestra bajo investigación es AgentTesla, configurando su funcionalidad y una lista completa de indicadores de compromiso.
El análisis del objeto malicioso que realizamos requiere mucho tiempo y esfuerzo, y este trabajo debe ser realizado por un empleado especial de la empresa, pero no todas las empresas están listas para mantener un analista en el personal.
Uno de los servicios prestados por el Laboratorio de análisis forense de computadoras y análisis de códigos maliciosos del Grupo IB es la respuesta a incidentes cibernéticos. Y para que los clientes no pierdan el tiempo coordinando documentos y discutiendo en medio de un ciberataque, Group-IB lanzó el
Receptor de respuesta a incidentes , un servicio de respuesta a incidentes previo a la suscripción que también incluye un paso de análisis de código malicioso. Más información sobre esto se puede encontrar
aquí .
Si desea estudiar una vez más cómo se desempaquetan las muestras de AgentTesla y ver cómo lo hace el especialista de CERT Group-IB, puede descargar la grabación del seminario web sobre este tema
aquí .