jueves, 29 de abril de 2010

Otro análisis más (y van 4) - Parte I

En este caso la imagen utilizada es la del Honenynet Forensic Challenge 2010/3, al que he presentado mi solución, y que ganar no ganaré, ni de coña vamos, pero que me ha servido para aprender mucho y de paso quitarme algunos miedos.

La historia, "Banking Troubles", es simple: usuario X de la empresa Y recibe un correo de un compañero apuntando a un fichero PDF el cual abre. Nada destacable hasta aquí, pero a partir de ese momento empieza a detectar movimientos extraños en su cuenta bancaria. ¿Qué ha pasado?

El entorno que voy a utilizar, como casi siempre, consiste en un host Windows Vista y un guest con Ubuntu Linux corriendo en VMware Server. Bajo Linux mi querido framework Volatility en su versión 1.3.2, la última revisión disponible desde svn y me temo que la última definitivamente, ya que los esfuerzos parecen centrados en el desarrollo de la versión 1.4. No obstante he preferido quedarme con ésta ya que tengo listos para ser utilizados todos los plugins publicados hasta la fecha y de momento me siento más cómodo.

Lo primero descargar la imagen, desempaquetarla y verificar la suma de comprobación:

# wget http://www.honeynet.org/challenge2010/downloads/hn_forensics.tgz
# echo "8178921fd065ad2de9c6738fe062d2b37402c04a *hn_forensics.tgz" | sha1sum -c -
hn_forensics.tgz: La suma coincide
# tar xvzf hn_forensics.tgz
Bob.vmem

y para asegurarnos que es compatible con el análisis mediante Volatility vamos a obtener información general de la misma:
# python volatility ident -f Bob.vmem
Image Name: Bob.vmem
Image Type: Service Pack 2
VM Type: pae
DTB: 0x319000
Datetime: Sat Feb 27 15:12:38 2010

Hasta aquí todo bién, así que vamos al lío.

En el principio creó System los procesos y los threads

Vamos a ver que se estaba ejecutando en el sistema en el momento de obtener el volcado o mejor dicho, y dado que se trata del fichero de memoria de una máquina virtual, en el momento en que ésta se detuvo:
# python volatility psscan2 -f Bob.vmem
PID PPID Time created Time exited Offset PDB Remarks
------ ------ ------------------------ ------------------------ ---------- ---------- ----------------
 
440 1040 Sat Feb 27 19:48:49 2010 0x01e80c78 0x04040240 wuauclt.exe
1108 1756 Fri Feb 26 03:34:39 2010 0x01ea96f0 0x04040180 VMwareTray.exe
1756 1660 Fri Feb 26 03:34:38 2010 0x01edd790 0x04040260 explorer.exe
452 244 Fri Feb 26 03:46:07 2010 Fri Feb 26 03:46:28 2010 0x01ee1af8 0x04040320 msiexec.exe
1132 1040 Fri Feb 26 03:34:40 2010 0x01eee5f8 0x040402a0 wscntfy.exe
852 688 Fri Feb 26 03:34:06 2010 0x01f3f020 0x040400c0 vmacthlp.exe
1836 688 Fri Feb 26 03:34:34 2010 0x01fdd8d0 0x040401e0 VMUpgradeHelper
1460 688 Fri Feb 26 03:34:10 2010 0x01fde568 0x040401a0 spoolsv.exe
1244 688 Fri Feb 26 03:34:08 2010 0x01fe55f0 0x04040160 svchost.exe
1100 688 Fri Feb 26 03:34:07 2010 0x01fea020 0x04040140 svchost.exe
644 548 Fri Feb 26 03:34:04 2010 0x0205b2e8 0x04040060 winlogon.exe
548 4 Fri Feb 26 03:34:02 2010 0x02104228 0x04040020 smss.exe
1752 888 Sat Feb 27 20:12:23 2010 0x022618c8 0x04040300 AcroRd32.exe
888 1756 Sat Feb 27 20:11:53 2010 0x02268020 0x04040380 firefox.exe
1116 1756 Fri Feb 26 03:34:39 2010 0x022cd5c8 0x04040280 VMwareUser.exe
2024 688 Fri Feb 26 03:34:35 2010 0x022d6b88 0x04040200 alg.exe
1628 688 Fri Feb 26 03:34:25 2010 0x023018b0 0x040401c0 vmtoolsd.exe
700 644 Fri Feb 26 03:34:06 2010 0x02329da0 0x040400a0 lsass.exe
1384 688 Sat Feb 27 20:12:36 2010 0x02409640 0x040402e0 svchost.exe
232 1040 Sat Feb 27 19:49:11 2010 0x0241a020 0x04040220 wuauclt.exe
688 644 Fri Feb 26 03:34:05 2010 0x02456da0 0x04040080 services.exe
880 688 Fri Feb 26 03:34:07 2010 0x02466870 0x040400e0 svchost.exe
948 688 Fri Feb 26 03:34:07 2010 0x024e1da0 0x04040100 svchost.exe
1040 688 Fri Feb 26 03:34:07 2010 0x024ea020 0x04040120 svchost.exe
612 548 Fri Feb 26 03:34:04 2010 0x024eeda0 0x04040040 csrss.exe
244 688 Fri Feb 26 03:46:06 2010 0x02533620 0x040402c0 msiexec.exe
4 0 0x025c8830 0x00319000 System

