Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
DSCourier_BOF — DSCourier项目的BOF POC / 通过COM调用WinGet | Kitploit
工具/GitHubGitHub/octoberfest7/dscourier_bof
权限提升漏洞利用横向移动后渗透利用渗透测试命令与控制红队Payload 开发
GitHuboctoberfest7/dscourier_bof

DSCourier_BOF

DSCourier项目的BOF POC / 通过COM调用WinGet

查看仓库
90784个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

DSCourier BOF

这是 Dylan Davis 和 Matthew Schramm 的 DSCourier 项目的 BOF 实现。它使用 WinGet 的 COM 接口在微软签名且受信任的进程中执行任意 PowerShell 代码。他们的完整研究博客可以在这里找到。

与我发布的大多数项目不同,这并非一个可直接投入使用的工具,而更像是一个概念验证(POC)。在发现了若干阻碍其成为可部署 BOF 的问题后,我决定不再进一步推进。代码几乎完全由 AI 生成(clanked)。仍有多个问题尚未解决,将在下文讨论。

用法

将你的任意 PowerShell 代码放入 dist/rev.yml 文件中。默认文件中包含来自原仓库的一个简单 PowerShell 反弹 Shell。如果你选择使用它,请确保将现有示例中的 IP 替换为你想要的 IP。

使用 PowerShell 反弹 Shell 的示例:

alt text

alt text

工作原理与限制

以下按随机顺序列出该工具的一些问题/限制。

  1. 要使 COM 调用成功,Microsoft.Management.Configuration.winmd 文件必须与执行 COM 调用的可执行文件位于同一目录。例如,当从脱壳的 system32 进程中运行 Beacon 时,普通用户没有写入权限,这立即会带来问题。为了解决这个问题,该文件被放置到 %APPDATA%\temp,并通过内联钩子 Hook 了 WinTypes!RoGetMetaDataFile 函数(该函数用于获取 winmd 文件路径),以便我们提供临时路径位置。这样允许读取 winmd 文件 / COM 调用成功,但意味着会产生 VirtualProtect 调用和 DLL 内存覆盖,从而留下 IOC。
  2. 继第1点之后,运行 BOF 后,winmd 文件会被锁定在磁盘上,直到 Beacon 进程退出。我曾稍作尝试解决此问题,包括添加目前已广为人知的自删除功能,但文件仍会锁定在磁盘上。也许可以绕过或解决此问题,但这留待其他人去探索。
  3. 如原始研究中所述,由于使用了 WinGet 内的 pwsh 资源,会在 ConfigurationRemotingServer.exe 下派生出 conhost.exe 进程。Claude 建议可以加载自定义二进制模块作为资源,而不是调用 pwsh,这应该可以解决 conhost 的问题,但这需要将额外文件放到磁盘上,而且我未能使其工作。可能根本不可行。如果可行,就为将通用 .NET DLL 放到磁盘上、由 ConfigurationRemotingServer.exe 加载并执行传递的 Shellcode/参数等打开了大门。
  4. 此 BOF 实现了所需 COM 接口的异步版本。使用同步版本会导致 Beacon 挂起,直到 ConfigurationRemotingServer.exe 进程完成才能回调;以简单的反弹 Shell 为例,这意味着在 Shell 被杀死之前 Beacon 不会再次回连。切换到异步接口可避免此问题,但会引入一些时序问题。代码中硬编码了3秒的睡眠,在实际操作中用于在特定调用之间延迟,但这显然不是正确的实现方式。
  5. COM 接口定义通过从 GitHub 下载 winget-cli .msixbundle,解压,提取 .msix,找到 .winmd 文件获得。然后使用 winmdidl.exe 提取 IDL 文件。接着使用 midlrt.exe 将 IDL 转换为头文件/.c 文件,再通过 Claude 解析,仅保留所需的定义。这仍然是一团混乱的代码。这个 Microsoft 链接 可能有助于更好地理解此过程。
  6. 代码总体上比较混乱,因为它未能走出 POC 阶段。
  7. 必须在目标机器上至少运行一次 winget configure --enable 命令,BOF 才能成功。我追踪到原因是包含 ConfigurationRemotingServer.exe 的 DotNet 目录在该命令运行/二进制文件下载之前根本不存在。这些文件位于 C:\Program files\WindowsApps\... 中,低权限用户无法写入,因此我们甚至不能通过 BOF 自行将文件放到磁盘上并使事情生效。
  8. 我研究过,据我所知,这些不是 DCOM 接口,只是 COM。因此,这不是一个可用于横向移动至其他机器的可行原语。
  9. 由于第7点,在我看来,这不是一个良好/可靠的初始访问方法。如果你在禁用 WinGet 的机器上着陆(参见原始博客文章),或者尚未运行 configure --enable 命令,你会被硬性阻止。对于后渗透目的,它可能有价值,但你在某种程度上受限于它是一个固定的进程,会派生/运行你的代码,而由于使用 pwsh,会有 AMSI 介入。

编译

此工具的编写未使用常规的 BOF API 声明(例如 bofdefs.h 文件)。如 Matt Ehrnschwender 的这篇博客文章所述,可以在编译后使用 objcopy 将格式为 DLL$API 的正确符号修补到 BOF 中。

我编写了一个名为 BOFPatcher 的工具来自动化此过程。它使用户能够像编写普通 C 代码一样编写 BOF,而无需担心繁琐的 API 声明:

alt text

此工具仅对购买我的 BOF 开发与战术 课程的用户开放。

虽然 BOFPatcher 工具未包含在此仓库中,但此工具的 Makefile 会调用 objcopy,并传入包含正确符号替换的 imports_dscourier64.txt 文件,从而使 BOF 可用。

致谢

  1. 感谢 Dylan 和 Matt 的出色工作。希望看到他们更多成果!
  2. 感谢 Claude 通过 AI 生成了大部分代码(clanking)。
下载工具