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

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

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

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

工具目录

分类

查看所有分类
Loading categories
CustomC2ChannelTemplate — 用于通过反射加载器应用IAT钩子开发Cobalt Strike自定义C2通道的模板。 | Kitploit
工具/GitHubGitHub/codextf2/customc2channeltemplate
渗透测试框架漏洞利用框架Shellcode命令与控制红队Payload 开发
GitHubcodextf2/customc2channeltemplate

CustomC2ChannelTemplate

用于通过反射加载器应用IAT钩子开发Cobalt Strike自定义C2通道的模板。

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

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

用于自定义C2通道的IAT钩子

这是一个简单的概念验证和模板,用于开发Cobalt Strike的自定义C2通道,通过反射加载器应用IAT钩子。

博客文章:https://codex-7.gitbook.io/codexs-terminal-window/red-team/cobalt-strike/building-custom-c2-channels-by-hooking-wininet
TCP通道的演示动图 gif.gif

使用方法

customCallback.h、hook.c、hash.h和hook.h文件是粗略的模板,但它们可以放入Crystal kit中直接作为概念验证使用。将它们放入udrl/src文件夹,替换现有的副本。tcg.h保持不变(来自Raphael Mudge的tradecraft garden)。

examples/文件夹中的示例可以直接使用,但它们只是示例,编写时未考虑运营因素。谨慎使用。

当前示例包括:

  • 命名管道(代理必须运行在同一主机上)
  • TCP
  • UDP(懒得做分块,因此最大回调大小为65535)
  • NTP(懒得做分块,因此最大回调大小为65535)
  • ICMP(懒得做分块,因此最大回调大小为65535)
  • WebSockets(仅适用于wininet,待修复)

注意,Crystal Kit中原始的规避能力(如Draugr实现和睡眠掩码)已从hook.c中移除,以保持此代码库的清洁和可移植性。如果您希望保留这些功能,可以从Crystal Kit的原始副本中重新添加。

生成beacon DLL时,必须选择适当的HTTP库(winhttp/wininet)作为使用的HTTP库。

用于测试的可塑配置文件已提供在仓库中——理论上(大多数)其他可塑配置文件应该也能工作,但此模板是使用此配置文件(取自GraphStrike)测试的。

为什么我制作了这个?

官方的ExternalC2接口使用起来很痛苦——它需要通过externalc2通道对SMB beacon进行staging,并且(直到4.10版本)不支持在未经由externalc2代理先进行staging的情况下与预制的SMB beacon通信。即使在当前状态下,它仍然受限于以下架构:

root@kitploit:~
smb beacon --named pipe--> externalc2 agent --custom channel--> externalc2 handler --> teamserver

是的,我知道UDC2已在Cobalt Strike 4.12中添加。这只是一个有趣的实验,旨在在UDRL中复制该功能。

概念很简单——如果你能钩住用于回连的WinAPI,你就已经拥有了回连所需的所有数据。这种实现自定义C2通道的方法以前已经做过,如GraphStrike所示。

然而,GraphStrike的实现仍然与HTTP协议本身紧密耦合。此仓库的目标是提供一个易于使用、修改和扩展的模板,用于实现任何自定义通道(HTTP或其他),只需对周围代码进行少量修改。

扩展模板

此模板显然不打算以其默认状态使用,因此要实现您选择的C2通道,您需要修改以下内容:

customCallback函数以执行以下操作:

  1. 以任何必要的方式传输base64 blob(其第一个参数)
  2. 获取响应并返回

您可以通过参数使用HTTP请求的原始主机和端口(您从Cobalt设置):

root@kitploit:~
const char *host
INTERNET_PORT port

并修改broker.py中的handleCallback()函数以执行以下操作:

  1. 接收回调
  2. 调用process_encoded_request(你的回调数据)
  3. 发送响应回去。

就这样。

例如,customCallback.h中customCallback()函数的概念验证当前执行以下操作:

  1. 将base64 blob写入文件request.txt
  2. 等待500ms
  3. 从文件response.txt读取响应
  4. 返回文件内容

broker.py中handleCallback函数的概念验证当前执行以下操作:

  1. 从request.txt读取回调
  2. 调用process_encoded_request(encoded_request)
  3. 将响应写入response.txt

usage: broker.py [-h] --host HOST --port PORT 其中主机和端口指向团队服务器上的HTTP监听器。代理解析HTTP请求并将其发送到实际的监听器。

其他随机的有趣事实(对任何在乎的人)

这可能是实现这个目标的"最懒惰"的方式,但也是最稳定的方式之一。它基本上只是将整个HTTP请求打包,然后以您希望的任何方式将其发送到代理,代理再将其发送到真实的团队服务器,作为HTTP beacon运行,对团队服务器完全透明。

有一种(技术上)更干净的实现,我尝试过,涉及使用一个极简的可塑C2配置文件(实际上我使用了GraphStrike的那个),并在wininet钩子内部根据可塑规范解析不同的beacon数据组件(id、metadata、output等)。这会使回调blob的大小稍小一些,但由于请求解析,代码库变得不必要地混乱,并且还需要使用那个特定配置文件(这虽然不是什么大问题,但有点hacky)。

我认为这个实现更好,因为它不太依赖于hacky的可塑配置文件(从技术上讲,它仍然需要beacon响应输出在响应体中发送,但这是唯一的要求),而且代码可读性提高了10倍。

另外值得注意的是,除了base64编码外,HTTP请求JSON没有混淆或加密——您可以自由添加自己的混淆或加密,但由于Beacon回调已经加密,技术上没有任何数据存在被解密的风险。最糟糕的情况是,如果检索到base64 blob,可能会被识别为HTTP请求。请自行决定如何处理这些信息。

致谢和参考

  • https://github.com/rasta-mouse/Crystal-Kit (用于开发和测试的原始模板)
  • https://github.com/RedSiege/GraphStrike (IAT钩子实现Graph通道)
  • https://github.com/benheise/TitanLdr (IAT钩子实现DoH)
  • https://tradecraftgarden.org/ (用于Crystal Kit的框架,并由此扩展)

是的,我使用了LLM来编写一些代码和注释,没有人喜欢写文档或从头开始用C编写样板JSON解析。起诉我吧。

免责声明

通常的免责声明,对于您使用这段糟糕代码可能犯下的反人类罪行或引发的核战争,我不承担任何责任。

下载工具