Seguridad Informatica > Hacking

Introducción a los exploits

(1/5) > >>

franky508:
MANUAL DE EXPLOITS

Índice

1-   Introducción

2-   Tipología de exploits

          2.1   Buffer Overflow

          2.2   Condición de carrera

          2.3   Error de formato de cadena

          2.4   Cross Site Scripting (XSS)

          2.5   Inyección SQL

          2.6   Inyección de caracteres (CRLF)

          2.7   Denegación de servicio (DoS)

          2.8   Ventanas engañosas


1- Introducción

Un exploit es un pequeño programa malicioso que aprovecha una vulnerabilidad de un programa informático, generalmente causada por un bug en la programación del mismo. La función de estos programas suele ser la de violar las medidas de seguridad del programa que atacan, utilizando para ello el bug , accediendo a él de forma no autorizada para obtener algún tipo de beneficio del mismo. Por ejemplo, en los servidores FTP, que es un protocolo utilizado para enviar y recoger ficheros en remoto, se ha descubierto una vulnerabilidad cuando éste está configurado para redireccionar conexiones FTP a otros ordenadores que estén en la misma red de área local. Así, aunque un firewall pudiera evitar que los buscadores de puertos ataquen a otros ordenadores de esta LAN, se puede explotar este fallo del servidor FTP para buscar puertos.

Una exploit es un programa que explota una vulnerabilidad en concreto, es decir, no existe un exploit universal, sino que por cada una de las vulnerabilidades que se van descubriendo, van surgiendo nuevos exploits. Además, los exploits dependen de cada sistema operativo y su configuración, así como de los programas que se están ejecutando, la versión de los mismos y su configuración.
Según el ámbito de actuación de los exploits podemos hacer una primera clasificación en dos grandes grupos:

Exploits locales : Éstos son aquellos que actúan en la maquina en la que están.
   
Exploits remotos : Éstos son aquellos que se ejecutan desde la máquina atacante de manera que se sirven de algún servicio conectado a la red que tenga una vulnerabilidad para poder obtener algún tipo de beneficio como puede ser acoplar una Shell a un puerto no privilegiado. Un puerto no privilegiado es cualquiera por encima del 1024 , ya que los anteriores están reservados para el sistema y para el usuario root, y sólo se podrán usar estos puertos si el exploit consigue actuar como root.

Para explotar una vulnerabilidad, un usuario experimentado, generalmente se hace sus propios programas, que habitualmente estarán escritos en los lenguajes C, C++, Perl o Sh.
Cuando buscamos un exploit por internet y nos lo bajamos, podemos encontrarnos con una versión compilada o una sin compilar. En el primer caso, podemos hacer uso de la misma directamente, en el segundo de los casos el primer paso que tendremos que hacer será compilar el código fuente que tenemos, y para ello necesitaremos un compilador del lenguaje en el que esta escrito el exploit.
Hay ocasiones en las que la compilación no es una tarea inmediata, ya que algunos de estos códigos fuente no están totalmente limpios, son los llamados exploits capados , en estos casos necesitamos tener algunas nociones del lenguaje de programación para corregirlo y compilarlo.

  2-TIPOLOGÍA DE EXPLOITS


Como hemos visto los exploits aprovechan las vulnerabilidades que presentan ciertas aplicaciones. Estas vulnerabilidades pueden ser agrupadas según el tipo de bug que las produzca, por lo tanto también podemos agrupar a los exploits según el tipo de vulnerabilidad que exploten:
   
        Buffer Overflow o desbordamiento de buffer

    Race condition o de condición de carrera

    Format string bugs o errores de formato de cadena

    SQL injection

    Inyección de caracteres (CRLF)

    Denegación de servicio

    Window spoonfing o ventanas engañosas.

2.1 Buffer Overflow

Un buffer overflow o desbordamiento de buffer es un error de sistema causado por un defecto de programación. Un programa tiene su área de código ejecutable, y organiza su espacio de memoria utilizando una parte para almacenamiento de los datos que el programa recibe y que serán guardados temporalmente en la memoria.

Cuando en la entrada se introduce un volumen de datos demasiado grande, mayor de lo que el programador pudo prever, y se pretende escribir sobre un área de memoria que no es suficientemente grande para alojarlos, se sobrescribirán otras zonas de memoria, provocando lo que hemos llamado desbordamiento de buffer. Este fallo puede estar producido porque el programador no introdujo en su código las correspondientes comprobaciones entre la capacidad de buffer y los datos que se pretender alojar en el mismo. Como consecuencia de este error se produce una excepción de acceso a memoria y la terminación del programa en ejecución.


