Inicio > Hacking > Vuelve el patito low cost, ahora grazna como un USB Rubber Ducky original

Vuelve el patito low cost, ahora grazna como un USB Rubber Ducky original

Sobre los autores: Ernesto Sánchez (@ernesto_xload) y Joel Serna (@JoelSernaMoreno) son consultores en seguridad informática que han participado en eventos como: Navaja Negra, MorterueloCON y Eastmadhack.

 

 

Buenos días a todos!

Hace un tiempo, os contábamos como hacer un dispositivo BadUSB por alrededor de 1 euro, lo podéis leer aquí , en él, a efectos prácticos, explicábamos como montar un dispositivo similar a un USB Rubber Ducky, en el sentido de que se comporta como un teclado automático y pre-programado para hacer unas funciones concretas, pero puede quedarse algo corto en algunas ocasiones, sobre todo por el limitado almacenamiento y memoria ram de su microcontrolador ATTINY85: 8KB de flash y 512 bytes de ram.

Como no podía ser de otra forma, hemos estado pensando es éste asunto y ofreceros algo más funcional y, sobre todo, más fácil de utilizar. Una de las opciones deseables que nos parecia mas útil, era que se pudiesen utilizar directamente scripts del USB Rubber Ducky sin tenerlos que adaptar de ninguna forma, debido a su amplia expansión, conocimientos y ejemplos que existen en internet.

Como mencionamos en el artículo anterior, y aunque sea repetirlo, un BadUSB es un dispositivo USB con apariencia de otro dispositivo distinto (para confundir al usuario normalmente) que al conectarlo a cualquier ordenador realiza “otras cosas”, en el caso mas general emula un teclado que de forma automática “teclea” lo que le hayamos programado a gran velocidad sin que el usuario se percate, normalmente, de lo realizado.

Cuando hablamos de BadUSB, así en general, se cubren muchos dispositivos , desde algunos hackeados a tal efecto como los pendrives con el controlador Phison 2251-03 (2303), los dispositivos de desarrollo genérico como Teensy (en cualquiera de sus variantes) o Arduino Leonardo / Micro o dispositivos específicos orientados a auditorias de seguridad como el Phoenix Ovipositor o el USB Ruber Ducky, siendo éste último el mas famoso entre la comunidad hacker (entiéndase siempre en el buen sentido de la palabra, para más información sobre la comunidad hacker visitar este link).

Aunque solo sea por ser el mas famoso, y porque vamos a acabar usando su lenguaje de scripting, vamos a hacer una reseña sobre el USB Rubber Ducky: es un dispositivo desarrollado y comercializado por la empresa estadounidense Hak5 que una vez conectado al ordenador se comporta como un teclado virtual, programable a través de un sistema de scripting relativamente simple (scripts que una vez escritos han de ser compilados y almacenados en formato binario en su tarjeta micro SD).

Como ejemplo: el clásico “Hola Mundo”:

DELAY 3000
GUI r
DELAY 500
STRING notepad
DELAY 500
ENTER
DELAY 750
STRING Hello World!!!
ENTER

El código hace lo siguiente:

Delay 3000: Espera “x” milisegundos (en este caso se produce una pausa larga al inicio para la instalación de drivers en el equipo, aunque también se utiliza para dar un tiempo prudencial a que se abra un programa u otras tareas)

GUI r: Pulsa las teclas Windows (GUI) y “R” simultáneamente para abrir la ventana “Ejecutar” en un sistema operativo Windows

STRING notepad: Manda una cadena de caracteres, en este caso Notepad (editor de textos de windows)

ENTER: Envia la tecla Enter, en este caso para ejecutar el programa Notepad

STRING Hello World!!!: Manda una cadena de caracteres, en este caso Hello World!!!

ENTER: Envía la tecla Enter, en éste caso para introducir el carácter de nueva línea.

La referencia completa al lenguaje de scripting se puede encontrar aquí, algunos scrips de ejemplo aquí (La mayoría de dichos scripts pueden encontrarse debidamente revisados para Windows 10 en el github de Joel).

