ATtiny85 el famoso Cheap Rubber Ducky

Ayer me pedían que hiciera una lista de hardware para hacking por menos de 50 euros, y como le conteste, mirate mis últimos posts jeje Y es que cuando no podemos permitirnos dejarnos 200 euros en una Piña o 50 en un Rubber Ducky tenemos que buscarnos la vida y, para facilitaros vuestra búsqueda, he ido creando esta serie de post sobre hardware más o menos económico.

No hace mucho publiqué un post sobre como convertir un Arduino UNO en un Rubber Ducky, esto nos daba la posibilidad de darle una nueva vida a ese UNO que teníamos en un cajón pero muchos me comentaron que el tamaño no era precisamente ideal, y es cierto; la idea del UNO es para realizar pequeños tests y POCS para familiarizarnos con como funciona este dispositivo pero ¿y si os dijera que podéis tener un dispositivo del tamaño de un pendrive mediano que hace lo mismo? Este es el ATtiny85, conocido precisamente como el Cheap Rubber Ducky o Rubber Ducky barato, y es que el cacharrete en cuestión cuesta la friolera de ¡1.5 euros! O incluso más barato dependiendo de donde y cuantos compres.

El ATtiny85 es un microcontrolador de 8 bits basado en AVR-RISC que nos ofrece 8kb ISP de memoria flash, 512b EEPROM, 512b SRAM, 6 puertos I/O, 32 registros de trabajo, USI, interrupciones internas y externas, conversor de 10 bits y 4 canales, …. Vale, ya estamos todos en modo ameba y en la misma onda jeje Y es que, si como yo, no sabéis que significan la mitad de esas cosas seguramente no estáis buscando utilizarlo para algún proyecto complejo donde tenéis que escoger el microcontrolador que mejor se os adecue a vuestras necesidades. A nosotros lo que realmente nos interesa es que podemos hacer que este pequeñajo actúe como un teclado y realizar ataques del estilo Rubber Ducky, aquí os dejo una pequeña foto del mismo al lado de la Pi Zero para que podáis comparar tamaños:

Como podéis apreciar en mi caso el ATtiny85 viene con un puerto mini-USB hembra, también lo hay disponible con el conector en macho pero en mi caso la idea era ocultarlo como un dispositivo del estilo de una batería externa en lugar de hacerlo pasar por un pen drive por ejemplo.

Pero vamos al lío, y sin que sirva de precedente, esta vez he utilizado Windows para montar este proyecto, todos tenemos días malos. De todas maneras os dejaré las instrucciones para Linux aunque no las he testeado al 100%.

Lo primero, el software, como único requisito necesitaremos tener instalada la última versión del Arduino IDE, ojo los que usáis repositorios, en muchas distros utilizan una versión bastante vieja. De la misma manera que hicimos con el UNO debemos añadirle soporta a esta placa al IDE para ello iremos a Archivo -> Preferencias -> Gestor de URLs Adicionales de Tarjetas y añadiremos en una nueva linea lo siguiente:

http://digistump.com/package_digistump_index.json

Aceptamos, aceptamos y ahora nos vamos a Herramientas -> Placa -> Gestor de Tarjetas aquí filtraremos por el tipo contribución e instalamos Digistump AVR Boards. ¡Listo! Ya tenemos lo necesario instalado, a la hora de flashear nuestro ATtiny85 deberemos seleccionar la placa Digisparck (Default – 16.5 mhz) y, por raro que parezca, ningún puerto.

Esta vez la cosa no fue tan sencilla sin embargo a la hora de flashear por primera vez. Tanto en Windows como en Linux el ATtiny se conectaba y desconectaba el solo de forma continuada, llegue a pensar que venía mal. Y es que resulta que hay ciertas diferencias a la hora de flashear con respecto a un Arduino, la primera es que no necesitamos tener el ATtiny85 enchufado desde el principio, cuando hagamos click en Upload en la consola podremos ver que nos pide que enchufemos el mismo y una vez lo reconozca se encargara de flashearlo. ¿Comodo verdad? Si, siempre que te funcione a la primera. En mi caso tuve que descargar e instalar los siguientes drivers para windows (aquí), simplemente ejecutais el archivo install.exe y listo. En el caso de Linux es un pelín más complicado ya que, no solo necesitaréis la versión actual y legacy de libusb sino que en algunos casos tendréis que añadir unas reglas nuevas a udev, aquí tenéis la documentación con las instrucciones, por desgracia solamente en Inglés, cuando lo pueda probar actualizaré el post con los pasos que seguí.

