EL MUNDO DE BUGS Y EXPLOITS

Ver el tema anterior Ver el tema siguiente Ir abajo

EL MUNDO DE BUGS Y EXPLOITS

Mensaje por SpiderNet el 16/12/2007, 11:48 pm

Manual: El Mundo de Bugs y Exploits
Autor: SpiderNet


Muchos abran oido de hablar de bugs que es un error de un software y exploit es un codigo para aprovechar este error.

Eso es en lineas generales. Vamos a asimilar poco a poco en los conceptos hasta comenzar a hacer pequenas practicas para reforzar lo aprendido. Vamos a definir cada uno.


1. Que es un bug?

Es un error de programacion, es un defecto de software, es cuando un software hace algo diferente para lo que fue programado.

Hasta el programador mas experto se descuida y mete el dedo donde no debe, alguna variable no declarada, una situacion no prevista. Windows a lo largo de toda su historia ha tenido muchos bugs. Muchos softwares sacan mejoras, nuevas versiones, parches, plugins para corregir un bug y mejorar su software.


2. Que es un exploit?

Es un codigo o programa malicioso cuya funcion es aprovechar el error o bug de otro programa para entrar a determinado sistema.

En palabras sencillas y sin tanto rodeo bug es un error de programacion y exploit es el aprovechamiento de este error para conseguir penetrar el sistema donde se encuentra este software con errores.

Que tipo de exploits tenemos?

2.1. Desbordamiento de Buffer (Buffer Overflow)
2.2. XSS (Cross Site Scrpting)
2.3. Inyeccion SQL
2.4. CRL Combinacion de codigos de control
2.5. Ataque de denegacion de servicio


2.1. Desbordamiento de Buffer (Buffer Overflow)

El desbordamiento de buffer se produce cuando en un buffer con tamaño limitado se intenta introducir más datos de los que permite, excediendo el número de bytes que se habían reservado en la memoria.

Ejemplo.
Spongamos que la pagina http://spidernet.forumotion.com esta configurado para recibir un maximo de 5000 mensajes o temas y el codigo fuente no esta validado para decir hasta aqui, sino que trata de procesar el mensaje 5001 pero la memoria no lo acepta y como no estaba previsto en la programacion tenemos un error, se desbordo el buffer que tiene su tamaño limitado.


Tecnicamente que sucede?

Los buffer vecinos son corrompidos, son sobreescritos. si el buffer se llena la informacion va a los buffer adyacentes.


2.2. XSS (Cross Site Scripting)

CSS las siglas fueron cambiadas a XSS para no ser confundidas con las Hojas de Estilo en Cascada (CSS). Son errores que se encuentran en cualquier aplicacion HTML, no necesariamente es en una WEB ya que puede estar en aplicaciones locales e incluso en el navegador.


2.3. Inyeccion SQL

SQL (Structure Query Language) es un lenguaje utilizado para trabajar con bases de datos relacionales.
Una inyeccion SQL sucede cuando se inyecta un codigo SQL invasor dentro de otro codigo SQL.


2.4. Combinacion de codigos de control

Los que somos viejitos je je, recordemos la epoca cuando usabamos las maquinas de escribir
CR es el retorno de carro
LF el salto de linea

Cuando escribiamos el cilindro horizontal se desplazaba hacia la derecha por cada digito marcado y al llegar al final debiamos regresarlo o retornar el carro (carroi es el cilindro) y ademas debiamos rotar el cilindro para avanzar una linea y no sobreescribir encima de la que acabamos de tipear LF.

Pero teniamos una palanca que hacia estas dos acciones de una sola vez CRLF.

Windows todavia usa el CRLF para indicar el fin de una linea.

Lo representamos en hexadecimal 0D 0A (CR LF), en decimal 13 10(CR LF)


2.5. Ataque de denegacion de servicio (DOS)

Denial of Service (DOS). Es aquel ataque donde se le niega el servico a usuarios legitimos como conseuencia del ataque. Se genera mediante la saturacion de informacion al servidor de tal manera que se sobrecarga y niega el servicio a los usuarios legitimos cuando se lo solicitan.

Ejemplo.
Si el servidor del foro SpiderNet le envian mensajes y mas mensajes que mantienen al servidor ocupado recibiendo y procesando tanta informacion que dejas muchos mensajes en espera para procesarlos a medida que se desocupa, pero llega un momento que esta tan lleno que ya no dispone de memoria para tener mensajes en espera para procesar y por lo tanto rechaza nuevos mensajes que seran los mismos del ataque y los que puedan mandarle sus usuarios legitimos registrados.