Una vez explicado para que sirve el dispositivo y mostrado un payload de ejemplo, algunas personas se pueden encontrar con una barrera: el precio, cuesta unos 45 US$ (mas 12US$ de envío) que está muy bien para algunos sectores profesionales o semiprofesionales, pero puede estar fuera de alcance de algunas personas que solo les apetece “cacharrear”.

Por eso, después de buscar mucho, valorar opciones y un montón de horas de picar código, os presentamos como hacer un clon perfecto del USB Rubber Ducky, que interpreta sus scripts a la perfección sin siquiera tener que compilarlos, por unos 10€ o menos.

El dispositivo en concreto que vamos a utilizar es éste:

Se puede encontrar fácilmente en aliexpress buscando badusb.

NOTA IMPORTANTE: Aunque en los resultados salen otros dispositivos, en éste artículo nos referimos ÚNICAMENTE al mostrado en la fotografía

El dispositivo presenta las siguientes características de hardware:

  • Microcontrolador ATmega32u4 (32KB de flash y 2,5KB de ram) con bootloader de Arduino Leonardo

  • Tarjeta microSD

  • Circuitería auxiliar varia (circuitería discreta, oscilador a 16mhz, regulador de tensión a 3,3v y conversor de niveles)

Vamos al meollo de la cuestión:

Instalación y configuración:

