martes, 11 de junio de 2013

Analizando un trozito de memoria

El contenido de este artículo se corresponde con mi propuesta de solución a la prueba de análisis forense planteada por el inteco. Los ficheros correspondientes a cada una de las pruebas, incluyendo el volcado de la memoria ram utilizado en este análisis, estan disponibles gracias a un compañero de la lista de correo de la rooted desde el siguiente enlace.

Importante recalcar que he tenido que modificar e incluso en ocasiones eliminar información que considero superflua para adaptarme a las limitaciones de formato impuestas por el tema del blog.

Indicar si la máquina está comprometida y en caso afirmativo con qué tipo de código malicioso, aportando las pruebas encontradas del mismo.[15%]

La máquina ha sido comprometida y para ocultar la ejecución de determinados comandos a la vista de un posible análisis del sistema "en caliente" se ha utilizado el rootkit FUto.

Analizando mediante volatility el listado de los procesos que se encontraban en ejecución en el sistema en el momento de realizar el volcado de la memoria física obtenemos:

# python vol.py -f imagen.dd pslist
Volatile Systems Volatility Framework 2.3_beta
Offset(V) Name PID PPID Thds Hnds Start
---------- ----------------- ------ ------ ------ -------- --------------------------
0x81233bd0 System 4 0 49 234
0x810dc368 smss.exe 524 4 3 19 2009-10-24 10:48:21 UTC+0
0x810d89a0 csrss.exe 596 524 10 231 2009-10-24 10:48:26 UTC+0
0x810be578 winlogon.exe 620 524 18 491 2009-10-24 10:48:27 UTC+0
0x810ec620 services.exe 664 620 14 235 2009-10-24 10:48:28 UTC+0
0xffb78150 lsass.exe 676 620 14 268 2009-10-24 10:48:29 UTC+0
0xffb538e0 vmacthlp.exe 844 664 1 24 2009-10-24 10:48:31 UTC+0
0x810cb1d0 svchost.exe 892 664 6 117 2009-10-24 10:48:33 UTC+0
0x810d3460 svchost.exe 960 664 9 193 2009-10-24 10:48:33 UTC+0
0x810d9a78 svchost.exe 1068 664 23 463 2009-10-24 10:48:34 UTC+0
0x810a2c90 svchost.exe 1096 664 6 60 2009-10-24 10:48:34 UTC+0
0xffb44638 svchost.exe 1220 664 10 153 2009-10-24 10:48:34 UTC+0
0xffb37278 VMwareService.e 1452 664 3 129 2009-10-24 10:48:37 UTC+0
0xffb7e4b8 explorer.exe 1704 1680 12 274 2009-10-24 10:51:05 UTC+0
0xffb19228 VMwareTray.exe 1780 1704 1 26 2009-10-24 10:51:07 UTC+0
0xffb17210 VMwareUser.exe 1788 1704 4 72 2009-10-24 10:51:07 UTC+0
0xffb153c0 cmd.exe 1012 1704 1 20 2009-10-24 11:01:34 UTC+0
0x81067da0 win32dd.exe 1020 1012 1 21 2009-10-24 11:01:34 UTC+0

De la salida anterior, similar al resultado obtenido mediante el administrador de tareas de Windows, podemos concluir que se ha utilizado el binario win32dd.exe para realizar el volcado de la memoria. Dado que dicho binario se ejecuta desde la línea de comandos tiene sentido la aparición de un proceso de nombre cmd.exe. Para confirmar este punto, y de nuevo mediante volatility, comprobaremos los programas ejecutados en el sistema desde la "shell":
# python vol.py -f imagen.dd cmdscan
Volatile Systems Volatility Framework 2.3_beta
**************************************************
CommandProcess: csrss.exe Pid: 596
CommandHistory: 0x4e50d8 Application: cmd.exe Flags: Allocated
CommandCount: 0 LastAdded: -1 LastDisplayed: -1
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0x2a4
Cmd #0 @ 0xfc32d8: Nd \Malware\FUto
Cmd #1 @ 0x4e2328: Ntart nc -d -L -p 31337 -e cmd.exe
Cmd #2 @ 0x4e2a10: N?N?
Cmd #3 @ 0x4e9068: Netstat -a ?N???N?N
Cmd #4 @ 0x4e91a0: ??
Cmd #5 @ 0x4e9cf8: in32dd.exe
Cmd #6 @ 0x4e1eb8: N?N?
Cmd #7 @ 0x4e2ce8: N?N-phd msdirectx.sys
Cmd #8 @ 0x4e9e38: md.exe
**************************************************
CommandProcess: csrss.exe Pid: 596
CommandHistory: 0xfcf400 Application: win32dd.exe Flags: Allocated
CommandCount: 0 LastAdded: -1 LastDisplayed: -1
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0x330

