在无法连接外网的内网环境中,输入一个 URL,一键调度多款成熟安全工具完成侦察与扫描, 自动发现目标背后的 API 接口、自动执行越权测试,并把异构输出收敛为统一、带证据的 渗透测试报告。
⚠️ 本工具仅限授权测试使用。请勿对未获得书面授权的目标运行。
____ _ _
/ ___| |__ (_)_ __ nmap · httpx · whatweb · feroxbuster
| | | '_ \| | '_ \ nuclei · ZAP · sqlmap · arjun
| |___| | | | | | | | + API 自动探测 + 越权测试 (未授权 / IDOR / 垂直)
\____|_| |_|_| |_| |_ 纯离线 · 零 Python 依赖 · 单文件 HTML 报告
Chein 是一个编排器,不是扫描引擎。它不重复发明 nmap / nuclei / ZAP 的能力, 而是:
- 调度:按流水线自动串起八类成熟安全工具,阶段内并行、工具缺失自动降级跳过;
- 探测:内置 API 自动探测模块(文档探针 / JS 提取 / 字典爆破 / 方法枚举), 把"目标有哪些接口"这步从手工变成全自动;
- 测试:内置自动越权测试(未授权重放 + 水平越权 IDOR),补上扫描器测不到的 访问控制缺陷——OWASP Top 10 第一名;
- 收敛:把各工具的异构输出归一化为统一的 Finding 模型,去重、评分, 生成带证据的 Markdown / 单文件 HTML / JSON 三种报告。
设计目标:输入一个 URL(可带登录凭据),一条命令得到可交付、可追溯的渗透测试结果。
- 统一 Adapter 接口:nmap / httpx / whatweb / feroxbuster / nuclei / ZAP / sqlmap / arjun 八工具即插即用,任一缺失只跳过对应阶段,不影响其余流程
- API 自动探测四路通道:接口文档探针(OpenAPI/Swagger/GraphQL/WADL)+ 前端 JS 资产提取 + API 字典爆破 + 已发现路径方法枚举,汇聚为统一端点表
- 自动越权测试(三档):未授权重放 + 水平越权(IDOR)默认开启;垂直越权 (低权限账号)独立开关;线索按 S/A/B 证据分级,命中敏感数据(PII/密钥)自动升级
- 认证登录支持:表单登录(账号/密码)、HTTP Basic、会话 Cookie 注入、自定义 请求头;登录态自动贯通内置探测与全部工具;ZAP 通过官方认证 API 自登录
- ZAP 全自动编排:无头守护 + REST API(Spider → AJAX Spider → OpenAPI 导入 → Active Scan),未启动时自动拉起守护进程
- 纯离线:核心只用 Python 标准库,零 pip 依赖;运行时零外网请求
- 跨平台:Linux / macOS / Windows 均可运行(进程管理、ZAP 启动脚本已做平台自适应)
- 证据留痕:每步工具的原始 stdout/stderr 全量落盘
raw/,每条发现可追溯 - 安全内建:授权人必填抬头、scope 同源校验、跨域重定向拒绝跟随、默认保守速率、 方法枚举只发安全方法(OPTIONS/HEAD/GET)
┌────────────────────────────────────────────────────────────┐
│ CLI (argparse) chein.py <URL> [选项] │
├────────────────────────────────────────────────────────────┤
│ 编排层 orchestrator.py 9 阶段流水线, 阶段内并行, 降级跳过 │
│ 认证 auth.py 表单登录 / Basic / Cookie / 头 │
│ 越权 idor.py 未授权重放 + IDOR + 垂直越权 │
│ 敏感 sensitive.py PII/密钥识别, 证据 S/A/B 分级 │
│ 收敛 dedup.py 去重 · 评分 · 严重度 │
├────────────────────────────────────────────────────────────┤
│ API 探测 api_discovery/ 文档探针 / JS 提取 / 方法枚举 │
│ 工具适配 adapters/ 8 个 Adapter (统一接口) │
│ 执行器 runner.py 超时控制 / 原始输出落盘 / 流式回显│
│ HTTP http_util.py 内置客户端 (Cookie jar/重定向) │
├────────────────────────────────────────────────────────────┤
│ 报告 reporting.py findings.json / report.md/html │
└────────────────────────────────────────────────────────────┘
- Python 3.10+(无第三方依赖,无需 pip install)
- 按需安装安全工具(清单与离线下载地址见
tools.txt), 工具缺失时对应阶段自动跳过
# 1. 环境自检 —— 工具/字典/模板是否就绪
python3 chein.py --list-tools
# 2. 基础扫描(自动探测接口 + 生成报告)
python3 chein.py http://10.0.0.5/
# 3. 带登录的完整扫描(有测试账号时推荐)
python3 chein.py http://10.0.0.5/ \
--username tester --password 'P@ssw0rd' \
--login-url http://10.0.0.5/login \
--authorized-by "Enil/2026-08-20"Windows 下把 python3 换成 python,其余一致;建议使用 Windows Terminal
以获得正确的中文与颜色显示。
# 快速摸底(几分钟出资产与接口, 跳过重工具)
python3 chein.py http://10.0.0.5/ --skip zap,nuclei,sqlmap
# 完整扫描(全端口 + ZAP + nuclei + 注入验证, 数十分钟~数小时)
python3 chein.py http://10.0.0.5:8080/app \
--full-ports --zap-port 8080 --with-sqlmap \
--username tester --password pass --login-url http://10.0.0.5:8080/login \
--authorized-by "张三"
# 只深挖 API 接口(目标明确是接口服务时)
python3 chein.py http://10.0.0.5:8080/ --skip nmap结果在 output/<主机>_<时间戳>/:
| 文件 | 说明 |
|---|---|
report.html |
单文件离线报告(深色主题,浏览器直接打开,交付/汇报用) |
report.md |
Markdown 报告(写正式文档直接抄) |
findings.json |
结构化结果(发现 + 端点表 + 告警 + 认证状态),二次处理用 |
raw/ |
所有工具的原始 stdout/stderr,证据留痕 |
目标需要账号密码时,四种方式任选其一或组合使用。登录成功后会话 Cookie 自动贯通 所有探测通道,报告"概览"区会记录认证状态:
# 方式 1: 表单登录(最常见)—— 自动提交凭据并捕获会话 Cookie
python3 chein.py http://10.0.0.5/ \
--username tester --password 'P@ssw0rd' \
--login-url http://10.0.0.5/login
# 自定义登录请求体({u}/{p} 为账号密码占位符; 以 { 开头按 JSON 提交)
# --login-data 'user={u}&pass={p}&remember=1'
# --login-data '{"username":"{u}","password":"{p}"}'
# 登录成功校验标记(响应体必须包含, 防"登录失败仍返回 200"误判)
# --login-success '欢迎'
# 方式 2: HTTP Basic 认证
python3 chein.py http://10.0.0.5/ --auth-basic 'admin:P@ssw0rd'
# 方式 3: 已有浏览器会话, 直接注入 Cookie(跳过登录流程)
python3 chein.py http://10.0.0.5/ --cookie 'JSESSIONID=abc123; token=xyz'
# 方式 4: 自定义请求头(如 API Token)
python3 chein.py http://10.0.0.5/ --header 'Authorization: Bearer eyJ...'行为约定:
- 登录失败会明确告警并降级为匿名扫描(报告可见),不会静默误报
- 登录地址默认必须与目标同主机;同注册域(
sso.corp.com之于app.corp.com) 或解析到同一 IP 时自动放行;真正的跨域 SSO 加--allow-cross-host-login放行 - 跨域重定向拒绝跟随(防凭据被带出 scope)
- ZAP 不共享 Cookie,而是通过
formBasedAuthentication等官方 API 让 ZAP 自己用测试账号登录(需 add-on 齐全,见tools.txt) - 凭据会出现在工具进程参数中(可被
ps看到);介意可写入config.json -> auth段避免出现在命令行
给定 URL 后,从四个方向并行收集接口线索,汇聚为统一端点表(方法 × 路径 × 参数 × 认证要求 × 证据来源),再分发到扫描器:
| 通道 | 原理 | 说明 |
|---|---|---|
| 文档主动发现 | 探测 swagger/openapi/graphql/wadl 常见路径并解析 | 命中率最高;OpenAPI 同步导入 ZAP |
| 前端 JS 提取 | 拉取页面与爬虫发现的 JS,正则提取接口路径与方法 | SPA 应用核心通道 |
| 字典爆破 | feroxbuster 挂 API 字典 + 常规目录字典 | 兜底通道 |
| 方法枚举 | 对已发现路径发 OPTIONS/HEAD/GET 探测允许的方法 | 只发安全方法 |
端点表在报告中独立成章,可当作后续手工测试的靶子清单。
登录态就绪时,阶段 5.5 对端点表自动执行检测(仅 GET、走 scope 校验与限速、 默认开启前两档):
- 第一档 未授权重放:去掉会话 Cookie 重放每个 GET 端点;匿名仍返回相同"数据" (HTML 前端壳不计)→ "未授权访问"线索
- 第二档 水平越权(IDOR):对
{id}路径参数或 id 类 query 参数,从基线响应 提取候选值替换重放;返回同结构不同数据 → IDOR 线索 - 第三档 垂直越权(需低权限账号,默认关闭):用低权限会话重放主账号可访问 的接口,命中管理类路径或返回相同数据 → "低权限账号可访问"线索
# 前两档默认自动执行
python3 chein.py http://10.0.0.5/ --username tester --password pass \
--login-url http://10.0.0.5/login
# 第三档: 需要低权限账号, 显式开启
python3 chein.py http://10.0.0.5/ --username admin --password 'pass' \
--login-url http://10.0.0.5/login \
--with-vertical-authz --low-user user1 --low-pass 'pass' \
--low-login-url http://10.0.0.5/login
# 低权限账号也可直接注入会话: --low-cookie 'JSESSIONID=xxx'
python3 chein.py http://10.0.0.5/ --no-idor # 全部关闭证据分级与敏感数据识别:每条线索按"数据接口 / 相似度 / 敏感标记"定级
S/A/B 并写入证据首行;匿名/低权限响应命中敏感数据(手机号、身份证、邮箱、
银行卡、内网 IP、JWT、API 密钥、password/token 等敏感字段名)时自动升级严重度
与置信度,并在证据中标注 ⚠ 敏感数据标记。
产出写入报告"发现明细"(tool=idor),属于线索,需人工打开证据确认。
上限与阈值在 config.json -> idor 调整。
阶段0 认证 (可选) 表单登录 → 捕获会话 Cookie
阶段1 存活 httpx(缺失回退内置 HTTP 检查)
阶段2 侦察 nmap + whatweb 并行
阶段3 发现 ZAP 爬虫 ∥ feroxbuster(目录) ∥ feroxbuster(API) ∥ 文档探针 并行
阶段4 分析 JS 端点提取 + 方法枚举 → 端点表去重汇聚
阶段5 参数 arjun 隐藏参数(可选, --with-arjun)
阶段5.5 越权 未授权重放 + IDOR(默认) + 垂直越权(--with-vertical-authz)
阶段6 扫描 ZAP 主动扫描 ∥ nuclei 模板验证 并行
阶段7 注入 sqlmap(可选, --with-sqlmap, 仅含参端点)
阶段8 报告 去重 → 评分 → findings.json / report.md / report.html
任一阶段失败或工具缺失只记录告警并继续,不会中断整条流水线。
用法: python chein.py <URL> [选项]
扫描控制:
--full-ports nmap 全端口扫描 (1-65535)
--aggressive 激进模式 (提高速度/线程, 慎用)
--with-sqlmap 对含参端点运行 sqlmap 注入验证
--with-arjun 运行 arjun 隐藏参数探测
--zap-port PORT 启用 ZAP 并指定 REST API 端口
--no-idor 关闭自动越权测试
--skip TOOLS 跳过模块 (逗号分隔: nmap,whatweb,feroxbuster,
zap,nuclei,sqlmap,arjun,discovery,httpx,idor)
--threads N feroxbuster 并发线程数
--timeout SEC 单工具默认超时 (秒)
认证与登录:
--auth-basic USER:PASS HTTP Basic 认证
--username U / --password P 表单登录凭据
--login-url URL 登录提交地址
--login-data STR 登录请求体模板 ({u}/{p} 占位符, { 开头为 JSON)
--login-method {POST,GET}
--login-success TEXT 登录成功后响应体必须包含的标记
--allow-cross-host-login 放行跨域 SSO 登录 (默认拒绝)
--cookie STR 直接注入会话 Cookie 'a=b; c=d'
--header "K: V" 附加请求头 (可重复)
垂直越权 (需低权限账号, 默认关闭):
--with-vertical-authz 启用垂直越权测试
--low-user U / --low-pass P 低权限账号凭据
--low-login-url URL 低权限账号登录地址 (默认与 --login-url 相同)
--low-cookie STR 低权限账号会话 Cookie (跳过登录)
其他:
--config FILE 配置文件 (默认 ./config.json)
--outdir DIR 报告输出根目录 (默认 ./output)
--authorized-by NAME 授权人 (写入报告抬头, 务必填写)
--list-tools 打印工具/字典/模板可用性清单后退出
--version 显示版本
全部配置在 config.json(开箱含默认值;tool_paths 为空时从 PATH 查找):
| 配置段 | 说明 |
|---|---|
tool_paths |
各工具二进制/脚本绝对路径(Windows 建议直接填,免改系统 PATH) |
tool_interp |
脚本型工具解释器(sqlmap→python、whatweb→ruby) |
wordlists |
四类字典路径:目录/API/文档探针/参数名(内置起步字典,可换 SecLists) |
nuclei |
templates 离线模板库目录(不配置则跳过 nuclei)、速率与并发 |
zap |
enabled、地址/端口、start_command 自动启动命令、爬虫/扫描超时 |
sqlmap / arjun |
启用开关与目标数上限(也可用 --with-sqlmap/--with-arjun 临时开) |
auth |
认证默认值(CLI 优先;可把凭据写在这里避免出现在命令行) |
http |
内置客户端超时、限速、UA、TLS 校验 |
discovery |
方法枚举上限、JS 文件数上限 |
idor |
越权测试开关与阈值(enabled/max_endpoints/max_probes_per_endpoint/unauth_similarity/vertical_similarity) |
feroxbuster_* / nmap_* |
爆破线程与扩展名、nmap 端口与速率档位 |
打开 report.html,按顺序看四处:
- 概览:严重度统计(critical/high/medium/low/info)+ API 端点数 + 风险评分
- 认证状态 —— 5 秒判断目标风险水位;
- 执行工具:谁跑了、谁跳了 —— 判断这份结果覆盖度够不够;
- 自动发现的 API 端点:接口清单(方法/路径/参数/来源)—— 后续手工测试的靶子;
- 发现明细:按严重度排序,每条带工具、置信度、证据(原始请求/响应片段)、CWE。
关于"线索"与"发现":tool=idor 的条目以及低置信度条目是自动化给出的线索,
打开证据人工复现确认后,才构成可交付的漏洞结论——这是渗透测试的正常流程。
Chein/
├── chein.py # 入口
├── config.json # 全部配置(默认值齐全)
├── tools.txt # 依赖工具与字典清单(含离线下载地址)
├── 安装清单.md # 内网部署体检与安装清单
├── chein/
│ ├── cli.py # 命令行入口
│ ├── orchestrator.py # 9 阶段流水线调度(阶段内并行、降级跳过)
│ ├── auth.py # 认证: 表单登录 / Basic / Cookie / 请求头
│ ├── idor.py # 自动越权测试(未授权重放 + IDOR + 垂直越权)
│ ├── sensitive.py # 敏感数据识别(PII/密钥)与证据分级
│ ├── models.py # Target / Finding / Endpoint / ScanReport
│ ├── runner.py # 命令执行器(超时/落盘/流式回显)
│ ├── http_util.py # 内置 HTTP 客户端(Cookie jar/手动重定向)
│ ├── reporting.py # md / html / json 报告
│ ├── dedup.py # 去重与风险评分
│ ├── compat.py # Windows/POSIX 平台兼容层
│ ├── adapters/ # 8 个工具适配器(统一 Adapter 接口)
│ └── api_discovery/ # 文档探针 / JS 提取 / 方法枚举 / 端点表
├── data/wordlists/ # 内置起步字典(可替换为大字典)
└── output/ # 扫描结果(每次扫描一个时间戳目录)
- 在外网下载全部二进制 / 字典 / nuclei 模板 / ZAP(含预装 add-on),清单见
tools.txt; - 整个目录拷贝进内网;二进制放入 PATH,或直接写
config.json -> tool_paths; python chein.py --list-tools自检全绿后,断网跑一遍验证零外网依赖。
公司 EDR 可能查杀 nuclei/sqlmap 等工具的压缩包,AES 加密包 + 安全团队白名单 的应对方式见
安装清单.md。
- 仅限授权测试。
--authorized-by写入报告抬头,作为授权留痕 - 所有子请求严格限定目标主机(scope 校验),越界熔断
- 默认保守速率与并发;
--aggressive需确认目标承受能力 - 方法枚举只发 OPTIONS/HEAD/GET;越权测试只发 GET;sqlmap/arjun 默认关闭
- 复杂登录流程(验证码 / CSRF token / 多步跳转)需先浏览器登录再
--cookie注入 - 垂直越权需第二个低权限账号(
--with-vertical-authz+--low-*,默认关闭) - 动态内容(时间戳等)会导致越权测试少量漏报(相似度阈值取舍,宁漏勿滥报)
- IDOR 候选值提取基于响应体启发式,存在少量噪音线索,需人工确认
- 敏感识别为正则/字段名启发式,可能有少量误标(如页面上展示的示例数据),仍需人工复核
- 单 URL 定位:批量/多目标场景需重复执行(路线图待办)
- M1: 编排骨架 + 4 基础工具 + API 探测四路通道 + 报告
- M2: 认证登录(表单/Basic/Cookie/头)+ ZAP 认证上下文 + 跨平台
- M3: 自动越权测试三档(未授权重放 + IDOR + 垂直越权)+ 证据分级与敏感数据识别(v0.5)
- M4: GraphQL 盲探测增强、OpenAPI 导出 Postman、登录会话保鲜与自动重登
- M5: Web 看板、任务持久化与审计库、多目标批处理