2025 CISCN&CCB TimeCapsule详细解题过程
字数 1156 2025-08-29 08:30:06
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构造
// 测试类
TestTemplatesImpl.class
// 用于验证链子是否有效
修复方案
- 将代理类的
invoke方法置空即可绕过检查
3. 密码学部分分析
加密工具类
- 使用AES算法、CTR模式、无填充
CTR模式特点
- 通过逐次累加计数器加密生成密钥流
- 最终密文分组=计数器加密的比特序列 XOR 明文分组
加密流程
-
encrypt方法- 输入:byte[]数组和key
- 创建新数组combined(IV长度+加密数据长度)
- 将IV复制到combined前面,加密数据复制到后面
-
decrypt方法- 输入:base64数据和key
- 使用密文前16字节作为IV
- 对剩余密文进行解密
攻击思路
- 已知:原明文、原密文、IV可控
- 类似AES-CBC字节翻转攻击
攻击脚本
# 密钥流生成后,构造任意密文
# 每16字节密钥流与明文异或
# 处理非16倍数情况:使用min函数取剩余数据
4. 完整复现步骤
-
注册
- 完成用户注册流程
-
加载恶意字节码
- 准备并加载攻击用的恶意字节码
-
导出原明文
- 通过本地测试获取原明文数据
- 访问特定路由获取
-
导出原密文
- 从系统获取原始加密数据
-
生成新密文
- 运行Python脚本生成攻击用密文
-
命令执行
- 通过构造的密文实现反弹shell或命令执行
- 注意:需使用Python发包才能成功执行命令
关键点总结
- 反序列化链构造需结合动态代理和PriorityQueue
- CTR模式攻击需精确控制IV和密钥流
- 完整攻击需分阶段获取明文、密文并构造最终payload
- 实际测试表明Python发包比Java实现更可靠