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

盡管2MB大小的Windows報告是一個誤導,指定2MB將返回ERROR_INVALID_PARAMETER或以下映像:

指定3MB結果如下:

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

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

關于隱身性及其與小型文件的相關性,與VHD文件相比,ISO文件具有很多優勢。
你可能想知道ISO文件和VHD文件有什么共同點,因為本文著重于ISO文件安裝。ISO文件以及VHD/VHDX文件都使用相同的虛擬存儲API。此外,乍一看,在虛擬存儲API文檔中甚至沒有提到ISO文件,直到你開始閱讀通過AttachVirtualDisk安裝虛擬磁盤映像時,才會看到以下內容:附加虛擬硬盤(VHD)或CD或DVD。
映像文件(ISO),方法是找到合適的VHD提供程序以完成附件,此時你就可以了解ISO文件和VHD可以在其API省略中互換使用。
OpenVirtualDisk的調用定義如下:

第一個參數VirtualStorageType,必須是指向VIRTUAL_STORAGE_TYPE結構的有效指針,該結構定義為:

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

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

4.檢查我們的安全令牌,如果我們沒有SeManageVolumePrivilege,請提出以下請求。

5.使用正確初始化的VIRTUAL_STORAGE_TYPE結構調用OpenVirtualDisk。

6.調用AttachVirtualDisk,將ATTACH_VIRTUAL_DISK_FLAG設置為ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY和ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER。

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

9.調用CreateProcess。
10.確保成功或失敗后,所有句柄和堆都要關閉,然后退出。

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