當前位置:
首頁 > 新聞 > Arduino+Avr libc製作Badusb原理及示例講解 | 長文含視頻

Arduino+Avr libc製作Badusb原理及示例講解 | 長文含視頻

* 原創作者:泥殼安全,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載



一、 前言


2014年美國黑帽大會上研究人員JakobLell和Karsten Nohl展示了badusb的攻擊方法後,國內與badusb相關的文章雖然有了一些,但是大部分人把相關文章都閱讀後還是會有種「不明覺厲」的感覺,badusb仍有一層朦朧的面紗。經過一段時間的學習和研究後,筆者希望通過自己的一些心得體會可以幫助其他人更清晰地認識badusb,也希望這篇文章能夠起到一定的啟發。這篇文章主要分為五個部分——知識掃盲部分、badusb固件編寫部分、badusb配置界面部分、技術展望部分和總結部分。






二、硬體準備


本文使用的硬體是Arduino Leonardo開發板,但是不難將Leonardo開發板替換為其它Arduino開發板。





三、知識掃盲


1. 雖然USB協議有一定的漏洞,但是不是任何USB設備都能製作badusb的。製作badusb有兩個核心,一個是能夠為USB設備編寫相應的固件,另一個是能夠將編寫的固件燒錄到USB設備中。要編寫相應的固件就需要掌握USB設備中微控制器(或者說晶元)的指令規範文檔(如果Intel不提供開發文檔,那麼除了Intel自己沒有人能為Intel處理器編寫程序);


而要將固件燒錄到USB設備中,要麼使用相應的硬體編程器,要麼就需要USB設備本身已經存在的bootloader來輔助進行燒錄工作(bootloader是USB設備廠商在生產時就放在USB設備中的,網上某些優盤的優盤量產工具也是從廠商流出的,而不是第三方編寫的)。


要同時滿足兩個核心條件還是比較難的,即便是JakobLell和Karsten Nohl公布的badusb利用代碼也是針對滿足一定條件的優盤,因為流出的優盤量產工具有限(既然有優盤量產工具,可以推測相應的優盤中肯定有bootloader或者類似bootloader的固件存在,那麼通過逆向優盤量產工具就可以掌握PC端軟體和特定優盤的通信方式,進而實現自己的燒錄工具)。


2. Arduino 和 teensy這類開發板之所以容易製作badusb,是因為它們採用的微控制器官方有詳細的說明文檔。最常用的是atmel公司的微控制器,atmel官網提供了各種開發文檔和開發相關的庫等。


3. Atmel廠商的微控制器整合了SRAM, FLASH和EEPROM。SRAM就好比電腦的內存,不用關心;FLASH高地址存放的是bootloader,低地址則存放用戶燒錄的固件,晶元加電時直接執行用戶的固件,但是晶元複位時會先執行bootloader(這一點是燒錄的關鍵),再執行用戶的固件;EEPROM則主要用來存放數據,用戶可以隨意修改EEPROM中的數據,固件也可以從EEPROM里讀取數據(本文的固件示例和PC端程序都利用了這一特性)。


4. Avr libc是一個開源項目,針對atmel廠商的各種微控制器開發C語言庫、編譯器、燒錄工具等一系列輔助工具,還有針對Windows平台的WinAvr項目。Arduino ide的核心其實也是avr libc。


5. Arduino的開發板有相應的bootloader(在FLASH高地址)可以和avr libc項目中的avrdude.exe軟體通信,實現固件的燒寫和讀取動作。在Arduino開發板複位時,會載入bootloader,這時候就可以利用avrdude.exe和bootloader通信。複位操作可以通過開發板上的複位按鈕,或者編程實現軟複位操作(如果開發板支持的話)。


6. Intel hex 是一種用於編程器的特殊的文件格式,正是因為這種格式,使得我們可以自由控制數據的存儲地址。Intel hex的文件格式解析可以自行網上搜索。




四、知識獲取途徑


1. USB知識獲取


如果只是為了簡單了解USB設備為什麼可以模擬鍵盤、滑鼠等其它設備,網上有許多博客是關於USB規範詳解的,也可以簡單地看《USB開發大全》和《USB應用開發實例詳解》前面關於USB通用協議部分,如果不是對硬體感興趣沒必要深究。


2. Arduino、Avr libc知識獲取

這兩樣其實都是開源的,所以只要有足夠的精力和實力,看源代碼深入了解相關知識是沒問題的。但是如果只是想體驗一下製作badusb,可以只看一下Arduino的官方文檔和avrdude.exe的相關文檔,看這些文檔時也沒必要深究每個細節,能一定程度上「照葫蘆畫瓢」就可以了。




五、Badusb固件編寫


這裡給的固件示例在執行時會從EEPROM中指定的地址讀取數據,根據讀取的數據和制定的規則發送相應的按鍵響應給PC主機。





這裡針對這個固件給幾個例子幫助理解:



1. 從EEPROM中依次讀取到"$"、"r"($r)表示badusb會按下Win+R鍵。


