
Ferramenta simples de injeção de teclas para Windows e Linux que exfiltra dados de WiFi armazenados (SSID e senha).

Você já viu um filme onde um hacker conecta um pendrive aparentemente comum a um computador e instantaneamente rouba dados? Hoje, você construirá um dispositivo que faz exatamente isso.
⚠️ Aviso legal:
Todo o conteúdo deste projeto destina-se exclusivamente a fins de pesquisa em segurança.
No verão de 2022, decidi construir um dispositivo capaz de extrair dados de um computador alvo. Mas como exatamente se implanta um malware e se exfiltra informações? Nas seções a seguir, percorrerei os passos essenciais, os conceitos subjacentes e as nuances técnicas envolvidas na criação de uma ferramenta de injeção de teclas personalizada. Embora este projeto tenha como alvo específico as credenciais WiFi, o payload pode ser facilmente modificado para fins mais avançados ou maliciosos – os únicos limites reais são sua criatividade e conhecimento técnico.
Com o tempo, o projeto cresceu e passou a incluir uma grande variedade de scripts e ferramentas. Originalmente, foi criado para demonstrar as capacidades de um Rubber Ducky – especificamente, uma versão econômica usando o Raspberry Pi Pico (RPi Pico). Atualmente, os dois componentes principais do projeto são:
Acesso físico ao computador da vítima (desbloqueado).
O computador deve ter acesso à internet para enviar os dados roubados através de SMTP para exfiltração por meio de rede.
Conhecimento da senha do computador da vítima para o exploit no Linux.
Após criar um pico-ducky, basta copiar o payload modificado (ajustado com seus dados SMTP para o exploit no Windows e/ou ajustado com a senha do Linux e o nome do pendrive) para o RPi Pico.
[!NOTE]
É possível construir esta ferramenta usando o Rubber Ducky, mas lembre-se de que o RPi Pico custa cerca de US$ 4,00 e o Rubber Ducky custa US$ 80,00.
No entanto, embora o pico-ducky seja uma solução boa e econômica, o Rubber Ducky oferece recursos como discrição e uso da versão mais recente do DuckyScript.
Para usar o Ducky Script para escrever o payload no seu RPi Pico, você primeiro precisa convertê-lo em um pico-ducky. Siga estes passos simples para criar o pico-ducky.
Uma ferramenta de injeção de teclas, uma vez conectada a uma máquina hospedeira, executa comandos maliciosos ao rodar um código que imita teclas digitadas por um usuário. Embora pareça um pendrive, ela age como um teclado que digita um payload pré-programado. Ferramentas como o Rubber Ducky podem digitar mais de 1.000 palavras por minuto. Uma vez criada, qualquer pessoa com acesso físico pode implantar esse payload com facilidade.
O payload usa o comando STRING para processar as teclas de injeção. Ele aceita um ou mais caracteres alfanuméricos/de pontuação e digitará o restante da linha exatamente como está na máquina alvo. Os comandos ENTER/SPACE simulam a pressão das teclas do teclado.
Usamos o comando DELAY para pausar temporariamente a execução do payload. Isso é útil quando um payload precisa esperar por um elemento, como um Prompt de Comando, carregar. O delay é útil quando usado logo no início, quando um novo dispositivo USB é conectado a um computador alvo. Inicialmente, o computador deve concluir um conjunto de ações antes de começar a aceitar comandos de entrada. No caso de HIDs, o tempo de configuração é muito curto. Na maioria dos casos, leva uma fração de segundo porque os drivers já estão integrados. No entanto, em alguns casos, um PC mais lento pode demorar mais para reconhecer o pico-ducky. A recomendação geral é ajustar o tempo de delay de acordo com seu alvo.
Exfiltração de dados é a transferência não autorizada de dados de um computador/dispositivo. Uma vez coletados, um invasor pode empacotá-los para evitar detecção enquanto os envia pela rede usando criptografia ou compactação. As duas formas mais comuns de exfiltração são:
Esta abordagem foi usada para o exploit no Windows. O payload completo pode ser visto aqui.
Esta abordagem foi usada para o exploit no Linux. O payload completo pode ser visto aqui.
Para usar o payload do Windows (payload1.dd), não é necessário conectar nenhum fio jumper entre os pinos.
Uma vez que as senhas foram exportadas para o arquivo .txt, o payload enviará os dados para o e-mail designado usando o Yahoo SMTP. Para instruções mais detalhadas, visite o seguinte link. Além disso, o modelo de payload precisa ser atualizado com suas informações SMTP, ou seja, você precisa atualizar RECEIVER_EMAIL, SENDER_EMAIL e a PASSWORD do seu e-mail. Você também pode atualizar o corpo e o assunto do e-mail.
[!NOTE]
Após o envio dos dados por e-mail, o arquivo
.txté excluído.Você também pode usar um SMTP de outro provedor de e-mail, mas deve estar atento ao servidor SMTP e aos números de porta que escreverá no payload.
Lembre-se de que algumas redes podem estar bloqueando o uso de um SMTP desconhecido no firewall.
Para usar o payload do Linux (payload2.dd), você precisa conectar um fio jumper entre GND e GPIO5 para estar em conformidade com o código em code.py no seu RPi Pico. Para mais informações sobre como configurar múltiplos payloads no seu RPi Pico, visite este link.
Fig. 1: Exploit no Linux
Uma vez que as senhas foram exportadas do computador, os dados serão salvos no pendrive USB designado. Para que este payload funcione corretamente, ele precisa ser atualizado com o nome correto do seu pendrive, ou seja, você precisará substituir USBSTICK pelo nome do seu pendrive em dois lugares.
Além disso, você também precisará atualizar a PASSWORD do Linux no payload em três lugares. Conforme mencionado acima, para que este exploit seja bem-sucedido, você precisará saber a senha da máquina Linux da vítima, o que torna este ataque menos plausível.
Para executar o script wifi_passwords_print.sh, você precisará atualizar o script com o nome correto do seu pendrive. Depois disso, você pode digitar o seguinte comando no seu terminal:
echo PASSWORD | sudo -S sh wifi_passwords_print.sh USBSTICK
onde PASSWORD é a senha da sua conta e USBSTICK é o nome do seu dispositivo USB.
NetworkManager é baseado no conceito de perfis de conexão e usa plugins para ler/escrever dados. Ele utiliza o formato de arquivo de chave .ini-style e armazena perfis de configuração de rede. O keyfile é um plugin que suporta todos os tipos de conexão e capacidades que o NetworkManager possui. Os arquivos estão localizados em /etc/NetworkManager/system-connections/. Com base no formato keyfile, o payload usa o comando grep com regex para extrair os dados de interesse. Para filtragem de arquivos, foi usada uma asserção de lookbehind positiva modificada ((?<=palavra-chave)). Enquanto a asserção de lookbehind positiva corresponde a uma determinada posição na string, sc. a uma posição logo após a palavra-chave sem tornar esse texto parte da correspondência, a regex (?<=palavra-chave).* corresponderá a qualquer texto após a palavra-chave. Isso permite que o payload corresponda aos valores após as palavras-chave SSID e psk (chave pré-compartilhada).
Para mais informações sobre o NetworkManager, aqui estão alguns links úteis:
Abaixo está um exemplo dos dados exfiltrados e formatados da máquina da vítima em um arquivo .txt.
Uma das vantagens do Rubber Ducky sobre o RPi Pico é que ele não aparece como um dispositivo de armazenamento em massa USB quando conectado. Uma vez conectado ao computador, a máquina o vê apenas como um teclado USB. Este não é o comportamento padrão do RPi Pico. Se você quiser impedir que seu RPi Pico apareça como um dispositivo de armazenamento em massa USB quando conectado, você precisa conectar um fio jumper entre o pino 18 (GND) e o pino 20 (GPIO15). Para mais detalhes, visite este link.
💡 Dica:
- Carregue seu payload no RPi Pico antes de conectar os pinos.
- Não solde os pinos, pois provavelmente você vai querer alterar/atualizar o payload em algum momento.
Ao criar um arquivo de payload funcional, você pode usar o script writer.py ou alterar manualmente o arquivo template. Para executar o script com sucesso, você precisará passar, além do nome do arquivo de script, um nome do SO (windows ou linux) e o nome do arquivo de payload (ex.: payload1.dd). Abaixo você encontra um exemplo de como executar o script writer ao criar um payload para Windows.
python3 writer.py windows payload1.dd
Com algumas pequenas modificações, os scripts usados anteriormente também podem ser adaptados para rodar no Bash Bunny. O Bash Bunny funciona emulando um dispositivo USB confiável [1]. Para este projeto, vamos configurá-lo para emular um dispositivo de armazenamento flash usando o seguinte comando [1, 2]:
ATTACKMODE HID STORAGE
Usando o comando DuckyScript ATTACKMODE, podemos definir qual tipo de dispositivo o Bash Bunny deve emular [1]. Cada modo de ataque se registra no sistema usando um ID de fornecedor USB (VID) e um ID de produto (PID) exclusivos [1]. Também é possível combinar vários modos de ataque encadeando-os.
Fig. 2: Bash Bunny Mark I conectado a um PC
O Bash Bunny suporta os comandos originais do DuckyScript, e por isso pude reutilizar o script da seção Rubber Ducky. Para usar esses comandos inline, precisamos prefixá-los com o comando QUACK [1]. Por exemplo, em vez de escrever WINDOWS r, escrevemos Q WINDOWS r.
Para carregar payloads no Bash Bunny, o dispositivo deve estar no modo arming (posição da chave 3 — a mais próxima do plugue USB) [1]. Uma vez conectado, copie payload.txt e exfil.txt para payloads\switch1. Os payloads devem ser nomeados como payload.txt [1,2], enquanto quaisquer arquivos de suporte referenciados pelo payload podem ser nomeados livremente.
Para referência, a estrutura do diretório de armazenamento em massa do Bash Bunny é a seguinte [2]:
BashBunny/
├── loot/
│ └── (dados exfiltrados dos payloads serão salvos aqui)
└── payloads/
├── library/
│ └── (scripts ou módulos reutilizáveis)
├── switch1/
│ ├── payload.txt
│ └── (arquivos opcionais, ex.: exfil.txt, scripts, etc.)
└── switch2/
├── payload.txt
└── (arquivos opcionais)
Fig. 3: Estrutura do Diretório de Armazenamento em Massa do Bash Bunny
Assim que o script terminar de executar, os resultados serão salvos em loot\wifi_pass.txt. Se o computador alvo não tiver senhas WiFi salvas, o arquivo estará vazio.
[!NOTE]
Como o ataque Bash Bunny depende de um script do PowerShell (
exfil.txt), ele só pode ser usado em sistemas Windows. Para usar uma abordagem semelhante no Linux, você precisará modificar o payload e substituir o script do PowerShell pelo script Bash mencionado na seção Linux acima.
Este pico-ducky atualmente funciona apenas no Windows.
Este ataque requer acesso físico a um dispositivo desbloqueado para ser implantado com sucesso.
O exploit no Linux tem muito menos probabilidade de sucesso, pois para ter sucesso você não só precisa de acesso físico a um dispositivo desbloqueado, mas também precisa saber a senha do administrador da máquina Linux.
O firewall da máquina ou da rede pode impedir que os dados roubados sejam enviados pela rede.
Os atrasos do payload podem ser inadequados devido às diferentes velocidades dos computadores usados para implantar o ataque.
O dispositivo pico-ducky não é realmente discreto; na verdade, é bastante o contrário, é muito volumoso, especialmente se você soldar os pinos.
Além disso, o dispositivo pico-ducky é visivelmente mais lento em comparação ao Rubber Ducky executando o mesmo script.
Se o Caps Lock estiver ativado, parte do código do payload não será executada e o exploit falhará.
Se o computador tiver um ambiente de idioma diferente do inglês configurado, este exploit não terá sucesso.
Atualmente, o pico-ducky não suporta DuckyScript 3.0, apenas DuckyScript 1.0 pode ser usado. Se você precisar da versão 3.0, terá que usar o Rubber Ducky. Para este exploit, a versão 3.0 não é necessária!