BadUsb介紹
BadUSB是計算機安全領域的熱門話題之一,該漏洞由Karsten Nohl和Jakob Lell共同發現,并在2014年的BlackHat安全大會上公布。 雖然已隔一兩年,但還是有人在研究它,它的攻擊方式也多種多樣。
使用他們的代碼做了個類似的U盤,用戶插入U盤,就會自動執行預置在固件中的惡意代碼,下載服務器上惡意文件,執行惡意操作——注意,這里的U盤自動運行可不是以前的autorun.inf自動運行程序哦,具體的技術細節可以參考后文內容。
參考這個視頻的演示: http://v.youku.com/v_show/id_XODQ0NzYxNDg0.html
BadUSB最可怕的一點是惡意代碼存在于U盤的固件中,由于PC上的殺毒軟件無法訪問到U盤存放固件的區域,因此也就意味著殺毒軟件和U盤格式化都無法應對BadUSB進行攻擊。
【BadUSB原理】
在介紹BadUSB的原理之前,筆者在這里先介紹下BadUSB出現之前,利用HID(Human InterfaceDevice,是計算機直接與人交互的設備,例如鍵盤、鼠標等)進行攻擊的兩種類型。分別是"USB RUBBERDUCKY"和"Teensy"。
USB RUBBERDUCKY:簡稱USB橡皮鴨,是最早的按鍵注入工具,通過嵌入式開發板實現,后來發展成為一個完全成熟的商業化按鍵注入攻擊平臺。它的原理同樣是將USB設備模擬成為鍵盤,讓電腦識別成為鍵盤,然后進行腳本模擬按鍵進行攻擊。 TEENSY:攻擊者在定制攻擊設備時,會向USB設備中置入一個攻擊芯片,此攻擊芯片是一個非常小而且功能完整的單片機開發系統,它的名字叫TEENSY。通過TEENSY你可以模擬出一個鍵盤和鼠標,當你插入這個定制的USB設備時,電腦會識別為一個鍵盤,利用設備中的微處理器與存儲空間和編程進去的攻擊代碼,就可以向主機發送控制命令,從而完全控制主機,無論自動播放是否開啟,都可以成功。
TEENSY介紹
攻擊者在定制攻擊設備時,會向USB設備中置入一個攻擊芯片,此攻擊芯片是一個非常小而且功能完整的單片機開發系統,它的名字叫TEENSY。通過TEENSY你可以模擬出一個鍵盤和鼠標,當你插入這個定制的USB設備時,電腦會識別為一個鍵盤,利用設備中的微處理器與存儲空間和編程進去的攻擊代碼,就可以向主機發送控制命令,從而完全控制主機,無論自動播放是否開啟,都可以成功。
關于TEENSY,可以參考天融信阿爾法實驗室的《HID攻擊之TEENSY實戰》
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公布的代碼
利用Arduino制作TEENSY
Arduino是讓一種叫做單片機的小型可編程電腦盡可能簡單地被使用,并且單片機可以讓物體獲得交互功能。
來看一下我們需要準備的材料:
Arduino Leonardo //小型單片機模擬USB Arduino IDE //用于燒錄代碼的編譯器 http://pan.baidu.com/s/1hsC7OOk 安卓數據線 //用于連接電腦USB PC一臺 //ok我們可以開工了
Arduino Leonardo 單片機長這樣:
下載IDE
地址:http://pan.baidu.com/s/1hsC7OOk
安裝以后的界面如下:
編寫代碼
在編輯器界面選擇文件選項卡,然后點擊保存,我這邊先放到桌面, 比較好找
setup函數內部是默認執行的代碼, loop函數是循環執行的代碼;
以上只是程序給我們搭好的框架,實際代碼要我們自己去編寫。我們讓USB對電腦進行操作主要是想實現自動化鍵盤操作,所以我們這邊就要用到arduino的鍵盤函數
#include<Keyboard.h> //包含鍵盤模塊的頭文件 Keyboard.begin(); //開啟鍵盤通信 Keyboard.press(); //按下某個鍵 Keyboard.release(); //釋放某個鍵 Keyboard.println(); /*輸入某些內容 和一些網上的解釋不同 網上解釋是輸入內容并且能回車,而我測試的時候并不能回車 可能和版本有關 不要不要擔心有辦法回車*/ Keyboard.end(); //結束鍵盤通信
有編程經驗的同學都知道怎么用了, 我們重新編寫以上的測試代碼:
#include<Keyboard.h> //包含鍵盤模塊頭文件 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()//循環,這里的代碼 { //循環體 寫入你要循環的代碼 }
點擊編輯器中驗證的按鈕:
驗證通過以后, 把芯片USB插入電腦, 等待USB燈亮了以后, 在編輯器中選擇==》工具 ==》 開發板 ==》 arduino leonardo
再選擇 工具 ==》 端口 ==》 COM端口(每一臺機器端口不同)
上傳代碼
點擊編輯器的開始按鈕, 開始上傳代碼到芯片中
帶上芯片, 重新插入電腦, 會自動彈出CMD并執行命令;
HID攻擊之TEENSY實戰 : http://blog.topsec.com.cn/ad_lab/hid%E6%94%BB%E5%87%BB%E4%B9%8Bteensy%E5%AE%9E%E6%88%98/
新的U盤自動運行——BadUSB原理與實現 : https://security.tencent.com/index.php/blog/msg/74
利用BadUsb5秒內黑掉一臺電腦 : http://www.52pojie.cn/thread-427287-1-1.html
作者: NONO
出處:http://www.cnblogs.com/diligenceday/
企業網站:http://www.idrwl.com/
開源博客:http://www.github.com/sqqihao
QQ:287101329
微信:18101055830
廈門點燃未來網絡科技有限公司, 是廈門最好的微信應用, 小程序, 微信網站, 公眾號開發公司
文章列表