lunes, 30 de marzo de 2015

Juankeando con la Pitón (8) - AP Scanner con sockets

La suite Aircrack tiene la fabulosa herramienta airodump-ng para escanear los puntos de acceso a nuestro alrededor. En esta entrada implementaremos con python (2.7) algunas de sus funcionalidades para entender como funciona.

En esta ocasión utilizaremos sockets puesto que aporta mas valor didáctico, aunque en la siguiente entrada trabajaremos con la librería scapy (vista en anteriores posts) que nos aportará mayor abstracción que los sockets y nos facilitará enormemente la tarea.


De todos los paquetes que intervienen en una comunicación wireless, para nuestro actual cometido solo nos interesan los del tipo beacon (beacon frames) pues contienen el nombre del punto de acceso, su mac o canal entre otros muchos valores. Por tanto, nuestro primer cometido será identificar el subtipo de los beacon comentados antes. Para ello el Sr. Google o wireshark pueden servirnos:

Imagen obtenida de http://www.wildpackets.com/resources/compendium/wireless_lan/wlan_packet_types

Siendo el subtipo 8 este será el que filtraremos. A partir de aquí, el resto de datos los obtendremos de wireshark (o desde las especificaciones del paquete):


Con un paquete de ejemplo obtenido con wireshark procedemos a ver que posiciones ocupan dentro de éste los diversos valores que queremos obtener. Todo esto lo tendremos en cuenta durante el desarrollo del script:


Al principio encontramos las funciones channel_hopper y signal_handler ya explicadas en anteriores entradas, aunque, descritas brevemente, una permite ir cambiando de canal y la otra interrumpir correctamente el programa con CTRL+C.

La parte interesante del código la encontramos en el método main, concretamente a partir de la línea 43.
Las primeras peculiaridades surgen al crear el socket, pues a diferencia de como lo creamos normalmente (con STREAM o DGRAM), en esta ocasión trabajaremos con los datos en bruto (RAW). El tercer elemento que normalmente se omite, en esta ocasión es 3 (ETH_P_ALL) que implica que el socket trabaje con todos los protocolos. Con esto definido ponemos a escuchar una interfaz en modo monitor (usando, por ejemplo, airmon-ng) y que empiece a capturar paquetes.


Trabajamos con los paquetes en RAW, por tanto éstos llevan sus cabeceras. Ésta es de 36 bytes, siendo el 37 el que determina el subtipo del paquete, en este caso tendrá que ser 8 (0x0008) (línea 53 del código):


A partir de aquí se trabaja con una lista para evitar mostrar puntos de acceso repetidos pues continuamente recibiremos beacons. A continuación mostraremos la información que deseemos del paquete  conociendo la posición que ocupa en éste. Siendo interesante conocer que el tamaño del nombre del punto de acceso es un factor determinante y variable pues, en función de su longitud, los valores siguientes (en el caso del script la MAC y el canal) estarán en una posición u otra. La variable ssidLen controla esto (línea 54).

Para probarlo, partiendo de que nuestra interfaz se encuentra en modo monitor, veremos un resultado como el que sigue:


Como siempre, el script está en la correspondiente sección del GitHub de 0verl0ad (si los chinos os dejan acceder a el ;) ):
https://github.com/0verl0ad/pyJuanker/blob/master/scripts/apScannerSock.py

En la siguiente entrada (a saber cuando...), veremos las mismas funcionalidades pero implementadas con la librería scapy.


Si alguien quiere ampliar información...:


C'est fini, nos leemos en breve

5 0verl0ad Labs: Juankeando con la Pitón (8) - AP Scanner con sockets La suite Aircrack tiene la fabulosa herramienta airodump-ng para escanear los puntos de acceso a nuestro alrededor. En esta entrada implemen...
< >