Está en la página 1de 14

Ethical Hacker Security Training – Buffer Overflows

Buffer Overflows

Agenda (Cont.)

 Introducción
 Por qué las aplicaciones son vulnerables?
 Tipos de Buffer Overflows
 Ejemplo
 El Stack
 Manejo de Memoria
 Stack Pointer
 Lenguaje Ensamblador
 Una Función por Dentro
 Shellcode
 Técnicas de Mutación
 Stack-Based Buffer Overflows: Pasos
 Ataque a un Programa Real

Ethical Hacker Security Training – Buffer Overflows 2


Copyright © 2008 SIClabs

Agenda (Cont.)

 Generando un Desbordamiento
 Luego de un Ataque
 Conocimientos requeridos para la explotación
 Heap-Based Buffer Overflows
 Detección
 Ejemplo en Lenguaje C
 Análisis del Código de Ejemplo
 Contramedidas
 Herramientas

Ethical Hacker Security Training – Buffer Overflows 3


Copyright © 2008 SIClabs

1
Ethical Hacker Security Training – Buffer Overflows

Introducción

 Un Buffer Overflow es un error que ocurre cuando un programa


asigna un bloque de memoria de cierta longitud (buffer) y luego
intenta guardar en ese bloque datos de un tamaño mayor al
asignado, produciendo que se sobreescriba información crucial para
la ejecución normal del programa.

 En algunas ocasiones eso puede suponer la posibilidad de alterar el


flujo de ejecución del programa pudiendo hacer que éste realice
operaciones no previstas.

 Esto es posible dado que en las arquitecturas comunes de


computadoras, la memoria no tiene estricta separación entre la que
se dedica a datos y a programa.

Ethical Hacker Security Training – Buffer Overflows 4


Copyright © 2008 SIClabs

Introducción (Cont.)

 Si el ejecutable que tiene el error en cuestión tiene privilegios


especiales se convierte además en un serio fallo de seguridad.

 El código especialmente preparado para obtener los privilegios del


programa atacado se llama shellcode.

 Los Buffer Overflows son utilizados por los hackers contra los
sistemas operativos y aplicaciones.

 Al igual que los ataques de SQL injection, usualmente tienen como


objetivo los campos de entrada de usuario.

Ethical Hacker Security Training – Buffer Overflows 5


Copyright © 2008 SIClabs

Introducción (Cont.)

 Un exploit de Buffer Overflow causa una falla (Memory Corruption)


en el sistema al solaparse la memoria o ejecutarse comandos de
consola o código arbitrario.

 Una vulnerabilidad de Buffer Overflow es causada por la falta de


chequeo o validación de una variable.

 Si la aplicación no chequea el tipo, formato o tamaño de la variable


antes de enviarla a la memoria, puede producirse una
vulnerabilidad de Buffer Overflow.

Ethical Hacker Security Training – Buffer Overflows 6


Copyright © 2008 SIClabs

2
Ethical Hacker Security Training – Buffer Overflows

Por que las Aplicaciones son Vulnerables?

 Los programadores no implementan buenas prácticas de desarrollo.

 Poca experiencia del programador.

 Existen presiones para entregar un producto a tiempo, los


programadores pueden cometer errores o los programas no son
correctamente auditados.

 Muchas funciones estándar son vulnerables en si mismas.

Ethical Hacker Security Training – Buffer Overflows 7


Copyright © 2008 SIClabs

Tipos de Buffer Overflows

 El Stack y el Heap son ubicaciones de la memoria del sistema,


donde se colocan las variables y datos de programas.

 Las ubicaciones del stack son estáticas y las del heap son
dinámicas y ocurren en tiempo de ejecución.

 Un heap-based buffer overflow ocurre cuando en la parte baja de la


memoria se sobreescribe otra variable dinámica.

 Como consecuencia, un programa puede producir un


comportamiento inadecuado.

Ethical Hacker Security Training – Buffer Overflows 8


Copyright © 2008 SIClabs

Tipos de Buffer Overflows (Cont.)

 Los dos tipos básicos de buffer overflows son:


 Stack-based
 Heap-based

 Cada uno de ellos funciona de forma diferente y su forma de


explotarlo varía para cada caso:
 El stack posee una organización pre-establecida que permite más
certeza respecto del modo en el que se comportará la memoria.
 El heap suele ser más difícil de explotar debido al modo dinámico en
