Giới thiệu – tự chế một USB Rubber Ducky từ Arduino Pro Micro
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 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:
- 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?
ì 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 (Bài viết tại đây), 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 .
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.
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 , 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!
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);
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
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
Bài viết của tác giả Đoàn Ngọc Huân. Bài gốc trên kipalog
Bonus: Bài DEMO Trên USB Rubber Ducky thật
Source: CEH VIỆT NAM
Bài demo được thực hiện bởi Đại ka Q-Koi (CiSO NBAirPort) và chém gió (trong iClass) bởi Đông Dương Giáo Chủ @ https://cehvietnam.com
Người đăng: CEH VIỆT NAM vào Thứ Sáu, 15 tháng 6, 2018
Bài hay nên đọc
Chúng ta bảo mật máy tính cá nhân như thế nào?
Cài đặt SSH trên Ubuntu Server
Giải thích cấu trúc thư mục của hệ điều hành Linux
Cảnh báo chiêu thức lừa đảo chuyển tiền WESTERN UNION mới năm 2019
Microsoft cho biết tin tặc đã xâm phạm một số tài khoản Outlook
Views: 5449