GoClipC2:基于剪贴板的隐蔽C2通道技术详解

本文深入探讨了利用Windows剪贴板构建隐蔽C2通道的技术实现,包括Base64编码、AES-GCM加密、多版本功能演进及检测规避方法,适用于VDI/RDP环境下的红队操作。

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函数替代子进程
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计