Esto es una descripcion superficial de bugs y exploits. Ahora vamos a analizar cada caso en particular.

SpiderNet
Admin

Mensajes : 348
Inscrito el : 25 Nov 2007

Volver arriba Ir abajo

2.1. Desbordamiento de Buffer

Mensaje por SpiderNet el 22/12/2007, 8:58 pm

Que es un buffer?

Es una memoria de almacenamiento temporal de información, llamado también intermemoria o memoria intermedia. Es un error software que puede hacer que se ejecute código arbitrario de forma no autorizada.

Suele tratarse de una memoria intermedia entre un dispositivo y otro, por ejemplo, la computadora y la impresora, o la computadora y el disco rígido, etc.

Se utiliza para mejorar el rendimiento o también para compensar la diferencia de tiempos y velocidades que manejan los distintos dispositivos.


Desbordamiento de buffer

• Puede afectar tanto a aplicaciones como al propio núcleo del sistema operativo.

• Se da con mas facilidad en determinados lenguajes (C, C++, …) que no comprueban ciertos límites. Por ejemplo:

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

• Permiten a un atacante hacer que todo el sistema falle, obtener derechos de administrador, etc.


Funcionamiento de la Pila

• La pila es un bloque contiguo de memoria que se utiliza cada vez que se llama a una función

• En cada invocación de función, se almacenan en la pila (generalmente, en direcciones decrecientes):
o los parámetros pasados a la función.
o la dirección de retorno.
o un ((puntero de marco)) (frame pointer, FP).
o las variables locales de la función


Ejemplo de Desbordamiento de buffer

