FlinnZee/webstrike-framework
GitHub: FlinnZee/webstrike-framework
WebStrike 是一个将多个 Kali 安全工具编排为分阶段流水线的自动化 Web 渗透测试框架,解决了工具间数据流转、技术感知决策和报告生成的工程问题。
Stars: 22 | Forks: 3
# WebStrike — 自动化 Web 渗透测试框架
```
__ __ _ ___ _ _ _
\ \ / /__| |__ / __| |_ _ _(_) |_____
\ \ /\ / / -_) '_ \\__ \ _| '_| | / / -_)
\_/\_/\___|_.__/|___/\__|_| |_|_\_\___|
Automated Web Pentesting Framework · by NiMAA
```
## 为什么选择编排器(而不是“又一个扫描器”)
Web 渗透测试的难点不在于*运行*工具——而在于根据你刚刚发现的内容决定接下来运行什么,并清晰地生成报告。WebStrike 接管了这一工作流。每个工具都保持在其本职工作上的最佳状态;WebStrike 则是指挥家。
## 设计
一个**阶段流水线**(phase pipeline)。模块声明它们属于哪个阶段;阶段按顺序运行,同一阶段内的模块**并发**运行。输出通过共享的 `Context` 流转——在侦察中发现的子域名成为探测目标,存活的 URL 成为爬取/扫描目标,依此类推。
```
recon → probe → crawl → content → vulnscan → webtest → triage → report
crt.sh whatweb katana ffuf nuclei sqlmap LLM md/html
subfinder gowitness dalfox (any) json/sarif
dnsx param-audit
oast-ssrf
```
| 阶段 | 模块 | 工具 | 侵入性 | 作用 |
|-----------|--------------------|------------|:---------:|---------------------------------------|
| recon | `crtsh` | curl | 否 | 被动子域名枚举 (crt.sh CT) |
| recon | `subfinder` | subfinder | 否 | 被动子域名枚举 |
| recon | `dnsx-resolve` | dnsx | 否 | 仅保留可解析的子域名 |
| probe | `http-probe` | whatweb | 否 | 存活检测 + 技术指纹识别 |
| crawl | `katana-crawl` | katana | **是** | 主动爬取 endpoint |
| crawl | `screenshot` | gowitness | 否 | 为存活主机截图 (视觉分类) |
| content | `content-discovery`| ffuf | **是** | 目录 / 文件暴力破解 |
| vulnscan | `nuclei-scan` | nuclei | **是** | 模板驱动的漏洞扫描 |
| webtest | `sqli-scan` | sqlmap | **是** | SQL 注入 (CWE-89) |
| webtest | `xss-scan` | dalfox | **是** | 反射型/DOM XSS (CWE-79) |
| webtest | `param-audit` | — | 否 | 标记易受 SSRF/IDOR 攻击的参数 (CWE-918/639) |
| webtest | `oast-ssrf` | interactsh | **是** | 通过 OAST 回调检测盲 SSRF (CWE-918) |
| triage | `ai-triage` | LLM (任意) | 否 | AI 优先级划分、攻击链、后续步骤 |
缺失的工具会被**跳过并给出明确提示**,绝不会导致崩溃。
## 运行模式 — 手动 vs 自动
你可以通过 `--mode`(默认为 `manual`)来选择自动化的程度:
- **`manual`**(人工干预 / human-in-the-loop):被动侦察 + 探测会自动运行。
侵入性模块(爬取、内容、漏洞扫描)会被**跳过**,除非你通过
`--enable ` 或 `--only ` 主动启用。先侦察、观察,然后再做决定。
- **`auto`**(全自动 / hands-off):每个模块都会运行,但受限于配置项中的**交战规则**(Rules of Engagement)。
### 交战规则(`auto` 模式的安全护盾)
在配置项的 `roe:` 下设置,并在 `auto` 模式下执行最严格:
```
roe:
scope_allow: ["*.acme.com", "acme.com"] # only touch these hosts ([] = any)
deny_paths: ["/logout", "/*/delete*"] # never request these paths
rate_limit: 100 # global req/sec budget (see below)
max_subdomains: 0 # 0 = unlimited
```
任何超出范围的主机和被拒绝的路径在任何工具接触它们之前都会被丢弃。
**`rate_limit` 的确切含义:**它是一个*保守的全局预算*,
而不是令牌桶。在 `auto` 模式下,它会被静态分配给并发目标 × 具备速率感知的工具,每个工具通过各自的速率参数
(nuclei/ffuf/katana 的 `-rate-limit` / `-rate`)获得其份额。因此,**聚合后的出站速率会保持等于或低于配置的值——它只会偏低,绝不会超标**,
这对于将速率保持在合同规定的上限内是安全的方向。坦白的局限性是:它信任每个工具都会遵守其参数(请求并不在一个统一的瓶颈点进行计量),提前完成的工具不会将其释放的份额交给其他工具,而且没有可用速率参数的工具(sqlmap/dalfox 是基于延迟/并发的)不受此限制。一个*真正的*全局限制器——在共享瓶颈点(内部限流代理)计量请求——已列入路线图。
## 已认证扫描(Authenticated scanning)
大多数真正的漏洞都隐藏在*登录之后*。身份验证信息会被注入到**每一个**工具
(whatweb / katana / ffuf / nuclei / sqlmap / dalfox)中:
```
auth:
headers: ["X-Api-Key: abc123"]
bearer_token: "eyJ..." # -> Authorization: Bearer eyJ...
cookies: "session=abc; csrf=def"
user_agent: "Mozilla/5.0 (engagement-xyz)"
```
…或者在 CLI 中按次运行时指定:
```
./webstrike.py scan acme.com --header "Authorization: Bearer eyJ..." --cookie "session=abc"
```
## 状态、差异对比与恢复
每次运行都会记录到 SQLite 存储中(`~/.local/share/webstrike/state.db`,
可通过 `--db` 覆盖,使用 `--no-store` 禁用)。这为你带来:
- **差异对比(Diff)** — 每次运行都会报告自该目标*上次扫描以来的新增内容*
(新增 / 已知 / 已解析),并输出到控制台和报告中。非常适合用于计划/持续监控和漏洞赏金(bug-bounty)的复查。
- **恢复(Resume)** — 每个阶段完成后都会写入一个 `checkpoint.json`。如果一次漫长的扫描
意外中断,可以继续执行:`./webstrike.py scan --resume runs/acme.com_20260612_x/`。
## 技术感知的链式调用
探测阶段会对技术栈进行指纹识别,后续阶段会**据此进行调整**——这就是编排器相对于静态脚本的优势所在:
- 检测到 **WordPress/Drupal/Joomla/Tomcat** → ffuf 自动选择特定于 CMS 的字典。
- 值得注意的技术(Jenkins, Spring, GitLab, Laravel, GraphQL, …) → 生成可操作的后续发现("Spring — 探测 /actuator …")。
- `nuclei-scan.tech_tags: true`(可选启用) → 将 nuclei 限制在与检测到的技术栈匹配的模板内(速度更快,范围更小)。
## AI 分类(大脑)
大多数编排器在得到一个扁平的漏洞列表后就停止了。WebStrike 可以将**整个测试任务**交给一个充当高级渗透测试员的 LLM——根据真实的可利用性(而不仅仅是扫描器严重性)进行排名,发现漏洞组合形成的**攻击链**,并建议下一步行动。输出结果会进入每个报告(Markdown/HTML/JSON)和控制台。
**提供商无关(Provider-agnostic)** — 它使用标准的 OpenAI 兼容 API,因此你可以使用托管模型或*本地模型*(Ollama / LM Studio / vLLM)。它是**可选启用**的:只有在设置了 API 密钥环境变量时才会运行,并且在任何数据离开主机之前会发出警告(对于敏感的测试任务,请使用本地模型)。
在配置项的 `llm:` 块中进行配置,或者随时通过环境变量将其指向任何地方(这些变量会覆盖配置项,因此无需编辑文件——交互式向导使用的正是这种方式):
```
export WEBSTRIKE_LLM_KEY=... # provider key (never committed)
export WEBSTRIKE_LLM_URL=http://localhost:11434/v1 # e.g. Ollama, for full privacy
export WEBSTRIKE_LLM_MODEL=llama3.1 # any model the endpoint serves
./webstrike.py scan acme.com --mode auto --enable ai-triage
```
对于**本地**模型,密钥会被服务器忽略,但仍然必须设置为任意非空值(它是启用该项的开关)。或者直接运行 `./webstrike.py` 并在向导的 *Advanced* 步骤中开启 AI 分类。
## 安装
```
cd webstrike
pip install -r requirements.txt # rich, pyyaml, questionary (all optional but nice)
# 外部工具 (Kali)。安装任何你缺失的:
sudo apt install whatweb ffuf
# 通过以下方式安装 nuclei / subfinder 等: go install github.com/projectdiscovery/...@latest
```
## 交互模式
运行 WebStrike 且**不带任何参数**,它就会让你进入一个引导式会话——横幅、顶级菜单以及逐步提示,让你无需记住任何一个参数就能构建并启动扫描。使用方向键选择目标、模式和模块;可选的 *Advanced* 分支涵盖了身份验证、代理、速率限制、通知和 AI 分类。
```
./webstrike.py # ← enter interactive mode
```
方向键提示在安装了 [`questionary`](https://pypi.org/project/questionary/) 时会使用它;
如果没有安装,同样的向导会退化为仅使用标准库的编号菜单——因此它在任何机器上都能运行。下面的 CLI 仍然是用于脚本和自动化的全功能接口。
## 用法
```
./webstrike.py check # what's installed?
./webstrike.py modules # list modules + tool status + intrusive flag
# manual 模式(默认):仅 passive recon 和 probe
./webstrike.py scan acme.com
# manual 模式,但选择开启 directory brute forcing
./webstrike.py scan acme.com --enable content-discovery
# full auto 模式,受限于 profile 的 Rules of Engagement
./webstrike.py scan acme.com --mode auto --profile profiles/default.yaml
# authenticated scan
./webstrike.py scan acme.com --header "Authorization: Bearer eyJ..." --cookie "sid=abc"
# 将所有流量路由到 Burp 以便后续手动跟进
./webstrike.py scan acme.com --proxy http://127.0.0.1:8080
# 恢复崩溃的运行
./webstrike.py scan --resume runs/acme.com_20260612_141500/
# 仅运行特定模块
./webstrike.py scan https://app.tld --only http-probe,nuclei-scan
```
报告会以 `report.md` + `report.json` 的形式存放在 `runs/_/` 目录中,
此外还有原始工具产物。
## 扩展 — 用约 30 行代码添加一个攻击模块
在 `wstrike/modules/` 中放入一个文件。它会被自动发现,无需注册:
```
from wstrike.modules.base import Module
from wstrike.core import runner, tools
from wstrike.core.context import Context, Finding
class MySubdomainEnum(Module):
name = "subfinder"
phase = "recon"
requires = ["subfinder"]
description = "Passive subdomain enumeration"
async def run(self, ctx: Context) -> None:
bin_ = tools.resolve("subfinder")
res = await runner.run([bin_, "-d", ctx.target, "-silent"])
for host in res.lines():
ctx.add_finding(Finding(title=f"Subdomain: {host}",
module=self.name, target=host))
```
## 测试
```
pip install -r requirements-dev.txt
pytest -q
```
CI (`.github/workflows/ci.yml`) 会在 Python 3.11 和 3.12 上运行测试套件。
## 路线图
- **已完成:**完整的流水线(recon → probe → crawl → content → vulnscan → webtest)
包含手动/自动模式 + RoE,**已认证扫描**,**SQLite 状态 +
差异对比 + 恢复**,**技术感知的链式调用**,**多目标 + 并发**,
**代理**,**OAST/interactsh 盲 SSRF**,**Slack/Discord 通知**,
**HTML + SARIF 报告**,**gowitness 截图**,**subfinder API 密钥**,
以及 **pytest 套件 + CI** ✅
- **v0.2.0:****AI 分类引擎**(提供商无关的 LLM:优先级排序,关联
攻击链,建议后续步骤) + 加固(结构化的 sqlmap/dalfox
解析,保守的全局速率预算,基于 PSL 的范围匹配) ✅
- **v0.3.0:****交互模式** — 一个引导式、菜单驱动的向导(方向键
提示,带有标准库编号菜单作为后备),让你无需接触任何参数即可运行包含 AI 分类在内的全面扫描 ✅
- **接下来:**一个*真正的*全局速率限制器(通过内部限流代理在共享瓶颈点计量请求,取代保守的预算分配);
wayback/gau URL 来源;amass;nuclei `-as` 自动扫描
- **之后:**REST API + 封装此 CLI 引擎的 Web 仪表板(CLI 优先)
## 范围与道德规范
仅用于**授权的**安全测试。请始终在签署的协议 / 明确许可及目标的交战规则内进行操作。
## 许可证
[MIT](LICENSE) © 2026 TK NiRMAL
*WebStrike — 由 **NiMAA** 创建。*
标签:CISA项目, GitHub, Web渗透测试, 安全工具编排, 实时处理, 密码管理, 数据泄露, 聊天机器人, 自动化安全工具, 运行时操纵, 逆向工具