Obtenemos nuevos datos que constituyen nuevas vías de investigación. Parece que se han lanzado programas cuya ejecución se ha ocultado mediante el uso del rootkit FUto.

Confirmaremos este punto utilizando como cadena de búsqueda la ruta "\Malware\FUto":
# python vol.py -f imagen.dd filescan | grep Malware
Volatile Systems Volatility Framework 2.3_beta
Offset(P) #Ptr #Hnd Access Name
---------- ------ ------ ------ ----
0x00d14f90 1 0 R--r-d \Device\HarddiskVolume1\Malware\FUto\fu.exe
0x01d5e828 1 1 R--rw- \Device\HarddiskVolume1\Malware\FUto
0x027f0f00 1 0 R--r-d \Device\HarddiskVolume1\Malware\FUto\nc.exe

NOTA: la salida del comando anterior no mostraba la cabecera, la cual se ha incluido para facilitar el análisis de los resultados obtenidos.

¿Tiene procesos, bibliotecas o módulos ocultos en el sistema? En caso afirmativo indicar cuales con todos los detalles de los mismos y los métodos de detección utilizados.[30%]

Tal como se extrajo de la respuesta a la pregunta anterior es obvio que existen al menos un proceso y un modulo/driver en ejecución pero ocultos por acción del citado rootkit. Para confimar la ejecución de netcat utilizaremos volatility mediante un comando diferente, el cual realiza un listado más exhaustivo de los procesos en ejecución:
# python vol.py -f imagen.dd psxview
Volatile Systems Volatility Framework 2.3_beta
Offset(P) Name PID pslist psscan thrdproc pspcid csrss session deskthrd
---------- ----------------- ------ ------ ------ -------- ------ ----- ------- --------
0x010a6620 services.exe 664 True True True True True True True
0x004038e0 vmacthlp.exe 844 True True True True True True True
0x02dfd278 VMwareService.e 1452 True True True True True True True
0x03da03c0 cmd.exe 1012 True True True True True True True
0x02086638 svchost.exe 1220 True True True True True True True
0x00ae3850 nc.exe 408 False True True False True True True
0x0108d460 svchost.exe 960 True True True True True True True
0x0105cc90 svchost.exe 1096 True True True True True True True
0x03e4a228 VMwareTray.exe 1780 True True True True True True True
0x009e3150 lsass.exe 676 True True True True True True True
0x01093a78 svchost.exe 1068 True True True True True True True
0x01021da0 win32dd.exe 1020 True True True True True True True
0x010851d0 svchost.exe 892 True True True True True True True
0x03b6d210 VMwareUser.exe 1788 True True True True True True True
0x01078578 winlogon.exe 620 True True True True True True True
0x00d144b8 explorer.exe 1704 True True True True True True True
0x010929a0 csrss.exe 596 True True True True False True True
0x01096368 smss.exe 524 True True True True False False False
0x011edbd0 System 4 True True True True False False False

La cabecera informa del tipo de análisis utilizado para realizar el listado de procesos y la aparición de "False" determina si dicho método consigue detectar el proceso en cuestión. Concretamente para netcat la columna correspondiente al listado del comando pslist, ejecutado en la sección anterior, confirma que no es capaz de detectarlo lo que explica que no pudieramos verlo.

Veamos ahora si existe algún modulo/driver oculto, utilizando como cadena de búsqueda datos extraídos de los comandos ejecutados desde cmd.exe:
# python vol.py -f imagen.dd modscan | grep Malware
Volatile Systems Volatility Framework 2.3_beta
Offset(P) Name Base Size File
---------- -------------- ---------- -------- ----
0x0112e688 msdirectx.sys 0xfc3b6000 0x10000 \??\C:\Malware\FUto\msdirectx.sys

NOTA: la salida del comando anterior no mostraba la cabecera, la cual se ha incluido para una mayor claridad en el análisis de los resultados obtenidos.

Enlace a Rootkit.c, el cual forma parte de FUto y se correspondería, una vez compilado, con el driver msdirectx.sys en cuestión.

¿Existe algún tipo de indicio de comunicaciones en el sistema que permitan el control remoto del mismo? En caso afirmativo explicar detalladamente. (direcciones IP, puertos, procesos, ruta de los ficheros implicados, comandos ejecutados, privilegios en el sistema, etc.)[20%]

No se detectan conexiones en curso en el momento en que se obtuvo el volcado de la memoria física del sistema, para lo cual ha vuelto a ejecutarse volatility:
# python vol.py -f imagen.dd connscan
Volatile Systems Volatility Framework 2.3_beta
Offset(P) Local Address Remote Address Pid
---------- ----------------- ------------------ -----

Lo que no significa que no puedan establecerse, de hecho esa es la finalidad de la ejecución del comando netcat, brindar una shell del sistema a cualquiera que se conecte al puerto 31337 TCP de la máquina comprometida:
# python vol.py -f imagen.dd sockscan
Volatile Systems Volatility Framework 2.3_beta
Offset(P) PID Port Proto Protocol Address Create Time
---------- ----- ------ ------ ---------- --------------- -------------------------
0x01020a78 4 445 6 TCP 0.0.0.0 2009-10-24 10:48:21 UTC+0
0x01020cc0 4 445 17 UDP 0.0.0.0 2009-10-24 10:48:21 UTC+0
0x01021538 1220 1900 17 UDP 127.0.0.1 2009-10-24 10:51:13 UTC+0
0x01056d80 960 135 6 TCP 0.0.0.0 2009-10-24 10:48:34 UTC+0
0x010e7500 4 137 17 UDP 192.168.150.130 2009-10-24 10:48:37 UTC+0
0x01109bf0 4 139 6 TCP 192.168.150.130 2009-10-24 10:48:37 UTC+0
0x0110c3c0 4 138 17 UDP 192.168.150.130 2009-10-24 10:48:37 UTC+0
0x01130cc0 1220 1900 17 UDP 192.168.150.130 2009-10-24 10:51:13 UTC+0
0x011c7508 408 31337 6 TCP 0.0.0.0 2009-10-24 10:56:47 UTC+0
0x0264babc 0 7266 8456 - 128.206.46.0 -
0x02a49608 1068 123 17 UDP 127.0.0.1 2009-10-24 10:48:38 UTC+0
0x02a49a40 1068 123 17 UDP 192.168.150.130 2009-10-24 10:48:38 UTC+0

La salida anterior confirma la asociación del puerto 31337 TCP con el PID 408 (nc.exe) y el comando ejecutado desde al consola del sistema así lo confirma:
# python vol.py -f imagen.dd cmdscan | grep nc
Volatile Systems Volatility Framework 2.3_beta
Cmd #1 @ 0x4e2328: Ntart nc -d -L -p 31337 -e cmd.exe

Extraiga los ficheros maliciosos identificados en el sistema e indique los hash (SHA256) de los mismos y la ruta donde están ubicados en el disco duro de la máquina.[20%]

No resulta posible volcar el binario de netcat desde la memoria ya que el comando de volatility utilizado para ello indica que la página de memoria donde se encontraba almacenado ha sido paginada:
# python vol.py -f imagen.dd filescan | grep nc.exe
Volatile Systems Volatility Framework 2.3_beta
0x027f0f00 1 0 R--r-d \Device\HarddiskVolume1\Malware\FUto\nc.exe