El problema real viene cuando el desbordamiento sobrescribe datos válidos que ya estaban guardados en memoria. Si además tenemos en cuenta que en las arquitecturas comunes de ordenadores el espacio de memoria dedicado a los datos y al programa están reservados de forma consecutiva, es decir, que no hay separación entre ambos, nos podemos dar cuenta de que entre los datos perdidos por la sobreescritura puede haber fragmentos de rutinas o procedimientos necesarios, con lo que se producirá un error en el programa.

El fallo de seguridad nace cuando un usuario malintencionado provoca este desbordamiento de buffer mediante el envío de datos que incluyen porciones de código en el espacio reservado para las variables locales y después modifica la dirección de regreso o a donde regresa la información para que apunte a la posición de memoria donde hemos introducido nuestro código. Este código puede ser lo que se conoce como un shellcode , es decir, un conjunto de órdenes programadas generalmente en lenguaje ensamblador que se inyectan en la pila para conseguir que la máquina en la que se reside se ejecute la operación que se haya programado, que generalmente suele ser el lanzamiento de un intérprete de comandos como el bash, sh, etc.


2.2 Condición de carrera
Otro tipo de vulnerabilidad bastante frecuente es la que se conoce como condición de carrera o race condition . Estos errores son producidos en situaciones de concurrencia de varios hilos en las que se compite por los recursos que proporciona el sistema operativo. Bajo estas condiciones hay ocasiones en las que se presentan situaciones en las que dos o más procesos tienen que leer o escribir en un área común que comparten. En estos casos se deberían tomar las precauciones necesarias para que las acciones llevadas a cabo por cada recurso fuesen atómicas, sin embargo hay ocasiones en las que no lo son, ocasionando datos inconsistentes o dejando en ocasiones abierto un intervalo de tiempo en el que un atacante podría obtener privilegios, leer y escribir sobre ficheros protegidos.
Un ejemplo muy sencillo de lo que es una condición de carrera lo vemos ahora:



--- Código: ---Var x=10
Sub decrementar  {
        If   (x>0)   {
x--
        }
}

--- Fin del código ---


Si tenemos una rutina como la anterior, donde x es una variable global compartida, si un único proceso es el que la ejecuta, la variable no tomará nunca un valor negativo, sin embargo en un entorno concurrente, en el que varios procesos ejecutan la misma rutina compitiendo por el tiempo de CPU, si un proceso no iniciase la ejecución de la misma hasta que otro no finalice su ejecución no habría problemas. Pero podría darse la situación en la que  un proceso P1 inicie la ejecución de la rutina para un valor de x=1, P1 realizara la comprobación  x>0 que se cumple, en ese momento se interrumpe la ejecución de P1 para dar paso al proceso P2, el cual también comprueba el valor de x, que no ha cambiado porque la ejecución de proceso P1 ha sido detenido justo antes de cambiar el valor de x, por lo tanto la condición de x>0 también se cumple y se ejecuta el código contenido en la comprobación, con lo que x toma el valor 0. El proceso P2 termina su ejecución y devuelve el turno de ejecución de P1 que retoma la ejecución en el mismo punto en el que se paró, es decir, decrementando la variable x, ya que la comprobación la realizo anteriormente, con lo que el final de esta rutina devuelve un valor negativo en la variable x.

Este es un ejemplo muy básico para entender que es una vulnerabilidad de condición de carrera.


Aun no está acabado, iré haciéndolo :)

Salu2

Infectedbug:
gracias , revisare el tema a diario :)

franky508:

--- Cita de: [I]nfectedbug en Marzo 28, 2012, 10:06:59 pm ---gracias , revisare el tema a diario :)

--- Fin de la cita ---
Mañana haré seguramente estos:

          2.1 Buffer Overflow

          2.2   Condición de carrera

          2.3   Error de formato de cadena

Así que podras revisarlo jajajaja :D

Salu2 ;)

kid_goth:
uuuu sii buffer overflow nunca lo he entendido xD... espero sigan xD...

ACK:
Muchas gracias, a marcadores ;D

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa