- Introdução
- Desenvolvimento
- Resultado
- Conclusão
- Payloads
O que é um Rubber Ducky?
O projeto foi completamente baseado em um outro pré-existente, originário da equipe de Podcasting Hak5. Rubber Ducky foi o nome dado a ferramenta capaz de emular as funções de um teclado, e assim executando os mais diversos comandos e ações, encaixando-o na categoria de dispositivos HID.
Por HID - Human Interface Device -, compreende-se como um dispositivo aceito pelo sistema como responsável sendo por entrada de dados, exatamente igual a um teclado USB para computador, por exemplo. O que, finalmente, transformou a ferramente amada por diversos Pentesters, devido a sua facilidade de uso e de aplicação.
Figura 1 - Rubber Ducky internamente
Fonte: HakShop (2018)
As instruções são escritas previamente e salvas no dispositivo. A linguagem possui sintaxe simples, direta e é chamadas de "Payloads". Segue um exemplo de Script que tem como função abrir o 'notepad' do Windows e escrever: "ArduinoDucky"
DELAY 3000
GUI r
DELAY 500
STRING notepad
DELAY 500
ENTER
DELAY 750
STRING ArduinoDucky
ENTER
Todavia, devido a dificuldade de compra, tanto devido ao valor alto e a exportação problemática brasileira, outras soluções chegam para suprir a necessidade. Então, visando um valor mais baixo e fácil disponibilidade para testes dos "pentesters", o Arduino Ducky cumpre uma função parecida, custando cerca de 1/10 do valor original.
Figura 2 - Arduino Uno (Modelo Popular)
Fonte: Arduino CC (2018)
O Arduino é uma plataforma de prototipagem muito famosa. Devido a vasta gama de modelos, diversos sensores, módulos, e baixo custo de acessórios, é a escolha ideal para este caso.
Para que o objetivo de recriar o Rubber Ducky seja alcançado, algumas características principais precisam ser consideradas durante o processo.
O desejável:
- Executar comandos via HID;
- Fácil/level/discreto para testes;
- Aparência semelhante a de um Pendrive USB;
- Possuir armazenamento suficiente para diversos scripts/payloads/arquivos em geral;
- Linguagem com sintaxe simples;
- Custo reduzido;
- Fácil acesso de compra ao dispositivo.
Tendo em vista tais objetivos, verificando-se aos objetivos primordiais, que seriam, manter intuitivo, barato e de fácil acesso comercial, foram utilizados:
- 01 Arduino Pro Micro - (ATMEGA32U4);
- 01 Adaptador USB Male/Female para Micro USB;
- 01 OTG - USB Female para Micro USB;
- 01 Cabo USB Male para Micro USB (Cabo para carregar celular);
- 01 Case para o Arduino (Opcional);
- 01 Computador com acesso a IDE Arduino.
As imagens de cada item, respectivamente, são encontradas abaixo, previamente juntas de uma breve descrição de suas funções.
O Arduino Pro Micro foi selecionado para esse caso, devido a uma série de razões: tamanho compacto; entrada Micro USB; bibliotecas compatíveis; baxo valor; fácil importação; dentre outros.
Figura 3 - Arduino Pro Micro(Modelo Utilizado)
Fonte: Arduino Board (2018)
O Adaptador pode ser usado em diversas ocasiões, já que ele converte a entrada Micro USB presente no Arduino Pro Micro, tanto para um USB Male, habilitando o memso ser usado como um pendrive regular no computador. Ou serve de USB Female, para ser conectado ao adaptador OTG, e or sua vez, ser conectado em algum outro dispositivo via Micro USB, atuando como Micro USB - Micro USB.
Figura 4 -Adaptador USB Male/Female para Micro USB
Fonte: O Autor (2018)
Os adaptadore OTG já são amplamente utilizados em conjunto com celulares Android e outros dispositivos USB. Uma grande variedade de combinações podem ser utilizadas, como por exemplo, utilizar um mouse ou um teclado no celular.
Nesse caso, ele foi usado em conjunto com o adaptador citado acima, para que a entrada Female Micro USB do Arduino Pro Micro se tornasse um Male Micro USB. Dessa maneira, utilizando o Arduino Pro Micro diretamente em um dispositivo com conexão Micro USB, como um celular, por exemplo.
Figura 5 - OTG - USB Female para Micro USB
Fonte: O Autor (2018)
O cabo tem exatamente a mesma função do adaptador OTG. Todavia, ele acaba garantindo uma extensão caso necessário.
Figura 6 - Cabo USB Male para Micro USB
Fonte: O Autor (2018)
Para fins estéticos, e de proteção, é interessante o uso de um case. Podendo ser de um Pendrive antigo, ou até mesmo impresso com uso de impressoras 3D.
Figura 7 - Case para o Arduino
Fonte: Michal Monday (2018)
Para fazer todo o carregamento do script/payload no Arduino Pro Micro, independente da conexão e/ou adaptador, a IDE disponibilizada pelo próprio Arduino é essencial.
Figura 8 - Computador com acesso a IDE Arduino
Fonte: Arduino CC (2018)
Em relação, especificamente aos scripts/payloads e sua sintaxe/linguagem, no tópico final será explicado de maneira detalhada seu funcionamento.
Os resultados, buscando uma explicação didática e sequencial, foram divididos em: Código e Sintaxe; Exemplo; Conclusão baseado nas expectativas.
Código e Sintaxe:
Para o funcionamento e execução dos comandos via HID, o ArduinoDucky precisa ser programado previamente. O Rubber Ducky, orignalmente, utiliza uma sintaxe simples, que é chamado propriamente de RubberScript, porém, os processadores do deste, e do ArduinoDucky são diferentes, logo, algumas modificações precisam ser feitas, para que o nosso projeto consiga executar os mesmos comandos.
Nesse caso, a IDE do próprio arduino será nosso começo. Não será possível utilizar exatamente a mesma sintaxe RubberScript. Em contrapartida, é extremamente simples efetuar a conversão do RubberScript original para o aceito via Arduino, utilizando ferramentas para tal, ou já escrevendo o código via linguagem do Arduino nativamente.
Existem alguns sites que efetuam tal conversão, como os citados abaixo:
- seytonic.com/ducky
- roothaxor.gitlab.io/ducky2arduino
- Dentre outros sites conversores de script/payload
Exemplo:
Para que fique claro o funcionamento, será mostrado a seguir um exemplo de código originalmente escrito em RubberScript, e outro já convertido para o funcionamento pleno em uma plataforma Arduino.
Nota-se, claramente, que a escrita fica maior e com maior memória. Todavia, a conversão já é efetuada por ferramentas prontas, o que facilita muito o usuário. A questão da memória será comentada posteriormente.
Seguem os exemplos abaixo.
RubberScript:
GUI r
DELAY 500
STRING notepad
DELAY 500
ENTER
DELAY 750
STRING Escrita em notepad via RubberScript
ENTER
ArduinoDucky (com conversão):
#include "Keyboard.h"
void typeKey(int key)
{
Keyboard.press(key);
delay(50);
Keyboard.release(key);
}
void setup()
{
Keyboard.begin();
delay(500);
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
Keyboard.releaseAll();
delay(500);
Keyboard.print("notepad");
delay(500);
typeKey(KEY_RETURN);
delay(750);
Keyboard.print("Escrita em notepad via ArduinoDucky");
typeKey(KEY_RETURN);
Keyboard.end();
}
void loop() {}
Além das ferramentas disponibilizadas para a conversão do código Rubber Ducky para ArduinoDucky, já existem muitos e muitos payloads prontos para o próprio Rubber Ducky. Sendo que tais, podem ser convertidos facilmente para o uso no ArduinoDucky, ou servirem de exemplos para a criação de payloads próprios e novos.
Seguem abaixo, alguns sites que contam com repositórios de payloads prontos. Grande parte deles são desenvolvidos pela própria comunidade e divulgados na internet, outros foram desenvolvidos inicialmente para demonstrar o funcionamento no Rubber Ducky.
Links:
- github.com/hak5darren/USB-Rubber-Ducky/wiki/Payloads
- ducktoolkit.com/
- thehacktoday.com/60-best-rubber-ducky-usb-payloads/
Conclusão baseado nas expectativas:
Chegando ao fim do projeto, é o momento de analisar quais foram as expectativas e objetivos alcançados durante a sua execução. Foram listadas, anteriormente, alguns tópicos contendo as características julgadas ideais para o funcionamento pleno da alternativa ao Rubber Ducky.
Nesse contexto, os resultados obtidos foram:
- [✔] Executar comandos via HID;
O projeto foi perfeitamente capaz de executar os comandos via HID.
- [✔] Fácil/level/discreto para testes;
O projeto tem é de fácil manejo, leve, e discreto para uso.
- [✔] Aparência semelhante a de um Pendrive USB;
O projeto, quando revestido por algum plástico ou case, se passa por um Pendrive USB facilmente.
- [✖] Possuir armazenamento suficiente para diversos scripts/payloads/arquivos em geral;
Utilizando os recursos disponíveis, e tendo em foco a facilidade e praticidade, o Arduino escolhido não possui tanta memória quanto o Rubber Ducky, já que este conta com espaço para cartão Micro SD. Existem opções para acoplar um adaptador no Arduino Pro Micro, assim, expandindo sua memória, mas não foi o caso neste projeto.
- [✔✖] Linguagem com sintaxe simples;
A linguagem para uso próprio no ArduinoDucky é mais complexa que a utilizada orginalmente no Rubber Ducky. Todavia, existem vários payloads prontos e conversores para facilitar a vida do usuário.
- [✔] Custo reduzido;
O custo total não ultrapassa os 5 dólares. O Rubber Ducky é vendido na loja oficial da Hak5 por 44.99 dólares. O custo é muito mais acessível, além de todos os itens poderem ser adquiridos via importações da china, ou em território brasileiro, diferente do caso de efetuar a compra do Rubber Ducky.
- [✔] Fácil acesso de compra ao dispositivo.
O dispositivo e os itens necessários podem ser todos comprados online, em lojas da china, ou também em território brasileiro.
Como o esperado, o Rubber Ducky é uma ferramenta mais completa, isso devido a seu armazenamento Micro USB. Porém, acaba se tornando praticamente inviável a compra do dispositivo no Brasil, devido a seu elevado preço e diversas dificuldades enfrentadas em determinados tipos de exportações de eletrônicos.
Concluí-se que, dentro das necessidades apresentadas, o ArduinoDucky consegue atender muito bem os requisitos apresentados, sendo uma ferramenta extremamente útil para realização de testes rápidos e automatização de tarefas longas, tudo isso via payloads pré-construidos.
Além dos payloads que foram citados e disponibilizados no decorrer do texto, deixo aqui alguns que foram criados e convertidos por mim usando algumas da ferramentas citadas.
Todos os arquivos (.ino) para o ArduinoDucky podem ser encontrados no repositório. Abaixo, uma lista de referências e uma explicação de sua função.
FloodEnumerado:
O payload tem a função de enviar via HID uma série de mensagens continuas, que são seguidas de um número que representa em qual mensagem o programa já chegou. Segue exemplo de resultado da conexão do ArduinoDucky em um dispositivo que aceite HID:
Mensagem - 1
Mensagem - 2
Mensagem - 3
Mensagem - 4
Mensagem - 5
Mensagem - 6
Mensagem - 7
Mensagem - 8
Mensagem - 9
Mensagem - 10
EnviarTweet:
O payload tem a função de enviar via HID uma série de mensagens no Twitter, que são seguidas de um número que representa em qual mensagem o programa já chegou. A mensagem contém duas linhas de valores fixos, e ao fim da segundo linha, um valor que represente a quantidade de mensagens enviadas.
Para que funcione, a página inicial do Twitter precisa estar aberta em algum navegador ou app. Utilizando dos próprios atalhos, as mensagens serão enviadas no intervalo de tempo definido.
Um exemplo de execução segue:
'n'
Minha primeira linha 'ENTER'
Minha segunda linha, quantidade de mensagens > ? 'CTRL ENTER'
[Pressionar 'n' no teclado irá abrir uma janela "Novo Tweet"]
[Irá escrever o texto na janela e dar ENTER para pular linha"]
[Irá escrever o texto na próxima linha]
[? será substituído pela variável contadora de mensagens]
[Após a mensar ser escritar, será pressionar CTRL ENTER, que é o atalho respectivo para enviar um novo Tweet]






