arkanzasfeziii/Sentinel
GitHub: arkanzasfeziii/Sentinel
一款将指纹识别、SSRF、IDOR、身份验证攻击、注入和 GraphQL 攻击串联为完整攻击链的 Web 与 API 进攻框架。
Stars: 0 | Forks: 0
# Sentinel — Web 与 API 进攻框架
## 威胁模型
现代 Web 应用程序的攻击发生在逻辑层,而不是网络层。WAF 会过滤 payload。CDN 会吸收大容量攻击。但是,授权逻辑、参数处理和 API gateway 配置仍然由那些过于相信自己对于“用户会发送什么”假设的开发人员编写。
Sentinel 对试图探测这些假设的攻击者进行了建模:
| 阶段 | 失败点 | 攻击者动作 |
|---|---|---|
| **信息侦察** | `Server`、`X-Powered-By` 和 `X-Debug-Token` header 泄露了技术栈版本 | 指纹识别框架(Laravel、Spring、Django、Express),检测 WAF 供应商并制定绕过策略 |
| **SSRF** | 内部 API 调用使用了用户提供的 URL,且没有 scheme/host 白名单 | 探测 28 个参数名;通过 gopher:// 访问 AWS IMDSv1/v2、Azure IMDS、GCP metadata、Kubernetes API、Redis,通过 gopher:// 访问 SMTP,以及内部 host |
| **IDOR** | 对象访问的授权检查缺失或仅在客户端进行 | 枚举已认证 ID ±20 范围内的 ID;替换 UUID 格式;测试从 `/user/` 到 `/admin/` 的垂直越权 |
| **身份验证** | JWT 验证时没有强制执行算法;使用了弱 HS256 密钥 | 以 4 种编码变体伪造 `alg:none` token;暴力破解 15 个常见的 HS256 密钥;检测 RS256 算法混淆漏洞 |
| **注入** | SQL 参数未参数化;JSON 中接受了 NoSQL 操作符;模板引擎渲染了用户输入 | 基于时间的盲注(MySQL SLEEP、MSSQL WAITFOR、PostgreSQL pg_sleep);NoSQL `$gt`/`$ne` 操作符注入;SSTI Jinja2/OGNL RCE 链 |
| **GraphQL** | 生产环境未禁用内省;batching 允许绕过速率限制;缺乏深度限制 | 全量 schema 内省;敏感 mutation 检测;19 次查询的 batch 以绕过速率限制;查询深度 DoS |
**范围:** 授权的 Web 应用程序渗透测试、API 安全评估和漏洞赏金项目。
## 为什么开发此工具
OWASP Top 10 工具已经非常丰富。孤立测试单一漏洞类别的工具也无处不在。罕见的是能够将这些攻击叙事串联起来的框架:指纹识别驱动注入策略;SSRF 发现用于提取云凭证;伪造的 JWT 绕过 IDOR endpoint 上的授权。
Sentinel 围绕 `EngagementSession` 构建——这是一个带有重试 adapter 的 `requests.Session`,它将 cookie、header 和已发现的 token 从一个模块传递到下一个模块。在 auth 模块中提取的 JWT 与用于探测 IDOR endpoint 的 token 相同。通过 SSRF 窃取的云凭证与来自同一目标的 SQL 注入发现一起流入到评估报告中。
## 功能
### 指纹识别与技术栈分析
- Server header 提取 —— 来自 `Server`、`X-Powered-By`、`X-Generator`、`X-Debug-Token` 的版本披露
- 通过响应模式进行框架检测:Laravel(调试页面)、Django(`csrfmiddlewaretoken`)、Rails(`_rails_`)、Express(`express`)、Spring Boot(`Whitelabel Error`)、WordPress(`wp-content`)、Struts2(`struts2`)
- **WAF 指纹识别** —— 从响应 header 和 body 模式检测 Cloudflare、AWS WAF、Akamai、F5 BIG-IP、Incapsula、ModSecurity、Sucuri、Barracuda
- **API endpoint 发现** —— 探测 30 多个标准路径:`/actuator/env`、`/actuator/heapdump`、`/graphql`、`/graphiql`、`/swagger-ui.html`、`/api-docs`、`/.well-known/jwks.json`、`/admin`、`/internal`、`/debug`、`/metrics` 等
- **CORS 配置错误** —— 测试带有 `credentials: include` 的反射 `Origin` header;标记带有凭证的完全信任
- **安全 header 审计** —— 检查缺失的 `Content-Security-Policy`、`X-Frame-Options`、`X-Content-Type-Options`、`Strict-Transport-Security`、`Permissions-Policy`
### SSRF 利用
每个 endpoint 探测 28 个参数名(`url`、`redirect`、`callback`、`next`、`dest`、`path`、`host`、`proxy`、`fetch`、`load`、`link`、`src`、`uri`、`endpoint`、`forward`、`navigate`、`open`、`ref`、`return`、`site`、`target`、`to`、`file`、`resource`、`continue`、`domain`、`out`、`data`)。
探测目标:
- AWS IMDSv1: `http://169.254.169.254/latest/meta-data/iam/security-credentials/`
- AWS IMDSv2: PUT token → 通过 `X-aws-ec2-metadata-token` GET 凭证
- Azure IMDS: `http://169.254.169.254/metadata/instance` (带有 `Metadata: true`)
- GCP metadata: `http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token`
- Kubernetes API: `https://kubernetes.default.svc/api/v1/namespaces`
- 内部 host: `http://localhost`、`http://127.0.0.1`、常见内部网段
- Protocol handler: `file:///etc/passwd`、`file:///proc/environ`、`dict://redis:6379/INFO`、`gopher://smtp:25/`
每次探测有 **9 种 IP 地址绕过编码**:
- 原始格式(`127.0.0.1`)
- xip.io 通配符(`127.0.0.1.xip.io`)
- 八进制(`0177.0000.0000.0001`)
- 十六进制(`0x7f000001`)
- 十进制(`2130706433`)
- IPv6(`::1`、`[::1]`)
- User@host(`http://attacker@127.0.0.1`)
- 大小写变体(`http://LocalHost`)
- 三斜杠(`file:///etc/passwd`)
每个参数均测试 GET 和 POST(JSON body、form-encoded、XML)。
**自动提取:** 如果返回 AWS IMDS 角色列表,会在同一请求链中自动获取完整凭证。
### IDOR 枚举
- **基于路径的 IDOR** —— 从 URL 路径中提取数字 ID;探测 ±20 个相邻 ID 和 5 个随机 UUID;比较响应大小/状态以检测未授权的对象访问
- **基于参数的 IDOR** —— 探测 `id`、`user_id`、`account_id`、`object_id`、`resource_id` 查询参数
- **垂直越权** —— 将 `/user/`、`/account/`、`/profile/` 路径片段替换为 `/admin/`、`/administrator/`、`/superuser/`;比较响应码
- **Mass assignment** —— 带有提权字段的 PUT 请求:`role`、`is_admin`、`permissions`、`user_type`、`access_level`;通过响应差异检测是否成功
### 身份验证攻击模块
**JWT:**
- `alg:none` 伪造 —— 4 种编码变体(none、None、NONE、nOnE),带有原始 payload 和注入的 `role:admin`
- HS256 弱密钥暴力破解 —— 15 个常见密钥:`secret`、`password`、`key`、`123456`、`jwt_secret`、`mysecret`、`changeme`、`admin`、`token`、`api_key`、`private`、`app_secret`、`default`、`test`、`dev`
- RS256 算法混淆检测 —— 标记 RS256 token 并提示将公钥重用为 HS256 密钥的机会
- 敏感声明提取 —— 标记包含 `role`、`admin`、`is_admin`、`permission`、`scope`、`group` 的 token
**Session:**
- Session 固定检测 —— 比较身份验证前后的 session token
**OAuth:**
- `redirect_uri` 绕过 —— 测试 5 种恶意重定向变体:附加路径、参数污染、开放重定向链、子域变体、scheme 变体
- 缺失 `state` 参数检测 —— OAuth 流程中的 CSRF
**客户端密钥扫描:**
- 扫描目标页面加载的所有 JavaScript bundle,查找:AWS Access Key、Google API Key、GitHub PAT、OpenAI key、通用 `apiKey`、`secret`、`token` 模式
### 注入模块
**SQL 注入:**
- 基于错误的检测 —— 测试响应中是否包含 MySQL、MSSQL、Oracle、PostgreSQL 的错误消息
- 基于时间的盲注 —— MySQL: `SLEEP(5)`,MSSQL: `WAITFOR DELAY '0:0:5'`,PostgreSQL: `pg_sleep(5)`;测量响应时间差
- 基于 UNION 的提取 —— 模糊测试列数 (1-10),通过确认的列数提取 `@@version`/`version()`
- GET 参数和 POST body (form + JSON)
**NoSQL 注入:**
- MongoDB 操作符注入 —— 在 GET 查询字符串和 JSON POST body 中使用 `$gt`、`$ne`、`$exists`、`$regex`
- 针对 `/api/users/login` 及类似 auth endpoint 进行测试
**SSTI:**
- 检测 payload:`{{7*7}}`、`${7*7}`、`<%= 7*7 %>`、`#{7*7}`、`*{7*7}`
- Jinja2 RCE 链:`{{config.__class__.__init__.__globals__['os'].popen('id').read()}}`
- OGNL RCE 链:`${Runtime.exec('id')}`
### GraphQL 攻击模块
- **全量 schema 内省** —— 查询 `__schema` 获取所有类型、字段、mutation 和 subscription
- **敏感 mutation 检测** —— 标记包含 `delete`、`admin`、`grant`、`privilege`、`user`、`password`、`role` 的 mutation
- **内省绕过探测** —— 针对部分禁用内省的替代内省查询
- **Batching 攻击** —— 在单个数组 body 中发送 19 个查询,以测试速率限制的执行情况
- **GraphQL 注入** —— 向 `$input` 和 `$id` 参数进行变量注入
- **查询深度 DoS 检测** —— 发送深层嵌套查询;如果未被拒绝则进行标记
## 架构
```
Target (URL · headers · session cookies)
│
▼
EngagementSession
┌──────────────────────────────────┐
│ requests.Session + retry │
│ discovered tokens · cookies │
│ JWT · SSRF results │
└──────────────────────────────────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
Fingerprint SSRF IDOR
Module Module Module
stack+WAF 28 params ±20 IDs
headers 9 bypass vertical
│ │
▼ ▼
AuthModule InjectModule
JWT/OAuth SQL/NoSQL/SSTI
secret scan blind/UNION/RCE
│
▼
GraphQLModule
schema + batch
depth + inject
│
▼
JSON Report
(module · vuln · severity)
```
## 攻击流程
1. **指纹识别** —— 向目标发送初始请求;提取 header;检测框架、WAF 供应商和暴露的 API 路径;识别 CORS 和缺失的安全 header
2. **SSRF 探测** —— 在所有已发现的 API endpoint 上模糊测试所有 28 个易受 SSRF 攻击的参数名;每次探测应用 9 种绕过编码;检测 IMDS 响应模式,如果发现则自动提取凭证
3. **JWT 分析** —— 从 auth 流程中提取 JWT;解码 header 和 payload;尝试具有 4 种变体的 `alg:none`;用 15 个常见密钥暴力破解 HS256;扫描 JS bundle 以查找 API key 和 token
4. **IDOR 扫描** —— 从经过身份验证的响应中提取对象 ID;探测 ±20 个相邻 ID;测试 UUID 替换;尝试路径级别的垂直越权;mass assignment PUT
5. **注入** —— 模糊测试所有 GET 参数和 POST body 字段以查找 SQL 错误模式;基于时间差的盲注时间测量;NoSQL 操作符注入;SSTI 检测,如果检测成功则发送 RCE payload
6. **GraphQL** —— 运行完整内省;解析 schema 以查找敏感 mutation;执行 batch 攻击;测试深度限制
7. **报告** —— `--output report.json` 包含模块、漏洞类别、参数、payload、响应证据和严重程度
## 用法
```
# 安装依赖
pip install -r requirements.txt
# 全栈 fingerprint
python sentinel.py --target https://api.target.com --modules fingerprint
# 使用 bypass encodings 进行 SSRF 探测
python sentinel.py --target https://api.target.com --modules ssrf
# 使用 authenticated session 进行 IDOR 枚举
python sentinel.py --target https://api.target.com --modules idor \
--header "Authorization: Bearer eyJ..."
# JWT 攻击 — 伪造 alg:none、暴力破解 HS256
python sentinel.py --target https://api.target.com --modules auth \
--token "eyJhbGciOiJIUzI1NiJ9..."
# 对所有 parameters 进行 SQL + NoSQL + SSTI injection
python sentinel.py --target https://api.target.com --modules inject
# GraphQL introspection + batch attack
python sentinel.py --target https://api.target.com/graphql --modules graphql
# 完整 engagement
python sentinel.py --target https://api.target.com --modules all \
--header "Authorization: Bearer eyJ..." \
--output api-findings.json
# Non-interactive 模式
python sentinel.py --target https://api.target.com --modules all --yes --output results.json
```
## 输出
```
17:22:10 [INFO] [Fingerprint] Server: nginx/1.24.0 | Framework: Laravel 10.x
17:22:10 [CRIT] [Fingerprint] WAF: None detected — no bypass required
17:22:11 [INFO] [Fingerprint] Endpoints: /api-docs, /actuator/env, /graphql
17:22:11 [CRIT] [Fingerprint] CORS: Origin reflected with credentials:true — full trust misconfiguration
17:22:12 [CRIT] [SSRF] Hit on param=redirect | Payload: http://169.254.169.254/latest/meta-data/
17:22:12 [CRIT] [SSRF/AWS] Role detected: ec2-app-role — retrieving credentials
17:22:12 [CRIT] [SSRF/AWS] AccessKeyId=ASIA... SecretAccessKey=... SessionToken=...
17:22:13 [CRIT] [IDOR] ID substitution success: /api/v1/users/1843 → /api/v1/users/1841 (200 OK, 2.1KB)
17:22:13 [CRIT] [IDOR/Vertical] /api/v1/user/profile → /api/v1/admin/profile (200 OK)
17:22:14 [CRIT] [Auth/JWT] alg:none accepted — role:admin forged token accepted by /api/v1/admin
17:22:14 [CRIT] [Auth/JWT] HS256 secret cracked: secret="mysecret"
17:22:15 [CRIT] [Inject/SQL] Time-based blind confirmed: param=search | SLEEP(5) → 5.3s delta
17:22:15 [CRIT] [Inject/SSTI] Jinja2 RCE chain successful: {{config.__class__...}} → uid=www-data
17:22:16 [CRIT] [GraphQL] Introspection enabled — 23 types, 8 mutations exposed
17:22:16 [CRIT] [GraphQL] Sensitive mutation: deleteUser, grantAdminRole
17:22:16 [CRIT] [GraphQL] Batch attack: 19 queries accepted — rate limiting absent
[✓] API assessment complete — 11 critical findings | report: api-findings.json
```
## MITRE ATT&CK 覆盖范围
| 技术 | ID | 模块 |
|---|---|---|
| 对外暴露应用程序的利用 | T1190 InjectModule, SSRFModule |
| 不安全的凭证:云实例元数据 API | T1552.005 | SSRFModule |
| 窃取应用程序访问 token | T1528 | AuthModule |
| 利用特权提升漏洞 | T1068 | IDORModule, AuthModule |
| 来自信息库的数据 | T1213 | GraphQLModule, IDORModule |
| 收集受害者网络信息 | T1590 | FingerprintModule |
| 伪造 Web 凭证 | T1606 | AuthModule (JWT 伪造) |
**战术:** TA0001 初始访问 · TA0006 凭证访问 · TA0004 特权提升 · TA0009 收集 · TA0007 发现
## 涉及的 CWE 覆盖范围
| CWE | 描述 | 模块 |
|---|---|---|
| CWE-918 | Server-Side Request Forgery | SSRFModule |
| CWE-89 | SQL Injection | InjectModule |
| CWE-94 | Code Injection (SSTI) | InjectModule |
| CWE-639 | Authorization Bypass Through User-Controlled Key | IDORModule |
| CWE-347 | Improper Verification of Cryptographic Signature | AuthModule (alg:none) |
| CWE-345 | Insufficient Verification of Data Authenticity | AuthModule (JWT 密钥) |
| CWE-942 | Overly Permissive CORS Policy | FingerprintModule |
| CWE-770 | Allocation of Resources Without Limits (DoS) | GraphQLModule (深度/batch) |
## 法律声明
Sentinel 专为授权的渗透测试、API 安全评估和漏洞赏金计划设计,前提是目标组织已明确书面授权进行测试。在大多数司法管辖区,未经授权测试 Web 应用程序或 API 根据计算机欺诈法属于违法行为。作者对滥用行为不承担任何责任。
标签:API安全, CISA项目, JSON输出, Web安全, 蓝队分析, 逆向工具