Ir al contenido principal

Hydra android malware (Part 2)

Resolución del ABOS4 curso Free tools

Buenos días,

Durante estos días de alarma sanitaria, en los que toca estar encerrados por el virus COVID-19 aprovechamos para seguir avanzando en el curso de Ricardo de Reversing con herramientas alternativas,

Para ello, abrimos el ejecutable (ABOS4) usando IDAPro, y analizamos un poco en estático los componentes del binario, para poder tener una idea de como podemos explotarlo.



Donde tenemos en el main() del binario las siguientes llamadas:


  1. MessageBox()--> Muestra el mensaje de ejecuta una calculadora
  2. Malloc() --> Reserva un espacio de memoria en el heap y devuelve un puntero que apunta al trozo reservado, este se almacena en la variable local mem_reservada.
  3. Gets()-->Escribimos en una zona de memoria almacenada en la variable Var_a_machacar.
  4. Gets()-->Escribimos en la zona del heap reservada por el malloc y almacenada en mem_reservada.
  5. fun_externa()-->Ejecuta una función de fuera del main, cuya direccion esta apuntada por var_externa y usa como parámetro la variable var_a_machacar.
Por ultimo nuestro main() termina con bloques básicos mas pequeños que hacen que nuestro programa se quede en un bucle infinito.


mov eax, 1
test eax,eax
jz short loc_40106A


En la siguiente parte de la entrada, vemos como podemos encarar la solución de este ejercicio.

1)Tal y como se resuelve en el tutorial proporcionado por @ricardo.

Tenemos que el stack de nuestra función main(), la cual se encuentra compuesta por las siguientes variables locales:

                                     

Donde tenemos almacenadas las variables Var_a_machacar, que la pasamos como argumento al primer gets() y el mem_reservada, donde se almacena el puntero que apunta a la reserva de memoria del heap (malloc()).

Por lo visto en tutoriales anteriores, podemos deducir que si en el primer gets() introducimos más de 256 caracteres machacaremos el puntero que se encuentra justo en la posición de abajo, que es el que apunta a heap.

Por lo tanto eso es lo primero que haremos en nuestro exploit. es sobrescribir este puntero, mas adelante vamos a ver que dirección vamos a poner en el stack.

Exploit:

payload = 256 * "A" + Dir_mem(X) + ????


Hemos visto que en el punto 4, se llamaba a la función gets(), y se le pasaba en este caso como parámetro la dirección reservada con el malloc, por lo tanto si en el paso anterior, modificamos el valor de variable mem_reservada,  y ahora llamamos al gets() significa que podremos escribir en la dirección que nosotros queramos lo que le leamos por stdin, (Siempre que tenga permisos de escritura en la zona de memoria donde queramos escribir, sino nos saltará una excepción).

Por ultimo en el punto 5, vemos que se ejecuta una función, cuya dirección  esta apuntada por la variable var_externa(). Esta variable al no ser local, significa que no se encuentra en la stack frame de la función main(). De hecho y tras analizarlo con IDAPro, podemos ver que se encuentra en la sección .data y vemos que var_externa permite escritura, por lo que si modificamos su valor por una función que nos permita ejecutar cosas (system()), podremos ejecutar lo que queramos y nuestro programa, lo ejecutará.

Vamos a localizar con IDA_PRO todas la información que necesitamos para construir nuestro exploit:


Dirección de Var_externa --> 0x00415000

Direccion de System() --> La cual nos permite ejecutar lo que nosotros le indiquemos, como puede ser la calculadora o notepad. --> 0x00402557

*Podemos extaer la direccion de system() buscando en las strings "compsec"



Por ultimo, vemos que si modificamos la dirección de la función var_externa y la sustituimos por la dirección de System() , a este hay que pasarle como parámetro lo que queremos ejecutar, en el caso de la calculadora --> "calc\0"

Tal y como vemos en la siguiente imagen, esta cadena se tiene que encontrar en la variable var_a_machacar.



Ya que tenemos todos los componentes de nuestro exploit podemos crearlo:


Exploit v2:


import sys
from subprocess import Popen, PIPE
import struct
import random
import string

#Armamos nuestro payload 

