2 ago 2013

Introducción a los exploits: ese pequeño y poderoso mundo

El mundo de los exploits es complejo y amplio. Esta afirmación puede chocar con el título del artículo, pero realmente es un mundo donde hablando en términos de Bytes podemos acceder a gran cantidad de información a la cual no podríamos acceder de otra forma. Un exploit no es más que una pequeña aplicación implementada con el objetivo de aprovecharse (to exploit) de un fallo de programación. Este fallo es generado en la etapa de implementación, pero el fallo realmente puede haberse introducido en cualquiera de las etapas del ciclo de vida del software.

Como comenté anteriormente, un exploit es un código el cual intentará aprovecharse de un fallo en la implementación de un aplicativo con la intención de obtener ciertos privilegios, si el fallo puede ser explotado. Por ejemplo, se podría causar la caída de una aplicación (DOS), modificación de datos que la aplicación maneja o tomar el control de la máquina, mediante la inyección de código en memoria.

¿Cuál es el objetivo de un pentester? Será utilizar un exploit para, mediante la inyección de otro pequeño código denominado shellcode, tomar el control de la máquina remota/local (en función del ámbito del exploit) o realizar alguna acción sobre dicha máquina. Generalmente, los exploits suelen ser implementados en C, aunque los podemos encontrar en Ruby (Metasploit powa!), Java, Python...

¿Qué es una shellcode?

Es la parte del código de un exploit que tiene como objetivo ejecutarse en la máquina de la víctima para realizar una acción concreta, generalmente, muy maliciosa. No es más que una serie de instrucciones en ensamblador que el exploit se encarga de inyectar y hacer que se ejecuten en la máquina vulnerada. Por lo que el exploit no es realmente el que logrará el control, el exploit es el código que se aprovecha de una vulnerabilidad para llevar a cabo una acción, inyectar código, por ejemplo. ¿Qué acciones implementan las shellcodes? Pueden implementar la ejecución de una shell, la subida de una Meta Interpreter, más conocida como Meterpreter, la adición de un usuario al sistema, la descarga de un archivo, etc. Como se puede entender, puedes implementar pequeñas acciones concretas, o desplegar grandes gestores de control.

El caso más genérico para todos los sistemas operativos vulnerados es la consecución de una shell de tipo inverso. En este caso el atacante habrá conseguido ejecutar una shell en la máquina remota y tomar el control de ésta. Además, al ser de tipo inverso, es el payload que se ejecuta en la máquina vulnerada quien se conecta al atacante, evitando de esta forma un router, por ejemplo.

Con Metasploit es realmente sencillo entender estos conceptos, ya que los módulos de tipo exploit siempre disponen de una variable denominada PAYLOAD, que es donde se debe elegir el tipo de shellcode que se quiere configurar por si el exploit tiene éxito. Se pueden visualizar ejemplos con la herramienta msfpayload, disponible con el framework. Además, este framework permite generar la shellcode con facilidad para distintos lenguajes de programación.

Tipos de payloadsExisten distintos tipos de payloads:
  • Inline o Singles. Es código autónomo que solamente realiza una tarea concreta. Por ejemplo cuando el exploit inyecta el payload en memoria y éste se ejecuta otorgando una shell inversa al atacante, añadiendo un usuario al sistema o mostrando algún tipo de mensaje de alerta al usuario. Se acoplan fácilmente a pequeños espacios en la memoria vulnerada.
  • Stagers. Son los encargados de crear la conexión entre el atacante y la víctima, son el paso previo a la descarga de todo el payload. ¿Por qué es necesario? Existen payloads con diversas funcionalidades, como puede ser Meterpreter. Este tipo de payloads necesitan crear una conexión con la máquina vulnerada y después descargar el resto del código en otra zona, por lo que los payloads de tipo stagers son los utilizados para descargar payloads de tipo staged.
  • Staged. Se descargan y son ejecutados por los de tipo stagers y normalmente son usados para realizar tareas complejas o con gran variedad de funcionalidades. En otras palabras los de tipo staged utilizan pequeños stagers para ajustarse en pequeños espacios de memoria dónde realizar la explotación.
Otra de las cosas que hay que tener en cuenta cuando se lista los distintos payloads es la propiedad NoNX y NX. El NX bit es una característica de los procesadores modernos para prevenir ejecución de código en ciertas áreas de memoria. Por ejemplo, en sistemas Windows NX es implementado como DEP, Data Execution Prevention. Si se ve esta característica en algún payload del listado significa que ese código está preparado para evadir el DEP. Los payloads que indican IPv6 en la lista indican que están preparados para funcionar en redes IPv6.

6 comentarios:

  1. Un gran post Pablo ;)Muy bien explicado y fácil de entender para los neófitos en la materia.

    ResponderEliminar
  2. ¡Genial Pablo! Muy bien explicado. Esperemos que hagas una serie de artículos sobre exploits y cómo ejecutarlos.Graciasssss

    ResponderEliminar
  3. Pablo es un crack, he aprendido mucho con sus libros, simples, claros y directos.Un que muchas veces me encantaria poder disponer debun video blog para seguirle mucho mejor!

    ResponderEliminar
  4. [...] a shellcode que se encontra dentro do binario, provocando a conexão inversa. Recordamos que Meterpreter é do tipo Stager, assim será também em duas fases, primeiro de conexão e segundo de [...]

    ResponderEliminar
  5. [...] Introducción a los exploits: ese pequeño y poderoso mundo [...]

    ResponderEliminar