Para hacer una primera prueba de que todo esto funciona vamos a probar el típico ejemplo de encender y apagar el led de la placa, para ello cargaremos el siguiente código de ejemplo (lo tenéis disponible también en el IDE en los ejemplos de DigiSpark):

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(0, OUTPUT); //LED on Model B
  pinMode(1, OUTPUT); //LED on Model A   
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(0, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(1, HIGH);
  delay(1000);               // wait for a second
  digitalWrite(0, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(1, LOW); 
  delay(1000);               // wait for a second
}

Copiamos el código en el IDE le damos a Upload (ctrl+u), enchufamos el ATtiny85 cuando nos lo pida y esperamos. En cuanto arranque de nuevo deberíamos ver un led fijo y el otro parpadeando cada segundo, si es así tenemos todo correcto, sino tendremos que hacer más troubleshooting y ver que ha pasado.

Ahora que ya tenemos todo preparado vamos a adaptar el ejemplo de hello world que utilizamos en el post del Arduino UNO y veamos que ocurre, utilizaremos el siguiente código:

#include "DigiKeyboard.h"

void setup() {
  DigiKeyboard.update();
}

void loop() {
  delay(1000);
  DigiKeyboard.update();
  delay(100);
  
  // meta+r, delete content, start powershell
  DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT); // meta+r
  delay(50);
  DigiKeyboard.println("notepad");
  delay(200);
  DigiKeyboard.println("hello world");
  
  delay(900000);
}

Una vez cargado el ATtiny85 abrirá el notepad y escribirá el mensaje “hello world”.

En este caso seguimos teniendo el mismo problema que con el UNO, el layout del teclado es el de US lo cual puede causarnos problemas a la hora de escribir caracteres especiales.

Rebuscando por ahí me he encontrado con este repo el cual nos permite convertir un script de RubberDucky directamente a un archivo ino que podremos abrir en el IDE.

Para que funcione deberemos descargarnos a la misma carpeta el archivo encoder.js ya que no viene incluido. Para poder hacer un test editamos el script de bash example.sh y al final de la linea donde llama a encoder.js reemplazamos de (layaout alemán) por es (layout español), ejecutamos dicho script y veremos que nos muestra algunos errores ya que no todos los caracteres están soportados. Así mismo duck2spark tiene ciertas limitaciones y no soporta absolutamente todos los comandos de Rubber Ducky pero nos ayudará mucho.

Si os animáis a probarlo el ejemplo que viene incluido imprimirá por pantalla una seria de símbolos, números y letras, esto también nos ayudará a ver cuales son los que realmente están soportados para luego tenerlo en cuenta al crear nuestros propios payloads.

El código ya en formato ino del ejemplo es el siguiente:

/*
* Sketch generated by duck2spark from Marcus Mengs aka MaMe82
*
*/
#include "DigiKeyboard.h"

