150 likes | 303 Views
Conceptos básicos (CPU Intel x86). Desbordamiento de buffer remoto. Ventajas del método:. No necesita cuenta de usuario en la máquina a asaltar como la necesitaría una escalada de privilegios. Los exploits suelen ser bastante compactos y no muy extensos. El código de Windows.
E N D
Conceptos básicos (CPU Intel x86) Desbordamiento de buffer remoto
Ventajas del método: • No necesita cuenta de usuario en la máquina a asaltar como la necesitaría una escalada de privilegios. • Los exploits suelen ser bastante compactos y no muy extensos. • El código de Windows ...
Tipos de Desbordamiento • Tres tipos : • Desbordamiento de buffer en stack (machacar dirección de retorno en el stack). <------- • Desbordamiento de “heap memory” (machacar “header” de espacio libre, la función de asignación machaca dirección de retorno de función). • Desbordamiento en segmento de datos (machacar puntero a función).
Regiones de un proceso en memoria: Pila (stack) Memoria dinámica (heap) Parte alta de memoria Variables estáticas (espacio reservado y valores de inicialización) Código y datos de sólo lectura Parte baja de memoria
Parte alta de memoria función(char *parametro1,...) { char buff_aux_local[N]; ... procesa la petición del usuario del servicio: parte de la info se mete en buff_aux_local; } main() { ... char buff_pet_usuario[SIZE]; ... apertura de un socket, asociado a un puerto donde se presta el servicio; escucha en el socket y lo que reciba lo mete en buffer buff_pet_usuario; ... función(buff_pet_usuario,...); ... } M A I N buff_pet_usuario Parte baja de la pila ... Parámetro 1 ... F U N C I O N Dirección de Retorno Saved Frame Pointer buff_aux_local ... Parte alta de la pila Stack pointer Parte baja de memoria
La función copia parte de la petición a buff_aux_local STACK OVERFLOW Info a copiar en buff_aux_local Shellcode buff_pet_usuario Parámetro 1 3) 1) ... ¡ Dirección de retorno machacada! Dirección dentro de buff_pet_usuario Info... Buffer local, es desbordado y en la posición de la dirección de retorno de la función, metemos una dirección que apunta a una posición dentro de buff_pet_usuario, a un lugar que nos interese en el shellcode. 2) Info... buff_aux_local ...
Shellcode • Escucha en otro puerto diferente al del servicio o aplicación. • Asocia una “shell” de commandos interactiva a ese puerto. • Con un poco de suerte ... ¡ se ejecutará con privilegios de administrador!
Requisitos del shellcode: • El paso a ensamblador de la shellcode debe cumplir con el requisito de no tener caracteres nulos intermedios, pues podrían ser entendidos como final del string que se mete en el buffer (p.ej: MOVL %EBX,0x0 -> XOR %EBX,%EBX). • La estructura de la información en el buffer a desbordar, dependerá de la aplicación o servicio a ser atacado. Normalmente el código de la shellcode, y la información necesaria para desbordar el buffer local de la función vulnerable, se integrarán en una petición “válida” para esa aplicación o servicio. • No sabemos donde está el buffer en el que colocamos el shellcode: todos los direccionamientos deben ser relativos.
Info de la petición buff_pet_usuario: Info a copiar a buff_aux_local Dirección de salto: algún lugar entre los NOPs NOP NOP NOP NOP ... JMP CALLZ (salto relativo) - sacar de la pila dirección del string “/bin/sh” y meterlo en un registro. - apertura de un socket en un puerto predefinido, - espera conexiones en ese puerto. - ejecutar la shell START S H E L L C O D E CALL START CALLZ No sabemos en qué sitio de la memoria va a estar el string “/bin/sh” “/bin/sh” Dirección en pila,como dirección de retorno de CALL START
En un caso real (I): • Para una aplicación/versión/S.O. determinados que queremos atacar, podemos averiguar donde comienza la pila. A partir de ahí intentar caer en los NOPs de relleno que hemos colocado con el shellcode en el buffer. • El fin de los NOPs es aumentar la probabilidad de acertar en el sitio adecuado con el salto.
En un caso real (II): • Connect back shells: • Abren conexiones a puertos predefinidos de la máquina atacante. • El objetivo es burlar posibles firewalls intermedios. • En desbordamientos de buffer locales, usar variables de entorno si no cabe el shellcode en el buffer donde se realiza la petición del usuario: • Las variables de entorno se cargan a principio de la pila del programa.
Referencias: • http://compsecassoc.org/downloads/Smashing_The_Stack.txt : • Smashing the stack for fun and profit. • http://www.insecure.org/stf/mudge_buffer_overflow_tutorial.html • How to write buffer overflows. • http://www.securiteam.com/securityreviews/5OP0B006UQ.html • Writing buffer overflows exploits – a tutorial for beginners. • http://www.shmoo.com/securecode • How to write secure code. • http://www.thc.org • http://rootkit.com
¡Que no nos pase nada! FIN de la primera parte
Demo de Exploits: • Microsoft IIS 5.x SSL PCT1.0 Remote Windows 2K/XP Exploit (MS04-011). • KAHT II Massive DCOM RPC Exploit (MS03-026). • Microsoft Internet Explorer .ANI Files Handling Exploit (MS05-002). • LSASS.EXE Win2K Pro Remote Denial-of-Service (MS04-007). • Metasploit (version 2.4 : 77 exploits).