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安全, 蓝队分析, 逆向工具