.: TALLER DE PROGRAMACIÓN BLUETOOTH :. Con buffer overflow XD

Iniciado por dxr, 6 Diciembre 2005, 14:49 PM

0 Miembros y 1 Visitante están viendo este tema.

dxr

Gospel... bonito taller vas acer lo seguire... peor antes una cosa XDD

ANELKAOS Y YO hemos estado echando un vistazo a tu source y no nos gusta para nada XDDD

1º.... veamos pongo el sopurce y lo analizamos:



#include <stdio.h>
#include <stdlib.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

int main (int argc, char **argv)
{
      bdaddr_t bdaddr;//Estructura bdaddr_t para almacenar la direccion MAC
      char MAC_dev[248];//Direccion MAC del dispositivo
      char nombre_dev[248];//Nombre del dispositivo
      int id_dev;//Identificador del dispositivo
      int socket;//Socket HCI

      if(argc < 2)
      {
            printf("Sintaxis: %s <direccion MAC>\n",argv[0]);
            exit(1);
      }

      printf("+ BlueResolver por Gospel [elblogdegospel.blogspot.com]\n\n");

      strcpy(MAC_dev,argv[1]);

      printf("Detectando nombre del dispositivo <%s>...\n",MAC_dev);

      baswap(&bdaddr, strtoba(MAC_dev));
                     
      id_dev = hci_get_route(&bdaddr);
      if (id_dev < 0)
      {
            printf("[!] Error. Dispositivo no encontrado.\n");
            exit(1);
      }
                     
      socket = hci_open_dev(id_dev);
      if (socket < 0)
      {
            printf("[!] Error. Fallo al intentar abrir HCI.\n");
            exit(1);
      }
                     
      int timeout = 10000;
      if (hci_read_remote_name(socket,&bdaddr,sizeof(nombre_dev), nombre_dev, timeout) == 0)
      {
            printf("Dispositivo encontrado:\n\tMAC: %s\n\tNombre: %s\n",MAC_dev,nombre_dev);
      }
      else
      {
            printf("[!] Error. No se ha podido obtener el nombre del dispositivo Bluetooth.\n");
      }
             
      close(socket);

      return(0);
}



Citar
      char MAC_dev[248];//Direccion MAC del dispositivo

Yo esto lo ubiera declarado como puntero, asi prebeemos un stack overflow y si tienes el fallo pues kedaria en un heap overflow

y luego esto ya si q si XD:

Citar
strcpy(MAC_dev,argv[1]);

asi a capon? reservas 248 bytes peor si meten 83476593847659324 ale pa dentro pa la pila no? y na menos en un programa que rekiere privilegios de root XD.

yo lo que aria primero seria declarar ese array como punteo y luego antes de hacer el:

strcpy hacer una comprobacion de los bytes que ocupa argv[1] y si supera los q tu kieres saltar un error y esas cosas...

Sigue con el taller que me interesa ;D
Hacer preguntas concretas, claras y aportando toda la documentación necesaria.
De lo contrario, no tendreis una respuesta clara.

Gospel

Aisss.... estos blackhat siempre buscandole esa vuelta de tuerca q le falta... el mamón del Anelkaos q me manda un sms para felicitarme el cumpleaños y de regalo me dice q mi programa tiene un buffer overflow! Jajaaajaja...

Gracias por el advisory chavales! Yo no estoy muy puesto en eso de los buffer overflows y el código tiene esa pinta tan infantil por dos motivos:
- Me basé en el redfang para sacar la parte del código q implementa esta función de 'name resolver'. El redfang utilizaba vectores estáticos para almacenar cadenas de caracteres, me dio pereza cambiarlo...
- El objetivo del programa es q sea un código simple y ligero, fácil de leer. No es una gran herramienta, es un ejemplo sencillo. Era más fácil entender q primero recogemos la entrada de la MAC por teclado en una variable y luego la pasamos a forma bdaddr_t q hacerlo directamente con argv[1]. En fin, tampoco creo q pueda ser utilizado maliciosamente para lanzar un bof en un sistema linux...

Aún así, en cuanto llegue a casa esta tarde modifico el código y lo hacemos más seguro, ok?

Hala, gracias por el advisory!! En sucesivas entregas, quedáis contratados como consultores de seguridad del Taller!

Salu2

Gospel

Ok, ya está modificado. Ya de paso he comentado un poco más el código para mejor comprensión.  :)

No hace falta q le deis más vueltas a la tuerca pq si me meto en comprobaciones de tamaños de cadenas y demás, el código se complica innecesariamente. El objetivo no es construir una super herramienta comercial q no puede tener un sólo agujero de seguridad, sino simplemente un código sencillo q permita comprender cómo funciona la programación en Bluez... o acaso vosotros vigilais q las prácticas q entregais en la Uni no sean vulnerables a un BoF??

Hala... lo dicho... Si en adelante publico un código con un grave problema de seguridad pues me lo comentaís y lo securizo. Si es un fallo leve, pues no hace falta... lo primero es la claridad en el código!

Ciao y gracias de nuevo ;)

dxr

Si yo te entiendo gospel pero debemos de dar buen ejemplo programando aplicaciones funcionales y seguras :P de todos modos era una chorrada de b0f pero weno. Que sepas q apartir de ahora voy analizar todos tus sources :P mas q na xq asi aprendemos cosas los 2 XDDD
;D
Hacer preguntas concretas, claras y aportando toda la documentación necesaria.
De lo contrario, no tendreis una respuesta clara.

dxr

mmmm

char *MAC_dev = argv[1];//Direccion MAC del dispositivo

yo creo q no e sla forma mas correcta... ya q estas dejando q el usuario meta lo q kiera pero en la memoria dinamica, has solucionao un stack overflow pero as creado un heap overflow XDDD


siento decirtelo pero creo q como lo tenias al pricipio valia pero antes de copiar el contenido del 1º argumento comprobay los bytes que ocupa :P y declarando  char *MAC_dev asi como puntero. Si en la memoria dinamica ubiera mas variables se podria sobreescribir su contenido y cuando el programa fuera a llamarla ejecutar tu codigo ;P
Hacer preguntas concretas, claras y aportando toda la documentación necesaria.
De lo contrario, no tendreis una respuesta clara.

/* strcpy() */

Creo que la mejor idea seria dejar
char MAC_dev[248];//Direccion MAC del dispositivo
y para el strcpy podemos usar un strncpy por ejemplo.
Ahi dejo un link a un texto que apesta xD: http://foro.elhacker.net/index.php/topic,95901.0.html
Sigo asi
Soy feliz
yo elegí
Sexo, Drogas y PunkRock

/* strcpy() */

No seria interesante hacer un exploit para este programa ¿?
xDDDDDDD
Si me hago un tiempo libre ;)
xDDD
Sigo asi
Soy feliz
yo elegí
Sexo, Drogas y PunkRock

ANELKAOS

Eh que a mi si me gustó, solo que leí las declaraciones y dije...no puede ser.... jajaja xD Me hizo gracia y se lo comenté a DEREK_X xD Pero vamos...tampoco es pra darle mayor importancia... :P
1Saludo

dxr

Ya pense en hacer el explot pero es absurdo es un programa q tienes q ejecutarlo como root... q vas hacer un shellcode q se ejecute como root? : XD no merece la pena ;D
Hacer preguntas concretas, claras y aportando toda la documentación necesaria.
De lo contrario, no tendreis una respuesta clara.

/* strcpy() */

 La idea era por hacer algo anecdotico, es decir, habriamos explotado a Gospel ;)
Sigo asi
Soy feliz
yo elegí
Sexo, Drogas y PunkRock