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, 漏洞搜索