Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1
1. Alcance del proyecto
2. Herramientas utilizadas
1
Extraído literalmente de Hacking. The Art of Exploitation [2nd Edition] [Jon Erickson] [Cap. 3, pág. 115]
2
Fig. 1. Máquina virtual Windows XP Service Pack 3 sobre VirtualBox
3
2.1. Immunity Debugger v1.85
Immunity Debugger2 es una herramienta pensada para la escritura de exploits,
el análisis de malware e ingeniería inversa con ficheros binarios. Tiene un
interfaz gráfico bastante amigable e integra soporte para A
PI de Python que permite ampliar sus características mediante la ejecución de
scripts en este lenguaje de programación.
Sus características más reseñables son:
Depurador con funcionalidad diseñada específicamente para tareas de
seguridad.
Reduce significativamente el tipo de desarrollo de exploits.
Interfaces simples y comprensibles.
Permite depuración rápida y liviana que previene la corrupción de datos
en un análisis complejo.
Conectividad con fuzzers y herramientas para el desarrollo de exploits.
Su interfaz incluye una GUI (Graphical User Interface) y una línea de comando.
La línea de comando está siempre disponible sobre cualquiera de las vistas de
la GUI que se tenga habilitado (en la parte inferior por defecto). Esto permite
al usuario la ejecución de comandos como si se estuviese en un depurador basado
en texto, como WinDBG o GDB.
2
Fuentes:
- http://www.immunityinc.com/products/debugger/
- http://www.reydes.com/d/?q=Immunity_Debugger
4
En la Fig. 3 se puede apreciar la vista de la ventana de CPU, que permite la
visualización en una misma pantalla de 4 funciones de interés a la hora de
realizar los exploits.
DESENSAMBLADO
Muestra el código en ensamblador de la aplicación que se está analizando. La
información se muestra en cuatro columnas. En la primera se visualizan las
direcciones de memoria. La segunda muestra los códigos de operación de la
instrucción (vista hexadecimal de la instrucción) localizada en la dirección.
La tercera columna es código ensamblador (puesto que Immunity es un depurador
dinámico, se puede hacer doble clic sobre cualquier instrucción ensamblador y
cambiarla; el cambio será visible inmediatamente y se podrá ver como esto
afecta el programa). La última columna contiene comentarios (el depurador
intenta adivinar algunos detalles sobre las instrucciones y si es satisfactorio
pondrá los detalles en los comentarios. Si no se está satisfecho con lo
adivinado por el depurador se puede borrar y escribir los comentarios propios
haciendo doble clic).
REGISTROS
Este cuadro permite visualizar los registros del CPU y sus valores. La sección
superior son registros de propósito general, que contienen valores temporales,
y registros que son utilizados para controlar el flujo del programa. La sección
intermedia contiene registros bandera que la CPU cambia cuando algo de
importancia ha ocurrido en el programa. La sección inferior contiene registros
que se usan en la ejecución de operaciones de punto flotante.
Estos registros pueden variar su color desde negro hacia rojo cuando se produce
algún cambio, lo que facilita la visualización de esos cambios. Asimismo, se
puede hacer doble clic sobre cualquier registro y cambiar su valor. Se puede
también seguir un valor almacenado en el registro si es una dirección de memoria
válida haciendo clic derecho sobre este y seleccionando “Follow in dump”.
VOLCADO DE MEMORIA
La ventana de volcado muestra una vista hexadecimal del programa completo. Se
divide en tres columnas: La primera muestra la dirección, La segunda caracteres
hexadecimales localizados en la dirección y en la tercera se puede ver la
representación ASCII de los datos hexadecimales. Se pueden buscar valores
haciendo clic derecho sobre la ventana y seleccionando “Search for -> Binary.
String”.
5
PILA
La localización de memoria hacia la que apunta el ESP (Stack Pointer Register)
o Registro Puntero de Pila se muestra en la parte superior de la ventana de
pila. La información se divide en tres columnas. La primera muestra la
dirección, la segunda los datos localizados en esa dirección y la tercera
contiene comentarios. Se pueden cambiar los datos en la pila haciendo doble
clic.
Aparte de lo dicho, Immunity Debugger contiene muchas más vistas, que se pueden
habilitar desde el menú View.
Una de las características más interesante de esta aplicación es que permite
la integración de scripts desarrollados en Python, sin más que instalarlos en
la carpeta PyCommands dentro de la carpeta donde se haya instalado el programa
(en la instalación por defecto C:\Archivos de Programa\Immunity Inc\Immunity
Debugger\PyCommands), como se ve en la Fig. 4.
3
https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/
6
2.2. Kali Linux
Dado que la aplicación para la que se va a desarrollar un exploit es un servidor
FTP, corriendo en un entorno Windows XP, se quiere lanzar dicho exploit desde
un cliente remoto. Por ello, en otra máquina virtual haremos correr una
distribución Kali Linux que integra una serie de herramientas que se utilizarán
en el desarrollo y en la posterior ejecución del exploit.
Concretamente, se usa la distribución Kali 2017.1 corriendo sobre el mismo
entorno de virtualización usado para la máquina Windows XP que alojará la
aplicación a atacar (VirtualBox 5.2.6), y todo ello sobre el mismo anfitrión
Ubuntu 16.04.3 LTS reseñado ya al inicio del apartado 2.
Las dos máquinas virtuales (Windows XP y Kali) se ejecutarán simultáneamente
en una configuración de red que les permita verse. En este caso se ha utilizado
un adaptador puente sobre la tarjeta física del equipo que permite la asignación
de direcciones IP en la misma red que la máquina anfitrión. En concreto, el
anfitrión (Linux Ubuntu) está en la dirección 192.168.1.200/24, la máquina
Windows XP SP3 con la aplicación a atacar estará en 192.168.1.250/24 y la
máquina con Kali Linux en la 192.168.1.251/24.
7
2.2.1 msfconsole
2.2.2 msfvenom
4
https://www.metasploit.com/
5
https://www.offensive-security.com/metasploit-unleashed/msfvenom/
8
Fig. 7. Herramienta msfvenom
Las mismas funciones que se integran dentro del script en Python mona.py, ya
comentado en el apartado 2.1, están también presentes dentro de la distribución
de Kali, lo que nos permitirá usarlos para la generación de patrones de
caracteres aleatorios que nos permitan determinar, en su caso, el punto exacto
en el que se produce el desbordamiento de buffer. Concretamente, usaremos los
scripts pattern_create.rb y pattern_offset.rb para la generación de un patrón
de caracteres de cierto tamaño y la posterior búsqueda del offset en el que se
produce el desbordamiento del buffer. En Kali, estos scripts también se engloban
dentro de las herramientas que aporta MSF y están localizados en la ruta
/usr/share/metasploit-framework/tolos/exploits, como se ve más en la siguiente
figura.
9
Fig. 8. Ubicación de los scripts pattern_create.rb y pattern_offset.rb
10
Fig. 9. Se lanza la aplicación PCMan FTP Server en la máquina virtual Windows XP SP3
11
Fig. 11. Parámetros iniciales del fuzzer ftp_pre_post
Tras lanzar el exploit, se puede apreciar que el servidor FTP acepta sin
problemas peticiones de texto hasta unos 2000 caracteres, pero a partir de ahí
el fuzzer va más lento, y acaba reportando un fallo de la aplicación, que se
hace evidente cuando se observa que en Windows, efectivamente, la apliación se
ha caído. Viendo los datos del informe de errores en Windows se observa que se
reporta una dirección de memoria en la que parece ocurrir el fallo: 7043396f.
12
Fig. 13. Fallo en la aplicación
13
Fig. 15. Servidor FTP enlazado con Immunity Debugger
Reacondicionamos los parámetros de ftp_pre_post para afinar en torno al tamaño
de cadena que ha provocado el fallo:
- endsize: 2200 (definimos el tamaño máximo de la entrada de texto)
- startsize: 1900 (empezaremos con un texto de 1900 caracteres)
- stepsize: 20 (los saltos hasta provocar el fallo serán de 20 en 20
caracteres)
En la siguiente figura se presenta una captura de pantalla de cuándo se reporta
el fallo en el debugger, mientras el fuzzer está lanzando un texto de entre
2000 y 2020 caracteres. Se puede observar que el registro EIP, que apunta a la
siguiente instrucción a ejecutar, se queda marcando la misma dirección de
memoria que reportaba el informe de errores de Windows: 7043396f.
14
3.2. Esqueleto de ataque inicial
En el apartado anterior se ha visto que el servidor FTP es vulnerable a un
desbordamiento de buffer con una cadena entre 2000 y 2020 caracteres. El fuzzing
no ha reportado ningún comando específico para usar con el servidor FTP, pero
inicialmente vamos a intentarlo con el comando USER, con el que se especifica
en el protocolo FTP el usuario que accede al servidor.
Para cerciorarnos de que se produce el desbordamiento de buffer, preparamos un
esqueleto inicial (ver Anexo I) que mande un login de usuario de 2020
caracteres. Simplemente inicia una sesión FTP con un nombre de usuario compuesto
de 2020 caracteres A a la dirección IP que se le pasa como argumento y al
puerto 21.
15
Fig. 19. Desbordamiento de buffer con esqueleto inicial
16
Fig. 21. Esqueleto con el patrón cíclico
Ejecutamos nuevamente el script de este nuevo esqueleto con el debugger
funcionando. Cuando ocurre el desbordamiento de buffer, el debugger marca un
valor para el registro EIP: 386F4337.
17
3.4. Badchars
Existen una serie de caracteres que pueden limitar el funcionamiento de los
exploits, debido a que las funciones que implementan las aplicaciones pueden
reaccionar a la presencia de esos caracteres de formas varidadas impidiendo
que ocurra el desbordamiento de buffer. Estos caracteres reciben el nombre de
badchars. Comprobaremos a continuación manualmente si alguno de estos
caracteres inválidos afecta a la ejecución de nuestro exploit. Para ello,
utilizaremos un script en Python que es capaz de generar todo el conjunto de
caracteres posibles (ver Anexo IV). Hay un total de 206 caracteres generados
por este script.
18
Fig. 25. Esqueleto para ir probando los diferentes badchars
La primera ejecución de este esqueleto sobre el servidor FTP genera la pila
que se muestra en la Fig. 26, en la que el EIP se escribe con BBBB
(\x42\x42\x42\x42) –una dirección que no contiene ninguna instrucción legigle
y que posteriormente usaremos para buscar el salto-, luego aparecen los 30 nops
programados (\x90) y tras ellos no se ve el primer badchar (\x00), de lo que
se deduce que es un carácter inválido para esta aplicación.
19
Fig. 27. \x0a es un badchar
Una nueva iteración con el esqueleto modificado para descartar este badchar
genera la pila de la Fig. 28, que de nuevo muestra que \x0d es el siguiente
badchar a descartar.
20
En este proyecto se va a utilizar un payload que consiste en la ejecución de
una ventana que muestra un mensaje (ver Anexo VI). Obviamente, se genera la
carga para un sistema Windows de 32 bits y, además, se evitan los badchars
identificados en el apartado anterior. Las opciones pasadas a msfvenom para
ello son:
-p windows/messagebox: especifica el payload a usar, en este caso una
pequeña ventaña mostrando un mensaje. Con msfvenom –l payloads se puede
ver un listado de todos los payloads que permite generar esta aplicación.
TEXT=’TE HE PILLADO DESPREVENIDO!’: es el texto que se mostrará en la
ventana.
TITLE=HackeoEtico: se mostrará ese texto en la parte superior de la
ventana.
-f c: especifica el formato de salida; msfvenom permite generar payloads
en múltiples formatos (msfvenom --help-formats para verlos todos). En
este caso se genera en C.
-a x86: especifica la arquitectura en la que se ejecutará el payload.
-b ‘\x00\x0a\x0d’: Lista de badchars a evitar en la codificación.
21
Fig. 31. Exploit inicial
22
ESP (Extended Stack Pointer, que almacena un puntero a la parte inferior de la
pila) apunta a una parte del buffer desbordado. Por tanto, usaremos ese registro
para apuntar a nuestro payload.
Usamos el exploit inicial de la Fig. 31 para provocar el desbordamiento y
buscamos en las librerías del sistema o de la aplicación alguna instrucción
JMP ESP a la que saltar para que redirija el flujo al payload. Para ello,
usaremos el plugin mona y el comando find en Inmmunity Debugger.
23
Fig. 35. Todas las direcciones de salto encontradas
Ya lo único que resta es elegir una de esas direcciones, para lo que se seguirán
los siguientes criterios:
Que no tenga ninguno de los badchars en su dirección.
Que no tenga protección ASLR (Address Space Layout Randomization), lo
que mantendrá fija la referencia en memoria.
En este caso todas las direcciones cumplen lo anterior, porque en Windows XP
no existía la característica ASLR. También se ve que los saltos que salen en
el fichero find.txt dependen todos del sistema operativo, por lo que el exploit
solo se podrá ejecutar con el servidor FTP corriendo bajo Windows XP.
Elegimos por ejemplo la tercera de las direcciones que aparecen en la Fig. 35,
que llama a la librería dinámica kernel32.dll: 0x7c86467b. Con ella,
modificaremos el exploit inicial para cargar en el EIP dicha dirección. A la
hora de hacerlo, utilizamos el formato Little Endian, como se ve en la siguiente
figura (Ver Anexo IX).
24
Ejecutando el exploit anterior sobre la máquina Windows con el servidor FTP
funcionando veremos el efecto que tiene nuestro payload, como se muestra en
las siguientes figuras.
25
4. Anexos
En los anexos a este proyecto se incluyen los ficheros que se han ido
generando en los pasos anteriores, a saber:
I. esqueleto_inicial.py: Contiene un buffer de 2020 caracteres A que
provocan desbordamiento de buffer en la aplicación PCMan FTP Server
2.0.7.
II. patron: Contiene un patrón de 2020 caracteres cíclicos generado con
pattern_create.rb.
III. esqueleto_patron.py: Modificación del esqueleto inicial incorporando el
patrón generado anteriormente, para detectar el punto exacto en el que
se produce el desbordamiento.
IV. badchars.py: Script que permite la generación de una lista de caracteres
que pueden ser inválidos para una aplicación.
V. Badchars_ftp.py: Esqueleto que incluye los caracteres generados en IV
como si fuera el payload del exploit a partir del punto en el que se
produce el desbordamiento, de cara a ver si la aplicación no puede
insertar alguno de esos caracteres y evitarlos así en la generación del
payload.
VI. payload_windows_messagebox: Payload generado con msfvenom que genera una
ventana con un mensaje en la aplicación a la que ataca.
VII. exploit_inicial.py: Versión inicial del exploit que escribe en EIP un
valor basura (BBBB) para comprobar la inyección del payload tras el
desbordamiento del buffer.
VIII. find.txt: Fichero que contiene todas las direcciones JMP ESP encontradas
con el plugin mona.py.
IX. exploit_ftp.py: Exploit final del proyecto, incluyendo salto indirecto.
26