GraphStrike:进攻性工具开发剖析
字数 2180 2025-08-22 12:22:30
GraphStrike: 基于Microsoft Graph API的C2框架深度解析
1. GraphStrike概述
GraphStrike是一个开源工具,利用Microsoft Graph API作为命令与控制(C2)通道,将Cobalt Strike Beacon流量通过Microsoft官方域名(graph.microsoft.com)进行路由。这种技术提供了显著的隐蔽优势,因为流量会混入正常的Microsoft服务通信中。
1.1 核心优势
- 隐蔽性:C2流量通过Microsoft官方域名传输,难以被传统网络过滤检测
- 威胁模拟:模拟APT组织(如APT37、APT28等)已知使用的技术
- 易用性:相比早期实现,简化了部署和维护流程
2. 技术背景与设计原理
2.1 Microsoft Graph API基础
Microsoft Graph API提供了访问和操作Microsoft生态系统内数据的方法,包括:
- Microsoft Teams消息
- SharePoint和OneDrive文件
- Outlook电子邮件
- Azure AD用户、组和应用程序数据
2.2 通信模型对比
传统Cobalt Strike HTTPS通信
Beacon → 重定向器 → Team Server → 重定向器 → Beacon
GraphStrike通信模型
Beacon → Microsoft服务器 (graph.microsoft.com)
GraphStrike服务器 → Microsoft服务器 → Team Server
这种异步通信模型引入了额外延迟,但提供了更高的隐蔽性。
3. 关键技术实现
3.1 访问令牌管理
Graph API要求所有请求使用访问令牌,这些令牌每小时过期。解决方案包括:
- 在Beacon首次通信时获取初始令牌
- 通过挂钩WinINet API在运行时更新令牌
- 实现令牌自动刷新机制(在令牌过期前更新)
3.2 用户定义反射加载器(UDRL)
GraphStrike基于AceLdr UDRL实现,通过IAT挂钩技术拦截和修改关键API调用:
关键挂钩函数
- InternetConnectA_Hook:识别GraphStrike Beacon并初始化
- HttpOpenRequestA_Hook:修改请求动词和URI
- HttpSendRequestA_Hook:添加访问令牌到请求头
- InternetReadFile_Hook:处理异步通信状态
3.3 内存管理技术
由于位置无关代码的限制,使用创新技术存储全局变量:
- 在堆上创建自定义结构体存储函数指针和状态变量
- 通过汇编指令保留内存区域存储关键指针
- 使用特殊宏实现跨函数访问
4. SharePoint文件操作机制
4.1 文件命名约定
- 任务文件:使用Beacon元数据(base64url编码)作为文件名
- 输出文件:格式为
<元数据><分隔符><会话ID>
4.2 文件操作流程
- Beacon首次通信时在SharePoint创建两个专用文件
- Team Server将任务写入任务文件
- Beacon定期检查任务文件并执行命令
- Beacon将输出写入输出文件
- GraphStrike服务器读取输出并转发给Team Server
4.3 同步控制机制
使用文件清零作为同步信号:
- 当Beacon完成任务后,清空任务文件
- 当服务器读取输出后,清空输出文件
- 防止命令重复执行和数据丢失
5. GraphStrike服务器架构
5.1 核心功能
- 维护访问令牌有效性
- 监控SharePoint文件变化
- 在Team Server和SharePoint之间中转数据
- 管理Beacon生命周期
5.2 关键组件
- CheckBeacons:主循环,监控文件状态变化
- BeaconComms:每个Beacon的专用通信线程
- 事件处理器:协调任务和输出的传输时序
5.3 与Team Server集成
- 通过Aggressor脚本扩展Cobalt Strike功能
- 处理特殊命令(exit、sleep等)
- 使用cs-decrypt-metadata.py解析Beacon元数据
6. 部署与配置
6.1 先决条件
- Microsoft Azure租户
- 具有适当许可的SharePoint站点
- Cobalt Strike Team Server
6.2 配置流程
- 运行配置程序设置Azure应用和权限
- 生成config.h和config.py配置文件
- 编译GraphLdr UDRL
- 启动GraphStrike服务器
- 在Cobalt Strike客户端加载GraphStrike.cna
6.3 配置文件示例
// config.h
#define SHAREPOINT_ADDRESS C_PTR(OFFSET("/v1.0/sites/[site]"))
#define APP_CLIENT_ID C_PTR(OFFSET("854b480d-a5fd-4789-b2c1-511a3ee4cef7"))
#define APP_CLIENT_SECRET C_PTR(OFFSET("K7D8Q~esKoxpcHbnCeisbg4pTzzFrM3nDsSH1ca-"))
#define TENANT_ID C_PTR(OFFSET("8aCEN074b-dSO1-4Rab-99c5-e381ED492902"))
7. 防御与检测考量
7.1 潜在检测点
- 异常的Graph API调用模式
- 频繁的文件创建和修改
- 应用程序权限的使用(而非委派权限)
- 固定的Beacon检查间隔
7.2 缓解措施
- 随机化检查间隔
- 限制应用程序权限范围
- 使用合法的业务用例作为掩护
- 定期轮换客户端密钥
8. 总结与展望
GraphStrike代表了将合法云服务用于C2通信的先进技术,其主要价值在于:
- 提供高度隐蔽的C2通道
- 模拟高级威胁行为者的TTPs
- 简化复杂技术的部署流程
未来可能的改进方向包括:
- 支持WinHTTP库
- 增加更多Graph API功能作为备用通道
- 改进异步通信的性能
- 增强与Cobalt Strike新版本的兼容性
通过深入理解GraphStrike的工作原理,安全团队可以更好地防御此类技术,而红队则可以更有效地模拟高级威胁。