Banner 1

Analizando un trozito de memoria

Una gran entrada de neo:

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 :)

Fuente:http://neosysforensics.blogspot.com/2013/06/analizando-un-trozito-de-memoria.html

No hay comentarios:

Powered by Bad Robot
Helped by Blackubay