Shellcode
Shellcode
1. Propósito ........................................................................................................................... 3
2. Desactivar ASLR ................................................................................................................. 3
3. Creación de un programa vulnerable .................................................................................. 3
4. Desbordamiento de pila ..................................................................................................... 4
5. Fichero de desbordamiento ................................................................................................ 5
6. Depuración del programa................................................................................................... 7
7. Ejecución normal ................................................................................................................ 8
8. Ejecución desbordando la pila .......................................................................................... 10
9. Instalación HexCurse ........................................................................................................ 12
10. Modificar la dirección de retorno ..................................................................................... 12
11. Prueba nueva dirección de retorno ................................................................................... 13
12. Obtener shellcode ............................................................................................................ 14
13. Construir el exploit ........................................................................................................... 16
14. Prueba del exploit ............................................................................................................ 18
15. Elegir dirección de retorno para el exploit ........................................................................ 19
16. Prueba del exploit 2 ......................................................................................................... 21
17. Actualización del programa.............................................................................................. 22
18. Prueba exploit 3 de la actualización ................................................................................. 23
19. Posible solución vulnerabilidad ........................................................................................ 26
2. Desactivar ASLR
ASLR es una técnica utilizada para mitigar los ataques contra los desbordamientos de buffer,
haciendo que los segmentos de memoria no sean fijos, sino que esta varié de forma aleatoria
en cada ejecución por lo que para poder realizar sin problemas la practica, lo deshabilitamos.
4. Desbordamiento de pila
En una ventana del terminal, ejecutamos el comando de ejecución del programa con un
argumento inusual de 100 caracteres “A”, para ver la ejecución y si se produce un
desbordamiento de la pila.
./name
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAA
5. Fichero de desbordamiento
• Ahora debemos poner la salida de este programa en un archivo nuevo para ejecutarlo
contra el programa vulnerable que llamaremos “sal” (de salida).
• En la terminal ejecutamos los comandos
./des > sal
ls -l sal
• Esto genera un archivo llamado “sal” que contiene 66 caracteres “A” y un salto de línea,
es decir, en total 67 caracteres.
7. Ejecución normal
• Los registros mas importantes son esp (parte superior de la pila) y ebp (parte inferior de
la pila) que están resaltados en blanco con el ratón.
Buscaremos los bytes exactos de la dirección de retorno modificando el archivo que contiene
los 66 caracteres “A” y el salto de línea (necesario para el exploit).
• En una nueva ventana de terminal siendo root ejecutamos los comandos para copiar el
archivo “sal” en un nuevo archivo “sal2” y abrirlo en el editor hexadecimal HexCurse
cp sal sal2
hexcurse sal2
• En la ventana del editor (ventana derecha) cambiaremos por ejemplo los 8 últimos
caracteres “A” por “87654321” que serán “38 37 36 35 34 33 32 31” en la ventana
hexadecimal (recordemos el objetivo de localizar e identificar que caracteres
sobrescriben la dirección de retorno).
El shellcode es la carga útil del exploit de código. Para esta practica, crearemos un shellcode
sencillo que llama a la función exit() y se utiliza para salir de un programa (este exploit no
logra nada, pero sirve para ver la explotación del programa vulnerable y lograr el objetivo).
• Creamos un fichero nuevo llamado “exit.asm” que será donde escribamos nuestro
shellcode en código ensamblador
nano exit.asm
section .text
global _start
_start:
xor eax, eax ;poner a cero eax
mov al, 1 ;se copia el valor 1 a la parte baja del registro AX (AL)
xor ebx,ebx ;poner a cero ebx
int 0x80 ; llamada a la interrupción del sistema
Una vez obtenido el shellcode vamos a crear un exploit con Python en un archivo llamado
“exp” (de exploit) para lanzarlo y/o explotarlo en el programa vulnerable.
• Primero debemos establecer los NOP slide, pero ¿Qué es un NOP slide?
o Existen algunas imperfecciones en el depurador por las que un exploit podría fallar
entre otros por las variables de entorno que pueden hacer que la ubicación de la
pila cambie ligeramente.
o La solución establecida es un NOP slide. Una larga serie de “90” caracteres o bytes
(x90) que cuando se procesan no hacen nada, y pasan a la siguiente instrucción.
• Para este exploit usaremos por ejemplo un NOP slide de 30 bytes.
• En una nueva ventana de terminal ejecutamos el comando
nano exp
#!/usr/bin/python
nopslide = '\x90' *30
shellcode = (‘\x31\xc0\xb0\x01\x31\xdb\xcd\x80’)
padding = 'A' * (62 - 8 - 4 - 30)
rip = ‘4321’
print nopslide + shellcode + padding + rip
• En una nueva terminal ejecutamos los comandos necesarios para ejecutar el entorno de
depuración gdb y ver los resultados.
gdb -q name
break 10
Después de comprobar que tanto la dirección de retorno como los demás datos del exploit
están en los registros debemos elegir la dirección correcta para que ejecute el shellcode.
Si todo fuera perfecto, podríamos poner la dirección del primer byte del shellcode, pero para
dar un margen de error, elegimos una dirección en algún lugar en medio del NOP slide.
• Fijándonos en la imagen anterior de los registros (imagen del punto 14) una dirección
adecuada seria 0xffffd5c0
Este exploit de código funciona únicamente con la compilación actual del programa. Si este
programa tuviera una actualización en la que se ha tenido que volver a compilar, deberíamos
de volver a cambiar nuestro exploit con una nueva dirección de retorno y ver si sigue siendo
igual de vulnerable.
• En una nueva terminal ejecutamos los comandos necesarios para copiar el archivo que
contiene el programa “name.c” a uno nuevo llamado “name2.c”
cp name.c name2.c
nano name.c
• Actualizamos el programa cambiándole el mensaje de salida “Listo!” por “Fin!” y
guardamos.
• El exploit provoca la salida inmediata del programa sin mostrar el mensaje de salida
“Fin!”.