xndbogdan/Helix-CTF-Challenge

GitHub: xndbogdan/Helix-CTF-Challenge

一个基于 Laravel Zero 的命令行 CTF 攻击工具包,用于自动化解决 Helix 夺旗赛的各项挑战。

Stars: 0 | Forks: 0

# Helix CTF 工具包 (`ctf-cli`) 一个基于 [Laravel Zero](https://laravel-zero.com) 的命令行工具包,用于解决 **Helix // Code Society × QA DNA** 夺旗赛(capture-the-flag)挑战。在明确这项工作完全基于控制台驱动(HTTP 探测、枚举、payload 重放)之后,它从一个完整的 Laravel 应用移植而来 —— 对于这项工作而言,CLI 是正确的形态,无需携带 HTTP 层、视图或数据库。 这是一个**攻击性工具包**,而不是一个 CTF 平台。每条命令都会与实时目标进行通信,并重放用于恢复每个 fragment 的技术。 - **目标:** `https://challenge.qadna.co` (AWS 上的 nginx 运行 Next.js) - **活动:** Helix // Code Society × QA DNA - **选手 handle:** Bobee - **状态:** 全部 7 个挑战已解决(最后两个是根据官方 walkthrough PDF 在赛后重建的) ## 环境要求 - PHP 8.2+ - Composer - 对目标的网络访问权限 ## 安装 ``` composer install ``` CLI 入口是项目根目录中的 `application` 二进制文件: ``` php application list # show all commands php application ctf:session # run a command ``` ## 配置 所有目标设置都位于 [`config/ctf.php`](config/ctf.php) 中,可以通过环境变量覆盖: | 键 | 环境变量 | 默认值 | 备注 | |-----|---------|---------|-------| | `base_url` | `CTF_BASE_URL` | `https://challenge.qadna.co` | 目标 base URL | | `resume_code` | `CTF_RESUME_CODE` | `HLX-LMST-QL` | 玩家会话 cookie (`helix_player`) | | `handle` | `CTF_HANDLE` | `Bobee` | 选手 handle | | `player_id` | — | `8cab29c0-…` | 用作伪造 JWT 中的 `sub` claim | | `login.*` | — | dna_admin / Pr0b3_D33p! / QX-7291 | 挑战 #1 凭据 | | `access_token` | — | `xK9mQ2vL8nR3` | 泄露的 accessToken;被 #2 和 #5 复用 | ## 命令 ### ctf:session 针对 `/api/resume` 恢复玩家会话,将响应存储在 `storage/app/session.json` 中,然后查询 `/api/me` 以打印排名、积分、解决次数和活动状态。 ``` php application ctf:session ``` ### ctf:solve {challenge?} 重放已解决挑战的 payload 并打印恢复的 fragment / score code。如果不带参数(或使用 `all`),它将按顺序运行每个挑战。 ``` php application ctf:solve # interactive picker php application ctf:solve all # replay everything php application ctf:solve jwt-forge # one challenge ``` 有效的挑战名称:`login`、`escalation`、`reports`、`projects`、`resolve`、`idor`、`jwt-forge`。 ### ctf:enumerate {endpoint} 针对某个 endpoint 遍历 ID 范围,并标记主体长度偏离最常见长度的响应 —— 这项技术用于发现隐藏记录(挑战 #7 / IDOR)。 ``` php application ctf:enumerate /api/reports --from=1 --to=200 php application ctf:enumerate /api/notes --method=POST --param=id --body='{"id":{ID}}' php application ctf:enumerate /api/audit-log --header='Authorization: Bearer ' ``` | 选项 | 默认值 | 用途 | |--------|---------|---------| | `--method` | `GET` | HTTP 动词 | | `--param` | `id` | 携带 ID 的查询/主体参数 | | `--from` | `1` | 起始 ID | | `--to` | `200` | 结束 ID | | `--body` | — | JSON 主体模板;每次请求替换 `{ID}` | | `--header` | — | 作为 `Key: Value` 的额外 header | ## 挑战 所有 7 个挑战都是**相互独立的 bug** —— 它们之间没有链式反应,也没有认证前置条件。 | # | 名称 | 类型 | 技术 | |---|------|-------|-----------| | 1 | login | Auth bypass | 凭据隐藏在 HTML 注释(`dna_admin`)、浏览器控制台(`Pr0b3_D33p!`)和 `/api/config`(`QX-7291`)中。 | | 2 | escalation | Privilege escalation | `POST /api/profile` 泄露了 `availableRoles:[…,"admin"]` 以及一个免费的 `accessToken`;使用 `X-Access-Token` + `{"role":"admin"}` 进行重放。 | | 3 | projects | Broken access control | 客户端可修改的 `clearance` cookie —— 重发带有 `clearance=admin` 的 `GET /api/projects` 即可解锁锁定的项目 12。 | | 4 | reports | Hidden in plain sight | `/api/fragment-clue?fragment=reports` 直接返回 score code。 | | 5 | resolve | Obfuscated JS | `/analytics-helper.js` 暴露了 `window._resolve(token, seed)`,该方法会将 `accessToken` + `sessionSeed` POST 到 `/api/resolve`。 | | 6 | jwt-forge | JWT manipulation | 伪造一个带有 `role:auditor` 的 `alg:none` token 并请求 `/api/audit-log`。 | | 7 | idor | IDOR | `/api/reports` 泄露了 `nextPageStart:9999` —— 一个可预测的越界 cursor;`GET /api/reports/9999` 返回隐藏的内部报告。 | ## 项目布局 ``` app/Commands/ CtfSession.php # resume session, dump status CtfSolve.php # replay solved-challenge payloads CtfEnumerate.php # ID enumeration / anomaly detection config/ctf.php # target + player configuration ``` ## 备注 - 会话以 `helix_player` cookie(即 resume code)为键。 - Fragment / score code 是**针对特定玩家的** —— 抄袭其他参赛者的代码毫无用处;每项技术都必须触发你自己的揭示。 - 有关完整的侦察日志,请参阅 [`CLAUDE.md`](CLAUDE.md):记录了每个发现的 endpoint、提示、decoy 和死胡同。 基于 [Laravel Zero](https://laravel-zero.com) 构建,这是一个采用 MIT 许可证的用于控制台应用程序的微框架。
标签:CISA项目, CTF工具, ffuf, Laravel, OpenVAS, PHP, StruQ, 漏洞搜索