#define DUCK_LEN 2010
const PROGMEM uint8_t duckraw [DUCK_LEN] = {
	0x2c, 0x0, 0x1e, 0x2, 0x1f, 0x2, 0x34, 0x40, 0x21, 0x2, 0x22, 0x2, 0x23, 0x2, 0x35, 0x0, 0x2d, 0x0, 0x25, 0x2, 0x26, 0x2, 0x30, 0x2, 0x30, 0x0, 0x36, 0x0, 0x38, 0x0, 0x37, 0x0, 0x24, 0x2, 0x27, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x37, 0x2, 0x36, 0x2, 0x64, 0x0, 0x27, 0x2, 0x64, 0x2, 0x2d, 0x2, 0x33, 0x40, 0x4, 0x2, 0x5, 0x2, 0x6, 0x2, 0x7, 0x2, 0x8, 0x2, 0x9, 0x2, 0xa, 0x2, 0xb, 0x2, 0xc, 0x2, 0xd, 0x2, 0xe, 0x2, 0xf, 0x2, 0x10, 0x2, 0x11, 0x2, 0x12, 0x2, 0x13, 0x2, 0x14, 0x2, 0x15, 0x2, 0x16, 0x2, 0x17, 0x2, 0x18, 0x2, 0x19, 0x2, 0x1a, 0x2, 0x1b, 0x2, 0x1c, 0x2, 0x1d, 0x2, 0x2f, 0x40, 0x35, 0x0, 0x30, 0x40, 0x2e, 0x2, 0x2c, 0x0, 0x38, 0x2, 0x0, 0x0, 0x2c, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x2f, 0x40, 0x2, 0x0, 0x35, 0x2, 0x30, 0x40, 0x2, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x1e, 0x2, 0x1f, 0x2, 0x34, 0x40, 0x21, 0x2, 0x22, 0x2, 0x23, 0x2, 0x35, 0x0, 0x2d, 0x0, 0x25, 0x2, 0x26, 0x2, 0x30, 0x2, 0x30, 0x0, 0x36, 0x0, 0x38, 0x0, 0x37, 0x0, 0x24, 0x2, 0x27, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x37, 0x2, 0x36, 0x2, 0x64, 0x0, 0x27, 0x2, 0x64, 0x2, 0x2d, 0x2, 0x33, 0x40, 0x4, 0x2, 0x5, 0x2, 0x6, 0x2, 0x7, 0x2, 0x8, 0x2, 0x9, 0x2, 0xa, 0x2, 0xb, 0x2, 0xc, 0x2, 0xd, 0x2, 0xe, 0x2, 0xf, 0x2, 0x10, 0x2, 0x11, 0x2, 0x12, 0x2, 0x13, 0x2, 0x14, 0x2, 0x15, 0x2, 0x16, 0x2, 0x17, 0x2, 0x18, 0x2, 0x19, 0x2, 0x1a, 0x2, 0x1b, 0x2, 0x1c, 0x2, 0x1d, 0x2, 0x2f, 0x40, 0x35, 0x0, 0x30, 0x40, 0x2e, 0x2, 0x2c, 0x0, 0x38, 0x2, 0x0, 0x0, 0x2c, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x2f, 0x40, 0x2, 0x0, 0x35, 0x2, 0x30, 0x40, 0x2, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x1e, 0x2, 0x1f, 0x2, 0x34, 0x40, 0x21, 0x2, 0x22, 0x2, 0x23, 0x2, 0x35, 0x0, 0x2d, 0x0, 0x25, 0x2, 0x26, 0x2, 0x30, 0x2, 0x30, 0x0, 0x36, 0x0, 0x38, 0x0, 0x37, 0x0, 0x24, 0x2, 0x27, 0x0, 0x1e, 0x0, 0x1f, 0x0, 0x20, 0x0, 0x21, 0x0, 0x22, 0x0, 0x23, 0x0, 0x24, 0x0, 0x25, 0x0, 0x26, 0x0, 0x37, 0x2, 0x36, 0x2, 0x64, 0x0, 0x27, 0x2, 0x64, 0x2, 0x2d, 0x2, 0x33, 0x40, 0x4, 0x2, 0x5, 0x2, 0x6, 0x2, 0x7, 0x2, 0x8, 0x2, 0x9, 0x2, 0xa, 0x2, 0xb, 0x2, 0xc, 0x2, 0xd, 0x2, 0xe, 0x2, 0xf, 0x2, 0x10, 0x2, 0x11, 0x2, 0x12, 0x2, 0x13, 0x2, 0x14, 0x2, 0x15, 0x2, 0x16, 0x2, 0x17, 0x2, 0x18, 0x2, 0x19, 0x2, 0x1a, 0x2, 0x1b, 0x2, 0x1c, 0x2, 0x1d, 0x2, 0x2f, 0x40, 0x35, 0x0, 0x30, 0x40, 0x2e, 0x2, 0x2c, 0x0, 0x38, 0x2, 0x0, 0x0, 0x2c, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, 0x0, 0xf, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1a, 0x0, 0x1b, 0x0, 0x1c, 0x0, 0x1d, 0x0, 0x2f, 0x40, 0x2, 0x0, 0x35, 0x2, 0x30, 0x40, 0x2, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xf5, 0x28, 0x0, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x4, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x5, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x6, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x7, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x8, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0x9, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0xa, 0x2, 0x28, 0x0, 0x28, 0x0
};
int i = 4; //how many times the payload should run (-1 for endless loop)
bool blink=true;

void setup()
{
	// initialize the digital pin as an output.
	pinMode(0, OUTPUT); //LED on Model B
	pinMode(1, OUTPUT); //LED on Model A
	DigiKeyboard.delay(2500); //wait 2500 milliseconds before first run, to give target time to initialize
}

