Hoy les voy a mostrar como Dumpear una muestra de DorkBot que fue ofuscada con una capa de un Crypter en VB, luego compactada con UPX, y este modificado, para hacer mas difícil el análisis.
Analizaremos una muestra que me enviaron esta mañana y afecta a entidades bancarias de Perú.
Comenzamos con el ya conocido correo phishing para infectar a los desprevenidos:
Análisis del ejecutable en VirusTotal con un indice bajo de detecciones.
Primero hacemos una inspección ocular del binario con un editor Hexadecimal, en este caso FlexHex, se puede utilizar Hex Workshop, pero ya estoy acostumbrado a FlexHex.
Vemos que tiene las secciones típicas de UPX pero modificadas, por lo que puedo deducir que esta compactado con UPX.
Lo analizo con PEID, para sacarme la duda.
Aquí vemos que no detecto ningún packer (Nothing Found *)
(vemos que una de las secciones es UPX1...)
Inspeccionando las secciones vemos que falta la sección UPX0
Puedo modificar a las secciones con el editor Hexadecimal para luego intentar desempaquetarlo con el comando upx -d, pero lo vamos a hacer con el Ollydbg.
Resumiendo, lo que haremos con esta muestra sera:
1) Desempaquetar el UPX
2) Correr el Crypter (poniendo BP en WriteProcessMemory o ZwWriteVirtualMemory)
3) Dump de la muestra.
4) Ejecutar la muestra en una maquina virtual.
1) Desempaquetar el UPX
Podemos desempaquetar el UPX a mano o utilizando el plugin OdbgScript
Desempaquetando a mano:
Cargamos el ejecutable en el OllyDbg y observamos que el EntryPoint de este programa apunta a un PUSHAD que es típico de UPX.
Buscamos, luego del PUSHAD, el primer POPAD y poner allí un BP, luego buscar el ultimo JMP y poner allí otro BP.
0041774D . 58 POP EAX
0041774E . 61 POPAD
0041774F . 8D4424 80 LEA EAX,DWORD PTR SS:[ESP-80]
00417753 > 6A 00 PUSH 0
00417755 . 39C4 CMP ESP,EAX
00417757 .^75 FA JNZ SHORT VIDEOMMS.00417753
00417759 . 83EC 80 SUB ESP,-80
0041775C .-E9 F799FEFF JMP VIDEOMMS.00401158 ---> Salto al OEP
00417761 00 DB 00
00417762 00 DB 00
00417763 00 DB 00
Ejecutamos con F9 y va a parar en el POPAD, aquí ya se habrá ejecutado el código del packer UPX, volvemos a ejecutar con F9 y se detendrá en el JMP.
En este punto avanzamos con F7 y encontraremos el OEP .
(aquí podemos pasar a 2) Correr el Crypter)
Desempaquetado con OdbgScript:
Utilizaremos el siguiente Script, que realiza automáticamente lo que hicimos arriba, sin tener que andar buscando el POPAD/JMP en el código.
(El script lo grabamos en un archivo que luego cargaremos con OdbgScript)
var BPforPOPAD
var BPforJMP
findop eip,#61#
mov BPforPOPAD,$RESULT
bp BPforPOPAD
run
findop eip,#E9????????#
mov BPforJMP,$RESULT
bp BPforJMP
run
sti
msg "OEP Dumpear proceso en memoria"
Carga del malware en Ollydbg
Plugins -> OdbgScript -> Run Script: Seleccionamos el Script.
Listo, en este momento ya se ejecuto el Packer y estamos en el OEP
(click en aceptar)
2) Correr el Crypter
Bueno, aquí con cualquiera de los dos métodos utilizados mas arriba ya estamos en el OEP del programa.
Por lo que continuamos con un F7 y ponemos un BP a WriteProcessMemory
Ejecutamos con F9, cuando para estaremos listos para hacer un dump del proceso.
3) Dump de la muestra.
Podemos hacer un dump con OllyDump o hacemos un Backup del Buffer en memoria.
Quizás este no es el mejor método para los puristas.... pero a mi me sirve... :D
Backup -> Save data to File
Lo guardamos en el Escritorio.
Aquí vemos en esta parte de la memoria que se trata de DorkBot.
Luego abrimos con el FlexHex el backup _001F6000.mem y Buscamos el texto MZ o 4D5A en hexa.
Una vez encontrado, tenemos que seleccionar desde MZ hasta el fin del archivo.
Copiamos.
Y pegamos en otro Nuevo y grabamos el ejecutable.
En este punto ya tenemos a Dorkbot sin ofuscar y listo para ejecutarlo en una maquina virtual y probar a donde se conecta.
4) Ejecutar la muestra en una maquina virtual.
Probamos la muestra en una maquina virtual y observamos el trafico de red.
Pharming.
Eso es todo por el momento, espero que les guste.
Muestra + dump + Script: http://www.mediafire.com/?95m6du912g6aztb
Password = infected
@Dkavalanche 2012
1 comentario:
un tip nomas, si queres ahorrarte el paso de modificar el dumpeado con un editor hexadecimal.
Puedes usar el ollydump con la direccion que te da el buffer del parametro en WriteProcessMemory y en size de la seccion a dumpear haces un size (argumento 3 o 4) de WriteProcessMemory
Publicar un comentario