Hola de nuevo a todos.
En esta ocasión os traigo un nuevo cacharro. Esta vez se trata de un " Bad USB ". Pero no se trata de uno cualquiera, sino del que posiblemente sea el más barato del mercado, o al menos uno de los más baratos.
¿Qué es un Bad USB?
A modo de resumen, un " Bad USB" es un dispositivo USB que se hace pasar por un HID (Human Interface Device). Es decir, engaña al ordenador haciéndose pasar, principalmente, por un teclado o otro tipo de dispositivo conectado. Esto se consigue haciendo uso de dispositivos preparados para ello o reprogramando el firmware del dispositivo USB. De ahí viene el nombre de este tipo de dispositivos, ya que el primer firmware que reprogramó un USB fue bautizado como BadUSB. A continuación, por si queréis saber más, os dejo el enlace de la charla que se impartió en la conferencia Black Hat USA de 2014 en la fue presentado al mundo este nuevo concepto: https://www.youtube.com/watch?v=nuruzFqMgIw
Una vez conectado el dispositivo en el ordenador, es capaz de inyectar pulsaciones de teclado, tal y como haría el atacante si estuviera delante del equipo, pero de una forma mucho más rápida. Esto permite al atacante tomar el control de la máquina, exfiltrar información, espiar al usuario, instalar otros programas maliciosos, etc.
Desde entonces este tipo de ataque ha evolucionado bastante, al igual que la tecnología.
Si realizáis algunas búsquedas por internet, en concreto en las tiendas online más famosas, veréis que existen varios modelos. Cada uno de ellos con unas características, cualidades y precios distintos. Es más, ya no solo toman la forma de dispositivos USB sino que llegan a imitar a prácticamente cualquier dispositivo que utilice el conector USB. Por ejemplo, existe el Bad USB en versión cable. De esta manera se consigue imitar el cable con el que cargas o conectas tu smartphone desde el ordenador. Por ejemplo, os dejo por aquí el proyecto de Joel, Enersto y compañía: https://github.com/joelsernamoreno/BadUSB-Cable
Digamos que el "oficial", el más conocido, es el denominado como Rubber Ducky. Este pertenece a la marca Hak5. Este producto, sea cual sea la web en la se consulte, es con diferencia el más caro de los Bad USB. Y es altamente probable que dicha web se encuentre sin stock o con pocas unidades a la venta. Esta entidad fue capaz de desarrollar un "lenguaje de programación" bastante fácil con el que automatizar las acciones del Rubber Ducky.
Por otro lado, otra variante bastante conocida de dispositivo Bad USB, son los Malduinos de la marca Maltronics. Estos dispositivos ofrecen unas funcionalidades muy parecidas al Rubber Ducky, pero por un precio más asequible.
Sin embargo, a pesar de los anteriores modelos, existe una variante todavía más barata, la cual podemos adquirir de distintos proveedores por no más de 10€-12€. Ahora bien, es cierto que este modelo no dispone de ranura para almacenar la información en una tarjeta MicroSD. Por mi parte no lo veo una desventaja del todo, ya que a día de hoy es raro encontrarse con un equipo que no está conectado a Internet. Así que allá cada uno con su imaginación.
Sin más dilación, el Bad USB más barato es el siguiente:
Se trata de un dispositivo que cuenta en su interior con una placa microcontroladora llamada Arduino Leonardo. Esta placa hace uso del microprocesador ATmega32U4. "¿Pero y todo esto a quién le importa? Lo que quiero es jugar con él". Sí, ya vamos al lío. No me enrrollo más.
Jugando con el Bad USB
⚠️⚠️ DISCLAIMER ⚠️⚠️
La INFORMACIÓN que aquí se ofrece es de índole educacional y nada más. derechodelared no se hace responsable del uso que se le pueda dar a dicha información.
Para poder jugar con el cacharro, una vez nos llegue a casa, debemos tener a nuestra disposición lo siguiente:
- Un ordenador con el IDE Arduino instalado.
- Un equipo con un S.O. Windows instalado para probar el dispositivo. (No es obligatorio que se tenga que probar en Windows, pero en el caso de este post así es).
En un post anterior explico cómo instalar el IDE Arduino. En el caso de necesitarlo, aquí lo tenéis:
Empezamos. Lo primero que vamos a hacer es conectar nuestro flamante Bad USB a nuestro ordenador. Al hacerlo, veremos que de casa viene con un pequeño payload ya programado. Este, en el caso de ejecutarse en una máquina Windows, abre la herramienta llamada "Ejecutar" a través del atajo de teclado Windows+R
. Acto seguido, en la misma herramienta ejecutar, introduce la cadena de texto cmd.exe e inyecta la pulsación de la tecla "Intro". Al hacerlo, se abre la terminal de comandos. Y ahí finaliza la tarea que tiene programada.
Ahora es nuestro turno de programarlo. Para ello, abrimos el IDE Arduino. Una vez se haya abierto el programa, debemos ir a la parte superior de la interfaz. Allí hacemos clic en "Tools", debemos indicarle al programa que nuestra placa es un modelo Arduino Leonardo tal y como aparece en la siguiente imagen:
Si todo ha ido correctamente, nos reconocerá la placa sin problema, indicándonos el puerto en el que está conectado el dispositivo. Podemos, además, obtener información de la placa através de la opción "Get Board Info":
A partir de este momento, ya podemos programar el dispositivo a nuestro gusto. Para ello, vamos hacer uso de algunos ejemplos. Estos se encuentran en el siguiente repositorio: https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Payloads
Si accedemos a cualquiera de ellos, por ejemplo al denominado "Payload youtube roll", veremos lo siguiente:
DELAY 3000 GUI r DELAY 200 STRING https://www.youtube.com/watch?v=dQw4w9WgXcQ ENTER DELAY 3000 STRING f
Como podemos ver, está escrito en el "lenguaje de programación" desarrollado por Hak5 para el Rubber Ducky. No es díficil de entender lo que hace este ejemplo. En concreto, abre la herramienta "Ejecutar" con la combinación de teclas Windows+R
. Después introduce una cadena de texto, que es un enlace a un vídeo de Youtube, seguido de un Intro. Se espera tres segundos, y pulsa la letra F para que el vídeo se reproduzca en pantalla completa en el navegador que está definido por defecto en el sistema. ¿Cómo podemos pasar esto al lenguaje C que es el que entiende Arduino?
Para pasar este payload a Arduino, existe un proyecto en Github llamado Duckuino. Este es el enlace: https://github.com/Dukweeno/Duckuino. Podemos descargarnos este proyecto y ejecutarlo en nuestra máquina, o podemos hacer uso directamente de la versión online: https://dukweeno.github.io/Duckuino/
El uso de esta web no es muy complicado, simplemente debemos de pegar el payload en la parte izquierda de la pantalla, hacer clic en "compile !" y copiar en el portapapeles el código resultante.
Con el código en el portapapeles, nos situamos en Arduino y lo pegamos. El resultado es el siguiente:
Llegados a este punto, ya sabemos cómo convertir el lenguaje del Rubber Ducky, que es bastante más simple, a lenguaje C entendible por Arduino. Solamente queda subir el código al dispositivo. Cuidado, que cuando finaliza el proceso de subida, el código que hemos implementado se va a ejecutar en el equipo. Es decir, nos podemos fastidiar a nosotros mismo. OJO!
Por otro lado, si seguimos probando cosas, nos daremos cuenta de un error. Y es que la distribución del teclado de la librería que utiliza Arduino es la inglesa, más concretamente la americana.
Ajustando el teclado
Por tanto, para solucionar este problema, debemos cambiar el mapeo del teclado. Para ello, debemos modificar el fichero Keyboard.cpp. Este se encuentra en la carpeta de instalación de Arduino, en libraries -> Keyboard -> src:
Existen proyectos por Internet que nos pueden facilitar la vida a la hora de mapear el teclado a la distribución de teclado en castellano, o cualquier otra. También tenemos la posibilidad de hacerlo nosotros mismos manualmente. A gusto del consumindor. No obstante, para poder ir un poco más al grano, voy a facilitar por aquí el fichero que estoy utilizando. Ya que podría ser ésta la parte que más cuesta de todo el proceso: https://www.dropbox.com/s/i1917cr1ypyiosv/Keyboard.cpp?dl=0
Una vez descargado el fichero, simplemente hay que sustituir el original por el facilitado en este post. No es mala idea que antes hagáis una copia de seguridad del fichero original, y que lo guardéis en un directorio distinto. Ya que solo puede haber un Keyboard.cpp en dicha carpeta. Algunos de los caracteres y símbolos no han sido implementados, si queréis utilizarlos os lo dejo como tarea 😉. En concreto, los siguientes: ¡¿ñѺªç´
PoC Time!
A continuación, se muestra un vídeo del funcionamiento del Bad USB, al cual se le ha programado el payload https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Payload-lock-your-computer-message. Este payload le recuerda al usuario, haciendo uso del bloc de notas, que debe bloquear su equipo cuando lo abandone.
Tal y como se ha visto, el dispositivo cumple con su función.
Así que esto es todo amigos. Espero que con este post hayáis aprendido algo nuevo, y de no ser así, que por lo menos os haya gustado.
Un handshake. Hasta la próxima.
Colaborador de "Derecho de la red".