payload = b"calc\x00" #Cadena que le pasamos a la funcion system()
payload += b"A"*(256 - len("calc\x00")) --> Relleno de 256 - el tamaño de la cadena
payload += struct.pack('<I',0x00415000) #Direccion de var_externa y que usamos para machacar el  puntero del malloc de los 64 bytes de memoria.
payload += b'\n' #Añadirlo para que termine de leer el primer gets
payload +=struct.pack('<I',0x00402557) #Entrada para el 2 gets y le introducimos la direccion del COMSPEC (es decir system).

#Arrancamos el programa y lo ejecutamos:

p1 = Popen(r"C:\Users\juan\Desktop\Curso_Reversing_freeTools\ejercicios\Ejercicios\ABOS\ABO4_VS_2017.exe", stdin=PIPE)
print ("PID: %s" % hex(p1.pid))
print ("Enter para continuar")
p1.communicate(payload)
p1.wait()
input()


Un saludo en la siguiente entrada vamos a resolverlo de la forma propuesta por Ricardo que es pisando el SEH  e inyectando una shellcode.

Comentarios

Entradas populares de este blog

Hydra android malware (Part 2)

Buenas de nuevo, En esta segunda parte del tutorial de Hydra , vamos a coger una muestra mas reciente, y vamos a ahondar en las características técnicas de la muestra. Información de la muestra y Herramientas:  -) Muestra : 2fc050a06dab9dbc019dfdd768580ebe66f178a210fda23a02ce005742c5e262 -) JADX : Para poder leer el codigo Java/kotlin decompilado de la aplicación. -) Apktool : Para hacer el dissasembler de la APK, y poder parcherla y reconstruirla.  -) Genymotion : Para emular la aplicación -) Burp Suite: para capturar las comunicaciones -) Frida : Para TODO :) Análisis Estático Antes de comenzar con el archivo AndroidManifest.xml, como explicamos en la entrada anterior, vamos a introducir un poco de teoría de como es cargada y ejecutada una aplicación sobre el sistema operativo Android. Echamos un vistazo al androidManifest.xml : Al igual que en la entrada anterior, hay referencias a actividades  que no se encuentran presentes en el código de la aplicación al abrirlo con la herramien

Radare2- Set de comandos básicos

Buenas a todos y Feliz navidad lo primero. Entre mantecado y mantecado, y motivado por el curso de Ricardo Narvaja (CrackLatinos), me he decidido a publicar una entrada que es mas para mí que para el resto. Pero supongo que puede ser útil para otras personas, de ahí que lo ponga lo mas bonito posible en la web. Vamos a ver un "cheatsheet" con comandos útiles de Radare2 y su funcionalidad, todo esto puede extraerse del --help de las herramientas, pero para los que como yo le gusta ir al grano y ahorrar el mayor tiempo posible, tienen esta entrada. RABIN2: rabin2 -I file_.exe --> Nos proporciona información básica del binario, como arquitectura, y las protecciones del binario como (nx,dep,aslr...) rabin2 -i file_.exe --> Nos muestra los imports del binario. rabin2 -e file_.exe --> Dirección del Entry point. (Dirección virtual y raw offset en el executable) rabin2 -zz file_.exe --> Muestra las strings rabin2 -g file_.exe --> Este comando nos muestr

Hydra Android Malware (Part 1)

 Buenos Días, Hoy escribiré una entrada de análisis de malware en Android después de un tiempo sin escribir por aquí. La idea era coger de nuevo soltura con las herramientas open-source que hay para el análisis de aplicaciones android. Estuve leyendo información sobre alguna familias y me tope con Hydra (siguen apareciendo casos activos en Android (Twitter)) y me puse con ella. Arranqué con la lectura de este blog : Es el "padre nuestro" de la primera parte de nuestro tutorial, lo único que voy a hacer yo aquí en la primera parte es "puntualizar" algunos problemas que me he encontrado durante el análisis al seguir su tutorial. Información de la muestra y Herramientas:  -) Muestra : 46aeb04f2f03ebe7c716fc6e58a5dea763cd9b00eb7a466d10a0744f50a7368f -) JADX : Para poder leer el codigo Java/kotlin decompilado de la aplicación. -) Apktool : Para hacer el dissasembler de la APK, y poder parcherla y reconstruirla.  -) Ghidra : Decompilado de librerias Nativas. -) GEF : Debu