漏洞背景
“BadUSB”是計(jì)算機(jī)安全領(lǐng)域的熱門話題之一檐束,該漏洞由Karsten Nohl和Jakob Lell共同發(fā)現(xiàn)凉泄,并在2014年的BlackHat安全大會上公布。 雖然已隔幾年年斯碌,但還是有人在研究它晒来,它的攻擊方式也多種多樣。
介紹
BadUSB原理
在介紹BadUSB的原理之前周伦,筆者在這里先介紹下BadUSB出現(xiàn)之前夕春,利用HID(Human InterfaceDevice,是計(jì)算機(jī)直接與人交互的設(shè)備专挪,例如鍵盤及志、鼠標(biāo)等)進(jìn)行攻擊的兩種類型。分別是”USB RUBBERDUCKY”和”Teensy”寨腔。
TEENSY介紹
攻擊者在定制攻擊設(shè)備時(shí)速侈,會向USB設(shè)備中置入一個(gè)攻擊芯片,此攻擊芯片是一個(gè)非常小而且功能完整的單片機(jī)開發(fā)系統(tǒng)迫卢,它的名字叫TEENSY倚搬。通過TEENSY你可以模擬出一個(gè)鍵盤和鼠標(biāo),當(dāng)你插入這個(gè)定制的USB設(shè)備時(shí)乾蛤,電腦會識別為一個(gè)鍵盤潭枣,利用設(shè)備中的微處理器與存儲空間和編程進(jìn)去的攻擊代碼,就可以向主機(jī)發(fā)送控制命令幻捏,從而完全控制主機(jī)盆犁,無論自動播放是否開啟,都可以成功篡九。
關(guān)于TEENSY谐岁,可以參考天融信阿爾法實(shí)驗(yàn)室的《HID攻擊之TEENSY實(shí)戰(zhàn)》
USB RUBBER DUCKY介紹
簡稱USB橡皮鴨,是最早的按鍵注入工具榛臼,通過嵌入式開發(fā)板實(shí)現(xiàn)伊佃,后來發(fā)展成為一個(gè)完全成熟的商業(yè)化按鍵注入攻擊平臺。它的原理同樣是將USB設(shè)備模擬成為鍵盤沛善,讓電腦識別成為鍵盤航揉,然后進(jìn)行腳本模擬按鍵進(jìn)行攻擊。
這兩種攻擊方式金刁,是在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)恋昼,控制軟硬件交互;固件無法通過普通手段進(jìn)行讀取赶促。
BadUSB就是通過對U盤的固件進(jìn)行逆向重新編程焰雕,相當(dāng)于改寫了U盤的操作系統(tǒng)而進(jìn)行攻擊的。
USB協(xié)議漏洞
為什么要重寫固件呢芳杏?下面我們可以看看USB協(xié)議中存在的安全漏洞。
現(xiàn)在的USB設(shè)備很多辟宗,比如音視頻設(shè)備爵赵、攝像頭等,因此要求系統(tǒng)提供最大的兼容性泊脐,甚至免驅(qū)空幻;所以在設(shè)計(jì)USB標(biāo)準(zhǔn)的時(shí)候沒有要求每個(gè)USB設(shè)備像網(wǎng)絡(luò)設(shè)備那樣占有一個(gè)唯一可識別的MAC地址讓系統(tǒng)進(jìn)行驗(yàn)證,而是允許一個(gè)USB設(shè)備具有多個(gè)輸入輸出設(shè)備的特征容客。這樣就可以通過重寫U盤固件秕铛,偽裝成一個(gè)USB鍵盤,并通過虛擬鍵盤輸入集成到U盤固件中的指令和代碼而進(jìn)行攻擊缩挑。
BadUSB利用代碼分析
筆者對KarstenNohl和Jakob Lell公布的代碼進(jìn)行簡單的一個(gè)流程解析但两。
這樣一個(gè)帶有惡意代碼的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() {
}