这是一个简单的概念验证和模板,用于开发Cobalt Strike的自定义C2通道,通过反射加载器应用IAT钩子。
博客文章:https://codex-7.gitbook.io/codexs-terminal-window/red-team/cobalt-strike/building-custom-c2-channels-by-hooking-wininet
TCP通道的演示动图

customCallback.h、hook.c、hash.h和hook.h文件是粗略的模板,但它们可以放入Crystal kit中直接作为概念验证使用。将它们放入udrl/src文件夹,替换现有的副本。tcg.h保持不变(来自Raphael Mudge的tradecraft garden)。
examples/文件夹中的示例可以直接使用,但它们只是示例,编写时未考虑运营因素。谨慎使用。
当前示例包括:
注意,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通信。即使在当前状态下,它仍然受限于以下架构:
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函数以执行以下操作:
您可以通过参数使用HTTP请求的原始主机和端口(您从Cobalt设置):
const char *host
INTERNET_PORT port
并修改broker.py中的handleCallback()函数以执行以下操作:
process_encoded_request(你的回调数据)就这样。
例如,customCallback.h中customCallback()函数的概念验证当前执行以下操作:
request.txtresponse.txt读取响应broker.py中handleCallback函数的概念验证当前执行以下操作:
request.txt读取回调process_encoded_request(encoded_request)response.txtusage: 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请求。请自行决定如何处理这些信息。
是的,我使用了LLM来编写一些代码和注释,没有人喜欢写文档或从头开始用C编写样板JSON解析。起诉我吧。
通常的免责声明,对于您使用这段糟糕代码可能犯下的反人类罪行或引发的核战争,我不承担任何责任。