void funcion(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
int main(void) {
funcion(1, 2, 3);
}
void funcion (char *str) {
char buffer[16];
strcpy (buffer, str);
}
int main () {
char *str = "Mi longitud supera los 16 bytes";
/* longitud de str = 32 bytes */
funcion (str);
}

• La ejecución de este programa tiene un comportamiento indefinido.
o Al ejecutar strcpy, se sobrescriben el FP, la dirección de retorno, etc.
o Cuando la función termina, se continua ejecutando código por una posición no establecida.



Ejecución de código en un desbordamiento de buffer

Modificando la dirección de retorno de manera adecuada podemos:

• Ejecutar código que se encuentre dentro del propio programa vulnerable
o Si el programa se ejecuta con setuid 0 y contiene código para ejecutar un shell, podemos lanzar un shell como superusuario y hacer cualquier cosa.

• Ejecutar código arbitrario.
o En el ejemplo anterior se puede guardar código en str para que se ejecute justo cuando termine la función (por ejemplo, código para lanzar un shell como superusuario).
o El código se puede pasar en variables de entorno, parámetros del programa, etc.


Posibles soluciones al desbordamiento de buffer

Ninguna solución de las mostradas elimina el problema, pero hacen mas difícil su aparición:

• Escribir código seguro. Por ejemplo, no se deben usar funciones de C que no comprueben los lımites como strcpy, strcat, sprintf, gets, scanf, etc (¡Cuidado con strncpy, etc.!)

• Evitar que el contenido de la pila se pueda ejecutar. Problema: algunos compiladores (como GCC) usan ((funciones trampolín))
o Estas funciones son pequeñas porciones de código generadas en tiempo de ejecución que se almacenan en la pila desde donde se ejecutan.

• Mejorar el compilador
o Puede mostrar un aviso cuando se use una función potencialmente peligrosa. Ejemplo: GCC y gets.
o Puede añadir código automáticamente para que compruebe los lımites, ver si cambia la dirección de retorno de una función (StackShield, StackGuard), etc. Problema: hay que recompilar

• Comprobaciones dinámicas en tiempo de ejecución (libsafe).



Exced Shield en Linux

• Proporciona protección parcial contra vulnerabilidades que se basan en la sobreescritura de estructuras de datos y/o en la inclusión de código en dichas estructuras.

• Trata de solucionar por software una limitación hardware.
o Las tablas de paginas de los procesadores x86 poseen un único bit tanto para el permiso de lectura como para el de ejecución.
o Por tanto, toda pagina que se puede leer también se puede ejecutar y viceversa.
o En los procesadores AMD 64 hay bits separados para los permisos de lectura y ejecución.

• La protección se implementa dentro del núcleo de Linux y es transparente para las aplicaciones.
o Intenta que la mayor parte del contenido del espacio de direcciones virtual de un proceso sea no ejecutable, no solo la pila.


Funcionamiento de Exced Shield

Posibles soluciones
• Mantiene un valor máximo de dirección ejecutable (conocido como ((exec-limit))) para cada hilo.

• Para ello, controla que proyecciones en memoria de ficheros ejecutables (como bibliotecas compartidas) hace cada hilo o proceso.

• El planificador establece dinámicamente el segmento de código de usuario en cada cambio de contexto con objeto de que siempre contenga el lımite correcto para el hilo que se esta ejecutando.

• Se basa en la particularidad de la segmentación paginada de los procesadores x86 para establecer el tamaño del segmento de código.
o En la paginación pura de los procesadores x86, todos los segmentos (código, datos, pila, etc.) tienen el mismo valor para la base (0) pero pueden tener lımites distintos.

• Configura el mapa de memoria de los procesos para que la protección sea mayor:
o Siempre que sea posible, el código de las aplicaciones, de las bibliotecas compartidas y de cualquier proyección en memoria ejecutable se encuentra en el rango 0-16MB del espacio de direcciones virtuales.
o El rango 0-16MB se conoce como ((ASCII-armor área)) ya que ningún desbordamiento basado en cadenas de caracteres ASCII puede producir un salto a dicha zona de memoria.
o La pila, la memoria montón y muchas proyecciones en memoria de datos se encuentran después, por encima de la dirección ((exec-limit)) (cuando la configuración del mapa de memoria lo permita).
o El primer MB de memoria se deja libre para, entre otras cosas, proporcionar protección contra los punteros nulos.


Ejemplo de mapa de memoria con Exced Shield

Posibles soluciones
$ ./cat-lowaddr /proc/self/maps
00101000-00116000 r-xp 00000000 03:01 319365 /lib/ld-2.3.2.so
00116000-00117000 rw-p 00014000 03:01 319365 /lib/ld-2.3.2.so
00117000-0024a000 r-xp 00000000 03:01 319439 /lib/libc-2.3.2.so
0024a000-0024e000 rw-p 00132000 03:01 319439 /lib/libc-2.3.2.so
0024e000-00250000 rw-p 00000000 00:00 0
01000000-01004000 r-xp 00000000 16:01 2036120 /home/mingo/cat-lowaddr
01004000-01005000 rw-p 00003000 16:01 2036120 /home/mingo/cat-lowaddr
01005000-01006000 rw-p 00000000 00:00 0
40000000-40001000 rw-p 00000000 00:00 0
40001000-40201000 r--p 00000000 03:01 464809 locale-archive
40201000-40207000 r--p 00915000 03:01 464809 locale-archive
40207000-40234000 r--p 0091f000 03:01 464809 locale-archive
40234000-40235000 r--p 00955000 03:01 464809 locale-archive
bfffe000-c0000000 rw-p fffff000 00:00 0


Otras características de Exced Shiel


• La protección proporcionada no es completa:
o Un desbordamiento de buffer podría modificar el valor de una variable y con ello cambiar el flujo de control del proceso de forma tal que puede comprometer el sistema.
o Algunas zonas de datos con permiso de escritura se encuentran a veces por debajo del ((exec-limit)), por lo que un desbordamiento de buffer podría añadir código ejecutable.

• Aquellos programas que necesiten que la pila sea ejecutable (porque, por ejemplo, usan funciones anidadas y, por tanto, funciones trampolín) necesitan explícitamente indicar al SO que haga la pila ejecutable.

• Exec Shield también proyecta determinados ficheros en direcciones virtuales aleatorias para hacer mas difícil ataques que se basen en el conocimiento de las direcciones virtuales del código o de los datos.

SpiderNet
Admin

Mensajes : 348
Inscrito el : 25 Nov 2007

Volver arriba Ir abajo

Re: EL MUNDO DE BUGS Y EXPLOITS

Mensaje por Torombolo el 13/3/2008, 11:14 am

creo que la mejor forma es inyectar ordenes directamente al procesador en hexadecimal de esta forma se hace mas engorroso.. claro q una cosa es el local y el remoto.. hay q tratar bien los staks =P

Torombolo

Mensajes : 41
Inscrito el : 28 Nov 2007

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permiso de este foro:
No puedes responder a temas en este foro.