Para poder hacer este BadUSB, necesitaremos:

  • Tener el dispositivo mencionado anteriormente.

  • IDE de Arduino (Descargable de https://www.arduino.cc/en/Main/Software)

    • Una vez instalado debemos asegurarnos de que las librerías estén actualizadas.

    • En caso de usar Linux debemos asegurarnos que nuestro usuario pertenece al grupo dialout

    • En el caso de usar Windows deberemos tener correctamente instalados los drivers de Arduino Leonardo

  • Librería de teclado multi idioma (https://github.com/ernesto-xload/arduino_keyboardlib) ya que por defecto la de arduino solo soporta teclados con el layout en_US

  • Firmware del interpretador: Descargable desde aquí

Una vez todo correctamente instalado, ejecutamos el IDE de Arduino y abrimos el código del interpretador: Archivo > Abrir

Tenemos que asegurarnos que todo está configurado para la placa compatible con Arduino Leonardo, para ello vamos a la opción de herramientas -> Placa -> “Arduino Leonardo”. Posiblemente nos asignará el puerto, si no, seleccionamos el correspondiente.

Conectamos el dispositivo.

Compilamos y subimos el código con el botón correspondiente.

En la parte inferior del IDE de Arduino veremos si se ha grabado correctamente:

Con ésto ya tenemos el clon del USB Rubber Ducky listo, a partir de aquí sólo hay que copiar el script de USB Rubber Ducky correspondiente en una microsd formateada en fat16 o fat32 con el nombre “script.txt” y una vez insertado en un ordenador procederá a su ejecución.

Por supuesto el código fuente del interpretador es software libre y podemos modificarlo a nuestro gusto, añadiendo nuevos comandos o personalizando los ya existentes, de hecho existen dos comandos extra a modo de ejemplo: led_on y led_off (en minúsculas) que encienden y apagan el led presente.

Como ejemplo vamos a probar el payload You got quaqued!, del propio repositorio de Hak5.

NOTA: Algunos payloads hechos para el USB Rubber Ducky disponibles en al repositorio de Hak5, están preparados para Windows 7, y necesitan ser modificados para versiones posteriores de éste sistema operativo (se pueden encontrar ya modificados en éste enlace como hemos dicho anteriormente). En este caso concreto, lo hemos modificado para poder utilizarlo en Windows 10 y no tengamos ningún error:

DELAY 1000
GUI d
DELAY 500
GUI r
DELAY 500
STRING chrome
DELAY 500
ENTER
DELAY 5000
STRING https://i.imgflip.com/1dv8ac.jpg
DELAY 500
ENTER
DELAY 3000
CTRL s
DELAY 1000
STRING %userprofile%\Desktop\QUACKED
ENTER
DELAY 500
GUI d
DELAY 500
GUI r
DELAY 500
STRING %userprofile%\Desktop\QUACKED.jpg
ENTER
DELAY 1000
MENU
DELAY 500
DOWNARROW
DELAY 500
DOWNARROW
DELAY 500
ENTER
ALT F4
DELAY 500
GUI d
DELAY 500
MENU
DELAY 500
STRING v
DELAY 500
STRING d

Como somero resumen: lo que hace el payload es abrir Chrome, entrar a un enlace donde encontramos una imagen del USB Rubber Ducky, la descarga, la pone de fondo de pantalla del escritorio y, por último, oculta todos los iconos del escritorio.

Podemos ver que el lenguaje que utiliza este payload, es exactamente el mismo que utiliza el USB Rubber Ducky. De ésta forma, podemos usar cualquier payload existente para el Rubber Ducky, crear nuestros propios payloads con el mismo lenguaje o utilizar alguna de las múltiples herramientas que los genera automáticamente como Metasploit.

Bonus track:

En la búsqueda que hemos hecho anteriormente en aliexpress hemos podido ver como aparecen otros dispositivos, algunos basados en el Attiny85 que cubrimos en la entrada BadUSB Ultra Low Cost, y otros basados en el Atmega32U4 como el que ha ocupado éste articulo, pero sin zócalo para tarjeta micro SD, son los que se pueden ver a continuación:

Llama especialmente la atención el que se comercializa directamente con el factor de forma de un pendrive acabado en aluminio, en caso de querer realizar un pentesting seria el mas indicado para dejar abandonado en las inmediaciones del objetivo y esperar a que alguien lo conecte. No podemos olvidar la prueba realizada por Elie Bursztein en abril del 2016 plasmada en “Concerns about USB security are real: 48% of people do plug-in USB drives found in parking lots, las cifras hablan por si mismas, y son simplemente apabullantes.

En éste caso no podemos hacer de script kiddies o usar alguna herramienta de “botón gordo” y vamos a tener que programar el código que queremos que ejecute el microcontrolador directamente, cosa no muy complicada debido a toda la documentación existente, pero amigos… el hacking implica fundamente aprender y conocer, por eso nunca os damos todo hecho, perdería toda la gracia.

A continuación mostramos un ejemplo, muy básico que abre un bloc de notas y escribe la cadena “hola mundo” (es válido tanto para Windows como para Linux con Gnome o derivados comentando y/o descomentando las líneas correspondientes):

#include "Keyboard.h"

void setup() {
	// Inicializamos el teclado
	Keyboard.begin();

}

void loop() {
	delay(20000); // Espera 20 segundos (20000 milisegundos) 	
        CommandAtRunBarMSWIN("notepad"); 
        // Abre notepad en Windows 	
        //CommandAtRunBarGnome("gedit"); // Abre gedit en Gnome
	Keyboard.println("hola mundo"); // Enviá “hola mundo”
	while(1); // Detiene la ejecucion del programa.

} 

void CommandAtRunBarMSWIN(char *SomeCommand { 
	Keyboard.press(KEY_LEFT_GUI);
	Keyboard.press('r');
	delay(100);
	Keyboard.releaseAll();
	delay(1500);
	Keyboard.print(SomeCommand);
	Keyboard.press(KEY_RETURN);
	Keyboard.releaseAll();

}

void CommandAtRunBarGnome(char *SomeCommand){
	Keyboard.press(KEY_LEFT_ALT);
	Keyboard.press(KEY_F2);
	delay(100);
	Keyboard.releaseAll();
	delay(1500);
	Keyboard.print(SomeCommand);
	Keyboard.press(KEY_RETURN);
	Keyboard.releaseAll(); }

Las funciones CommandAtRunBarMSWIN y CommandAtRunBarGnome han sido extraídas de la librería phukdlib de IronGeek que aunque originalmente está preparada para dispositivos Teensy podéis descargarla modificada para Arduino Leonardo y compatibles aquí.

Para cualquier duda o sugerencia podéis contactar con nosotros a través de los enlaces que hemos proporcionado de Twitter y Github o bien el canal de Telegram de The Hacker Way.

¡Hasta la próxima!

  1. Jusnelo
    septiembre 8, 2017 en 9:40 pm

    Por ejemplo para teclados latinoamericanos existen las librerias de los keyboard?
    Como podría generar los?

    Me gusta

    • xl0ad
      septiembre 12, 2017 en 3:44 pm

      Hola Jusnelo, si necesitas otra distribución del teclado puedes descargar la librería customizada de: https://github.com/ernesto-xload/arduino_keyboardlib

      Soporta:
      * be_be
      * cz_cz
      * da_dk
      * de_de
      * en_us
      * es_es
      * fi_fi
      * fr_fr
      * it_it
      * pt_pt
      * tr_tr

      Es muy sencillo modificarlo para otras distribuciones de teclado

      Me gusta

  2. s3v3n
    septiembre 19, 2017 en 10:27 am

    Buenos días,

    Primero agradeceros la gran aportación que realizáis.

    Al intentar compilar el código me indica los siguientes errores:

    ducky_interpreter:349: error: ‘KEY_PRINTSCREEN’ was not declared in this scope

    sendkey(KEY_PRINTSCREEN,0);

    ^

    ducky_interpreter:354: error: ‘KEY_MENU’ was not declared in this scope

    sendkey(KEY_MENU,0);

    ¿como podría solucionarlo?

    Muchas gracias de antemano.

    Me gusta

    • xload
      septiembre 19, 2017 en 11:01 am

      Hola s3v3n, asegúrate de que has descargado e instalado correctamente la librería de teclado modificada desde https://github.com/ernesto-xload/arduino_keyboardlib , ademas de soportar varias distribuciones de teclado tiene implementadas algunas teclas que la original no soporta (como ‘KEY_PRINTSCREEN y KEY_MENU)

      Un saludo.

      Me gusta

  3. JuanAn
    septiembre 26, 2017 en 8:20 am

    A mí me pasa lo mismo. Tengo descargada la librería (de hecho, me indica que la usa):

    C:\Users\USUARIO\Desktop\ducky_interpreter\ducky_interpreter.ino: In function ‘int process_commad(char*)’:

    ducky_interpreter:351: error: ‘KEY_PRINTSCREEN’ was not declared in this scope

    sendkey(KEY_PRINTSCREEN,0);

    ^

    ducky_interpreter:356: error: ‘KEY_MENU’ was not declared in this scope

    sendkey(KEY_MENU,0);

    ^

    Se encontraron múltiples librerías para “Keyboard.h”
    Usado: C:\Users\USUARIO\Documents\Arduino\libraries\Keyboard
    No usado: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.8.0_x86__mdqgnx93n4wtt\libraries\Keyboard
    exit status 1
    ‘KEY_PRINTSCREEN’ was not declared in this scope

    Me gusta

  4. hombrequerie
    septiembre 26, 2017 en 8:21 am

    Me sucede lo mismo que a tí, pero si que me indica que está utilizando la librería que le he descargado:

    C:\Users\USUARIO\Desktop\ducky_interpreter\ducky_interpreter.ino: In function ‘int process_commad(char*)’:

    ducky_interpreter:351: error: ‘KEY_PRINTSCREEN’ was not declared in this scope

    sendkey(KEY_PRINTSCREEN,0);

    ^

    ducky_interpreter:356: error: ‘KEY_MENU’ was not declared in this scope

    sendkey(KEY_MENU,0);

    ^

    Se encontraron múltiples librerías para “Keyboard.h”
    Usado: C:\USUARIO\USUARIO\Documents\Arduino\libraries\Keyboard
    No usado: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.8.0_x86__mdqgnx93n4wtt\libraries\Keyboard
    exit status 1
    ‘KEY_PRINTSCREEN’ was not declared in this scope

    Me gusta

    • Anónimo
      septiembre 26, 2017 en 1:53 pm

      He actualizado la libreria en github, vuelve a probar.

      Un saludo

      Me gusta

    • septiembre 26, 2017 en 2:01 pm

      Vuelve a bajar la libria, la he actualizado.

      Un saludo.

      Me gusta

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: