Lab ReverseShell01 - Primera experiencia analizando un malware
El binario que usaremos esta disponible en http://ccom.uprrp.edu/~rarce/ccom4995/misc/mal01.exe
El programa que analizaremos no es muy nocivo pues no deja trazos en el sistema, e.g. no se copia o crea archivos en otros directorios, no altera el registry para tratar de autoejecutarse después. Por lo tanto no tenemos que tomar la precaución de hacer un snapshot al virtual machine antes de correr el malware para luego restaurar su estado.
- A modo de demostración de los pasos que toma el programa cuando corre, haremos un monitoreo usando Process Monitor.
Process Monitor. Filter -> Filter -> Process Name is mal01.exe. Add. Clear. Run.
Luego si edit clear display y corres el mal01.exe
, obtendrás una lectura como la siguiente. Lo importante es que el programa comenzó y terminó.
-
Abre
mal01.exe
en IDA. Uno de las primeros pasos al analizar malware es tener una idea de las funciones que usa del API de Windows (o de las librerías de C). La forma más fácil de ver esa información en IDA es en la ventana de Imports. El binariomal01.exe
hace import de más de 40 funciones, entre ellas algunas que nos hacen pensar que estará creando alguna conexión de red (gethostbyname
,connect
,WSASocket
). Otros imports que estaremos investigando sonGetModuleFileNameA
yCreateProcessA
. -
Otra verificación fácil que suele hacerse a un malware en IDA son sus "strings". Ya que aparentemente este binario crea una conexión, quizás en los strings podemos averiguar a qué servidor está tratando de conectarse. Revisa la ventana de strings en IDA. Mala suerte :-(, lamentablemente IDA solo identificó strings que corresponden a nombres de imports y a mensajes de error. La función
gethostbyname
y otras que usa este binario requieren parámetros tipo string, pero, ¿dónde están? -
En la ventana de disassembly de IDA (IDA View-A) observa la función
main
. Una de las primeras cosas que hacemain
es escribir muchos bytes sencillos al stack. Esto es indicativo de que está creando un stack-framed string. Determina los dos stack-based strings (cada uno está terminado por el caracter nulo). En lugar de hacerlo manualmente en IDA, abremal01.exe
en OllyDBG. Coloca un breakpoint en la primera instrucción que copia un byte a memoria y corre el programa (para que pause en esa instrucción). Para que puedas ver el string formándose en memoria da right click sobre la instrucción donde se detuvo y escoge Follow in dump - memory address. Luego dale a step into para que veas como se guardan los siguientes strings en memoria:1qaz2wsx3edc
yocl.exe
. Obtén un pantallazo de ese gran descubrimiento!. -
De vuelta en IDA, nota que lo próximo que sucede en la función
main
es una invocación a la funciónGetModuleFileNameA
. Esa función determina el path y nombre del programa que se está ejecutando (C:\whatever\it\is\mal01.exe). El parámetro que IDA identificó comolpFileName
es dondeGetModuleFileNameA
devuelve su resultado. En OllyDbg, trata de darle follow in dump a la dirección dondeGetModuleFileNameA
escribe su resultado ([EBP-300]). Pon un breakpoint justo en el CALL aGetModuleFileName
y luego has unstep over
para encontrar en memoria un string comoC:\Users\....\mal01.exe
. Pantallazo de celebración! -
Un poco más abajo, notarás que hay una invocación a
_strcmp
cuyo resultado afecta el flujo del programa. Si el resultado es diferente de 0, el programa termina. ¿Qué dos strings se están comparando? Veamos. Crea un breakpoint en el CALL de_strcmp
(nota queOllyDbg
fue incapaz de identificar el nombre de_strcmp
(no tiene algunos de los superpoderes de IDA) así que ayúdate con la información que provee IDA. Crea un pantallazo de celebración mostrando el contenido de los registros EAX y ECX. Esos son los dos strings que se están comparando. -
Aparentemente el binario se tiene que llamar
ocl.exe
para que esta comparación se cumpla y el programa pueda seguir su curso. Cierra OllyDbg y cambia el nombre del binariomal01.exe
aocl.exe
. -
Más adelante, el programa parece estar preparándose para crear una conexión por red. Verás llamadas a
WSAStartUup
yWSASocketA
. Entre esta última y la llamada agethostbyname
se invoca una función local identificada por IDA comosub_411089
. ¿Qué dos parámetros se le están pasando a esa función? Muestra un pantallazo en el que se puedan apreciar el contenido de esos dos strings. La funciónsub_411089
utiliza uno de los strings que fue construido al principio de main (1qaz2wsx3edc
) para descifrar los bytes del segundo parámetro (que comienzan con46 06 16
). El resultado es devuelto mediante EAX y es un URL (www......). ¿Lo ves? -
Si el proceso de crear la conexión a ese URL (usando
connect
) es exitoso, el programa llega a invocar la función que IDA ha llamadosub_401000
. Entra a esa función en IDA. Verás que invoca a una función muy peligrosa:CreateProcessA
(create a new process and its primary thread). Puedes ver en la lista de parámetros que el proceso que se está creando corre acmd.exe
. Otro de los parámetros que se le pasa aCreateProcessA
es una estructura llamadaStartupInfo
. Como puedes ver en la siguientes instrucciones, se está estableciendo quewShowWindow = 0
, i.e. no se mostrará la ventana donde corre el proceso, y elhStdInput
,hStdError
,hStdOutput
se están igualando al parámetro que le llega a esta función, que corresponde al socket creado durante elconnect
. Es decir el input y el output del comand line que se está creando provendrá de servidor al que se conectó.mov [ebp+StartupInfo.wShowWindow], 0 mov edx, [ebp+arg_10] mov [ebp+StartupInfo.hStdInput], edx mov eax, [ebp+StartupInfo.hStdInput] mov [ebp+StartupInfo.hStdError], eax mov ecx, [ebp+StartupInfo.hStdError] mov [ebp+StartupInfo.hStdOutput], ecx
En otras palabras, se está creando un reverse shell con el puerto 9999 de www.practicalmalwareanalysis.com. Si en ese servidor ponemos a escuchar en el puerto 9999, cuando una computadora corra este malware quedaremos conectados con un shell con los privilegios de la persona que haya corrido ocl.exe.
-
Si quieres ver el software acción debes hacerlo creer que en efecto se está conectando al website www.practicalmalwareanalysis.com. Para eso usaremos dos softwares:
- ApateDNS - interceptará la consulta al DNS y lo redirigirá al localhost. Descargalo de aquí: sdl-apatedns.zip e instálalo.
- Netcat - crearemos una conección tipo listen en espera de la conexión que establece el
ocl.exe
. Descargar de netcat-win32-1.11.zip. El puerto al que se trata de conectar el malwareocl.exe
es 9999. El comando para crear la conexión tipo listen esnc -l -p 9999
.
- Muestra un pantallazo donde se vean las pantallas de nc que demuestre conexión.