Windows虛擬技術(shù)的武器化嘗試
幾周前,Microsoft Security Intelligence發(fā)現(xiàn)有個(gè)攻擊者論壇正在討論如何利用惡意ISO文件進(jìn)行各種惡意軟件活動(dòng)。根據(jù)分析,惡意軟件活動(dòng)也開始使用ISO文件,例如Phobos勒索軟件,ZLoader,LokiBot和Nanocore。其實(shí)這些攻擊已經(jīng)沒有什么新鮮的了,因?yàn)閻阂釯SO文件的使用已有相當(dāng)長的一段時(shí)間了。但是,據(jù)我所知,還沒有任何研究者發(fā)現(xiàn)過任何示例代碼。
準(zhǔn)確地演示如何成功地將ISO文件武器化,而不是使用相當(dāng)舊的關(guān)于ISO感染的SPTH文件。其實(shí)這也不奇怪,因?yàn)閃indows操作系統(tǒng)直到2009年10月22日才對虛擬化本身提供支持。
如果你想研究如何以編程方式安裝ISO映像,你將會(huì)非常失望。因?yàn)檫@個(gè)StackOverflow答案中顯示的代碼是錯(cuò)誤的。函數(shù)調(diào)用是準(zhǔn)確的,但是,它使最終需要完成的操作過于復(fù)雜。無論如何,我寫這篇文章不是為了bash StackOverflow問題和答案,關(guān)鍵在于該代碼。
目前網(wǎng)上關(guān)于如何安裝ISO或VHD映像的方法都存在一定的誤導(dǎo)性,因此我希望找到這個(gè)問題的真正答案。
本文將說明如何正確安裝要用于惡意目的的ISO文件,我們的目標(biāo)是在不建立用戶可見路徑或分配驅(qū)動(dòng)器號(hào)的情況下安裝ISO。本文還將簡要回顧一下ISO與VHD/VHDX。
需要注意的是,本文將不會(huì)介紹如何以編程方式生成ISO / VHD映像。其實(shí)可以使用WINAPI以編程方式執(zhí)行此操作,但這不是我的目標(biāo),我想研究的更深入一點(diǎn)。此外,本文不會(huì)針對不同的殺毒軟件廠商對該技術(shù)進(jìn)行基準(zhǔn)測試,這僅僅是一個(gè)概念驗(yàn)證。
與本文相關(guān)的代碼使用的是C WINAPI,如果你不熟悉C或WINAPI,則可能難以理解。另外,我選擇C是因?yàn)槲也幌矚gC#.NET或Python來開發(fā)惡意軟件。
ISO文件,VHD文件和虛擬存儲(chǔ)API
ISO文件和VHD文件有什么區(qū)別?答案是一個(gè)ISO文件反映光盤驅(qū)動(dòng)器的數(shù)字副本,例如CD / DVD,而VHD是實(shí)際的虛擬硬盤驅(qū)動(dòng)器。兩者都可以由Windows操作系統(tǒng)虛擬化和安裝,都利用相似的API調(diào)用,都必須通過Windows虛擬存儲(chǔ)API中的相同API轉(zhuǎn)發(fā)。如Will Dormann在卡耐基梅隆大學(xué)(Carnegie Mellon University)的論文“VHD和VHDX文件的危險(xiǎn)”中指出的那樣,ISO文件在惡意軟件活動(dòng)方面處于更大的劣勢。他證明了許多殺毒軟件可能無法以編程方式安裝VHD / VHDX文件,盡管看上去它們能夠在某種程度上解析ISO映像,但是本文并不打算深入研究這個(gè)話題。
為什么使用ISO文件而不是VHD/VHDX?本文旨在專門解決攻擊者使用的方法。與VHD/ VHDX文件相比,隱藏ISO映像也容易得多, VHD文件的最小大小為2MB。

盡管2MB大小的Windows報(bào)告是一個(gè)誤導(dǎo),指定2MB將返回ERROR_INVALID_PARAMETER或以下映像:

指定3MB結(jié)果如下:

我能夠分配的最小VHD文件是5MB GUID分區(qū)表(GPT)。

相反,如果我們使用一些通用的ISO制作器,在這個(gè)特殊的情況下,我使用MagicISO制作器,可以制作出一個(gè)更小的文件:

關(guān)于隱身性及其與小型文件的相關(guān)性,與VHD文件相比,ISO文件具有很多優(yōu)勢。
你可能想知道ISO文件和VHD文件有什么共同點(diǎn),因?yàn)楸疚闹赜贗SO文件安裝。ISO文件以及VHD/VHDX文件都使用相同的虛擬存儲(chǔ)API。此外,乍一看,在虛擬存儲(chǔ)API文檔中甚至沒有提到ISO文件,直到你開始閱讀通過AttachVirtualDisk安裝虛擬磁盤映像時(shí),才會(huì)看到以下內(nèi)容:附加虛擬硬盤(VHD)或CD或DVD。
映像文件(ISO),方法是找到合適的VHD提供程序以完成附件,此時(shí)你就可以了解ISO文件和VHD可以在其API省略中互換使用。
OpenVirtualDisk的調(diào)用定義如下:

第一個(gè)參數(shù)VirtualStorageType,必須是指向VIRTUAL_STORAGE_TYPE結(jié)構(gòu)的有效指針,該結(jié)構(gòu)定義為:

成員DeviceId必須設(shè)置為VIRTUAL_STORAGE_TYPE_DEVICE_ISO。另外,VendorId必須設(shè)置為VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT。
如果成功完成此操作,那么其他所有內(nèi)容實(shí)際上都將與VHD/VHDX文件相同。
代碼
我的概念驗(yàn)證包含很多通用編程,例如驗(yàn)證我們是否在Windows 10上運(yùn)行,獲取放置ISO文件的位置以及確保我們擁有適當(dāng)?shù)臋?quán)限。以下是代碼的功能概述:
1.獲取PEB,確保我們的代碼在Windows 10上運(yùn)行。

2.使用USERPROFILE變量調(diào)用GetEnvironmentVariable以獲取當(dāng)前用戶。
3.如果成功調(diào)用了GetEnvironmentVariable,則連接“\\Desktop\\Demo.iso”。

4.檢查我們的安全令牌,如果我們沒有SeManageVolumePrivilege,請?zhí)岢鲆韵抡埱蟆?/p>

5.使用正確初始化的VIRTUAL_STORAGE_TYPE結(jié)構(gòu)調(diào)用OpenVirtualDisk。

6.調(diào)用AttachVirtualDisk,將ATTACH_VIRTUAL_DISK_FLAG設(shè)置為ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY和ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER。

7. GetVirtualDiskPhysicalPath會(huì)檢索到我們已安裝的ISO的物理路徑。
8.如果成功調(diào)用了GetVirtualDiskPhysicalPath,請連接“\\Demo.exe”。

9.調(diào)用CreateProcess。
10.確保成功或失敗后,所有句柄和堆都要關(guān)閉,然后退出。

本文翻譯自:
https://vxug.fakedoma.in/papers/VXUG/Exclusive/WeaponizingWindowsVirtualization.pdf如若轉(zhuǎn)載,請注明原文地址。