Tag Archive for python

Mejorando BSSID Finder

Siguiendo el hilo tratado en el post de hace algunos días, BSSID Finder, vamos a ver cómo podemos ampliar nuestro pequeño script, sin salir del ámbito de scapy, para que no sea meramente una aplicación informativa. En esta ocasión, he subido el código fuente en un repositorio de Github, disponible en este enlace.

¿Qué va a hacer el programa?

  1. Buscará los distintos BSSIDs para un ESSID determinado.
  2. Mostrará por pantalla los resultados encontrados, permitiendo seleccionar un BSSID específico o todos a la vez, con el objetivo de desautenticar sus correspondientes clientes inalámbricos.
  3. Finalmente, lanzará automáticamente los paquetes de desautenticación.

Veamos un ejemplo de su ejecución:

exec

Efectivamente, una vez seleccionada la opción All, realiza el envío de los correspondientes paquetes de desautenticación para todos los BSSIDs encontrados. Una vez más, Wireshark nos ayuda a corroborarlo:

wireshark

Podemos ver en la imagen que se ha aplicado un filtro para mostrar únicamente los paquetes del tipo gestión (0) y el subtipo deauthentication (12), el cual nos permite observar un paquete que tiene como Destination Address (DA) el valor broadcast y como Source Address (SA) y BSSID la dirección MAC del punto de acceso. No es casualidad, ya que la definición de estos valores se ha indicado explícitamente en el código. Veamos:

deauth_clients

En este caso, lo que tenemos es que a partir del objeto iterable bssids, vamos a enviar un número determinado de paquetes para cada bssid que contenga, definido por count, y en un intervalo de 0.2 segundos, definido por inter.

Cada paquete constará de tres capas, todas proporcionadas por scapy:

  • RadioTap(): se trata de una capa que proporciona información adicional sobre el paquete, como puede ser el canal por el que se transmite o la intensidad de señal de la fuente emisora una vez se ha recibido. Es una capa gestionada por el driver del adaptador inalámbrico y no es parte del estándar IEEE 802.11, con lo cual algunos drivers pueden simplemente ignorarla. En el código no se ha introducido información adicional al respecto.
  • Dot11(): representa propiamente el formato 802.11 y en este caso se le indica que encapsulará un paquete de desautenticación mediante las especificaciones de type=0 y subtype=12. Además, también define las direcciones MAC y su correspondiente ordenación según la especificación To DS=0 y From DS=0:

ToDS

FromDS Addr 1 Addr 2 Addr 3

Addr 4

0

0 DA SA

BSSID

0

1 DA BSSID

SA

1

0 BSSID SA

DA

1

1 RA TA DA

SA

Las siglas de la tabla hacen referencia a:

  • DA: dirección destinación.
  • SA: dirección origen.
  • RA: dirección del receptor.
  • TA: dirección del transmisor.
  • BSSID: dirección del AP.

Caso 00: la trama es parte de una red Ad-Hoc (IBSS), en que dos o más estaciones se comunican entre sí, o bien no está destinada a salir del entorno inalámbrico. Los beacon frames mantienen esta estructura y de hecho, cualquier trama de control o gestión.

Caso 01: la trama está entrando al entorno inalámbrico y proviene de un sistema de distribución (del Inglés, Distribution System (DS)). Un ejemplo puede ser una trama procedente del DS que va dirigida a la estación cliente y que será reenviada por el punto de acceso.

Caso 10: la trama abandona el entorno inalámbrico y es destinada a un nodo de la red del sistema de distribución. Un ejemplo es cuando una estación solicita una dirección IP (DHCP Request) y la solicitud es reenviada por el punto de acceso al servidor DHCP que reside en la red del sistema de distribución.

Caso 11: la trama está involucrada en una red del sistema de distribución inalámbrico (del Inglés, Wireless Distribution System (WDS)). Un ejemplo es cuando un punto de acceso se comunica con otro.

  • Dot11Deauth(): es la capa correspondiente a los paquetes de desautenticación y en la que sólo se puede especificar el motivo por el cual se solicita el proceso. Esta vez, se ha indicado “Unspecified reason” mediante el valor 1.

Podemos comprobar que, si durante la ejecución del script tenemos en correcta ejecución Airodump-ng, éste nos notificará de la captura de un handshake. Y no se acaba aquí, ya que también existe la posibilidad de efectuar un ataque DoS a las estaciones clientes si se introduce una cantidad suficientemente grande de paquetes a enviar, en lugar de 5 como se ha especificado en el ejemplo.

