漏洞背景
“BadUSB”是計算機安全領(lǐng)域的熱門話題之一,該漏洞由Karsten Nohl和Jakob Lell共同發(fā)現(xiàn),并在2014年的BlackHat安全大會上公布。 雖然已隔幾年年,但還是有人在研究它,它的攻擊方式也多種多樣。
介紹
BadUSB原理
在介紹BadUSB的原理之前,筆者在這里先介紹下BadUSB出現(xiàn)之前,利用HID(Human InterfaceDevice,是計算機直接與人交互的設(shè)備,例如鍵盤、鼠標(biāo)等)進行攻擊的兩種類型。分別是”USB RUBBERDUCKY”和”Teensy”。
TEENSY介紹
攻擊者在定制攻擊設(shè)備時,會向USB設(shè)備中置入一個攻擊芯片,此攻擊芯片是一個非常小而且功能完整的單片機開發(fā)系統(tǒng),它的名字叫TEENSY。通過TEENSY你可以模擬出一個鍵盤和鼠標(biāo),當(dāng)你插入這個定制的USB設(shè)備時,電腦會識別為一個鍵盤,利用設(shè)備中的微處理器與存儲空間和編程進去的攻擊代碼,就可以向主機發(fā)送控制命令,從而完全控制主機,無論自動播放是否開啟,都可以成功。
關(guān)于TEENSY,可以參考天融信阿爾法實驗室的《HID攻擊之TEENSY實戰(zhàn)》
USB RUBBER DUCKY介紹
簡稱USB橡皮鴨,是最早的按鍵注入工具,通過嵌入式開發(fā)板實現(xiàn),后來發(fā)展成為一個完全成熟的商業(yè)化按鍵注入攻擊平臺。它的原理同樣是將USB設(shè)備模擬成為鍵盤,讓電腦識別成為鍵盤,然后進行腳本模擬按鍵進行攻擊。
這兩種攻擊方式,是在BadUSB公布之前,比較流行的兩種HID攻擊方式,缺陷在于要定制硬件設(shè)備,通用性比較差。但是BadUSB就不一樣了,它是在“USB RUBBER DUCKY”和“Teensy”攻擊方式的基礎(chǔ)上用通用的USB設(shè)備(比如U盤)。
U盤的內(nèi)部構(gòu)造
U盤由芯片控制器和閃存兩部分組成,芯片控制器負(fù)責(zé)與PC的通訊和識別,閃存用來做數(shù)據(jù)存儲;閃存中有一部分區(qū)域用來存放U盤的固件,它的作用類似于操作系統(tǒng),控制軟硬件交互;固件無法通過普通手段進行讀取。
BadUSB就是通過對U盤的固件進行逆向重新編程,相當(dāng)于改寫了U盤的操作系統(tǒng)而進行攻擊的。
USB協(xié)議漏洞
為什么要重寫固件呢?下面我們可以看看USB協(xié)議中存在的安全漏洞。
現(xiàn)在的USB設(shè)備很多,比如音視頻設(shè)備、攝像頭等,因此要求系統(tǒng)提供最大的兼容性,甚至免驅(qū);所以在設(shè)計USB標(biāo)準(zhǔn)的時候沒有要求每個USB設(shè)備像網(wǎng)絡(luò)設(shè)備那樣占有一個唯一可識別的MAC地址讓系統(tǒng)進行驗證,而是允許一個USB設(shè)備具有多個輸入輸出設(shè)備的特征。這樣就可以通過重寫U盤固件,偽裝成一個USB鍵盤,并通過虛擬鍵盤輸入集成到U盤固件中的指令和代碼而進行攻擊。
BadUSB利用代碼分析
筆者對KarstenNohl和Jakob Lell公布的代碼進行簡單的一個流程解析。
這樣一個帶有惡意代碼的U盤就產(chǎn)生了,更詳細(xì)的可以搜索Karsten Nohl 和 Jakob Lell公布的代碼。
0×01 制作過程
好的廢話咱們不多說了,直接開始吧~
來看一下我們需要準(zhǔn)備的材料吧
微型usb開發(fā)板
Arduino IDE
筆記本一臺

啟動Arduino IDE

測試代碼
#include "DigiKeyboard.h"
void setup() {
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(3000);
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.println("notepad");
DigiKeyboard.delay(500);
DigiKeyboard.print("Hello hack!");
}
void loop() {
}
先不要插入開發(fā)板點擊上傳按鍵


出現(xiàn)這個時,插入開發(fā)板

完成后會出現(xiàn)Thank you!的字樣
0×02 測試使用




