Académique Documents
Professionnel Documents
Culture Documents
[2.3] Metasploit
TEMA
Vulnerabilidades
Esquema
TEMA 2 Esquema
proteccin vulnerabilidades vulnerabilidades
2
OpenVas Comandos
bsicos La pila
Caractersticas Off-by-one
ASLR
Funcionamiento PoC 1 (Linux)
Meterpreter Race Condition
Qu es? PoC 2 (Windows)
Nexpose Comandos Integer overflow
bsicos
Caractersticas Tipos de saltos
Funcionamiento Format String
Backdooring Buffers pequeos
Buffer Overflow
Otras Otras formas de
herramientas salto
Fuzzers
Ideas clave
Para estudiar este tema lee las Ideas clave que se exponen a continuacin.
Se explicarn los tipos de interfaces con las que se podr trabajar con Metasploit,
centrndonos exclusivamente en el de lnea de comandos. Tambin se explicarn
sus principales comandos y funcionalidades.
Tras esto se explicarn los diferentes tipos de vulnerabilidades que nos podremos
encontrar en aplicaciones y ejecutables (las vulnerabilidades web se vern en el tema
siguiente). Las principales vulnerabilidades son: Heap Overflow (desbordamiento
de pila), Buffer Overflow (desbordamiento de buffer), Off-By-One, Race condition,
Integer Overflow y Format String.
Nos centraremos sobre todo en los desbordamientos de buffer, ya que son los ms
comunes a da de hoy. Se explicar un poco de teora bsica de la arquitectura de los
computadores actuales, necesaria para entender el funcionamiento de esta
vulnerabilidad (partes fundamentales de un computador, lenguaje ensamblador e
instrucciones bsicas de este, funcionamiento de las zonas de memoria y
funcionamiento de la pila).
La primera PoC ser en un entorno Linux, con un ejecutable sencillo creado a propsito
con esta vulnerabilidad. Se podr reproducir de nuevo siguiendo la explicacin de la
PoC paso a paso utilizando solamente una mquina con Kali Linux.
La segunda PoC ser en un entorno Windows con una aplicacin real (aunque ya tenga
algunos aos). Esta aplicacin ser vulnerable a un desbordamiento de buffer y se
explicar, tambin paso a paso, como generar un exploit portable de ella para que se
pueda reproducir. En este caso harn falta dos mquinas, una con Kali Linux y otra con
Windows XP.
Tras las pruebas de concepto se explicarn otras formas de realizar los exploits vistos y
el caso concreto de hacer desbordamientos en buffers con tamaos reducidos. Tambin
se tratarn rpidamente los fuzzers para realizar las tareas de descubrimiento de
desbordamientos de buffer.
Una vez hemos obtenido toda la informacin posible de la vctima, gracias al tema
anterior, nos dedicaremos a explotar las vulnerabilidades de su sistema para intentar
hacernos con el control de su mquina y los privilegios de administrador.
1. Nessus
Elegiremos Kali Linux y la versin que tengamos (32 o 64 bits). Despus utilizaremos
los comandos:
En este otro ejemplo vemos el escaneo basic network scan realizado sobre un Windows
XP SP3. Como se puede ver, Nessus ha encontrado una vulnerabilidad crtica en la
mquina que se puede explotar remotamente y dar acceso total al atacante. En el
prximo captulo se ver este ataque.
2. OpenVas
A causa de que Nessus se hiciera de pago, surgi OpenVas, herramienta que es igual de
potente que la anterior y como ventaja tiene que se actualiza diariamente. OpenVas
viene por defecto en la distribucin Kali Linux.
Para iniciarla primero deberemos ir a: Aplicaciones > Kali Linux > Anlisis de
vulnerabilidades > OpenVas > openvas initial setup. Esto arrancar la configuracin
inicial descargando los plugins necesarios.
Tendremos que ingresar un usuario y contrasea para arrancar el servicio por primera
vez, el usuario por defecto es admin.
Nota: la primera vez que arranquemos la aplicacin puede tardar un buen rato ya que
tiene que descargar toda la base de datos.
Antes de nada, deberemos actualizar la base de datos y para ello iremos a la pestaa
administration > NVT Feed > Synchronise with Feed Now.
Finalmente asignaremos una tarea para realizar en el objetivo. Para ello iremos a la
pestaa Scan Management > New Task. Seleccionaremos un tipo de escaneo a realizar
y el objetivo sobre el que realizarlo y le daremos un nombre tambin.
3. Nexpose
Tiene una gran ventaja y es que si encuentra alguna vulnerabilidad, nos dir adems si
esta se encuentra en la base de datos de Metasploit. El nico problema con esta
herramienta es que solo est para sistemas operativos Linux o Windows de 64 bits, por
lo que no podremos instalarlo en nuestra mquina Kali si hemos optado por usar la de
32 bits.
Primero nos identificaremos y tendremos que definir el sistema a escanear. Para ello,
en la pgina principal pulsaremos en New Static Site.
2.3. Metasploit
Todas estas herramientas estarn por defecto en Kali Linux. Nosotros utilizaremos
MsfConsole por su versatilidad. A continuacin se explicarn sus diferentes funciones
y comandos:
MsfConsole permite ejecutar tambin algunos procesos de terceros como nmap, ping o
irb (un intrprete de comandos del lenguaje Ruby). Adems, al pulsar el tabulador
mientras escribimos en la lnea de comandos mostrar todas las posibilidades y
completar las palabras.
help -> Mostrar todos los comandos de Metasploit y una breve descripcin,
podremos cargar plugins con funcionalidades extra usando el comando load
plugin. Tambin se mostrar la ayuda de estos plugins con el comando help una
vez se hayan cargado.
background -> Ejecuta a Meterpreter en segundo plano, se puede acceder a cada
una de las sesiones abiertas con el comando sessions visto antes.
ps -> Muestra los procesos activos.
sysinfo -> Muestra informacin del sistema en el que estamos.
getuid -> Muestra los permisos con los que contamos en la sesin actual.
getpid -> Indica el pid del proceso al que estamos conectados.
migrate -> Cuando explotamos una vulnerabilidad de software, si la vctima cierra
la aplicacin perderemos la sesin, con este comando migraremos el proceso para
que esto no ocurra.
ipconfig -> Muestra las interfaces de red y las direcciones de la mquina remota.
idletime -> Muestra el tiempo de inactividad del usuario remoto.
pwd/ls/cd/mkdir/rm/rmdir -> Nos permiten movernos por los directorios de la
mquina remota y modificar archivos y carpetas.
run hashdump -> Obtendr los hashes de las contraseas del sistema.
upload/download -> Para subir y bajar archivos de la mquina remota.
screenshot -> Hace una captura de pantalla de la mquina vctima.
run vnc -> Devuelve una sesin grfica del equipo remoto, pudiendo ver todas las
acciones del usuario.
keyscan -> Captura las pulsaciones del equipo remoto. Usaremos tres comandos:
keyscan_start/keyscan_dump/keyscan_stop.
load sniffer -> Cargar el plugin para poder capturar paquetes en la vctima.
vctima que cada cierto tiempo intente activamente conectarse a la mquina atacante,
siendo el atacante el que deba estar a la escucha.
Utilizaremos el comando run metsvc para crear la puerta trasera y luego nos
conectaremos a ella con el manejador de exploits multi/handler y el payload
metsvc/reverse_bind_tcp.
Para realizar una backdoor persistente que intente conectarse al atacante de forma
activa utilizaremos la funcin persistence.
Cuando creemos la conexin persistente nos dir en que archivo de nuestra mquina se
encuentra el cleanup para borrar la conexin persistente. Para hacer esto usaremos el
comando:
Para conectarnos ser como antes, pero esta vez con el payload de meterpreter.
Metasploit tambin tiene herramientas para generar sus propios payloads o codificar
su cdigo malicioso para que los antivirus no los detecten. Estas herramientas son:
msfpayload, msfencode y msfvenom (esta ltima unifica a las otras dos).
Msfpayload
A veces no podremos ejecutar un exploit remotamente para obtener una Shell. Por
ello, este mdulo nos permitir generar un payload personalizado para envirselo a
la vctima. Esta herramienta ya es deprecated pero todas sus funcionalidades las
incluye la herramienta msfvenom.
Msfencode
Para poder evitar ser detectados por los antivirus, a veces tendremos que codificar
los ficheros infectados. Por ello, esta herramienta permite realizar diferentes
codificaciones, tantas veces como se deseen, para hacer pasar desapercibidos a estos
ficheros. Tambin es deprecated y todas sus funcionalidades las incluye msfvenom.
Msfvenom
Esta herramienta es la evolucin de las dos anteriores y las unifica en una
herramienta para facilitar la tarea de creacin de payloads y su codificacin.
msfvenom h.
Nos crear un fichero que tendremos que enviar a la vctima por correo, por enlace
web, por algn dispositivo de almacenamiento externo Nosotros pondremos nuestra
mquina a la escucha y, para ello, usaremos:
use multi/handler
Con set seleccionaremos el payload y las opciones necesarias de este. Cuando lancemos
el exploit se quedar a la escucha de que la mquina vctima abra el archivo infectado.
Para saber ms sobre este y otros mdulos de Metasploit, mira los siguientes enlaces:
http://ns2.elhacker.net/TallerMetasploit2012.pdf
http://ns2.elhacker.net/timofonica/manuales/Manual_de_Metasploit_Unleashed.
pdf (Manual de Metasploit de Offensive Security en espaol)
http://www.offensive-security.com/metasploit-unleashed/Introduction (Manual de
Metasploit de Offensive Security en ingls)
msfconsole
Desde los aos 80 ya se conocen los errores de tipo buffer overflow y que hay ciertas
funciones en algunos lenguajes de programacin que pueden llegar a provocar estos
fallos (como strcpy o get en C/C++). Pero aun as, a da de hoy, muchos desarrolladores
de software siguen utilizando estas y otras funciones con todo tipo de fallos generando
multitud de vulnerabilidades.
Hay diversos tipos de vulnerabilidades, algunas ms peligrosas que otras. Unas pueden
llegar a causar denegacin de servicio y otras ejecucin de cdigo remoto, pero que
pueden comprometer el sistema de una forma u otra.
Tipos de vulnerabilidades:
1 Heap Overflow
2 Off-By-One
3 Race condition
4 Integer Overflow
5 Format String
6 Buffer Overflow
Heap Overflow
Por ello, se puede utilizar la tcnica de Heap Spraying, que consiste en llenar el
heap de NOPs y shellcodes, haciendo que cuando se acceda a este puntero tenga
o Dereference after free: es un tipo concreto de use after free y ocurre cuando
intentamos acceder a memoria dinmica previamente liberada como
consecuencia de un free(). El trmino dereference se refiere a la accin, de
acceder a la variable a la que apunta el puntero en cuestin con el operador *.
Off-By-One
if ( strlen(param) > 64 )
{
printf(Argumento demasiado largo);
exit(0);
}
Race condition
Los errores generados por una condicin de carrera son producidos por el cambio
que experimenta el estado de un recurso (fichero, memoria, registros) desde que se
comprueba su valor hasta que el recurso es utilizado. Se convierten en una
vulnerabilidad si el atacante puede influir en este cambio de estado entre la
comprobacin y uso. Generalmente, este tipo de problemas suelen darse bien por la
interaccin entre hilos en un proceso multihilo o bien por la concurrencia de otros
procesos ajenos al proceso vulnerable.
Integer Overflow
Format String
En algunos lenguajes como C, es necesario para las funciones que imprimen por
pantalla que se indique el tipo de dato que se quiere imprimir (mediante %d,
%c). Este tipo de vulnerabilidad se da cuando el programador no define el
formato de los datos que se van a imprimir, permitiendo al atacante dar el formato a
su antojo y provocando que la funcin devuelva los valores que hay en la pila hasta
que se llegue a una zona que no tiene acceso y el programa acabe su ejecucin.
#include <stdio.h>
int main(void)
{
char texto[30];
int a = 1;
int b = 2;
int c = 3;
scanf(%29s, texto);
printf(texto); //No da formato al texto ledo
para imprimirlo
return 0;
}
Buffer Overflow
//overflow.c
int main ()
{
char strl [10] ; //Declaramos una variable con tamao de 10
caracteres (bytes)
//a continuacin, copiamos 35 bytes de "A" a
strl
strcpy (strl, " AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
}
La CPU deber realizar una serie de acciones para leer y ejecutar cada una de las
instrucciones, dividindose en diferentes fases.
Estas son:
Los flags servirn para guardar valores especiales del flujo del programa como
overflow, valor negativo o interrupciones activadas.
Tanto los registros de la pila (EBP y ESP), como el puntero de instruccin sern claves a
la hora de hacer un desbordamiento de buffer.
Las instrucciones que lee la CPU estn codificadas en lenguaje mquina (ceros y unos)
pero para facilitar al programador su trabajo, se cre un lenguaje a base de
mnemnicos, el lenguaje ensamblador.
Jcc: salta si la condicin (cc) se cumple. Esta condicin est relacionada con los
flags vistos antes, puede saltar si cero, si mayor igual, etc. Tambin modifica EIP.
CALL subrutina: llama a la subrutina que est indicada en la direccin de la
etiqueta subrutina. De manera implcita guarda EIP en la pila (PUSH EIP).
RET: retoma la ejecucin en el punto antes de llamar a la subrutina. De manera
implcita saca EIP de la pila (POP EIP).
NOP: no hace nada, pierde un ciclo de reloj. Aunque no lo parezca, esta instruccin
es una de las ms importantes a la hora de realizar los desbordamientos de buffer.
La mayora de los sistemas operativos, entre ellos Windows, utilizan el formato Little-
endian. Si, por ejemplo, tenemos la direccin de memoria 0x0804B22A, la
guardaramos en memoria principal de la forma \x2A\xB2\x04\x08.
Estas zonas tendrn diferentes propiedades, la ms importante ser los permisos que
tenga la zona (escritura, lectura o ambas).
El funcionamiento de la pila
La pila funciona a travs de dos registros ESP y EBP, mediante los cuales puede
cumplir todas sus funciones.
o SUB esp, 04h: resta 4 bytes a la pila. Restar significa aadir bytes a la pila, por
lo que hemos visto de su crecimiento inverso. Este mtodo de aadir bytes
directamente se usa para reservar espacio de variables locales dentro de las
subrutinas.
o POP reg: saca de la cima de la pila, apuntada por ESP, el valor que haya y lo
guarda en el registro. Disminuye el valor de ESP en tantos bytes como ocupe el
registro.
El otro registro que maneja la pila ser EBP. Este registro apuntar a la base o parte
inferior de la pila. Su uso principal ser la diferenciacin entre las rutinas y
subrutinas dentro de un proceso, tomando valores relativos a cada una.
Cada vez que se llame a un nuevo procedimiento se har: PUSH EBP, para poder
recuperarlo una vez acabe el procedimiento; luego se mover el nuevo valor de ESP a
EBP, convirtindose EBP en la base de referencia para las variables locales de la
forma [EBP 32].
Como se puede ver, podramos ser capaces de sobrescribir EIP. Al hacer esto podemos
introducir cualquier valor en EIP, que ser la direccin de la siguiente instruccin a
ejecutar. Por lo que podremos ir redirigiendo el flujo del programa hacia donde
nosotros queramos.
1. PoC 1
#include <stdio.h>
#include <string.h>
{
int A;
char B[100];
if (argc < 2)
{
printf("Uso: %s argumento\n",argv[0]);
return -1;
}
A = argc;
strcpy(B,argv[1]);
printf("A=%d\nB=%s\n",A,B);
return 0;
}
Como se puede ver, el programa puede dar lugar a un buffer overflow, pues declara la
variable B con 100 bytes y utiliza la funcin strcpy() para copiar en esta variable el
primer argumento introducido por el usuario.
Tambin ser necesario utilizar una orden en la terminal para desactivar otro
mecanismo de seguridad llamado ASLR que genera direcciones aleatorias en la pila y
en el heap para evitar de nuevo este tipo de vulnerabilidades.
echo 0 > /proc/sys/kernel/randomize_va_space
Ahora utilizaremos lenguajes de script como Perl, Python o Ruby para generar una
entrada de texto suficientemente grande como para que sobrescriba otras zonas. Para
ello deberemos introducir ms de 99 caracteres (ya que el carcter \0 de fin de cadena
lo aade siempre al final).
Usaremos el acento invertido para pasar como argumentos de la funcin la salida del
script, en cualquier lenguaje de los mencionados, que se encuentra a la derecha de la P
en el teclado.
En este caso encontramos que si introducimos 116 caracteres, los siguientes 4 sern
EIP.
El siguiente paso ser crear una shellcode para cuando explotemos la vulnerabilidad,
poder obtener una shell con los privilegios de la aplicacin (en nuestro caso, al ser Kali,
tendr siempre privilegios de root).
La shellcode que utilizaremos ser un pequeo programa de C que devuelve una shell
pero pasado a lenguaje ensamblador:
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89
\xe1\xb0\x0b\xcd\x80"
Este script sobrescribir el buffer con la shellcode (las instrucciones para ejecutar una
shell), el resto de as para completar los 116 bytes y EIP. Ahora tenemos que averiguar a
qu direccin debemos saltar para que se comience a ejecutar nuestra shell. De nuevo
usaremos GDB.
Posicin:
0xbffff408
Primera posicin
de la fila, es decir,
0xbffff400.
Podemos ver la primera instruccin de nuestra shellcode remarcada, as que esa ser la
posicin que tendremos que introducir en EIP. Modificaremos entonces nuestro script
exploit.rb y colocaremos la direccin en la variable eip recordando ponerla en formato
Little-endian: \x08\xf4\xff\xbf.
Obteniendo finalmente:
Estos problemas surgen porque hace falta ir instalando todas las actualizaciones tanto
de Metasploit como de cada una de las libreras de Ruby.
Para solucionarlo sin necesidad de realizar todas las actualizaciones, que a veces
pueden llegar a ser muy pesadas, vamos a modificar ambos archivos para que no realice
la comprobacin de que todas las libreras estn actualizadas para poder funcionar.
2. PoC 2
realizar el desbordamiento de buffer, pero se podra tardar mucho y es una tarea muy
tediosa. As que ya sabemos de antemano que esta aplicacin es vulnerable y que tiene
un desbordamiento de buffer cuando intentamos cargar un archivo .m3u muy grande.
Al pulsar el botn de load nos permitir incluir un archivo con una extensin especfica.
Entre las permitidas se encuentra la m3u, a la que sabemos que es vulnerable. Pero
ahora cmo generamos un archivo .m3u para que lo cargue y hacer el
desbordamiento de buffer?
La respuesta ser nuestra mquina Kali y no har falta ninguna herramienta especial,
solamente crearemos un ejecutable en algn lenguaje de script de los ya mencionados
(Perl, Ruby, Python) que genere un archivo con la extensin .m3u. En esta prueba de
concepto se usar de nuevo Ruby.
Para esta primera fase, estos archivos solo tendrn basura en su contenido, como una
letra repetida, y gran tamao, ya que queremos determinar en qu punto aproximado
se produce el desbordamiento y luego solo generar un pequeo nmero de bytes con
pattern_create para averiguar el punto exacto.
Se ha usado una carpeta compartida entre las mquinas virtuales para enviar los
archivos entre ellos, aunque tambin se puede usar un USB, la nube
El ltimo de ellos, OllyDbg, es el ms sencillo de utilizar, con una interfaz muy simple,
posee funcionalidades y plugins especficos para la explotacin de vulnerabilidades,
como los otros dos.
WinDbg es el depurador para Windows hecho por Microsoft, tambin posee mltiples
paquetes y plugins. Ser til descargarlo junto con el paquete de smbolos del sistema
de Windows para realizar las funciones de bsqueda de instrucciones o bytes en el
cdigo.
Immunity Debugger es similar en interfaz a OllyDbg pero cuenta con una pequea
lnea de comandos para la ejecucin de plugins basados en Python. Uno de estos
plugins, llamado mona, ser el que usemos ms adelante para esta prueba de concepto.
Puedes acceder a un manual del uso del plugin desde la siguiente direccin:
https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/
Este plugin tiene mltiples funcionalidades, entre las que estn: obtener el opcode de
una instruccin, buscar palabras, instrucciones o bytes dentro del cdigo ensamblador,
comparar archivos Para aadirlo a Immunity deberemos copiarlo en la carpeta de
PyCommands.
Ahora modificaremos nuestro script para crear un nuevo archivo .m3u. Esta vez
queremos reducir el rango de 10.000 caracteres para averiguar posteriormente la
posicin de EIP. Para ello crearemos un patrn del siguiente modo:
22.000 letras a.
Cada 2.000 cambiaremos de letra hasta las 30.000.
Encontramos que EIP tiene la letra d (64 en hexadecimal) por lo que est entre las
posiciones 26.000 y 28.000.
Tambin se pueden usar antes en lugar de ir reduciendo poco a poco, pero en esta
prueba de concepto se prefiere que se entienda el concepto en lugar de realizarlo todo
de golpe. Generaremos el patrn con:
./pattern_create.rb 2000
Tendremos que introducir 26.067 caracteres basura en el buffer antes que EIP.
Por qu no podemos usar bytes nulos? En los bytes nulos se basa el desbordamiento
de buffer, funciones como strcpy copian todo el contenido de un lugar a otro hasta que
se encuentre un byte nulo; si introducimos nosotros uno de estos bytes a la hora de
llenar el buffer parar en ese punto, aunque haya ms texto. Un ejemplo sera
0x00341a2b, vemos que el ltimo byte (Little-endian) es 0x00.
Por ello vamos a utilizar una tcnica para que nuestro exploit no dependa de la
direccin especfica a la que vaya a saltar, sino que sea siempre la misma, evitando el
uso de bytes nulos. Esta tcnica ser saltar a ESP.
Vamos a ver este ejemplo de una forma prctica en la aplicacin y adems obtendremos
la posicin exacta de ESP ya que a veces no se encuentra justo despus que EIP.
Lo ejecutamos de nuevo y vemos que hay una lnea entre EIP y ESP, marcada en azul,
por lo que hay que aadir 4 bytes extra despus de EIP
Nuestro objetivo ahora ser introducir nuestro sled de NOPs y Shellcode a partir de
aqu. Pero no saltaremos directamente a la posicin de ESP, si no que buscaremos la
instruccin jmp esp dentro de las propias libreras de Windows y de la aplicacin, para
que hagan el salto por nosotros, las conocidas DLL. Estas libreras son estticas y sern
portables de una mquina a otra; podremos hacer la aplicacin portable para el mismo
sistema operativo (con las libreras del sistema) o para cualquiera (con las libreras de
la aplicacin).
En este caso queremos usar las de la aplicacin. Para ello tenemos que encontrar en
estas libreras la instruccin jmp esp, por lo que usaremos el Immunity Debugger y el
plugin mona. Primero iremos a la ventana de Log pulsando la l en la barra de
herramientas, en esta ventana nos aparecern los mdulos que han necesitado la
aplicacin y la informacin de la ejecucin de los plugins.
Tenemos dos formas de buscar una instruccin o conjunto de instrucciones en todas las
libreras:
Ambas opciones dan el mismo resultado creando un archivo de texto llamado find.txt
en la carpeta del Immunity Debugger en Archivos de programa. En esta PoC se usa la
segunda opcin junto con el modificador -n que elimina los mdulos que tengan bytes
nulos.
El archivo find.txt tiene dos partes, la primera nos indicar todos los mdulos en los
que se ha encontrado una coincidencia (nos dir si el mdulo es del sistema operativo o
no, si tiene algn tipo de proteccin) y la segunda parte ir mostrando direccin por
direccin todas las que haya encontrado.
Vamos a comprobar que el salto funciona y para ello usaremos la instruccin break
\xcc que detiene el flujo de la ejecucin. Modificaremos nuestro script:
Tipos de saltos
Hemos conseguido crear un exploit en un entorno real, pero ha sido bastante ideal:
haba espacio en la pila para nuestro payload, pudimos utilizar ESP para encontrar el
payload generado, encontramos la instruccin de salto que queramos en las libreras
de la aplicacin para hacer nuestro exploit ms portable Normalmente no se tiene
una situacin ideal as que tendremos que utilizar diversas formas para ejecutar
nuestros payloads.
En el caso de la PoC 2:
Buscamos la instruccin call esp con mona y encontramos una direccin en una
DLL de la aplicacin: 0x01c53f0f.
Para buscar este tipo de instrucciones usaremos los comandos segn el nmero de
posiciones que queramos:
o !mona find -type instr -s pop # ret.
o !mona find -type instr -s pop # pop # ret.
[aaaaaaa][0x01DEB22A][cccc][NOPNOPNOPNOP][Payload]
Al simularlo obtendramos:
[aaaaaaa][0x0x01AB6A10][cccc][ddddeeee][0x01DEB22A][NOPNOPNOPNOP][Payload]
Para que funcione hemos de buscar la secuencia Push [Reg] + Ret en alguna DLL. Si
por ejemplo, el payload estuviera apuntado directamente por ESP pero no
encontrramos jmp esp ni call esp.
o Usando mona, buscaremos las dos instrucciones consecutivas en las DLL con
!mona find -type instr -s push esp # ret -n.
o Tambin podramos buscar los opcodes de cada instruccin y realizar la bsqueda
sobre ellas. En este caso !mona find -s "\x54\xc3" -n.
Blind Return. Esta tcnica se usa cuando no podemos utilizar EIP para apuntar
directamente a un registro (porque no se puedan utilizar instrucciones JMP o CALL
y no quede ms remedio que escribir la direccin en la pila) y tenemos control sobre
ESP (al menos los 4 siguientes bytes).
Consiste en:
o Sobrescribir EIP con la direccin a una instruccin RET de una DLL.
o Colocar la direccin del payload en los 4 bytes posteriores a ESP.
o Al ejecutar el RET se hace un POP implcito a los ltimos 4 bytes de la pila, que
ser la direccin que hemos introducido.
o Se saltar a nuestro payload.
Buffers pequeos
Podramos utilizar todo el espacio que hemos usado para desbordar el buffer (las letras
a basura que introdujimos) para albergar nuestro payload. Para que esta tcnica
funcione necesitamos encontrar las direcciones de memoria que albergan estos bytes y
una manera de referenciarlos.
Primero vamos a crear el exploit de prueba que simule una situacin de buffer
pequeo:
Encontramos que ESP es 0x000ffd38 y que hay 4 bytes de desplazamiento entre EIP y
ESP, por lo que solo tenemos 50 bytes de buffer en realidad. Pero, adems,
encontramos que cuando acaban los NOPs est el carcter 0x00 (fin de cadena)
porque es el final de la cadena que hemos copiado y a partir de ah hay un montn de
letras a.
Estas letras son parte del buffer inicial que hemos introducido antes de EIP, as que si
somos capaces de realizar un salto a esta parte podremos ejecutar un payload en ella.
Nuestro objetivo ser guardar el payload en las posiciones de memoria donde haya as
y utilizar el buffer pequeo de las x para saltar a este.
Ahora sabemos que las primeras 257 as sern basura pero a partir de ah, tendremos
espacio para introducir un payload.
El siguiente paso ser aadir en la zona de las x, los 50 bytes que tenemos disponibles
en ESP, el cdigo que nos permita hacer Jmp [ESP + 257]. Dividiremos el problema en
dos partes:
ADD ESP, 119h (281 en hexadecimal, ya que hemos aadido NOPs y nos da igual el
offset mientras sea mayor igual que 257).
JMP ESP (ESP ser ESP + 281, por lo que saltar a nuestro payload).
Nos encontramos un problema, el opcode de add esp, 119h contiene bytes nulos,
pues es \x81\xc4\x19\x01\x00\x00 y no nos sirve. Vamos a tener que encontrar otra
forma para dividir el nmero en varias sumas parciales. Adems en esta ocasin,
probaremos con WinDbg, ya que su base de smbolos es mayor que la de mona (mona
para la suma nos dar siempre opcodes con bytes nulos).
Nota: al realizar el exploit ha sido necesario quitar los ltimos NOPs (marcados con **)
pues sobrepasaban el espacio total disponible en la pila y no permita la ejecucin
correcta del payload. Adems al reducirse este nmero de NOPs, la posicin a la que
saltar de ESP disminuye por lo que deberemos quitar la lnea marcada con asteriscos
del cdigo de salto. Solo saltaramos (188 posiciones).
Y al ejecutarlo:
Es aconsejable que si se desea seguir las PoC o los ejemplos, todos los archivos se
copien en el Escritorio o en alguna carpeta de la mquina donde se ejecuten y no se
haga directamente desde la carpeta compartida por las mquinas virtuales ya que
puede generar fallos.
Popad (Pop all double). Hace POP a dobles palabras de la pila y las guarda en los
registros de propsito general en la misma instruccin.
o Un solo popad sacar 32 bytes de la pila.
o Se cargarn en los registros en el siguiente orden: EDI, ESI, EBP, ESP, EBX,
EDX, ECX y EAX. (En ESP no se cargan datos sino que son descartados).
o El cdigo de operacin es \x61 (Las as que hemos usado como basura).
o Es muy til para tamaos de buffer muy pequeos. Si tenemos que saltar 260
bytes con un espacio de salto de 14 bytes, podremos usar 9 POPAD y un JMP ESP
ocupando solo 11 bytes.
Fuzzers
Como apartado final se quiere hablar de un tipo de fuzzer especial usado para testear
aplicaciones en busca de desbordamientos de buffer. Este tipo de fuzzer se dedicar por
nosotros a la tarea de enviar grandes cantidades de caracteres a las entradas de ciertos
servicios de protocolos conocidos, como HTTP o FTP. Usaremos Metasploit para
encontrar estos fuzzers, en el mdulo auxiliary > fuzzers.
Uno de ellos, desarrollado por Corelan Team (los autores del plugin mona), se usa para
realizar este tipo de testeo de buffer overflow en servidores FTP. Introduce tantos
caracteres como le indiquemos siguiendo patrones para cada una de las opciones del
protocolo (nombre de usuario, contrasea, ningn comando, comando STOR)
avisndonos si se ha lanzado alguna excepcin a causa de desbordar el buffer por la
introduccin de texto.
Vamos a realizar una pequea prueba de concepto con un servidor FTP vulnerable
llamado WarFTP en una mquina XP y nuestra mquina Kali.
Ser siempre conveniente comprobar fase por fase las entradas del fuzzer una vez
descubramos que hay un fallo en aplicacin del servidor.
o DEP por hardware consiste en un bit que se coloca en las pginas de memoria de
un proceso en el que se indica si esta puede ejecutar o no cdigo. Este bit se llama
NX (no execute) en arquitectura Intel y XD (execute disable) en AMD. Esta
solucin es en tiempo de ejecucin y no requiere volver a recompilar las
aplicaciones para que funcione.
o DEP forzado por software no posee este bit mencionado, sino que consiste en
evitar que se sobrescriban los manejadores de excepciones SEH. Puede ayudar a
evitar que se ejecute cdigo malintencionado. A diferencia del anterior har falta
compilar especficamente para implementar esta medida, tambin llamada
/SafeSEH.
o Otra forma de solucin, basada en libreras es detectar cualquier intento de
ejecucin de cdigo ilegtimo en la pila, ejemplo de esto es la solucin
SecureStack desarrollada por SecureWave.
o Aunque haya formas de saltarse DEP, tanto software como hardware, supone
dificultar la tarea de generar vulnerabilidades y aumenta la complejidad de los
exploits.
#include <stdio.h>
Activar ASLR:
echo 2 > /proc/sys/kernel/randomize_va_space
Desactivar ASLR
echo 0 > /proc/sys/kernel/randomize_va_space
Este pequeo programa devolver el valor de ESP cada vez que se ejecute, pudiendo ver
en cada ejecucin como cambia su valor segn tengamos o no activado ASLR.
o De nuevo esta medida se podr saltar, ya sea usando grandes sleds de NOPs,
esperando que el salto caiga en ellos o accediendo a libreras que sean estticas.
Lo + recomendado
Lecciones magistrales
No dejes de leer
Hacking prctico
+ Informacin
A fondo
Gua de Metasploitable
Webgrafa
Tutoriales de corelan
Pgina web que contiene los mejores tutoriales acerca de exploit para Windows.
https://www.corelan.be/index.php/articles/
Exploit-db
Pgina web donde podemos encontrar informacin sobre los ltimos exploits
descubiertos.
http://www.exploit-db.com/shellcode/
Bibliografa
VV. AA. (2006). Extreme exploits (hackers y seguridad). Madrid: Ediciones Anaya
Multimedia.
VV. AA. (2005). Blindaje de redes: tu red invulnerable a los hackers. Madrid:
Ediciones Anaya Multimedia.
Actividades
En la siguiente actividad debers crear dos exploits para el programa reto.c. El primero
deber conseguir acceder a la funcin premio() alterando el flujo del programa y el
segundo deber obtener una shell local en la propia mquina. Se deber realizar en la
mquina Kali desactivando ASLR y compilando con las opciones vistas para permitir
ejecucin de cdigo en la pila
Test