que este se comporta, que es más inesperado.

Ethical Hacker Security Training – Buffer Overflows 9


Copyright © 2008 SIClabs

3
Ethical Hacker Security Training – Buffer Overflows

Ejemplo

 Este es un programa en C, que se compila sin que se produzcan


errores.

 Sin embargo, este programa intenta escribir más allá de la memoria


asignada para el buffer, situación que va a derivar en un
comportamiento inestable.

int main () {
int buffer[10];
buffer[20] = 10;
}

Ethical Hacker Security Training – Buffer Overflows 10


Copyright © 2008 SIClabs

El Stack

 El Stack es un bloque continuo de memoria que contiene datos.

 Es un mecanismo del tipo LIFO (Last Input First Output) que las
computadoras utilizan para pasar argumentos a funciones y
referenciar variables locales.

 Este actúa como un buffer manteniendo toda la información que la


función necesita.

 Es rellenado al comienzo de una función y liberado al finalizar.

 En la mayoría de las implementaciones va de direcciones de


memoria mayores a direcciones menores.

Ethical Hacker Security Training – Buffer Overflows 11


Copyright © 2008 SIClabs

Manejo de Memoria (IA32)

 Segmentos
 .text: solo lectura; código.
 .bss: datos no inicializados y dinámicos
 .data: datos inicializados y estáticos
 Stack
 Last In First Out (LIFO)
 Crece hacia abajo respecto de
la dirección de memoria
 Push
 Heap
 First In First Out (FIFO)
 Crece hacia arriba
 malloc()

Ethical Hacker Security Training – Buffer Overflows 12


Copyright © 2008 SIClabs

4
Ethical Hacker Security Training – Buffer Overflows

Stack Pointer

 Uno de los punteros necesarios para la operación del stack es el


Stack Pointer y su función es apuntar al tope del Stack.

 Cuando cualquier función realiza una llamada, los parámetros de


esta son puestos en el Stack.

 Luego la dirección de retorno seguida de un frame pointer (FP), son


almacenados en el Stack:
 Un frame pointer es utilizando para referenciar las variables locales y
los parámetros de la función
 Las variables locales de la función son puestas luego del FP

Ethical Hacker Security Training – Buffer Overflows 13


Copyright © 2008 SIClabs

Lenguaje Ensamblador

 Las dos operaciones más importantes relacionadas con el stack en


lenguaje assembler:
 Push: utilizada con el fin de “poner” un ítem al tope (encima) del stack.
 Pop: utilizada con el fin de “remover” un ítem del tope del stack.

 Algunos de los punteros y registros de operación más importantes:


 EIP (Extended Instruction Pointer): Apunta al código actualmente en
ejecución. Cuando una función es llamada, su valor es salvado en el
stack a fin de que pueda ser recuperado a posterior.
 ESP (Extended Stack Pointer): Apunta a la actual posición sobre el
stack y permite adicionar o remover elementos del stack por medio de
push y pop o a través de manipulación directa de punteros.
 EBP (Extended Base Pointer): Este registro debería conservar el
mismo valor durante el tiempo de vida de la función. Actúa como un
punto estático a fin de referenciar información basada en stack.

Ethical Hacker Security Training – Buffer Overflows 14


Copyright © 2008 SIClabs

Una Función Por Dentro

* Fuente: Alejandro Gramajo: Introducción a la Explotación de BoF

Ethical Hacker Security Training – Buffer Overflows 15


Copyright © 2008 SIClabs

5
Ethical Hacker Security Training – Buffer Overflows

Shellcode

 El Shellcode es un conjunto de órdenes programadas generalmente


en lenguaje ensamblador.
 Ejemplo:

"\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e"
"\x92\x03\xa0\x08\x94\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0"
"\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc\x82\x10\x20\x3b\xaa\x10\x3f\xff"
"\x91\xd5\x60\x01\x90\x1b\xc0\x0f\x82\x10\x20\x01\x91\xd5\x60\x01"

 El array de caracteres se obtiene al desensamblar el código


programado en lenguaje ensamblador, una vez compilado (binario).
 Así tenemos que una shellcode es código máquina escrito en
notación hexadecimal.
 Posteriormente se utilizan dentro de programas escritos en C.

Ethical Hacker Security Training – Buffer Overflows 16


Copyright © 2008 SIClabs

Técnicas de Mutación

 Un hacker debe conocer exactamente las direcciones de memoria y