Finalmente, a modo conclusión, queda por destacar, una vez más, la potencialidad que nos brinda scapy y de la cual hemos sido testigos en este post.

¡Os animo a que lo probéis!

¡Saludos!

 Ferran Verdés

Patito Hunter – Detectar y bloquear un USB Rubber Ducky con Python

“Cazando al patito”

Introducción a USB Rubber Ducky

A estas alturas seguro que ya todos habéis visto (o padecido) o habéis escuchado hablar sobre USB Rubber Ducky, conocido familiarmente como el “patito“. Para los que no, simplemente decir que se trata de un dispositivo USB con apariencia similar a un pendrive o flashdrive de toda la vida pero que en realidad es un dispositivo HID (Human Interface Device). En este caso se trata de un teclado que almacena una serie de comandos que son ejecutados cuando el dispositivo se conecta a un ordenador, portátil, tablet o smartphone. Los comercializan los chicos de Hak5, pero en España también tenemos representación de la empresa Phoenix Intelligence & Security que también fabrican dispositivos similares. Como os podéis imaginar las posibilidades son infinitas.

Aquí tenéis dos artículos en nuestro blog mostrando sus posibilidades:

Cuando el pato teclea Cuack Cuack – Parte 1

Cuando el pato teclea Cuack Cuack – Parte 2

Cabe destacar además que a día de hoy, muy pocos fabricantes de malware detectan y bloquean este tipo de dispositivos, solo G-Data con su USB Keyboard Guard. Eso sí, de momento solo para Windows.

USB Rubber Ducky - Ninja

Objetivos

En este caso no he venido aquí para escribir cómo funciona el USB Rubber Ducky y sus posibilidades, que como ya he dicho antes, son muchas desde el punto de vista ofensivo. Los objetivos de este artículo son:

  1. Explicar en qué he basado mi investigación
  2. Presentar la herramienta “Patito Hunter
  3. Aprender, hackear y compartir.

Ya en este blog he ido publicando artículos sobre análisis de dispositivos USB con Wireshark, concretamente los artículos los podéis encontrar en estos enlaces:

Análisis de un dispositivo USB con Wireshark – Parte 1

Análisis de un dispositivo USB con Wireshark – Parte 2

En estos artículos se explica cómo capturar tráfico USB con Wireshark para a continuación analizar la información obtenida y saber cómo funcionan los dispositivos USB; desde que lo conectamos al equipo, se intercambia información del dispositivo, sus configuraciones o interfaces. Desde la publicación del primer artículo, en octubre de 2015, he ido analizando con Wireshark la información de distintos dispositivos USB, y de distintas clases (Mass Storage, Printer, HID, etc).

Esta misma información puede ser usada para analizar otros dispositivos de tipo Bad USB, como puede ser el propio USB Rubber Ducky o LAN Turtle (la famosa tortuga). Como he comentado en la introducción, un “patito” emula el funcionamiento de un dispositivo HID, concretamente un teclado, pero con sus diferencias. Y son precisamente estas diferencias las que me han llevado a desarrollar una pequeña herramienta, a la que he llamado cariñosamente “Patito Hunter” para detectar y bloquear los USB Rubber Ducky, basándome precisamente en esas diferencias. Read more

BSSID Finder

En este post veremos que sólo 20 líneas de python son las necesarias para complementar el comportamiento de un sniffer y lograr que éste cumpla con nuestras necesidades. No obstante, el objetivo principal es proporcionar una introducción práctica a la librería scapy.

Este script resulta útil cuando en las auditorías wifi se requiere el conocimiento de los distintos AP de la organización que están a nuestro alcance. Un objetivo claro puede ser, por ejemplo, suplantar la identidad de los puntos de acceso para el envío de paquetes de desautenticación a las estaciones clientes.

Evidentemente esta tarea se puede realizar de forma manual, simplemente lanzado airodump-ng y anotando los bssid de interés, y cruzando los dedos para que no existan demasiados puntos de acceso. No obstante, contemplar las posibilidades del script resulta interesante, ya que son muy extensas. Por ejemplo, con pocas líneas es posible automatizar el envío de los paquetes de desautenticación y al final, todo se reducirá en un cd y un enter.

Para hacer uso del script, como siempre, debemos disponer de nuestra tarjeta en modo monitor:

monitor_mode

La sentencia “airmon-ng check kill” nos permite matar los procesos que pueden interferir con nuestro modo monitor de la tarjeta. Es muy recomendable usar esta sentencia, ya que nos podemos ahorrar la posibilidad de obtener un comportamiento no deseado de la misma, y en consecuencia, una situación de confusión.

Read more

Fuzzing a una aplicación con zzuf

Introducción: ¿por qué fuzzing?

Cuando nos encontramos haciendo tareas de ingeniería inversa a una aplicación, una de las tareas más monótonas es la de enviar stuff (“cosas“) a un punto de entrada de la aplicación para ver cómo responde. En función de nuestro objetivo (descubrir buffer overflow, format string…), el tipo de stuff que enviemos variará, no sólo en su contenido si no también en su cantidad, sobre todo si lo que buscamos es provocar un buffer overflow. Y cuando hablamos de cantidad, lo ideal es hacer fuzzing en lugar de hacerlo con peticiones manuales.

En el caso de los desbordamientos, más que el tipo de contenido lo que se busca es la cantidad, y aquí tenemos varias opciones de enviar “cosas” a la aplicación; de forma manual, mediante ejecución de instrucciones Python / Perl desde la consola, creándonos nuestro propio script o utilizar herramientas ya desarrolladas para este tipo de tareas; fuzzers.

En este artículo veremos distintas opciones, para finalmente presentar y ver algunos ejemplos de zzuf, el fuzzer del que vamos a hablar en este post.

Escenario

Para explicar el funcionamiento de un fuzzer, y de zzuf concretamente hemos preparado el siguiente escenario; una aplicación remota vulnerable a buffer overlflow (basado en stack), accesible a través del puerto TCP/9999.

Ese puerto a la escucha es nuestro único punto de entrada. Podríamos escanear el puerto, descubrir versión del servicio y buscar si hay alguna vulnerabilidad desconocida. En caso negativo, no nos queda otra que enviar cosas al puerto y ver cómo responde la aplicación.

Fuzzing - Netcat a vulnserver

En este caso, haciendo netcat al puerto conseguimos acceso a la aplicación, donde nos indica que podemos obtener ayuda escribiendo el comando HELP.

Peticiones manuales a la aplicación

Obviamente nuestra intención es otra, es encontrar qué tipo de información tenemos que enviarle y en qué cantidad. La explotación de la vulnerabilidad de buffer overflow no entra en el contexto de este artículo, lo explicaremos más adelante en otro, pero se puede ver marcado en amarillo una serie de comandos de la aplicación. Estos comandos son los usaremos para enviar nuestro stuff e intentar provocar el BO (buffer overflow).

Fuzzing - Netcat a vulnserver

Como decíamos en la introducción al artículo, podemos hacer peticiones manuales. En la imagen anterior al comando HELP le hemos añadido una serie de caracteres, primero dígitos y a continuación acompañados de varios caracteres “A“. La respuesta de la aplicación es que ese comando no está implementado. Podríamos seguir probando con más cantidad, con otros comandos, pero como os podéis imaginar esto llega a ser bastante tedioso y monótono si lo hacemos manualmente. Read more

Descubriendo la red con Python y Nmap – Parte 3

Buenos vamos con la siguiente entrega de Python y Nmap, recordar que tenemos la parte 1 y parte 2, para entender que vamos a hacer en este post, donde vamos a crear un pequeño script que nos almacenara en un fichero los host que están levantados, que luego podemos usar en otras herramientas.

python-nmap Read more

Descubriendo la red con Python y Nmap – Parte 2

Seguimos con nuestra segunda parte de Python y Nmap, aunque no sé yo si seguir o no, todavía espero mi jamón de la 1º parte 😛

En esta segunda parte vamos a seguir aprendiendo más opciones que nos trae la librería de Python-Nmap y en la siguiente realizaremos un pequeño script que nos solucione el descubrimiento de una red para sacar los equipos vivos y no tener que ir limpiando la información sobrante 🙂

python-nmap Read more

Descubriendo la red con Python y Nmap – Parte 1

Nuestro compañero Miguel, nos enseñó cómo descubrir el terreno de juego con Nmap (Parte 1, Parte 2) ahora que ya sabemos, ¿Por qué no automatizamos, gracias a nuestro amigo Python, los proceso de Nmap con la librería de Python-nmap y descubrimos la red de manera automatizada?

python nmap Read more