El otro día, mi compañero Pablo González me propuso un reto, resolver el Reto BLE (BlueTooth Low Energy) del CTF (Capture The Flag) que presentó Pablo en la Sh3llCON y que explicó hace poco aquí. La única condición era utilizar exclusivamente HomePWN, herramienta que desarrollamos para el pentesting de dispositivos IoT.
Como ya contó Pablo, el objetivo de este CTF es obtener un flag resolviendo una serie de retos, para ello se interactuará mediante BLE con una tarjeta MicroBIT cargada con el script de la prueba tal y como explicamos en este anterior post.
Empecé el reto confiado, ya que como hemos escrito anteriormente, HomePWN dispone de una gran cantidad de módulos orientados al BLE, así que abrí una máquina virtual con la herramienta, cogí un USB BlueTooth y me puse manos a la obra.
Resolución del CTF BLE
Lo primero fue cargar el módulo discovery/ble, aquí no tuve que modificar las opciones por defecto, ya que la interfaz estándar es la hci0 y no quería filtrar dispositivos por intensidad. Una vez ejecutado el módulo, estos fueron los resultados.
Ya en esta lista podemos ver el dispositivo que estamos buscando, y podremos referenciarlo en los sucesivos módulos gracias a la dirección MAC. Lo siguiente sería cargar un nuevo módulo para ver sus atributos. Nos dirigimos a ble/read-characteristics y metemos las opciones necesarias.
Para este módulo deberemos introducir la dirección capturada (en este caso f4:c5:11:e3:5c:23) y poner como tipo de atributo genérico aleatorio, como nos indicaba el módulo anterior. Al ejecutar el comando run obtenemos lo siguiente.
Viendo esta lista de características, quise suscribirme a la penúltima de ellas para escribir en la última, con la esperanza de que me devolviera un resultado. El problema es que, debido a la implementación de los módulos, al suscribirme bloqueaba la Micro:bit, impidiendo la escritura. ¿Qué hacer ahora?. Pues es buen momento de crear un nuevo módulo para resolver el problema.
La suerte es que en HomePWN es muy sencillo crear un nuevo módulo. Lo único que hay que hacer es coger el "Template" que se encuentra en el fichero modules/_template.py y copiarlo al nuevo documento que hemos creado en la carpeta donde queremos agrupar nuestra nueva funcionalidad. En nuestro caso dentro de modules/ble.
Llamaremos a nuestro módulo subscribe-and-write, y primero rellenaremos la información sobre él en el diccionario information. Luego hay que añadir los argumentos que queremos manejar en el módulo, dentro del diccionario options. Además, añadiremos la función auxiliar update_complete_set para autocompletar algunos de estos argumentos.
Después modificaremos el script de ble/subscribe, en este caso para que se suscriba a la característica y en la misma conexión envíe los paquetes, evitando así el bloqueo del dispositivo. Por último añadiremos una función auxiliar para transformar los bytes recibidos en hexadecimal y ASCII y así mejorar la visualización.
Con el módulo terminado, pude continuar el reto. Primero ejecuté este nuevo módulo creado, eligiendo como uuid-subcribe la característica con propiedad INDICATE y para escribir seleccioné la característica con propiedad WRITE NO RESPONSE WRITE. Por último escribí en el campo de data 0#, ya que es el mensaje que quería enviar. Al ejecutarlo vi este resultado.
A partir de aquí ya conocemos el procedimiento del post anterior. Solo había que cambiar el campo data hasta que dar con el número que nos devuelve el flag con el que completamos el CTF.
Como habéis podido ver, es muy sencillo completar este reto con HomePWN, y es bastante asequible crear un módulo específico para ampliar la funcionalidad de la herramienta.
Espero que os haya gustado, os animo a descargaros la herramienta e intentar resolver el reto por vuestra cuenta.
¡Un saludo!
Autor: Lucas Fernández Aragón (@lucferbux) Security Researcher del equipo de Ideas Locas de CDCO en Telefónica.
Figura 1: HomePWN: Cómo resolver el CTF BLE de ShellCOn |
Como ya contó Pablo, el objetivo de este CTF es obtener un flag resolviendo una serie de retos, para ello se interactuará mediante BLE con una tarjeta MicroBIT cargada con el script de la prueba tal y como explicamos en este anterior post.
Figura 2: HomePWN en GitHub. Herramienta de penttesting IoT |
Empecé el reto confiado, ya que como hemos escrito anteriormente, HomePWN dispone de una gran cantidad de módulos orientados al BLE, así que abrí una máquina virtual con la herramienta, cogí un USB BlueTooth y me puse manos a la obra.
Resolución del CTF BLE
Lo primero fue cargar el módulo discovery/ble, aquí no tuve que modificar las opciones por defecto, ya que la interfaz estándar es la hci0 y no quería filtrar dispositivos por intensidad. Una vez ejecutado el módulo, estos fueron los resultados.
Figura 3: Resultados del módulo discovery/ble |
Ya en esta lista podemos ver el dispositivo que estamos buscando, y podremos referenciarlo en los sucesivos módulos gracias a la dirección MAC. Lo siguiente sería cargar un nuevo módulo para ver sus atributos. Nos dirigimos a ble/read-characteristics y metemos las opciones necesarias.
Para este módulo deberemos introducir la dirección capturada (en este caso f4:c5:11:e3:5c:23) y poner como tipo de atributo genérico aleatorio, como nos indicaba el módulo anterior. Al ejecutar el comando run obtenemos lo siguiente.
Figura 4: Resultados del módulo ble/read-characteristics |
Viendo esta lista de características, quise suscribirme a la penúltima de ellas para escribir en la última, con la esperanza de que me devolviera un resultado. El problema es que, debido a la implementación de los módulos, al suscribirme bloqueaba la Micro:bit, impidiendo la escritura. ¿Qué hacer ahora?. Pues es buen momento de crear un nuevo módulo para resolver el problema.
La suerte es que en HomePWN es muy sencillo crear un nuevo módulo. Lo único que hay que hacer es coger el "Template" que se encuentra en el fichero modules/_template.py y copiarlo al nuevo documento que hemos creado en la carpeta donde queremos agrupar nuestra nueva funcionalidad. En nuestro caso dentro de modules/ble.
Figura 5: Libros de Python para Pentesters y Hacking con Python |
Llamaremos a nuestro módulo subscribe-and-write, y primero rellenaremos la información sobre él en el diccionario information. Luego hay que añadir los argumentos que queremos manejar en el módulo, dentro del diccionario options. Además, añadiremos la función auxiliar update_complete_set para autocompletar algunos de estos argumentos.
Figura 6: Módulo ble/subscribe-and-write |
Después modificaremos el script de ble/subscribe, en este caso para que se suscriba a la característica y en la misma conexión envíe los paquetes, evitando así el bloqueo del dispositivo. Por último añadiremos una función auxiliar para transformar los bytes recibidos en hexadecimal y ASCII y así mejorar la visualización.
Con el módulo terminado, pude continuar el reto. Primero ejecuté este nuevo módulo creado, eligiendo como uuid-subcribe la característica con propiedad INDICATE y para escribir seleccioné la característica con propiedad WRITE NO RESPONSE WRITE. Por último escribí en el campo de data 0#, ya que es el mensaje que quería enviar. Al ejecutarlo vi este resultado.
Figura 7: Resultado de la ejecución del módulo |
A partir de aquí ya conocemos el procedimiento del post anterior. Solo había que cambiar el campo data hasta que dar con el número que nos devuelve el flag con el que completamos el CTF.
Figura 8: Flag conseguido |
Como habéis podido ver, es muy sencillo completar este reto con HomePWN, y es bastante asequible crear un módulo específico para ampliar la funcionalidad de la herramienta.
Espero que os haya gustado, os animo a descargaros la herramienta e intentar resolver el reto por vuestra cuenta.
¡Un saludo!
Autor: Lucas Fernández Aragón (@lucferbux) Security Researcher del equipo de Ideas Locas de CDCO en Telefónica.
Figura: Contactar con Lucas Fernández Aragón |
No hay comentarios:
Publicar un comentario