el tamaño del stack para hacer que el puntero de retorno apunte a
su código.

 Entonces podría utilizar instrucciones de assembler NOP (No


Operation) para avanzar en la memoria sin ejecutar nada.

 Si hay un sistema de detección de intrusos escuchando en la red,


podría detectar este comportamiento si inspecciona en busca de
NOPs.

Ethical Hacker Security Training – Buffer Overflows 17


Copyright © 2008 SIClabs

Técnicas de Mutación (Cont.)

 El hacker podrá reemplazará los NOPs por fragmentos de código


equivalentes e inocuos. Esta mutación podría evitar ser detectado
por el IDS.

 Los programadores no deberían utilizar las librerías estándar


strcpy(), strcat(), y streadd() en C/C++ ya que son susceptibles a
buffer overflow.

 Curiosidad: Java no es susceptible a este tipo de ataques, dado su


diseño.

Ethical Hacker Security Training – Buffer Overflows 18


Copyright © 2008 SIClabs

6
Ethical Hacker Security Training – Buffer Overflows

Stack-Based Buffer Overflows: Pasos

 Un buffer esta esperando un numero determinado de datos.

 Enviamos al buffer datos de mayor tamaño que dicho número.

 Si el sistema no verifica estos valores, estos datos continúan


sobrescribiendo el programa.

 Código malicioso es puesto en el Stack.

 Gracias al desbordamiento se sobrescribe el puntero de retorno y el


flujo de control pasa al código malicioso.

Ethical Hacker Security Training – Buffer Overflows 19


Copyright © 2008 SIClabs

Ataque a un Programa Real

 Asumimos que una función es explotada enviando un string


demasiado largo.

 Este string sobrescribe el buffer y causa un error de segmentación.

 El puntero de retorno de la función es sobrescrito y el atacante


altera el flujo de ejecución.

 En caso de que el atacante quisiera insertar código con el fin de que


el mismo sea ejecutado, debería:
 Conocer la dirección exacta del Stack.
 Conocer el tamaño del Stack.
 Hacer que el puntero de retorno apunte al código que quiere ejecutar.

Ethical Hacker Security Training – Buffer Overflows 20


Copyright © 2008 SIClabs

Generando un Desbordamiento

* Fuente: Sergio Alvarez: Exploit Programming (2005)

Ethical Hacker Security Training – Buffer Overflows 21


Copyright © 2008 SIClabs

7
Ethical Hacker Security Training – Buffer Overflows

Luego del Ataque

 Una vez que el proceso es vulnerado, el atacante tiene los mismos


privilegios que tenia ese proceso.

 Ahora puede intentar explotar un buffer overflow local para escalar


privilegios.

 También puede crear un backdoor o realizar conexiones


interactivas.

Ethical Hacker Security Training – Buffer Overflows 22


Copyright © 2008 SIClabs

Conocimientos Requeridos para la Explotación

 Funciones de C y el Stack.

 Lenguaje Assembler.

 Entendimiento de cómo se realizan las llamadas al sistema (a nivel


maquina).

 Llamadas al sistema exec().

Ethical Hacker Security Training – Buffer Overflows 23


Copyright © 2008 SIClabs

Heap-Based Buffer Overflows

 Las variables que son dinámicamente asignadas por funciones


como malloc(), son creadas en el Heap.

 Heap es una memoria dinámicamente asignada, diferente de la


memoria que es asignada por el Stack y el código.

 En un ataque del tipo Heap Buffer Overflow, el atacante sobrescribe


un buffer que se encuentra en la parte más baja del Heap,
sobrescribiendo otras variables dinámicas, generando efectos
inesperados.

Ethical Hacker Security Training – Buffer Overflows 24


Copyright © 2008 SIClabs

8
Ethical Hacker Security Training – Buffer Overflows

Detección

 Existen dos formas de detectar Buffer Overflow:


 Una es analizando código fuente. Se debe verificar el uso inapropiado
de las funciones estándar, especialmente aquellas relacionados con la
entrada/salida de cadenas.
 Otra forma es testear la aplicación ingresando una gran cantidad de
datos y verificar si se comporta de manera anormal. (Fuzzers)

Ethical Hacker Security Training – Buffer Overflows 25


Copyright © 2008 SIClabs

Ejemplo en Lenguaje C

#include <stdio.h>