# python vol.py -f imagen.dd psscan | grep nc
Volatile Systems Volatility Framework 2.3_beta
0x00ae3850 nc.exe 408 388 0x00cba000 2009-10-24 10:56:47 UTC+0000


# python vol.py -f imagen.dd procexedump -p 408 -o 0x00ae3850 -D evidencias/
Volatile Systems Volatility Framework 2.3_beta
Process(V) ImageBase Name Result
---------- ---------- --------- ------
0xffaf6850 0x00400000 nc.exe Error: ImageBaseAddress at 0x400000 is paged

Sin embargo no ocurre lo mismo con el driver msdirectx.sys:
# python vol.py -f imagen.dd modscan | grep msdirectx.sys
Volatile Systems Volatility Framework 2.3_beta
0x0112e688 msdirectx.sys 0xfc3b6000 0x10000 \??\C:\Malware\FUto\msdirectx.sys


# python vol.py -f imagen.dd moddump --base=0xfc3b6000 -D evidencias/
Volatile Systems Volatility Framework 2.3_beta
Module Base Module Name Result
----------- -------------------- ------
0x0fc3b6000 UNKNOWN OK: driver.fc3b6000.sys


# cd evidencias/
# shasum -a 256 driver.fc3b6000.sys
a9af6231ed5b6f9a8c7e0a10b6d26a5f052b91a98436dddc5f6b1b02e5edf6ec driver.fc3b6000.sys

Enlace al análisis del fichero volcado utilizando virustotal.

Explicar cómo tiene persistencia en el sistema, aportando las evidencias encontradas.[15%]

No conozco en detalle el funcionamiento del rootkit en cuestión, pero entiendo que lo más obvio sería garantizar su ejecución tras cada reinicio del sistema mediante el registro de Windows. Puede confirmarse que existe una clave para el servicio/driver msdirectx, pero su ejecución aparece como deshabilitada (parámetro Start de la salida mostrada a continuación):
# python vol.py -f imagen.dd printkey -K "ControlSet001\Services\msdirectx"
Volatile Systems Volatility Framework 2.3_beta
Legend: (S) = Stable (V) = Volatile


----------------------------
Registry: \Device\HarddiskVolume1\WINDOWS\system32\config\system
Key name: msdirectx (S)
Last updated: 2009-10-24 10:59:17 UTC+0000


Subkeys:
(S) Security
(V) Enum


Values:
REG_DWORD Type : (S) 1
REG_DWORD Start : (S) 4
REG_DWORD ErrorControl : (S) 1
REG_EXPAND_SZ ImagePath : (S) \??\C:\Malware\FUto\msdirectx.sys
REG_SZ DisplayName : (S) msdirectx
REG_DWORD DeleteFlag : (S) 1

En cuanto al backdoor mediante la ejecución de netcat sirviendo una shell en el puerto 31337 lo más logico sería ejecutar dicho comando desde la clave del registro que determina las aplicaciones que se ejecutan con el inicio del sistema, o incluso utilizando la clave asociada a Winlogon, pero no resulta posible confirmar ninguna de las hipotesis anteriores dado que la clave del registro correspondiente a HKLM\Software no estaba cargada en memoria cuando se obtuvo el fichero de volcado proporcionado.

Registro de Windows, svchost y malware.

Despedida y cierre

Tal como he comentado al principio ésta es mi solución, y no tiene porque ser la correcta, o al menos no todo lo correcta que debería, así que ya sabes, se aceptan todo tipo de críticas ... eso sí, preferiblemente constructivas :)

2 comentarios:

Jesus dijo...

Hola,

Muy buen análisis, sobre el problema de sacar el nc.exe a través de Redline (http://www.mandiant.com/resources/download/redline) podemos extraerlo.

Un saludo,

neofito dijo...

¡Muchas gracias por el aporte Jesús!

Lo cierto es que lo probé cuando todavía se llamaba "Memorize" (el articulo debe estar por el blog) y desde entonces como que lo tengo un poco abandonado.

Saludos