Hack tung máy tính bằng Arduino
hardware
8
arduino
10
hacking
18
TIL
678
White

Đoàn Ngọc Huân viết ngày 22/12/2018

Giới thiệu - tự chế một USB Rubber Ducky từ Arduino Pro Micro

Educational purpose - bài viết có mục đính học tập, chia sẻ

Vừa nãy đọc xong bài viết trong Series "Keyboard from Scratch" - Tự chế bàn phím cơ của The Full Snack (https://thefullsnack.com/posts/mechkeyboard-first-part.html) thấy hay ho và nảy lên một ý tưởng trong đầu.
Nếu như ta có thể gửi các kí tự từ bàn phím đến máy tính thông qua Arduino, thì tại sao ta không gửi thẳng cả các keystrokes từ script định sẵn trong Arduino, không cần đến bàn phím? Mình chợt nhớ đến USB Rubber Ducky.

USB Rubber Ducky là gì?

Mình đã vẽ một cái sơ đồ diễn tả như sau:
alt text

  • USB thông thường/bàn phím khi kết nối đến máy tính sẽ hoạt động bình thường
  • USB chứa mã độc khi cắm vào máy tính sẽ bị trình diệt Virus khử ngay lập tức, hoặc bị tắt mất autorun, phải chạy script bằng tay.
  • Đối với bàn phím sử dụng để execute mã độc, trình diệt Virus sẽ bỏ qua vì máy tính nhận nó như một peripheral input, hiện lên là "Keyboard" trong Device Manager.

Thay vì sử dụng bàn phím và bật terminal/command promt để load mã độc, thì USB Rubber Ducky sẽ chứa sẵn script, và tự động thực hiện các thao tác như một cái bàn phím thông thường, với tốc độ đáng kinh ngạc (hơn 1000 từ/phút) và không sai sót.

Vậy làm thế nào để có được USB Rubber Ducky?

Vì quá hào hứng nên mình lên mạng tra liền thì thấy giá khá là chua chát, tận $45 nên tủi lòng, quyết định theo con đường DIY.

Tò mò và lên mạng tìm thử cách chế tạo một con Rubber Ducky từ USB thường (https://www.pentestingshop.com/pentesting/make-your-own-usb-rubber-ducky-using-a-normal-usb-stick/), thì thấy rằng nó khá là phức tạp (mod lại firmware, bung USB ra hàn gì đấy), với cả số lượng các thiết bị tương thích rất hạn hẹn, chỉ có vài loại USB làm được nên thôi, drop project :sweat:.

Hên sao đọc trúng bài viết của The Full Snack, đọc xong cái là trầm trồ, vuốt cằm ngồi nghĩ. Thư viện Keyboard.h của Arduino có thể gửi input đến máy tính. Và ngạc nhiên hơn nữa khi nạp code cho Arduino, mình có thể định dạng cho nó như một keyboard!

Bắt tay vào làm thôi!

Chuẩn bị - tự chế một USB Rubber Ducky từ Arduino Pro Micro

  • Arduino Pro Micro - lí do mình chọn là vì khỏ gọn, và có cổng Micro USB, không phải mua thêm module "USB to TTL" như xài Arduino Pro Mini. Lưu ý: Nano, Uno không tương thích (*)
  • Cáp Micro USB sang USB - kết nối con Pro Micro với máy tính
  • Một nút bấm để debug - cái này không cần thiết lắm, mình sẽ nhắc đến sau.
  • Nhớ thêm cả Arduino IDE nhé, mình xài version 1.6.9. alt text

Cắm Arduino vào máy tính và bắt đầu thôi

Với những ai thích sự đơn giản (hoặc lười như mình) thì sẽ viết Duckyscript, bởi vì nó cực kì dễ, đây là mô tả một đoạn script mở Notepad lên và gõ "Hello World!!!":

DELAY 1000      <--- Chờ 1s sau khi vừa cắm
WINDOWS d       <--- Mở Desktop
DELAY 150       <--- Delay 0.15s
WINDOWS r       <--- Hộp thoại Run
DELAY 300       <--- Delay 0.3s
STRING notepad.exe  <--- Nhập "notepad.exe"
DELAY 300
ENTER               <---  Và Enter
DELAY 750
STRING Hello World!!!   <--- Nhập "Hello World!!!"
ENTER

Nhưng Duckyscript chỉ tương thích với cái cục $45 trên :confused:, nên mình phải convert sang Arduino Code, cơ bản thì chỉ là send keystroke, lần này mình cũng lại lười nên lên mạng lục. Tìm được một converter là Duckuino. Bạn có thể clone repo về từ GitHub hoặc convert trực tiếp tại Bản Duckuino mình host
Sau khi convert, copy code về IDE, ta chỉnh lại một chút, gồm:

  • Thêm #include <Keyboard.h>
  • Chỉnh/thêm các delay cho chương trình chạy mượt, tùy theo tốc độ của máy tính mà cắm USB vào

/* Converted by Duckuino:
* https://forums.hak5.org/index.php?/topic/32719-payload-converter-duckuino-duckyscript-to-arduino/?p=244590
* Enjoy!
*/

#include <Keyboard.h>

void setup() {
Keyboard.begin();
delay(1000);

Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('d');
Keyboard.releaseAll();
delay(150);

Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
Keyboard.releaseAll();
delay(300);

print(F("notepad.exe"));
delay(300);

type(KEY_RETURN,false);
Keyboard.releaseAll();
delay(750);

print(F("HELLO WORLD!!!"));

type(KEY_RETURN,false);
Keyboard.releaseAll();
Keyboard.end();
}
void type(int key, boolean release) {
  Keyboard.press(key);
  if(release)
    Keyboard.release(key);
}
void print(const __FlashStringHelper *value) {
  Keyboard.print(value);
}
void loop(){}

Nạp code (Ctrl + U) và test ngay thôi!
alt text
Notepad được mở lên rất nhanh và dòng chữ hiện lên cũng trong tích tắc.

Nhưng vậy chẳng lẽ mỗi lần cắm Arduino vào là nó sẽ chạy script?

Chính xác, chính vì thế mình mới đề cập đến cái nút bấm 2 chân ban đầu. Ta sẽ sử dụng nút này để ngăn chặn không cho Arduino chạy mỗi khi cần debug.
Hàn 2 chân nút bấm vào pin số 3 (hoặc tùy thích) và pin GND, sau đó thêm đoạn sau:

pinMode(3, INPUT_PULLUP);
if(digitalRead(3) == LOW) while(1);

alt text

Lúc này, khi vừa nhấn giữ nút và vừa cắm USB vào thì chương trình sẽ nhảy vào vòng while và đứng đó, không chạy code bên dưới

Tớ có thể nghịch ngợm thêm những gì?

Tại đây có các payload được viết sẵn bằng Duckyscript, bạn có thể lấy và convert về nghịch. Mình sẽ demo thử một payload fake Windows update
alt text
Ngoài ra, bạn có thể:

  • Làm mấy cái reverse payload chiếm máy nạn nhân
  • Cài keylogger
  • Đổi wallpaper trong 2s
  • Lấy hết dữ liệu của trình duyệt web
  • Tự chế macro rồi bind với mấy cái nút gắn thêm vào
  • Làm vỏ USB từ máy in 3D cho hoàn thiện

Phần sau: làm payload chiếm máy nạn nhân từ USB vừa chế tạo ra.

Chú thích

(*): Những vi điều khiển tương thích với thư viện Keyboard.h:

  • ATmega32U6
  • ATmega8U2
  • ATmega16U2
  • ATmega16U4
  • ATmega32U2
  • ATmega32U4
  • ATxxUSBxx

(https://stackoverflow.com/a/52460637)

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Đoàn Ngọc Huân

1 bài viết.
1 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
5 1
Trang http://www.meete.co/ đã lộ thông tin người dùng như thế nào ? Một ngày đẹp trời đầu tháng 12 , Tự nhiên cái dạ dày cảm thấy đói bụng nên mìn...
kid conan viết hơn 2 năm trước
5 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
1 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!