main() {

char *name;
char *dangerous_system_command;
name = (char *) malloc(10);
dangerous_system_command = (char *) malloc(128);

printf("Address of name is %d\n", name);


printf("Address of command is %d\n",
dangerous_system_command);
sprintf(dangerous_system_command, "echo %s", "Hello world!");
printf("What's your name?");
gets(name);
system(dangerous_system_command);

Ethical Hacker Security Training – Buffer Overflows 26


Copyright © 2008 SIClabs

Análisis del Código de Ejemplo

 Lo primero que realiza el programa es declarar 2 variables de tipo


string y asignar memoria a las mismas.
 A la variable _ name_ se le asignan 10 bytes de memoria (lo cual
permite tener una cadena de 10 caracteres).
 La variable "dangerous_system_command" tiene 128 bytes.
 En C, estas variables son directamente almacenadas en memoria
una detrás de la otra.
 Para compilar el programa, utilizar (en Linux): gcc overrun.c _ o
overrun.
 Una vez compilado y ejecutado, estaremos en condiciones de
observar que la dirección dada para la variable
"dangerous_system_command" es de 16 bytes desde el inicio de la
variable “name”, siendo los 6 bytes extras, los utilizados por la
llamada al sistema “malloc” a efectos de que la memoria pueda
retornar a su uso general al momento que esta sea liberada.
Ethical Hacker Security Training – Buffer Overflows 27
Copyright © 2008 SIClabs

9
Ethical Hacker Security Training – Buffer Overflows

Análisis del Código de Ejemplo (Cont.)

[XX]$ ./overrun
Address of name is 134518696
Address of command is 134518712
What's your name?xmen
Hello world!
[XX]$

 La dirección dada para la variable "dangerous_system_command" es de 16 bytes


desde el inicio de la variable _ name_
 Los 6 bytes extras son utilizados por la llamada al sistema _ malloc_ permitiendo que
la memoria pueda retornar a su uso general cuando esta sea liberada
 _ Gets_ lee una cadena de la entrada estándar a una locación de memoria
específica. Al no tener definido un tamaño, va a leer tantos caracteres como pueda
hasta el fin de línea, incluso si sobrescribe el final de la memoria que le fue asignada
 Conociendo esto, podemos escribir el contenido de la memoria de la variable _
name_ dentro de "dangerous_system_command" y retornar el comando que
deseemos

Ethical Hacker Security Training – Buffer Overflows 28


Copyright © 2008 SIClabs

Análisis del Código de Ejemplo (Cont.)

[XX]$ ./overrun

Address of name is 134518696


Address of command is 134518712
What's your name?0123456789123456cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail

 Conociendo el modo de explotar la vulnerabilidad el atacante inserta un string


específicamente construido el cual contiene como parte de su carga el comando de
sistema operativo “cat”.
 El objetivo de que sea mostrado en pantalla el contenido del archivo /etc/passwd

Ethical Hacker Security Training – Buffer Overflows 29


Copyright © 2008 SIClabs

Contramedidas

 Existen librerías consideradas seguras, que reemplazan a las


originales para realizar las mismas funciones de forma específica.
 También existen programas que chequean que el stack no haya
sido alterado cuando una función retorna de una subrutina, y si ha
sido alterado, aborta.
 Otras protecciones dividen el stack en dos partes: una para datos y
otra para retornos de función.
 Se implementan como parches para el compilador.

Ethical Hacker Security Training – Buffer Overflows 30


Copyright © 2008 SIClabs

10
Ethical Hacker Security Training – Buffer Overflows

Contramedidas (Cont.)

 Otras soluciones pueden incluir la creación automática de un área


segura en memoria para almacenar una copia de las direcciones de
retorno.
 Luego se agrega un código en tiempo de compilación, que permite
proteger sin cambiar el espacio de direcciones del stack.
 Asi se mantienen dos copias de las direcciones de retorno, una de las
cuales va al stack, y luego se comparará con la almacenada en un
repositorio para detectar cambios.
 Algunas herramientas realizan comparaciones entre la dirección de
retorno original y la que aparece en el stack al regresar de las
funciones y subrutinas.
 Existen librerías que reescriben ciertas funciones sensibles:
 Estas son dinámicas y se cargan antes que el resto.
 Su trabajo es interceptar funciones peligrosas y utilizar las propias en
su lugar.
 Asi pueden detectar violaciones en los límites de los buffers.
Ethical Hacker Security Training – Buffer Overflows 31
Copyright © 2008 SIClabs

Contramedidas (Cont.)

 Otras medidas se orientan a la protección del espacio ejecutable,


para prevenir que se ejecute código en regiones peligrosas:
 En sistemas Windows es el “Data Execution Prevention” (DEP)
 En sistemas Unix/Linux/BSD se puede hacer mediante Openwall, PaX,
ExecShield, etc.

 Prevenir la ejecución de código en el stack implica que el atacante


no puede proveer código arbitrario residente allí.
 Igualmente son posibles otros ataques como return-to-libC o Heap
Overflow

Ethical Hacker Security Training – Buffer Overflows 32


Copyright © 2008 SIClabs

Contramedidas (Cont.)

 Otra protección es el uso del sistema de “Address Space Layout


Randomization” (ASLR) que implica la aleatoriedad de posiciones
de memoria de datos específicos (dirección base del ejecutable,
posición de las librerías, heap, stack, etc.)

 Además, se hacen aleatorias las direcciones de la memoria virtual.

 Esto complica el trabajo de adivinación e inferencia de un ataque,


aunque no hace imposible su éxito.

Ethical Hacker Security Training – Buffer Overflows 33


Copyright © 2008 SIClabs

11
Ethical Hacker Security Training – Buffer Overflows

Herramientas: Return Address Defender (RAD)

 RAD es un parche para el compilador que automáticamente crea un


área segura para almacenar una copia de la dirección de retorno.

 Además de eso, RAD automáticamente provee código de


protección dentro de las aplicaciones que el compila para defender
los programas contra ataques de Buffer Overflow.

 RAD no modifica el comportamiento del Stack.

Ethical Hacker Security Training – Buffer Overflows 34


Copyright © 2008 SIClabs

Herramientas: Stack Guard

 StackGuard es un compilador enfocado en la defensa de los


programas contra ataques "stack smashing“.

 Los programas que han sido compilados con StackGuard son en


gran medida inmune a los ataques de "stack smashing“.

 La protección no requiere cambios en el código fuente.

 Cuando una vulnerabilidad es explotada, StackGuard detecta el


ataque en progreso, genera una alerta de intrusión y detiene el
programa víctima.

Ethical Hacker Security Training – Buffer Overflows 35


Copyright © 2008 SIClabs

Herramientas: AppArmor

 AppArmor es una aplicación y herramienta de seguridad incluida en


algunas distribuciones Linux como SuSE, Ubuntu y Red Hat.

 Está diseñada para proveer una protección de fácil uso para las
aplicaciones, restringiendo las acciones que el software instalado
puede realizar.

 Permite al administrador asociar a cada programa un perfil de


seguridad que restrinja las capacidades de ese programa.

 Complementa el modelo tradicional de control de acceso


discrecional de Unix (DAC) proporcionando el control de acceso
obligatorio (MAC).

Ethical Hacker Security Training – Buffer Overflows 36


Copyright © 2008 SIClabs

12
Ethical Hacker Security Training – Buffer Overflows

Buffer Overflows

Links, Referencias y
Lecturas Complementarias

Links

 AppArmor
 http://en.opensuse.org/AppArmor

 ProPolice
 http://wiki.x.org/wiki/ProPolice

 Libsafe
 http://directory.fsf.org/libsafe.html

 RAD
 http://www.ecsl.cs.sunysb.edu/RAD

 SSP
 http://www.trl.ibm.com/projects/security/ssp

Ethical Hacker Security Training – Buffer Overflows 38


Copyright © 2008 SIClabs

Referencias y Lecturas Complementarias

 CEH Official Certified Ethical Hacker Review Guide


By Kimberly Graves
(Sybex) ISBN: 0782144373
 Certified Ethical Hacker Exam Prep
By Michael Gregg
(Que) ISBN: 0789735318
 Hacking Exposed, Fifth Edition
By S.McClure, J.Scambray, and G.Kurtz
(McGraw-Hill Osborne Media) ISBN: 0072260815
 Gray Hat Hacking, Second Edition
By S.Harris, A.Harper, C.Eagle, J.Ness
(McGraw-Hill Osborne Media) ISBN: 0071495681

Ethical Hacker Security Training – Buffer Overflows 39


Copyright © 2008 SIClabs

13
Ethical Hacker Security Training – Buffer Overflows

Buffer Overflows

Preguntas?

14

También podría gustarte