Se me cayo un exploit

SEGURIDAD INFORMÁTICA

HACKING . PROGRAMACIÓN . ELECTRÓNICA . GNU/LINUX

Se me cayó un exploit en tu server.... por @UnaPibaGeek

[email protected]:~# ./Ingeniería-Inversa

Ingeniería inversa de TODO! Necesito saber cómo están hechas las cosas :)

Reversing IV: Inyección PE a mano (old school)

14_pe_inject.PNG

En la entrada anterior de esta serie de notas de reversing, vimos cómo expandir una sección del ejecutable con el objetivo de hacernos un hueco para inyectar código propio allí. Hasta este punto, llegamos a hacer dicho espacio a mano, y ampliamos la última sección del binario de Putty de 32bits. Ahora llegó el momento de aprovechar ese espacio que hemos creado e inyectar el código que deseemos.

Para la práctica inyectaremos un MessageBox que se mostrará el iniciar el binario. En este caso el ejecutable afectado, como ya dijimos, es el cliente de Putty de 32 bits.

Si consultamos la documentación de la API MessageBox, podemos ver los parámetros que tenemos que pasarle para lograr ejecutar correctamente un mensaje.



Como podemos observar, el texto del mensaje (lpText) y el título (lpCaption) están entre los parámetros que debemos proporcionar. También tenemos el handler (hWnd) de la ventana que lo dejaremos en Null y el tipo de MessageBox, para el cual tenemos una gran variedad de opciones, pero también lo dejaremos en Null para que muestre un cuadro simple con un botón de “Aceptar”.

El primer paso es abrir con un editor hexadecimal el binario al cual le hemos expandido la sección, e insertar en alguna parte de ese hueco que hicimos, el texto y el título del mensaje que vamos a mostrar. Tal como pueden observar en la nota anterior, el espacio que generamos en el binario de Putty comienza en el offset AAE00h, así que es allí donde me posicionaré para escribir el mensaje.



En el offset AAE00h tenemos el título y en el AAE10h el texto del mensaje.

A partir del offset AAE30h inyectaremos las instrucciones necesarias para la ejecución del MenssageBox, pero para ello vamos a utilizar un debugger como OllyDBG o Immunity DBG.
Antes de abrir el binario con el debugger, vamos a cargarlo en Stud_PE para convertir los offset a RVA, de manera que al momento de abrirlo con el debugger ya sepamos a donde dirigirnos.



Tal como vemos en la imagen, cargamos el binario en Stud_PE, presionamos en RVA<=>RAW y calculamos la RVA tanto del título, como del mensaje y la posición donde vamos a escribir luego las instrucciones de código.

- Título: 00AAE00 -> 004B0000

- Texto: 00AAE10 -> 004B0010

- Código: 00AAE30 -> 004B0030

Dentro de Stud_PE también podemos ver la dirección del Entry Point, vamos a anotarnos ese dato ya que lo necesitaremos más adelante. En el caso de este binario, el EP se encuentra en la dirección: 0045C728.

Ahora sí, abrimos el ejecutable con Immunity DBG o el debugger que más nos guste y una vez allí, lo primero que haremos será buscar la dirección de memoria donde se encuentra la llamada a la API de MessageBox. En esta práctica, y para empezar, lo haremos de la siguiente manera:

Click secundario en cualquier parte de la ventana de código y seleccionamos Search For -> All Intermodular Calls.



En la ventana que se abre, debemos buscar la API de MessageBox.



Hacemos doble click allí, y en la ventana de código podremos observar la dirección de la llamada.



Aunque, es necesario invertirla, de manera que la dirección para este caso finalmente es: 0047C474.
Ahora sí, teniendo todos los datos necesarios, nos dirigimos al hueco que hemos creado, donde inyectaremos todas las instrucciones. Como ya hemos calculado, la dirección es 004B0030. Así que hacemos click secundario en cualquier parte del código, y presionamos en Go to -> Expression.



En el cuadro de dialogo que se abre escribimos la dirección y presionamos OK.

Una vez allí, empezamos a escribir las instrucciones necesarias. Para ello, hacemos doble click sobre la primera posición que vamos a alterar y escribimos PUSH 00 para el parámetro uType.



Presionamos “Assemble” y continuamos con el parámetro lpCaption, para el cual haremos un PUSH a la dirección de memoria que ya hemos calculado antes, donde se encuentra el título para el mensaje.



Lo mismo para el siguiente parámetro, el cual es el texto del mensaje.



Como último parámetro, hacemos un PUSH 00 para el parámetro hWnd.

Ahora nos queda el llamado a la función, para ello utilizaremos la siguiente instrucción: CALL DWORD PTR DS:[0047C474] donde entre llaves, tenemos la dirección de memoria que obtuvimos en pasos previos.



Con esto, ya tendríamos nuestro MessageBox armado con todos los parámetros necesarios. Ahora bien ¿En qué momento se va a ejecutar esto? Nuestro próximo paso es alterar el Entry Point, de manera que nuestra inyección de código sea lo primero que se ejecute.

Entonces, vamos a escribir una instrucción más donde estamos ahora, que será el salto al Entry Point original y se ejecutará inmediatamente después de que nuestro MessageBox se muestre en pantalla.



Finalmente, toda nuestra inyección de código queda de la siguiente manera:



Como vemos, la inyección comienza en la dirección 004B0033 así que ese será el nuevo Entry Point del ejecutable. Guardamos la modificación seleccionado todas estas nuevas instrucciones de código y haciendo Click secundario -> Copy to Executable -> Selection. En la ventana que se abre hacemos Click secundario -> Backup -> Save data to File y guardamos el archivo nuevo.

Para modificar el Entry Point, abrimos este nuevo archivo con el PE Editor de Lord PE y cambiamos el valor original del EP por 000B0033 que es donde comienzan las instrucciones que hemos inyectado.



Click en “Save” y finalizamos.
A partir de ahora, al ejecutar este binario, lo primero que veremos será nuestro MessageBox.



Al presionar Aceptar visualizaremos el cliente de Putty correctamente.



Bien, esta nota ha sido realmente muy "old school" y es la forma en que yo hacia inyecciones PE hace años. Es una forma muy sencilla que necesita mejoras que veremos más adelante, en próximas notas. Sin embargo, me parece que es útil para introducir conceptos de lo que es inyectar código en PE e ir amigandose con un debugger :).

Nos leemos pronto!

¿Te cansaste de leer? Tomate un café (share):

Fecha: 07/08/2017

¡Suscribite!

Aprendé más en...