◆黃海軍
(云南工商學院 云南 651700)
USB是一個外部總線標準,是一種外部存儲介質(zhì),具有很好的便利性,可以用來傳輸數(shù)據(jù)相關(guān)的多種用途,廣泛用于規(guī)范電腦與外部設(shè)備的連接和通訊。是應(yīng)用在PC領(lǐng)域的接口技術(shù)。
USB與其他設(shè)備交互基本上都是使用了USB-HID協(xié)議(Human Interface Device),它是一種USB設(shè)備的一個標準設(shè)備類,包含的設(shè)備非常多,一般為計算機提供接口,專門用于控制計算機操作方面。并且廣泛用于USB鼠標,USB鍵盤,USB游戲桿等等,USB HID協(xié)議的方便之處在于操作系統(tǒng)自帶了HID協(xié)議的驅(qū)動程序,不需要用戶手動安裝驅(qū)動程序就能使用,這也是USB設(shè)備即插即用的特性。HID設(shè)備最開始就是為了便于設(shè)備之間的交互,但便捷的背后隱藏著很大的安全隱患問題。
通常用戶在日常使用USB設(shè)備與其他設(shè)備交互的同時,主機通過枚舉設(shè)備描述符、配置描述符、接口描述符、端點描述符、HID描述符、字符串描述符以及語言ID描述符等來識別不同USB設(shè)備,在這個請求響應(yīng)的過程中由于缺少了校驗環(huán)節(jié),即沒有安全策略匹配審核直接就放行了USB設(shè)備,前面所提到的設(shè)備描述符是一個完整的數(shù)據(jù)結(jié)構(gòu),它可以由C語言或是其他編程語言編寫,并且被存儲在USB固件之中,設(shè)備描述符專門被用于說明一個USB設(shè)備的所有屬性,標準設(shè)備描述符的長度是18字節(jié),主機就是通過讀取這些屬性來識別插入的硬件設(shè)備是什么類型的USB設(shè)備。不同種類USB設(shè)備的描述都各不相同,如U盤,游戲手柄,鍵鼠的設(shè)備描述符都是不一樣的,而不同USB設(shè)備描述符都是存儲在設(shè)備自身,攻擊者完全可以通過修改一些設(shè)備的描述符來進行偽裝,通過USB-HID通信協(xié)議實現(xiàn)偽裝的USB設(shè)備與主機進行交互。由于主機上的USB接口沒有設(shè)備身份確認審核功能,當你插進一個U盤時電腦并沒有鑒別你的U盤到底是不是真的U盤時,那么攻擊者就有機可乘了。
隨著物聯(lián)網(wǎng)的發(fā)展,現(xiàn)在的許許多多設(shè)備都支持聯(lián)網(wǎng)并能提供很多硬件接口,USB接口作為一個功能強大的接口同時也是計算機不可缺少的硬件設(shè)備,因此越來越多的病毒制造者已經(jīng)不再局限于軟件層面,更多地轉(zhuǎn)向了對惡意硬件的研究,所謂惡意硬件就是攻擊者通過修改硬件原有的固件程序達到代碼執(zhí)行或注入病毒的效果。由于主機系統(tǒng)對USB設(shè)備接入沒有驗證策略,惡意USB設(shè)備可以通過獲取主機HID接口,偽裝成計算機管理員進入系統(tǒng),繞過主機安全策略或防火墻監(jiān)控,最終取得操作系統(tǒng)最高控制權(quán)限。這種惡意USB設(shè)備直接代表用戶,所以當腳本成功注入后即具有最高的執(zhí)行權(quán)限。
在Black Hat黑帽大會上,柏林SRLabs的安全研究人員賈科布·萊爾(Jakob Lell)和獨立安全研究人員卡斯滕·諾爾(Karsten Nohl)展示了被他們稱作“BadUSB”(按照BadBIOS命名)的攻擊方法,使用了這種USB安全漏洞的攻擊方法非常難以防御,只要具備USB接口的設(shè)備都有可能通過這個漏洞被攻擊。在HID協(xié)議下,U盤的固件,設(shè)備識別碼可以被修改,植入惡意代碼,將U盤偽裝成鍵盤,鼠標,網(wǎng)卡等等設(shè)備,當然除了U盤,其他usb設(shè)備也可以偽裝,例如:通過共享充電寶盜取手機信息等行為屢見不鮮。
使目標電腦被控制只需要讓用戶插入USB設(shè)備,惡意USB設(shè)備就會自動執(zhí)行預(yù)置在固件中的惡意代碼,下載服務(wù)器上惡意病毒文件,執(zhí)行惡意操作。這里的U盤自動運行不同于以往的autorun.inf自動運行程序。它是燒錄在USB固件里面的惡意代碼。攻擊者通過將惡意代碼植入一個攻擊芯片,這個攻擊芯片實際是一個單片機,并且功能非常強大,可以用其將USB設(shè)備模擬為鼠標或是鍵盤,如果帶有這個芯片的USB設(shè)備被插入到主機上面,電腦可能會把它識別成為一個鍵盤,利用燒錄在固件里面的惡意代碼對主機進行攻擊,實現(xiàn)對主機的完全控制。
BadUSB是一種理論上操控任意USB設(shè)備被病毒或其他惡意代碼感染的方法。簡單地說,這就意味著攻擊者可以使用包含處理器的常規(guī)USB設(shè)備,修改固件,并感染上惡意軟件。這讓USB設(shè)備成為進一步操縱計算機的工具。BadUSB當然也可以充當不同的輸入/輸出設(shè)備,例如物理鍵盤,鼠標,集線器,擴展塢,共享打印機,平板電腦,網(wǎng)絡(luò)攝像頭或身份驗證令牌。比如它假裝是鍵盤或鼠標,則惡意軟件可以注入擊鍵和鼠標單擊,在計算機上執(zhí)行多項操作,例如啟動郵箱后將電子郵件發(fā)送到特定地址,并且附帶來自目標電腦的相關(guān)文件。在用戶的計算機,如果假裝它是身份驗證令牌,則BadUSB會強制計算機提示令牌密碼,然后將其存儲在閃存驅(qū)動器中,并在計算機解鎖后把竊取到的令牌發(fā)送給攻擊者。又或者說它通過啟動Powershell與攻擊者建立正向連接,讓攻擊者獲取計算機的所有權(quán)限,可怕的是這個連接是用目標用戶主動發(fā)起的,也就是正向連接,殺毒軟件一般認為是用戶主動的操作,所以殺毒軟件一般都沒有警示。
實驗通過U盤模擬鍵盤實現(xiàn)攻擊,通過重寫USB固件的信息,使用鍵盤的協(xié)議,模擬成鍵盤,執(zhí)行普通的鍵盤功能,以高權(quán)限啟動Powershell,并在Powershell中執(zhí)行命令與攻擊者建立連接,使得攻擊者可以控制受害者的計算機。攻擊過程如圖1所示,
圖1 攻擊過程
此次實驗采用的USB硬件是Arduino Leonardo,采用的開發(fā)軟件是Arduino IDE 1.6.4版本,在IDE中添加了 #Keyboard.h支持庫。被攻擊端的系統(tǒng)為Windows7 64版本。
首先直接把BadUSB設(shè)備與電腦USB端口連接,啟動Arduino IDE,對設(shè)備的型號,端口等進行選擇,Aruduino程序由setup()與 loop()兩個函數(shù)組成,setup()函數(shù)是程序的初始化,loop()函數(shù)主要用于存放程序代碼.如圖2,此次實驗是模擬鍵盤向主機設(shè)備自動輸入惡意代碼達到攻擊的目的,因此用到了#Keyboard.h支持庫,關(guān)鍵API如下:
Keyboard.begin()//開始監(jiān)聽鍵盤通信
Keyboard.end()//結(jié)束監(jiān)聽鍵盤通信
Keyboard.press()//按下某個按鍵
Keyboard.print()//模擬鍵盤敲出字符串
Keyboard.release()//模擬松開某個按鍵
在實驗之前先進行測試,如圖2所示,BadUSB模擬鍵盤輸入“Win”鍵+“R”鍵 打開“運行”同時輸入“Cmd”調(diào)出終端控制臺,在實驗之前首先在BadUSB上燒錄了“echo hello world ”從而保證測試能成功執(zhí)行。
圖2 實驗前期測試
為了惡意代碼能成功執(zhí)行,在本次實驗中使用了功能相對多一點的終端(Powershell)。實現(xiàn)攻擊過程的實現(xiàn)分為以下幾步:
第一步,啟動窗口最小的cmd 以便更加隱藏的運行代碼,具體代碼:CMD/q/d/f:off/v:on/k MODE con:cols=15 lines=1,然后再Cmd里面調(diào)用功能更多的Powershell終端。
第二步,繞過殺毒軟件,因為執(zhí)行帶有惡意代碼的Powershell腳本在執(zhí)行的時候會產(chǎn)生異常的流量,可以通過在Powershell執(zhí)行命令前面加上“-W Normal-W Normal-w Normal ”繞過殺毒軟件的檢測。
第三步,執(zhí)行惡意腳本。Powershell可以通過創(chuàng)建對象的方式從服務(wù)器上下載并執(zhí)行指定文件,在此之前在服務(wù)器部署CobaltStrike服務(wù)端,攻擊機安裝好CobaltStrike客戶端。并開啟服務(wù)器HTTP服務(wù)。
在服務(wù)器上啟動CobaltStrike的服務(wù)端程序 在攻擊者設(shè)備上啟動CobaltStrike的客戶端程序并且連接上服務(wù)端,建立新的監(jiān)聽器監(jiān)聽5555端口,并且生成Powershell腳本的惡意Payload。這里攻擊的核心是BadUSB設(shè)備接入電腦后通過Powershell遠程執(zhí)行服務(wù)器端的惡意代碼。把惡意代碼Payload.ps1上傳至服務(wù)器,將相關(guān)Arduino程序燒錄至BadUSB設(shè)備中。
燒錄完Arduino程序后,將BadUSB設(shè)備插入測試機的USB接口上,如圖3所示在測試機上查看多了一個USB輸入設(shè)備。
圖3 成功檢測到新的輸入設(shè)備接入
如圖4所示當測試機插入BadUSB設(shè)備,攻擊機上就已經(jīng)接收到了測試主機的Shell。BadUSB攻擊成功。
圖4 攻擊機上查看測試機上線
整個實驗利用BadUSB插入電腦自動運行事先寫入的程序從服務(wù)器下載惡意Powershell腳本并且以高權(quán)限運行然后與攻擊端的CobaltStrike建立連接,成功獲取到電腦的權(quán)限。本地控制端可以瀏覽被控端電腦的文件如圖5所示,并且能下載被控端文件到本地。
圖5 瀏覽被控端文件
同時也可以操作目標電腦完成一些特定的任務(wù),比如可以通過目標電腦進行橫向滲透或者縱向滲透,拿下域控權(quán)限,從而拿下整個局域網(wǎng)的權(quán)限,這對于很多公司來說是非常可怕的。在經(jīng)過多次實驗后發(fā)現(xiàn),其在Windows10,Windows7操作系統(tǒng)中都可以輕松上線且都能實現(xiàn)相關(guān)功能,而且這種惡意腳本在運行的時候也不會觸發(fā)到默認管理規(guī)則,殺毒軟件也沒有任何相關(guān)的提示。對于一些安全性較高的計算機設(shè)備利用BadUSB這種技術(shù),很容易就能得到計算的權(quán)限。
由于BadUSB是循環(huán)模范用戶主動敲擊鍵盤輸入的一個過程,所以這種惡意BadUSB設(shè)備難以防范,惡意代碼也在USB設(shè)備的固件中,操作系統(tǒng)的安全策略監(jiān)測不到。對于用戶來說也不可能完全禁用USB設(shè)備,而惡意USB設(shè)備又是以偽造鍵盤進行攻擊,那一般我們的設(shè)備平時也就安裝一個,因此可以通過設(shè)置策略即僅同意安裝一個鍵盤,其余都禁用的方法防止被攻擊,這樣相對來說就是很好的防范了,當然也可以只允許信任的USB設(shè)備連接到您的PC。不要讓陌生人使用計算機為手機充電。不要借用別人的USB設(shè)備將文件從一臺PC移動到另一臺PC。最好購買新設(shè)備僅供自己使用。注意自己的PC,尤其是在公共場所。顯然,不應(yīng)該將計算機放在開放的地方,任何人都可以走過去并插入包含惡意軟件的USB驅(qū)動器。BadUSB可以偽裝成任何基于usb協(xié)議的不一定是U盤的數(shù)據(jù)線轉(zhuǎn)接器,因此要格外注意來自其他的USB設(shè)備。
基于USB HID協(xié)議的攻擊非常的危險,難以防御,可以說有無數(shù)種攻擊方法。比如通過樹莓派zero改造的BadUSB設(shè)備可以通過wifi或者藍牙遠程配置實時加載適應(yīng)被攻擊端的惡意腳本,并且還能夠返回執(zhí)行結(jié)果,可以檢測大小寫切換和Num小鍵盤的切換來獲取更好的腳本執(zhí)行時機,從而得到更好的利用。更可怕的是惡意代碼存儲在USB固件里,殺毒軟件根本不能靜態(tài)查殺。總之,遠離USB技術(shù),這可能不是一個好的選擇,但這是真正確保自己免受USB錯誤影響的唯一方法。甚至無線鼠標和鍵盤之類的設(shè)備也可能包含惡意軟件。使用有線鼠標和鍵盤,并根據(jù)需要使用云服務(wù)傳輸文件。具有涉密信息的計算機應(yīng)該對可疑設(shè)備進行排查,定期檢查第三方設(shè)備,對于不信任的USB設(shè)備一定要有防護心理,必要時可用虛擬機測試等等。同時,加強物理滲透等相關(guān)信息安全的知識也是必不可少的。