Clippy Goes Rogue (GoClipC2)
概述
GoClipC2是一种基于Windows剪贴板的隐蔽C2通道,专为VDI/RDP环境设计。通过加密的Base64消息传递绕过网络监控。
开发背景
一年前在VDI实验环境中发现剪贴板功能受限(无法直接复制二进制文件),但支持文本粘贴。通过Base64编码实现文件转换传输,初期手动操作后改进为自动化分块传输。
ChunkyIngress解构
核心PowerShell脚本实现文件分块编码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
if ($mode -eq 'encode') {
$fileBytes = [IO.File]::ReadAllBytes($inputPath)
$base64String = [Convert]::ToBase64String($fileBytes)
$chunkSize = 68KB # 可调整分块大小
$chunkCount = [math]::Ceiling($base64String.Length / $chunkSize)
Write-Output "准备传输 ${chunkCount} 个数据块"
Write-Output "粘贴每个块后按回车继续"
for ($i = 0; $i -lt $chunkCount; $i++) {
$startIndex = $i * $chunkSize
$chunk = $base64String.Substring($startIndex, [math]::Min($chunkSize, $base64String.Length - $startIndex))
Set-Clipboard -Value $chunk
Write-Output "块 $i 已复制到剪贴板。按Enter继续或Ctrl+C退出。"
Read-Host
}
Write-Output "总共创建块数: $chunkCount"
}
|
解码方式:
1
2
|
$BuildMahFile = [Convert]::FromBase64String("")
[IO.File]::WriteAllBytes('ChunkyIngress.7z', $BuildMahFile)
|
剪贴板API深度解析
Windows剪贴板核心API:
-
打开/关闭:
- OpenClipboard(hwnd) - 打开剪贴板
- CloseClipboard() - 关闭剪贴板
- EmptyClipboard() - 清空剪贴板
-
数据操作:
- SetClipboardData(format, handle) - 设置数据
- GetClipboardData(format) - 获取数据
- IsClipboardFormatAvailable(format) - 检查格式
- EnumClipboardFormats(format) - 枚举格式
-
常用格式:
- CF_TEXT - ANSI文本
- CF_UNICODETEXT - Unicode文本
- CF_BITMAP - 位图图像
- CF_DIB - 设备无关位图
Windows剪贴板演进史
- Windows XP及更早: 基础格式支持,无剪贴板历史
- Vista/7: 增强格式支持,UAC集成,应用隔离
- Windows 8/8.1: 应用间复制限制
- Windows 10: 剪贴板历史(25项),跨设备同步,时间线记录
- Windows 11: 扩展历史记录,格式检测增强,搜索功能
C2通道构建
基于ChunkyIngress的成功,开发GoClipC2作为客户端-服务器架构的POC:
- 服务器作为控制器
- 客户端部署在目标VDI/RDP主机
- 无外网端口连接,提升操作安全性
- 支持通过ChunkyIngress传输客户端二进制文件
工具开发历程
v0.0.1: 核心通信
- 500ms剪贴板轮询(后调整为数秒降低噪音)
- AES-GCM加密所有流量
- JSON消息结构含唯一ID
- 心跳功能
v0.0.2: C2操作功能
- VDI/RDP环境检测: 多向量进程检测
- 文件上传/下载: 分块传输架构,进度跟踪,错误恢复
- 命令队列系统: 多命令同时执行
- 后台持久化控制: 窗口显示/隐藏切换
- 睡眠/唤醒功能: 可配置休眠时间(60%成功率)
- 进程列表枚举: 隐藏窗口执行tasklist
1
2
3
4
|
cmd := exec.Command("tasklist", "/fo", "table", "/v")
cmd.SysProcAttr = &syscall.SysProcAttr{
HideWindow: true,
}
|
工作原理
C2通道通过Windows剪贴板运作,消息类型包括:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
const (
MSG_HEARTBEAT = "HB"
MSG_COMMAND = "CMD"
MSG_RESPONSE = "RESP"
MSG_DATA = "DATA"
MSG_ERROR = "ERR"
MSG_SHELL = "SHELL"
MSG_SLEEP = "SLEEP"
MSG_WAKE = "WAKE"
MSG_SET_HEARTBEAT = "SET_HB"
MSG_STATUS = "STATUS"
MSG_QUEUE = "QUEUE"
MSG_QUEUE_STATUS = "QUEUE_STATUS"
MSG_DOWNLOAD = "DOWNLOAD"
MSG_UPLOAD = "UPLOAD"
MSG_FILE_CHUNK = "FILE_CHUNK"
MSG_FILE_COMPLETE = "FILE_COMPLETE"
MSG_FILE_ERROR = "FILE_ERROR"
MSG_PERSIST = "PERSIST"
MSG_ENV_INFO = "ENV_INFO"
MSG_SCREENSHOT = "SCREENSHOT"
MSG_KEYLOG = "KEYLOG"
MSG_PROC_LIST = "PROC_LIST"
)
|
示例输出
所有消息以加密Base64 blob形式发送,前缀"SYUPD"伪装系统更新数据:
1
|
SYSUPD:cwOXba5E9tldKP8xwdLy7LatBk6IMTs26u/i3JUTK3PanCvGivcvw80CJSCh6jkTymGg+qzzRxsB3E+W9Xh7uJFOSDuIk+AVRmOwt5e+NC2T5HRdz48CjeFDs4r+1RIFNXtu0X1+UsZDhxcEXBr/R2piJIai4x9jfixOavp+W/UD6es4bLJgxXbvwh6DNjTHuaEbbCj2jtjBva+Q09UXENTOwa1ftJKBxt3CpQzb
|
检测机会
Sysmon事件ID检测
- 事件ID 1 (进程创建): 检测客户端执行、隐藏窗口执行、临时目录进程
- 事件ID 7 (镜像/DLL加载): 检测user32.dll和kernel32.dll加载
- 事件ID 10 (进程访问): 检测进程访问和环境探测
- 事件ID 11 (文件创建): 监控文件传输和临时文件创建
Sigma规则详见: https://github.com/ZephrFish/GoClipC2/tree/main/detection
未来计划
- 发布COFFLoader端口支持进程内执行
- 增强反取证能力,使用更多原生Go函数替代子进程