2. 從EEPROM中依次讀取到"$"、"r"、";"($r;)表示badusb會按下Win+R,然後按回車鍵。


3. 從EEPROM中依次讀取到"&"、"5"、"0"、"0"、"&"、"$"、"r"、";"(&500&$r;)表示badusb會按下Win+R鍵,然後等待500毫秒(保證運行對話框彈出),再按下回車鍵。


4. 從EEPROM中依次讀取到(&500&$rpowershell&400&;Get-Date;)表示badusb先按下Win+R鍵,等待500毫秒後輸入powershell,按回車鍵後等待400毫秒,再輸入Get-Date,最後按下回車鍵。




六、Badusb配置界面


所謂的Badusb配置界面,就是avrdude.exe的UI界面精簡版,再額外提供了控制Badusb執行的動作的功能(本質就是修改了EEPROM特定地址的數據,因為固件是根據EEPROM中的數據執行動作的)。



圖1 PC程序界面


這個程序主要就是avrdude.exe的UI界面,只有executable處和address處是為了自定義Badusb動作設計的。partno的選項和programmer的選項是解析選定的avrdude.conf得到的,所以不選擇avrdude.conf的話partno和programmer的下拉框將為空;埠號是通過註冊表獲取到的。


當點擊upload按鈕或者dump按鈕時,先利用編程方式實現複位操作(後面會解釋怎麼實現的),在短暫的暫停後使用CreateProcess執行avrdude.exe程序;而如果用戶在executable處輸入了字元串,PC程序會根據用戶輸入的字元串和Address處給定的地址生成intel hex格式的文件(還記得前面知識掃盲部分提到的intel hex格式?熟悉了intel hex的格式後,完全可以自己寫出生成hex文件的代碼,所以這裡就不貼出代碼了),再調用avrdude.exe把生成的intel hex文件燒錄到eeprom。下面給個具體的演示。



圖2 燒錄固件並指定Badusb執行動作


Executable處輸入的字元串指示badusb執行的動作,這裡badusb先按下Win+R鍵,等待500毫秒後輸入powershell,按下回車鍵,等待600毫秒後輸入Get-Date然後按下回車鍵,再輸入echoabcdefghijklmnopqrstuvwxyz按下回車鍵,最後再次輸入Get-Date和回車鍵。至於界面中其它一些零碎的參數筆者怎麼知道的後面會說,實在不行完全可以一個一個嘗試。



效果演示視頻鏈接:

https://v.qq.com/x/page/l03900zm1pe.html


視頻沒有演示badusb的危害多大(比如從伺服器下載木馬執行、竊取個人信息等),畢竟這些更多的屬於powershell腳本知識、cmd命令之類的,不是這篇文章的目的。


演示視頻中主要經歷了以下幾個階段:



1. 選擇了avrdude.conf文件後partno和programmer下拉框會展示avrdude.exe支持的晶元型號和編程器(編程器本質上是和bootloader通信的協議)。


2. 插上開發板(有提示音)後,port下拉框會展示開發板的串口號。


3. 在executable編輯框中輸入badusb需要執行的按鍵序列"&500&$rcmd",再選擇要燒錄到FLASH的固件(只需要燒錄一次固件,以後都不需要了),點擊upload後兩次彈出命令窗口進行燒錄(第一次燒錄固件,第二次向EEPROM中寫入數據),發現開發板重啟後彈出了運行對話框並輸入了"cmd"。


4. 修改executable編輯框的內容為"&500&$rcmd;"(多了一個分號,也就是多按了一個回車鍵),再次點擊upload(因為沒有選擇固件,所以不會進行固件的燒錄,只會修改EEPROM的數據),發現開發板重啟後彈出運行對話框緊接著迅速彈出了命令窗口。


5. 之後又修改了兩次executable編輯框的內容並燒錄以修改EEPROM的數據,發現一次是只彈出了powershell窗口,一次是彈出了powershell窗口後又執行了三條powershell指令。




七、技術展望


這次的示例只是展示了利用arduino leonardo開發板模擬usb鍵盤,而windows一旦鎖屏,模擬成鍵盤滑鼠之類的badusb就失效了。而有人發現在鎖屏狀態下插入網卡會讓windows操作系統發送dhcp請求給新插入的網卡分配ip,那麼是不是可以讓usb設備模擬成網卡兼dhcp伺服器兼dns伺服器,達到在鎖屏狀態下通過badusb劫持流量、竊取信息的目的?雖然有局限性,但是也說明了一個問題——badusb不只是簡單地利用usb協議的漏洞,還可以結合操作系統的一系列特性(缺陷?)在看似不可能的環境下執行,badusb的技術還有很多可以探索的地方。




八、總結


1. 理一下思路,要製作badusb,就要保證能編寫出相應的固件並能通過某種手段將固件燒錄到usb設備中。要想通過這兩點,最方便的就是使用arduino或者teensy這類開發板,否則就需要看有沒有官方的集成開發環境,比如Cypress官網就提供了詳細的開發文檔、示例、開發環境等。


