Explotacion del Buffer Overflow

1. Spiking

Spiking es una técnica de prueba automatizada utilizada para identificar vulnerabilidades de buffer overflow en aplicaciones. Se basa en el envío de datos malformados o inesperados a la aplicación objetivo para observar cómo responde.

Spiking
  • Herramientas: La herramienta "SPIKE" es comúnmente utilizada para esta técnica.

  • Proceso:

    • Se envían cadenas de caracteres de longitud variable y contenido inesperado a diferentes puntos de entrada de la aplicación.

    • Se monitorean las respuestas de la aplicación en busca de comportamientos anómalos, como fallos de segmentación o cierres inesperados, que indiquen una posible vulnerabilidad de buffer overflow.

2. Fuzzing

Fuzzing es una técnica similar a spiking, pero más exhaustiva y automatizada, que envía una gran cantidad de entradas aleatorias a la aplicación para encontrar fallos.

Fuzzing
  • Herramientas: Fuzzers como Peach, Sulley, y el built-in fuzzer de Burp Suite pueden ser utilizados.

  • Proceso:

    • Se define un conjunto de datos de prueba que incluye entradas válidas e inválidas.

    • El fuzzer envía estas entradas al programa, monitoreando la aplicación en busca de fallos.

    • Los fallos observados se analizan para identificar puntos donde el programa no maneja correctamente los datos de entrada, lo que puede indicar un buffer overflow.

3. Finding the Offset

Finding the Offset implica determinar la posición exacta en la que el buffer overflow sobrescribe el registro de instrucción (EIP).

Finding the Offset
  • Herramientas: Metasploit Framework, pattern_create y pattern_offset.

  • Proceso:

    • Generar un patrón único y largo usando herramientas como pattern_create.rb.

    • Enviar este patrón a la aplicación hasta que ocurra el fallo.

    • Verificar el valor del EIP después del fallo. Usar pattern_offset.rb para encontrar la posición exacta del patrón que sobrescribió el EIP.

    • El valor devuelto es el offset, que indica cuántos bytes desde el inicio del buffer hasta el EIP.

4. Overwriting the EIP

Overwriting the EIP es el proceso de sobrescribir el registro de instrucción (EIP) con una dirección de memoria controlada.

Overwriting The EIP
  • Proceso:

    • Usar el offset encontrado para enviar una cadena de caracteres que sobrescriba el EIP.

    • La nueva cadena debe contener el payload seguido de la dirección de retorno controlada que redirige la ejecución a nuestro shellcode.

5. Finding the Bad Characters

Finding the Bad Characters implica identificar los caracteres que causan problemas cuando se incluyen en el shellcode.

Finding the Bad Charaters
  • Proceso:

    • Enviar una cadena de prueba que incluya todos los posibles caracteres (0x00-0xFF).

    • Analizar la respuesta de la aplicación y la memoria para ver si algún carácter causa truncamiento o comportamientos anómalos.

    • Excluir los caracteres problemáticos del shellcode.

6. Finding the Right Module

Finding the Right Module es encontrar un módulo (DLL o ejecutable) que no esté protegido por técnicas de seguridad como ASLR (Address Space Layout Randomization) o DEP (Data Execution Prevention).

  • Herramientas: mona.py y !mona modules en Immunity Debugger.

  • Proceso:

    • Ejecutar el comando !mona modules para listar todos los módulos cargados.

    • Identificar los módulos sin ASLR y sin DEP que pueden ser utilizados para redirigir el flujo de ejecución al shellcode.

7. Generating Shellcode

Generating Shellcode implica crear un payload que, una vez ejecutado, proporcione acceso al sistema o ejecute un comando específico.

Generating Shellcode and Gaining Shell
  • Herramientas: msfvenom en Metasploit Framework.

  • Proceso:

    • Definir el tipo de payload, por ejemplo, un reverse shell o un bind shell.

    • Generar el shellcode excluyendo los bad characters identificados previamente.

    • Incluir opciones como la codificación para evadir detección por antivirus.

8. Gaining Shell

Gaining Shell es el proceso final donde se explota la vulnerabilidad para obtener acceso al sistema.

  • Proceso:

    • Inyectar el shellcode en la memoria a través del buffer overflow.

    • Sobrescribir el EIP para redirigir la ejecución al shellcode.

    • Establecer la conexión (reverse shell) o escuchar en el puerto especificado (bind shell).

    • Una vez que el shellcode se ejecuta correctamente, se obtiene acceso al sistema comprometido.

Última actualización