Todo apunta a que el proceso sospechoso es AcroRd32 ya que el enunciado del challenge mencionaba claramente un documento PDF. Si a esto le sumamos los numerosos incidentes en las últimas fechas relacionados con este tipo de formato parece que ya tenemos nuestra primera pista. Veamos ahora las conexiones TCP/IP establecidas:
# python volatility connscan2 -f Bob.vmem
Local Address Remote Address Pid
------------------------- ------------------------- ------
192.168.0.176:1176 212.150.164.203:80 888
192.168.0.176:1189 192.168.0.1:9393 1244
192.168.0.176:2869 192.168.0.1:30379 1244
192.168.0.176:2869 192.168.0.1:30380 4
0.0.0.0:0 80.206.204.129:0 0
127.0.0.1:1168 127.0.0.1:1169 888
192.168.0.176:1172 66.249.91.104:80 888
127.0.0.1:1169 127.0.0.1:1168 888
192.168.0.176:1171 66.249.90.104:80 888
192.168.0.176:1178 212.150.164.203:80 1752
192.168.0.176:1184 193.104.22.71:80 880
192.168.0.176:1185 193.104.22.71:80 880

Para verlo más claro asociemos nombres a los procesos basándonos en los Pids:
# python volatility pslist -f Bob.vmem | awk '$2 ~ /^(4|88[8|0]|1244|1752)$/ {print $2 "\t" $1}'
4 System
880 svchost.exe
1244 svchost.exe
888 firefox.exe
1752 AcroRd32.exe