2. arduino開發板主要使用的是atmel廠商的微控制器,編譯工具和燒錄工具也是來自開源項目avr libc。可以在arduino ide中「文件->首選項->設置」勾上顯示編譯和上傳的詳細輸出,然後使用ide的上傳功能上傳一個示例代碼,在輸出窗口就能看到很多有用的信息。附上一個示例:



圖3 arduino ide詳細輸出信息(a)


3. 看到圖4的輸出信息,應該可以聯想到通過軟體複位開發板其實是通過以1200bps速率和開發板進行串口通信,再進一步去看Windows串口通信時發現還需要設置幾個其他參數,這時候怎麼辦呢?只能看arduinoide是怎麼設置那些參數的,通過以下幾個步驟尋找到arduino ide設置相關參數的源代碼(arduino ide的源代碼github上有):


①在源代碼根目錄使用findstr /Sn /c:"Foundupload port"查找含有字元串「Found upload port」的文件,發現路徑為arduino-coresrcccarduinopackagesuploadersSerialUploader.java:276:(findstr是Windows提供的在文檔中查找字元串的工具)


②查看Serial Uploader代碼,發現字元串「Found upload port」在waitForUploadPort方法中,進一步發現調用了waitForUploadPort方法的是uploadUsingPreferences方法,在uploadUsingPreferences方法中發現調用了Serial.touchForCDCReset方法,通過方法名字猜測這個函數和開發板複位有關。


③再次使用findstr /Sn /c:」touchForCDCReset"找到touchForCDCReset方法的實現是在文件arduino-coresrcprocessingappSerial.java:90:中。


④在Serial.java中發現有這麼一行代碼:


SerialPort.setParams(1200,8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);


到這裡可以大膽猜測出利用串口通信的方式複位開發板時除了1200這個參數值外其他參數的值了。



圖4 arduino ide詳細輸出信息(b)


4. 通過圖5可以看到arduino ide在調用avrdude.exe燒錄固件到我的開發板時的一系列參數(-p就是partno,-c就是programmer,-b就是baudrate,可以發現和我前面演示時設定的參數是一樣的,因為我的那些參數就是根據這裡顯示的設置的)。有興趣的可以看看「Arduino安裝路徑hardwarearduinoavr」目錄下的boards.txt、platform.txt和programmers.txt,應該會有很多收穫。


5. 想利用arduino開發板製作有用的,或者擴展性強的badusb,需要理清以下邏輯:


①arduino開發板使用的主要是atmel廠商的微控制器,而atmel廠商的微控制器集成了SRAM,FlASH和EEPROM,其中arduino開發板中的FLASH高地址存放了某種bootloader,低地址則存放用戶上傳到開發板的固件;arduino開發板的EERPOM可以根據自己的情況使用。


②arduino開發板複位時,先啟動bootloader,一段時間(通常是幾秒)後啟動用戶的固件。而avrdude.exe燒錄過程其實就是在複位時和arduino開發板的bootloader通信,所以只有在bootloader啟動階段利用avrdude.exe才能成功燒錄。一定要把握好時間。


③固件程序可以從eeprom或flash中讀取數據,而intelhex格式文件可以控制將數據寫入特定存儲器的特定地址,利用這一點可以極大的擴展badusb的功能,而且將要執行的指令放在flash或者eeprom中也能在一定程度上起到隱藏效果。


Arduino+Avr libc製作badusb效果展示:




看不到視頻?


https://v.qq.com/x/page/l03900zm1pe.html


* 原創作者:泥殼安全,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

驗證碼安全那些事
最具同情心的勒索軟體套件Philadelphia
【漏洞預警】Linux內核ipv4/udp.c 遠程任意代碼執行(CVE-2016-10229)
【突發新聞】「血雨腥風」將至?方程式組織黑客工具包再曝光,大量針對Windows系統嚴重0day泄露

TAG:FreeBuf |

您可能感興趣

亞馬遜ASIN Localization是什麼?亞馬遜ASIN Localization講解&Listing合規精華
Spring IoC講解
關於webview最詳細講解(包含 h5 和android 交互)
The Weather Channel用MR講解颶風逃生指南
Office—Excel真題十六講解
protobuf深入講解
緩衝區實例講解之protostar stack3挑戰篇
如何設置Facebook主頁?Facebook主頁設置教程(附視頻講解)
各大城市講解——City Class
小優化卻有大效果,KOL深度講解TouchBoost
詳解Linux命令-sed語法和實例講解
Magic Leap CEO專訪,講解為何ML1沒用光場技術
亞馬遜新手開店 | FBA庫存管理& Prime Day備貨技巧講解
Tensorflow實戰講解神經網路搭建詳細過程
python裝飾器內容講解,告訴你python裝飾器是什麼
王自如親測iPhone xs Max,吳醒峰:信號講解有問題
Survios CTO將在線開課,實戰講解VR項目開發
Imagination首次線上講解!如何為端側智能開發靈活高效的人工智慧解決方案|報名
動感的宇舶恆寶BigBang大爆炸腕錶講解!
54頁PPT講解DeepMind深度學習及前沿進展【附下載】