Stack Shellcode
Información Básica
Shellcode de pila es una técnica utilizada en explotación binaria donde un atacante escribe shellcode en la pila de un programa vulnerable y luego modifica el Puntero de Instrucción (IP) o el Puntero de Instrucción Extendido (EIP) para que apunte a la ubicación de este shellcode, provocando su ejecución. Este es un método clásico utilizado para obtener acceso no autorizado o ejecutar comandos arbitrarios en un sistema objetivo. Aquí tienes un desglose del proceso, incluido un ejemplo simple en C y cómo podrías escribir un exploit correspondiente usando Python con pwntools.
Ejemplo en C: Un Programa Vulnerable
Comencemos con un ejemplo simple de un programa vulnerable en C:
Este programa es vulnerable a un desbordamiento de búfer debido al uso de la función gets()
.
Compilación
Para compilar este programa deshabilitando varias protecciones (para simular un entorno vulnerable), puedes usar el siguiente comando:
-fno-stack-protector
: Deshabilita la protección de la pila.-z execstack
: Hace que la pila sea ejecutable, lo cual es necesario para ejecutar el shellcode almacenado en la pila.-no-pie
: Deshabilita la Ejecución de Código Independiente de la Posición, facilitando predecir la dirección de memoria donde estará ubicado nuestro shellcode.-m32
: Compila el programa como un ejecutable de 32 bits, a menudo utilizado por simplicidad en el desarrollo de exploits.
Exploit en Python usando Pwntools
Así es como podrías escribir un exploit en Python usando pwntools para realizar un ataque ret2shellcode:
Este script construye un payload que consiste en un NOP slide, el shellcode, y luego sobrescribe el EIP con la dirección que apunta al NOP slide, asegurando que el shellcode se ejecute.
El NOP slide (asm('nop')
) se utiliza para aumentar la probabilidad de que la ejecución "se deslice" hacia nuestro shellcode independientemente de la dirección exacta. Ajusta el argumento p32()
a la dirección de inicio de tu búfer más un desplazamiento para aterrizar en el NOP slide.
Protecciones
ASLR debe estar deshabilitado para que la dirección sea confiable en todas las ejecuciones, de lo contrario, la dirección donde se almacenará la función no será siempre la misma y necesitarías alguna fuga para averiguar dónde se carga la función win.
Los Canarios de la Pila también deben estar deshabilitados o la dirección de retorno comprometida del EIP no será seguida nunca.
La protección de NX en la pila evitaría la ejecución del shellcode dentro de la pila porque esa región no sería ejecutable.
Otros Ejemplos y Referencias
64 bits, ASLR con fuga de dirección de pila, escribe shellcode y salta a él
32 bits, ASLR con fuga de dirección de pila, escribe shellcode y salta a él
32 bits, ASLR con fuga de dirección de pila, comparación para evitar la llamada a exit(), sobrescribe variable con un valor y escribe shellcode y salta a él
arm64, sin ASLR, gadget ROP para hacer la pila ejecutable y saltar al shellcode en la pila
Última actualización