Y para obtener nuestra siguiente pista utilicemos la técnica; una timeline (aka orden de sucesos) nos aclarará mucho las ideas, pero para eso necesitamos nuevas marcas de tiempo. El único comando de volatility que nos queda con esas características nos dará el listado de sockets abiertos tal que:
# python volatility sockscan2  -f Bob.vmem
PID Port Proto Create Time Offset
------ ------ ------ -------------------------- ----------
888 1168 6 Sat Feb 27 20:11:53 2010 0x01e6cd80
4 139 6 Sat Feb 27 19:48:57 2010 0x01e75390
880 1185 6 Sat Feb 27 20:12:36 2010 0x01e833a0
4 0 47 Fri Feb 26 03:35:00 2010 0x01e94e98
1752 1178 6 Sat Feb 27 20:12:32 2010 0x01e96b98
1244 1900 17 Sat Feb 27 19:48:57 2010 0x01e98ce0
4 1030 6 Fri Feb 26 03:35:00 2010 0x01e9a3e8
1040 1186 17 Sat Feb 27 20:12:36 2010 0x01ebd320
1040 1182 17 Sat Feb 27 20:12:35 2010 0x01ec72b0
880 1184 6 Sat Feb 27 20:12:36 2010 0x01ede008
1100 1047 17 Fri Feb 26 03:43:12 2010 0x01ee2488
1040 68 17 Sat Feb 27 20:12:35 2010 0x01ef2998
1040 123 17 Sat Feb 27 19:48:57 2010 0x01f09d80
880 30301 6 Sat Feb 27 20:12:36 2010 0x01f0fe98
700 500 17 Fri Feb 26 03:34:26 2010 0x01f14298
1100 1025 17 Fri Feb 26 03:34:34 2010 0x01f1a1a0
1752 1177 17 Sat Feb 27 20:12:32 2010 0x01f1a8b8
4 445 17 Fri Feb 26 03:34:02 2010 0x01fd2a80
888 1169 6 Sat Feb 27 20:11:53 2010 0x01fec370
1040 123 17 Sat Feb 27 19:48:57 2010 0x01feee18
4 445 6 Fri Feb 26 03:34:02 2010 0x020b6c58
888 1172 6 Sat Feb 27 20:11:53 2010 0x0225be98
888 1176 6 Sat Feb 27 20:12:28 2010 0x02261740
1244 1900 17 Sat Feb 27 19:48:57 2010 0x02263008
888 1171 6 Sat Feb 27 20:11:53 2010 0x02280880
4 138 17 Sat Feb 27 19:48:57 2010 0x02294450
1040 1181 17 Sat Feb 27 20:12:35 2010 0x022ac218
1244 2869 6 Sat Feb 27 20:12:37 2010 0x022c37d0
2024 1026 6 Fri Feb 26 03:34:35 2010 0x022d3d70
700 0 255 Fri Feb 26 03:34:26 2010 0x022f4528
700 4500 17 Fri Feb 26 03:34:26 2010 0x022f4aa8
4 137 17 Sat Feb 27 19:48:57 2010 0x02318008
1244 1189 6 Sat Feb 27 20:12:37 2010 0x02410c40
948 135 6 Fri Feb 26 03:34:07 2010 0x025e6008

Así que utilizando calc o excel, que para gustos colores:


Tirando del hilo

Si buscamos en Google utilizando las direcciones del listado de conexiones obtenemos varias coincidencias muy jugosas; concretamente:
http://www.malwaredomainlist.com/mdl.php?search=212.150.164.203&inactive=on
https://zeustracker.abuse.ch/monitor.php?host=193.104.22.71

Con la información obtenida de estos enlaces se me ocurre volcar la memoria de los procesos con conexiones sospechosas, y buscar a continuación coincidencias de cadenas de texto:
# python volatility memdmp -p 888 -f Bob.vmem
# strings !!:4.dmp | grep '^http://search-network-plus.com' | sort -u
strings 888.dmp | grep '^http://search-network-plus.com' | sort -u
http://search-network-plus.com/cache/PDF.php?st=Internet%20Explorer%206.0
http://search-network-plus.com/favicon.ico
# python volatility memdmp -p 880 -f Bob.vmem
# strings !!:4.dmp | grep '^http://193.104.22.71' | sort -u
strings 880.dmp | grep '^http://193.104.22.71' | sort -u
http://193.104.22.71/~produkt/69825439870/73846525#N
http://193.104.22.71/~produkt/9j856f_4m9y8urb.php
http://193.104.22.71/~produkt/9j856f_4m9y8urb.php&N

Confirmado: se trata de una infección del infame Zeus, ¿pero qué variante? Podemos consultar la entrada del registro que se genera de forma que el troyano se garantiza su ejecución con el arranque del sistema.

