2025 CISCN&CCB TimeCapsule详细解题过程
字数 1156 2025-08-29 08:30:06

2025 CISCN&CCB TimeCapsule详细解题教程

1. 环境搭建

  1. 使用jadx-1.5.1反编译jar包
  2. 保存所有源码,得到resource和source目录
    • source目录下为源码,仅保留com.ctf代码
    • resource为资源文件,依赖包存放在resource/BOOT-INF/lib下
  3. 修改端口配置(如8080被占用)
    • 在IDEA中添加修改选项调整端口

2. 反序列化链分析

漏洞点

  • /capsules/import路由下存在反序列化操作
  • 存在黑名单过滤机制

可利用类

  • 发现一个继承InvocationHandler代理和Serializable反序列化的工具类
  • 允许在触发readObject时走到这个工具类

链子后半段

  • 环境包含h2、jackson,且为jdk8版本
  • 利用signObject二次反序列化的jackson依赖

链子前半段

  • 尝试使用HashMap触发proxy.equals调用invoke
  • 发现hashCode也有invoke方法且会先触发
  • 解决方案:使用CC2的PriorityQueue思路
    • comparator方法做代理,在反序列化时调用invoke方法
    • 使用动态代理中的invoke()方法代替CC2中的TransformingComparator

EXP构造

// 测试类
TestTemplatesImpl.class
// 用于验证链子是否有效

修复方案

  • 将代理类的invoke方法置空即可绕过检查

3. 密码学部分分析

加密工具类

  • 使用AES算法、CTR模式、无填充

CTR模式特点

  • 通过逐次累加计数器加密生成密钥流
  • 最终密文分组=计数器加密的比特序列 XOR 明文分组

加密流程

  1. encrypt方法

    • 输入:byte[]数组和key
    • 创建新数组combined(IV长度+加密数据长度)
    • 将IV复制到combined前面,加密数据复制到后面
  2. decrypt方法

    • 输入:base64数据和key
    • 使用密文前16字节作为IV
    • 对剩余密文进行解密

攻击思路

  • 已知:原明文、原密文、IV可控
  • 类似AES-CBC字节翻转攻击

攻击脚本

# 密钥流生成后,构造任意密文
# 每16字节密钥流与明文异或
# 处理非16倍数情况:使用min函数取剩余数据

4. 完整复现步骤

  1. 注册

    • 完成用户注册流程
  2. 加载恶意字节码

    • 准备并加载攻击用的恶意字节码
  3. 导出原明文

    • 通过本地测试获取原明文数据
    • 访问特定路由获取
  4. 导出原密文

    • 从系统获取原始加密数据
  5. 生成新密文

    • 运行Python脚本生成攻击用密文
  6. 命令执行

    • 通过构造的密文实现反弹shell或命令执行
    • 注意:需使用Python发包才能成功执行命令

关键点总结

  1. 反序列化链构造需结合动态代理和PriorityQueue
  2. CTR模式攻击需精确控制IV和密钥流
  3. 完整攻击需分阶段获取明文、密文并构造最终payload
  4. 实际测试表明Python发包比Java实现更可靠
2025 CISCN&CCB TimeCapsule详细解题教程 1. 环境搭建 使用jadx-1.5.1反编译jar包 保存所有源码,得到resource和source目录 source目录下为源码,仅保留com.ctf代码 resource为资源文件,依赖包存放在resource/BOOT-INF/lib下 修改端口配置(如8080被占用) 在IDEA中添加修改选项调整端口 2. 反序列化链分析 漏洞点 在 /capsules/import 路由下存在反序列化操作 存在黑名单过滤机制 可利用类 发现一个继承 InvocationHandler 代理和 Serializable 反序列化的工具类 允许在触发 readObject 时走到这个工具类 链子后半段 环境包含h2、jackson,且为jdk8版本 利用 signObject 二次反序列化的jackson依赖 链子前半段 尝试使用HashMap触发 proxy.equals 调用 invoke 发现 hashCode 也有 invoke 方法且会先触发 解决方案:使用CC2的 PriorityQueue 思路 让 comparator 方法做代理,在反序列化时调用 invoke 方法 使用动态代理中的 invoke() 方法代替CC2中的 TransformingComparator EXP构造 修复方案 将代理类的 invoke 方法置空即可绕过检查 3. 密码学部分分析 加密工具类 使用AES算法、CTR模式、无填充 CTR模式特点 通过逐次累加计数器加密生成密钥流 最终密文分组=计数器加密的比特序列 XOR 明文分组 加密流程 encrypt 方法 输入:byte[ ]数组和key 创建新数组combined(IV长度+加密数据长度) 将IV复制到combined前面,加密数据复制到后面 decrypt 方法 输入:base64数据和key 使用密文前16字节作为IV 对剩余密文进行解密 攻击思路 已知:原明文、原密文、IV可控 类似AES-CBC字节翻转攻击 攻击脚本 4. 完整复现步骤 注册 完成用户注册流程 加载恶意字节码 准备并加载攻击用的恶意字节码 导出原明文 通过本地测试获取原明文数据 访问特定路由获取 导出原密文 从系统获取原始加密数据 生成新密文 运行Python脚本生成攻击用密文 命令执行 通过构造的密文实现反弹shell或命令执行 注意:需使用Python发包才能成功执行命令 关键点总结 反序列化链构造需结合动态代理和PriorityQueue CTR模式攻击需精确控制IV和密钥流 完整攻击需分阶段获取明文、密文并构造最终payload 实际测试表明Python发包比Java实现更可靠