hackops-academy/glacier
GitHub: hackops-academy/glacier
一款功能完整的 Web 应用安全扫描器,集拦截代理、被动/主动扫描、爬虫、Repeater 和 Fuzzer 于一体,提供原生桌面 GUI。
Stars: 1 | Forks: 0
# Glacier
### 由 HackOps Academy 制作
一款从零开始构建的 Web 应用安全扫描器 —— 拦截代理、
被动扫描器、爬虫、主动扫描器,以及原生桌面 GUI —— 隶属
HackOps Academy 旗下。
## 功能简介
- **拦截代理** — 捕获流经其中的每一个请求/响应
(基于 [mitmproxy](https://mitmproxy.org/) 构建)
- **被动扫描器** — 自动检查捕获的流量,查找缺失的安全 header、
不安全的 cookie、服务器版本泄露、冗长的错误消息以及暴露的敏感信息(API keys、JWTs、私有
密钥)—— 绝不发送额外流量,纯检查
- **爬虫** — 从起始 URL 抓取目标,跟踪同一 host 内的链接和
表单动作
- **主动扫描器** — 按需、针对单一 URL 进行测试,检测反射型 XSS、
SQL injection(基于错误、基于布尔的盲注以及基于时间的盲注)、
路径遍历 / 本地文件包含、OS 命令注入(反射型与
盲注/基于时间)以及开放重定向,采用标准的公开
检测方法。运行前需要明确的确认。
- **Repeater** — 手动请求编辑器:从零开始构造请求,或者
直接从 History 中提取一个,调整方法/headers/body,重新发送,
并比较响应。每次发送都会被记录,因此您可以跳回到任何
较早的尝试。与主动扫描器不同,它没有确认门槛 —— 它
完全且仅发送您明确键入的那一个请求,信任模型与
curl 或浏览器的开发者工具相同。
- **Fuzzer** — Intruder 风格的批量测试:在请求的任何位置(URL、header 或 body)
用字面量 `FUZZ` 标记注入点,
提供一个 wordlist,每个 payload 发送一次请求。结果会显示
在可排序的表格中(按状态码、响应长度或时间),以便
让数百个批次中那一个异常响应脱颖而出。通过 History 或 Repeater 一键即可
直接进入。受限于明确的确认和 1000 个 payload 的硬性上限,姿态与
主动扫描器相同。
- **Findings 管理** — 将多个页面中重复的问题进行去重,
分组为 findings,并跟踪 open/fixed/false-positive 状态
- **HUD** — 将所有功能整合在一起的原生 Electron 桌面 GUI
## 架构
```
proxy (mitmproxy addon) → SQLite ← API (FastAPI) ← HUD (Electron)
↓
passive scanner (runs automatically on every captured response)
spider / active scanner → triggered on demand via the API, write into
the same SQLite findings table
```
每个组件都与同一个 SQLite 数据库通信(`proxy/glacier.db`,
自动创建,已被 gitignore)。proxy 和 API 是独立的
进程,因此 API 可以在 proxy 持续在后台捕获的同时,
为 HUD 提供实时服务。
## 快速开始
需要 Python 3.10+、Node.js 18+,以及(可选地)用于
单命令启动的 `tmux`。
```
git clone
cd glacier
./setup.sh # creates the venv, installs Python + Node dependencies
./start.sh # launches proxy, API, and HUD together in tmux panes
```
没有 `tmux`?`start.sh` 会打印出三条命令,供您在不同的终端中手动运行。
一旦 HUD 窗口打开,输入 `http://localhost:8090` 并点击
**Connect**。
### 使用代理
将您浏览器的 HTTP/HTTPS 代理指向 `127.0.0.1:8081`,然后
通过该代理访问一次 `http://mitm.it` 以安装并信任 mitmproxy 的
CA 证书(HTTPS 拦截所必需)。
### 在扫描真实目标之前进行安全测试
`tools/vulnerable_test_app.py` 是一个小型刻意包含漏洞的本地
Flask 应用(包含 SQLi、XSS、路径遍历、OS 命令注入和开放
重定向 endpoints,并为每一个提供了妥善防护的“安全” endpoints
作为阴性对照)。在将其指向任何真实目标之前,使用它来确认主动扫描器是否正常
工作:
```
. venv/bin/activate
python3 tools/vulnerable_test_app.py # http://127.0.0.1:5001
```
### 测试已认证区域
爬虫和主动扫描器都可以针对已登录的会话运行,因此
受保护的页面会被发现并测试,而不是被静默跳过。
提供两种模式,在 `/api/spider/start`、
`/api/active/scan` 和 `/api/pipeline/scan` 上作为可选的 `auth` 对象传入:
**Cookie 模式** - 粘贴您已有的会话 cookie(例如手动登录后
从您的浏览器中复制的):
```
{"auth": {"mode": "cookie", "cookie_header": "session=abc123"}}
```
**表单模式** - 工具自行执行登录,并且会检测
扫描过程中的登出(会话超时等)并自动重新认证:
```
{"auth": {
"mode": "form",
"login_url": "https://target.example.com/login",
"username": "hackops", "password": "hackops",
"success_indicator": "Welcome back",
"logout_indicator": "Please log in"
}}
```
`success_indicator` / `logout_indicator` 是可选的,但推荐使用 —
它们让工具能够注意到在扫描过程中被登出,
并自行恢复。包含的 `tools/vulnerable_test_app.py`
具有真实的登录流程(`hackops` / `hackops`)和一个受保护的 `/account`
页面,可用于对此进行测试。
## 项目布局
```
proxy/ intercepting proxy addon + shared SQLite storage layer
passive/ passive scan rules + engine
spider/ crawler
active/ active scanner (XSS / SQLi / path traversal / cmd injection / open redirect detection)
auth/ authentication support (cookie or form login, session/logout handling)
repeater/ manual request editor core (sender.py)
fuzzer/ Intruder-style batch request engine (engine.py)
api/ FastAPI server tying it all together
tools/ vulnerable_test_app.py - safe local test target
hud/ Electron desktop GUI
```
## API 参考(简述)
| Endpoint | Method | 用途 |
|---|---|---|
| `/api/sites` | GET | 捕获的 hosts |
| `/api/traffic` | GET | 捕获的请求/响应 |
| `/api/traffic/{id}` | GET | 单条消息详情 |
| `/api/findings` | GET | 扁平的 findings 列表 |
| `/api/findings/grouped` | GET | 按 host+name+risk 去重的 findings |
| `/api/findings/summary` | GET | 按风险等级分类的 open findings 计数 |
| `/api/findings/{id}` | PATCH | 更新单个 finding 的状态 |
| `/api/findings/bulk-status` | PATCH | 一次性更新所有匹配的 findings |
| `/api/spider/start` | POST | 开始爬取 |
| `/api/spider/status/{job_id}` | GET | 爬取进度 |
| `/api/spider/results/{job_id}` | GET | 发现的 URL |
| `/api/active/scan` | POST | 对单个 URL 启动主动扫描(需要 `confirm: true`) |
| `/api/active/status/{job_id}` | GET | 扫描进度/结果 |
| `/api/pipeline/scan` | POST | 爬取站点并自动扫描发现的每一个带参数的 URL(需要 `confirm: true`,认证爬取/扫描可选传入 `auth`) |
| `/api/pipeline/status/{job_id}` | GET | 流水线进度/结果 |
| `/api/repeater/send` | POST | 发送一个手动指定的请求,记录它,并返回响应 |
| `/api/repeater/history` | GET | 列出已发送的 Repeater 请求 |
| `/api/repeater/{id}` | GET | 单个 Repeater 条目的完整详情(请求 + 响应) |
| `/api/repeater/{id}` | DELETE | 删除单个 Repeater 条目 |
| `/api/fuzz/start` | POST | 启动一次 fuzz 运行(需要 `confirm: true` + `FUZZ` 标记,上限 1000 个 payload) |
| `/api/fuzz/stop/{job_id}` | POST | 取消正在运行的 fuzz 任务 |
| `/api/fuzz/status/{job_id}` | GET | 进度(`completed`/`total`/`status`) |
| `/api/fuzz/results/{job_id}` | GET | 结果,可通过 `sort_by`/`order` 查询参数排序 |
| `/api/fuzz/result/{id}` | GET | 单个 fuzz 结果的完整详情(payload + 响应) |
| `/api/fuzz/jobs` | GET | 列出过去的 fuzz 任务 |
| `/api/fuzz/wordlists` | GET | 内置 wordlist 的名称和大小 |
## 许可证
Apache License 2.0 — 详见 [LICENSE](LICENSE)。
标签:CISA项目, GUI应用, MITM代理, Web安全, 加密, 抓包代理, 漏洞扫描器, 蓝队分析, 逆向工具