Primero un listado con el offset para las estructuras CMHIVE localizadas en memoria y que representan las diferentes ramas del registro de Windows:
# python volatility hivescan -f Bob.vmem
Offset (hex)
44658696 0x2a97008
44686176 0x2a9db60
48529416 0x2e48008
55269896 0x34b5a08
57399112 0x36bd748
59082008 0x3858518
70588752 0x4351950
111029088 0x69e2b60
114539360 0x6d3bb60
121604960 0x73f8b60
180321120 0xabf7b60
191408992 0xb68ab60
244959264 0xe99c820

Ahora, y utilizando uno de los offset dentro del fichero de memoria para cualquiera de las estructuras CMHIVE localizadas, utilizamos el comando hivelist:
# python volatility hivelist -o 0x2a97008 -f Bob.vmem
Address Name
0xe1d6cb60 \Documents and Settings\Administrator\Local Settings
\Application Data\Microsoft\Windows\UsrClass.dat
0xe1de0b60 \Documents and Settings\Administrator\NTUSER.DAT
0xe1769b60 \Documents and Settings\LocalService\Local Settings\Application Data
\Microsoft\Windows\UsrClass.dat
0xe17deb60 \Documents and Settings\LocalService\NTUSER.DAT
0xe1797b60 \Documents and Settings\NetworkService\Local Settings\Application Data
\Microsoft\Windows\UsrClass.dat
0xe17a3820 \Documents and Settings\NetworkService\NTUSER.DAT
0xe1526748 \WINDOWS\system32\config\software
0xe15a3950 \WINDOWS\system32\config\default
0xe151ea08 \WINDOWS\system32\config\SAM
0xe153e518 \WINDOWS\system32\config\SECURITY
0xe139d008 [no name]
0xe1035b60 \WINDOWS\system32\config\system
0xe102e008 [no name]

Solo resta consultar el contenido de la clave utilizanado la herramienta RegRipper, de Harlan Carvey y posible gracias a Brendan Dolan-Gavitt (mas información en este mismo blog):
# perl rip.pl -r ${img}@0xe1526748 -p winlogon
Launching winlogon v.20080415
Microsoft\Windows NT\CurrentVersion\Winlogon
LastWrite Time Sat Feb 27 20:12:34 2010 (UTC)
LegalNoticeCaption =
LegalNoticeText =
System =
AutoRestartShell = 1
PowerdownAfterShutdown = 0
ReportBootOk = 1
ShutdownWithoutLogon = 0
allocatecdroms = 0
allocatedasd = 0
allocatefloppies = 0
forceunlocklogon = 0
scremoveoption = 0
AllowMultipleTSSessions = 1
LogonType = 1
AutoAdminLogon = 0
SFCDisable = 0
WinStationsDisabled = 0
HibernationPreviouslyEnabled = 1
ShowLogonOptions = 0
cachedlogonscount = 10
passwordexpirywarning = 14
DebugServerCommand = no
Background = 0 0 0
SfcQuota = 4294967295
UIHost = logonui.exe
Shell = Explorer.exe
DefaultUserName = Administrator
AltDefaultUserName = Administrator
DefaultDomainName = BOB-DCADFEDC55C
AltDefaultDomainName = BOB-DCADFEDC55C
VmApplet = rundll32 shell32,Control_RunDLL "sysdm.cpl"
Userinit = C:\WINDOWS\system32\userinit.exe,C:\WINDOWS\system32\sdra64.exe,
 
Analysis Tips: The UserInit and Shell values are executed when a user logs on.

Ahi lo tenemos, el binario es sdra64.exe, y en este enlace, cortesía de s21sec, tenemos toda la información que necesitamos.

Lo dejaremos aquí por hoy; en breve, más :-)

2 comentarios:

silverhack dijo...

Atentísimo a la segunda entrega. Como siempre, increíble post!
Siento no haber coincidido en la Rooted, pero las cervecitas siguen pendiente ok?

neofito dijo...

Gracias por los piropos, pero de verdad que no los merecen.

Las cervecitas siguen pendientes, ya te digo, y Pedro y yo ya tenemos claro que las pagas tú ;)

Saludos