domingo, 18 de marzo de 2012

Explotación de vulnerabilidades - Stack Buffer Overflow (Parte I)

Si nos ponemos a analizar la gran cantidad de vulnerabilidades que salen diariamente en portales como securityfocus.org, secunia.com, packetstormsecurity.org, etcétera. estoy seguro que la vulnerabilidad “Stack Buffer Overflow” es protagonista en más de una ocasión.

Muchos de vosotros habréis oído hablar de dicho fallo, pero para aquellos que no lo tengáis tan claro os pongo una pequeña descripción de la Wikipedia (http://en.wikipedia.org/wiki/Stack_buffer_overflow):

“In software, a stack buffer overflow occurs when a program writes to a memory address on the program's call stack outside of the intended data structure; usually a fixed length buffer.”

Es decir, la vulnerabilidad Stack Buffer Overflow ocurre cuando una aplicación no controla correctamente el número de bytes que son almacenados en una dirección de memoria previamente reservada, de forma que la cantidad de bytes que se van a almacenar son superiores a los reservados.

Si recordáis en la primera entrada de la serie introducción a la ingeniería inversa, veíamos como se almacenaban los datos en el fragmento de la stack que se reservaba para una función. Aun así vamos a recordarlo.

Pongo primero el código en lenguaje C para que os resulte más sencilla la interpretación en ensamblador.

image

Si os fijáis, se están estableciendo dos variables: la varaible “pass” que se iguala a ocho letras “a” en minúsculas y la variable “name” que es solicitada por teclado. Tal y como está generado el código, es imposible acceder a la función printf “This is imposible!!”, ya que la variable “pass” nunca es modificada. Pero, ¿realmente esto es cierto?, y como una imagen vale más que mil palabras, vamos a ver el estado de la pila justo antes de realizar la comparación de cadenas.

image

He intentado aclarar lo máximo posible la imagen para que no resulte muy complicada, aun así haré una pequeña descripción.

- 0x004013C6: Reserva/Añade el espacio necesario en la PILA para realizar operaciones y almacenar las variables locales.
- 0x004013CE a 0x004013DD: Almacena la variable local “pass” en la PILA.
- 0x004013ED a 0x004013FC: Almacena la cadena introducida por teclado mediante la función “scanf” en el espacio de la PILA reservado para la variable “name”.

Una vez entendido como se almacenan las variables locales en la pila, supongo que ya sabréis a donde quiero llegar.

Aquí es donde nos encontramos la vulnerabilidad “Stack Buffer Overflow”, ¿Qué pasaría si al pedirnos que introduzcamos nuestro nombre, le asignamos una cadena que supere los 8 bytes reservados para la variable “name”?

Vamos ha realizar la prueba con la cadena “YYYYYYYYYYYYYYYY”, dieciséis “Y”.

image

Como se puede observar en la captura anterior, hemos podido sobrescribir la variable “pass” añadiendo una cadena más grande que la esperada. En este caso existían la variable “name” de 8 bytes y la variable “pass” de 8 bytes, al introducir una cadena de 16 bytes por teclado podremos sobrescribir el contenido de la variable “pass”.

Con lo visto, solo necesitaríamos una cadena de dieciséis bytes donde los últimos 8 bytes fueran la cadena “pa$$word” para poder sobrescribir la variable “name” y así acceder al printf “This is imposible!!” que en un principio no era posible acceder.

image

Así de sencillo ;) Para esta entrada he decidido realizar el ejemplo más básico que se me ha ocurrido y así llegar a entender de un modo simple los conceptos básicos de la vulnerabilidad “Stack Buffer Overflow”.

No solo es posible realizar este tipo de acciones una vez te has aprovechado de esta vulnerabilidad, algunas de las acciones que se me ocurren son:

- Ejecución de comando
- Alterar el comportamiento de la aplicación
- Denegaciones de Servicio
- Elevación de privilegios

Un ejemplo rápido de como provocar una denegación de servicio sobre la aplicación, se podría realizar introduciendo una cadena de caracteres lo suficientemente larga.

image

La explicación a la Denegación de Servicio es muy sencilla, al igual que la aplicación sobrescribe el espacio de memoria reservado para las variables locales, al seguir introduciendo caracteres en la PILA se seguirá llenando hasta sobrescribir las direcciones necesarias para el correcto funcionamiento de la aplicación.

Hasta aquí una pequeña introducción de la vulnerabilidad “Stack Buffer Overflow”. En las próximas entradas veremos cómo llegar a realizar ejecución de comandos y haremos algún que otro exploit para aplicaciones conocidas.

Un Saludo!!

6 comentarios:

  1. Muy bueno, siempre quise empezar con este tema, llego la hora...

    ResponderEliminar
  2. Una pregunta, que programa usas para ver el estado de la pila, el OLLYDBG? gracias

    ResponderEliminar
    Respuestas
    1. En este caso el que estoy utilizando es IDA PRO, pero sí, podrías utilizar OllyDbg, Immunity Debugger, gdb, etc, etc.

      Un Saludo.

      Eliminar
  3. Hola, muy gráfico y bien explicado.

    No sé si lo explicarás más adelante, pero para que esto funcione se debería compliar con la opción:

    "-fno-stack-protector"

    y desactivar el ASLR:

    "sudo echo 0 > /proc/sys/kernel/randomize_va_space"

    Saludos :-)

    ResponderEliminar
    Respuestas
    1. Buenas Felipe,

      en este caso el ejemplo lo realice con un sistema Windows XP, por lo que, no es aplicable lo que comentas. De todos modos sí que aplica al último post que realicé http://unlearningsecurity.blogspot.com.es/2012/05/exploit-corehttp-web-server-053-stack.html

      Muchas gracias ;)

      Eliminar