void loop()
{

	//should code be runned in this loop?
	if (i != 0) {
		DigiKeyboard.sendKeyStroke(0);

		//parse raw duckencoder script
		for (int i=0; i<DUCK_LEN; i+=2)
		{
			uint8_t key = pgm_read_word_near(duckraw + i);
			uint8_t mod = pgm_read_word_near(duckraw + i+1);
			if (key == 0) //delay (a delay>255 is split into a sequence of delays)
			{
				DigiKeyboard.delay(mod);
			}
			else DigiKeyboard.sendKeyStroke(key,mod);
		}
		i--;
		DigiKeyboard.delay(3000); //wait 3000 milliseconds before next loop iteration

	}
	else if (blink)
	{
		digitalWrite(0, HIGH);   // turn the LED on (HIGH is the voltage level)
		digitalWrite(1, HIGH);
		delay(100);               // wait for a second
		digitalWrite(0, LOW);    // turn the LED off by making the voltage LOW
		digitalWrite(1, LOW);
		delay(100);               // wait for a second
	}
}

Otra cosa que añade duck2spark es que al terminar de ejecutar el payload el led del ATtiny85 se encenderá y apagará, parecerá una tontería pero yo lo veo útil.

Ahora solo queda seguir trasteando y probando diferentes payloads 🙂

Espero os haya gustado este nuevo post y si consigo solucionar un problema que tengo con unas tarjetas mifare classic el siguiente post de hardware para hacking será un clonador de las mismas 😉

Como siempre, cualquier duda u opinión no dudéis en dejar un comentario más abajo.

Saludos, y gracias por vuestra visita!

Esta entrada fue publicada en DIY, tools, tutorial. Guarda el enlace permanente.

6 respuestas a ATtiny85 el famoso Cheap Rubber Ducky

  1. Melkor dijo:

    Podrias poner algun enlace de donde encontrarlo a ese precio? Los que encuentro yo, son todos entre 6 y 10 euros minimo.
    Gracias

  2. Dante dijo:

    Esta muy bien;

    como experiencia propia, hay que añadirle un retardo en el setup(), ya que Windows podría tardar en reconocer el dispositivo, o necesite instalar un driver. En computadoras ligeras con 2 o 3 segundos basta, pero en una que estaba muy tronca tuve que mover el tiempo hasta 5 segundos. De igual modo con algunas ordenes es necesario poner algunos retardos. Por ejemplo si vas a abrir un explorador o una carpeta, algunas computadoras tardan en abrir.

    Estoy experimentando para abrir un perfil de facebook o una pagina web curricular

    Lo de los exploits apenas lo estoy leyendo, es interesante, pero no es mi rumbo ni objetivo. Aunque me serviría para cuando te prestan una computadora sin permisos de administrador.

    Saludos y excelente información

    • KALRONG dijo:

      Gracias por la info Dante, de todas maneras si te fijas en el código se genera un retardo de unos 3 segundos (configurable) antes de ejecutar el exploit en si al igual que para entre comandos.

      • Dante dijo:

        El delay que sugiero es en el setup, no en el loop. El único que tiene ese retardo es el último programa, de 2.5 segundos, y porque va a cargar un exploit.

        Estaba mirando lo que se necesita para instalar PowerShell en las versiones de windows que no lo tienen de base, Instalar el FrameWork 1 y 2 en algunos casos, el 3.5 es opcional. Suerte que solo Windows Vista, XP y Server requieren tanto tiempo a solas con la computadora.

        Por alguna razón en Vista y XP, siempre se pierde el primer o segundo carácter de lo que vayas a escribir. Yo le estoy incluyendo esta linea para evitar eso;

        DigiKeyboard.sendKeyStroke(0);

        Si tienes otro método para que esto no pase, por favor

        Saludos y sigue escribiendo, está genial tu blog

        • KALRONG dijo:

          No sé si te estoy entendiendo pero el delay de loop está precisamente para esperar a que el sistema instale el dispositivo antes de empezar a mandar los keystrokes, pero creo que estamos hablando de cosas distintas.

          En teoría, y digo teoría porque no lo he probado, desde una consola de administrador de cmd debería ser posible de instalar pero claro, siempre y cuando este disponible para dicha versión y lo que tu dices, que te de tiempo jeje

          Con respecto a lo último la única solución que he visto es la que tu comentas o metiendo un enter antes de empezar a escribir, no tengo muy claro porque se pierde esa primera pulsación.

          Muchas gracias por tus comentarios 🙂

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.