arkanzasfeziii/Nebula
GitHub: arkanzasfeziii/Nebula
多云红队框架,模拟从凭证泄露到数据外渗的完整云身份攻击链,用于授权安全评估和红队演练。
Stars: 0 | Forks: 0
# Nebula — 多云红队行动框架
## 威胁模型
云环境的失败往往发生在身份层。配置错误的 IAM 策略、过于宽松的角色,以及存储在计算元数据中的凭证,使得云账户失陷成为现代红队演练中最容易实现的目标之一。
Nebula 模拟了这样一种攻击者:他们通过单组凭证进入(通常是从源代码中泄露、在 EC2 user-data 中暴露,或从 IMDSv1 中获取),并提权至云管理员:
| 阶段 | 失陷点 | 攻击者行动 |
|---|---|---|
| **侦察** | `sts:GetCallerIdentity` 不受限制 — 任何凭证都可以揭示其身份 | 识别我们是谁、处于哪个账户中,以及附加了哪些权限 |
| **权限分析** | 内联策略 + 托管策略 + 组策略很少作为一个整体进行审计 | 枚举内联、附加和组级策略文档中的所有有效权限 |
| **权限提升** | 过于宽松的 IAM 策略(`iam:AttachUserPolicy`、`iam:CreatePolicyVersion`、`iam:PassRole`) | 链式利用 14 种已映射的提权技术 — 从替换策略版本到执行 SSM EC2 命令 |
| **凭证获取** | 未强制执行 IMDSv2,Secrets Manager 缺少资源策略,Lambda 环境变量存储明文密钥 | 从 IMDS、Secrets Manager、SSM Parameter Store、Lambda 环境变量、EC2 user-data 中获取凭证 |
| **持久化** | 对 IAM 用户创建或跨账户信任策略修改没有告警 | 创建具有管理员权限的后门 IAM 用户;植入带有自定义 ExternalId 的外部跨账户角色 |
| **横向移动** | 角色信任策略允许在无条件下进行跨账户代入 | 枚举所有可代入的角色,按管理员级别和跨账户优先级排序,并逐一代入 |
| **数据外渗** | 存有备份、PII(个人身份信息)和生产数据且没有生命周期告警的 S3 存储桶 | 按关键字枚举所有可访问的存储桶;列出并选择性下载高价值对象 |
**范围:** 旨在展示失陷云身份影响范围的授权红队演练和云安全评估。
## 存在原因
云安全主要是一个 IAM 问题。公开记录中的每一次重大云泄露事件 — 从 CapitalOne 到 Code Spaces,再到无数 S3 暴露事件 — 都可以追溯到一个拥有其根本不需要的权限的身份,且在配置时未理解这些权限所创造的攻击路径。
标准的云安全工具会根据基准审计配置。Nebula 则是针对配置进行攻击。
区别在于:基准扫描器会告诉你未强制执行 IMDSv2。Nebula 会从 IMDSv1 中提取 IAM 角色凭证,并向你展示攻击者在下一步会用它们做什么。
Nebula 围绕 `EngagementContext` 构建 — 这是一个共享状态对象,负责将提取的凭证、发现的角色和已确认的提权路径从一个模块传递到下一个模块。Nebula 在 CredDump 模块中从 IMDS 提取的凭证,与它在 Lateral 模块中用于角色代入的凭证是同一个。发现结果会不断累积。
## 功能
### 云侦察
**AWS:**
- `STS GetCallerIdentity` — 确认身份、账户 ID 和 ARN
- 有效权限枚举 — 获取内联策略、附加的托管策略和组策略;合并为一个完整的权限集
- IAM 用户列出 — 枚举所有用户、上次密钥使用情况和 MFA 状态
- 可代入角色枚举 — 识别所有具有允许当前身份代入(优先跨账户)的信任策略的角色
- 活跃区域扫描 — 识别哪些 AWS 区域有正在运行的 EC2 实例
**Azure:**
- 订阅枚举 — 列出所有可访问的订阅
- 特权角色分配检测 — 识别 Owner、Contributor 和 User Access Administrator 分配
**GCP:**
- IAM 策略检索 — 获取组织或项目级的 IAM 绑定
- 高价值绑定识别 — 标记 `roles/owner`、`roles/editor`、`roles/iam.securityAdmin` 分配
### IAM 权限提升 — AWS
14 种映射到特定 IAM 权限的提权技术:
| 权限 | 提权路径 |
|---|---|
| `iam:AttachUserPolicy` | 将 `AdministratorAccess` 附加给当前用户 |
| `iam:PutUserPolicy` | 为当前用户创建内联管理员策略 |
| `iam:CreatePolicyVersion` | 用管理员策略替换现有的托管策略版本 |
| `iam:CreateAccessKey` | 为任何用户创建访问密钥 — 包括管理员账户 |
| `iam:UpdateAssumeRolePolicy` | 将当前身份注入到管理员角色的信任策略中 |
| `ssm:SendCommand` + `ec2:DescribeInstances` | 通过 SSM 在 EC2 上执行命令;获取 IMDS 凭证 |
| `iam:SetDefaultPolicyVersion` | 将托管策略恢复到较早的宽松版本 |
| `iam:PassRole` + `ec2:RunInstances` | 附加管理员角色启动 EC2 |
| `iam:PassRole` + `lambda:CreateFunction` | 使用管理员角色部署 Lambda;调用以提取凭证 |
| `iam:CreateRole` + `iam:AttachRolePolicy` | 创建新的管理员角色;代入该角色 |
| `sts:AssumeRole` (通配符) | 在无条件下代入任何角色 |
| `iam:AddUserToGroup` | 将当前用户添加到管理员组 |
| `glue:CreateDevEndpoint` | 创建带有管理员角色的 Glue 开发端点;通过 SSH 获取凭证 |
| `cloudformation:CreateStack` + `iam:PassRole` | 使用管理员角色部署 CloudFormation 堆栈 |
**Azure:** 将 `Owner` 角色分配给当前身份。
**GCP:** 设置授予当前身份 `roles/owner` 的 IAM 策略绑定。
### 凭证获取
- **IMDSv2 获取** — PUT 获取 token → 获取角色名 → GET 获取凭证 (AccessKeyId, SecretAccessKey, SessionToken)
- **Secrets Manager 转储** — 列出并检索整个账户中多达 20 个密钥;扫描密钥值中的凭证模式
- **SSM Parameter Store** — 检索所有 SecureString 参数并自动解密;扫描模式
- **Lambda 环境变量** — 列出所有函数;提取环境变量;标记凭证模式
- **EC2 user-data** — 检索正在运行实例的 base64 编码的 user-data;解码并扫描硬编码的凭证、包含密钥的引导脚本
### 持久化机制
- **IAM 后门用户** — 从 `BACKDOOR_NAMES` (`aws-health-monitor`, `ec2-metrics-agent`, `lambda-log-processor`, `cloud-telemetry-sync`, `iam-audit-reader`, `cost-allocation-helper`) 中创建具有随机名称的 IAM 用户;附加 `AdministratorAccess`;创建访问密钥对;输出清理命令
- **跨账户后门角色** — 创建具有外部账户信任策略和自定义 `ExternalId` 条件的 IAM 角色;附加管理员策略;允许操作者即使在初始凭证被轮换后也能从外部账户重新进入
### 横向移动 — 角色链
- 枚举所有具有 `sts:AssumeRole` 信任策略的 IAM 角色
- 按优先级排序:首先是跨账户角色,其次是名称中包含 admin 的角色
- 对每个角色尝试 `sts:AssumeRole`;按角色存储返回的凭证
- 支持针对特定角色 ARN 进行直接代入
### S3 数据外渗
- 枚举所有可访问的 S3 存储桶 — 按关键字过滤:`backup`、`prod`、`secret`、`credential`、`pii`、`data`、`database`、`private`、`sensitive`、`internal`、`config`、`logs`
- 列出匹配的存储桶内容 — 对象数量和总大小
- 下载模式:选择性检索高价值对象
- 试运行模式:在不进行下载的情况下报告将被外渗的内容
## 架构
```
Credentials (AWS / Azure / GCP)
│
▼
EngagementContext
┌──────────────────────────────────┐
│ provider · region · session │
│ harvested_creds · roles │
│ escalation_paths · loot │
└──────────────────────────────────┘
│
┌─────────┼─────────┐
▼ ▼ ▼
ReconModule PrivEsc CredDump
IAM/STS Module IMDS/SM/SSM
identity 14 AWS Lambda/UserData
paths
│
├──────────────────┐
▼ ▼
PersistModule LateralModule
backdoor user role chaining
cross-acct role assume all
│
▼
ExfilModule
S3 keyword hunt
selective download
│
▼
JSON Report
(provider · action · finding)
```
## 攻击流程
1. **身份确认** — `STS GetCallerIdentity` 在所有已配置的提供程序中确认当前身份、账户和 ARN
2. **权限映射** — 枚举内联、附加和组级别的 IAM 策略;构建有效权限集;识别与提权相关的权限
3. **提权评估** — 将有效权限与 14 种提权路径定义进行比较;按优先级顺序执行可行的提权技术
4. **凭证获取扫描** — IMDSv2(如果在 EC2 上运行或可从 VPC/EKS 内部访问);Secrets Manager 全面转储;SSM SecureString 解密;Lambda 环境变量提取;EC2 user-data 解码
5. **植入持久化** — 创建具有管理员访问权限的后门 IAM 用户;创建跨账户信任角色;向操作者输出凭证和清理命令
6. **角色代入链** — 枚举账户中所有可代入的角色;尝试按跨账户和管理员命名优先级排序进行代入;存储所有成功的凭证
7. **S3 数据外渗** — 枚举所有存储桶,按高价值关键字模式过滤,评估总数据量,在非试运行模式下选择性下载
8. **报告** — `--output report.json` 包含完整的发现列表、提取的凭证、已确认的提权路径和已代入的角色
## 用法
```
# 安装 dependencies
pip install -r requirements.txt
# AWS: 识别当前身份并枚举权限
python nebula.py --provider aws --modules recon
# AWS: 测试全部 14 种权限提升路径
python nebula.py --provider aws --modules privesc
# AWS: 从 IMDS, Secrets Manager, SSM, Lambda 中获取凭证
python nebula.py --provider aws --modules credharvest
# AWS: 植入后门 IAM user
python nebula.py --provider aws --modules persist
# AWS: 枚举并假定所有可访问的 roles
python nebula.py --provider aws --modules lateral
# AWS: 查找并从 S3 中外泄数据 (dry-run)
python nebula.py --provider aws --modules exfil --dry-run
# Azure: 枚举 subscriptions 和特权分配
python nebula.py --provider azure --modules recon
# GCP: 枚举 IAM bindings 和高价值 roles
python nebula.py --provider gcp --modules recon
# 完整 AWS engagement chain
python nebula.py --provider aws --modules all --output cloud-findings.json
# 非交互模式
python nebula.py --provider aws --modules all --yes --output results.json
```
## 输出
```
16:03:21 [INFO] [Recon] Identity: arn:aws:iam::123456789012:user/dev-deploy
16:03:21 [INFO] [Recon] Account: 123456789012 | Region: eu-west-1
16:03:22 [INFO] [Recon] Effective permissions: 47 actions across 12 services
16:03:23 [CRIT] [PrivEsc] Path available: iam:CreatePolicyVersion
16:03:23 [CRIT] [PrivEsc] Executed: replaced policy → admin policy version set as default
16:03:24 [CRIT] [PrivEsc] iam:CreateAccessKey path available — admin user: admin-ops
16:03:24 [CRIT] [PrivEsc] Access key created for admin-ops: AKIAIOSFODNN7EXAMPLE / ...
16:03:25 [CRIT] [CredDump/IMDS] IMDSv2 token acquired — role: ec2-app-role
16:03:25 [CRIT] [CredDump/IMDS] Credentials: AccessKeyId=ASIA... Expiration=+1h
16:03:26 [CRIT] [CredDump/SM] Secret: prod/database/master-password — postgresql://admin:C0nf!dential@db.internal
16:03:27 [CRIT] [CredDump/Lambda] Function: order-processor — env var DB_SECRET=hardcoded-value
16:03:28 [CRIT] [Persist] Backdoor IAM user created: aws-health-monitor
16:03:28 [CRIT] [Persist] AccessKey: AKIAIOSFODNN7EXAMPLE | SecretKey: [stored in output]
16:03:28 [INFO] [Persist] Cleanup: aws iam delete-user --user-name aws-health-monitor
16:03:29 [INFO] [Lateral] Assumable roles: 8 found
16:03:30 [CRIT] [Lateral] Assumed: arn:aws:iam::987654321098:role/OrganizationAccountAccess (cross-account)
16:03:30 [CRIT] [Lateral] Assumed: arn:aws:iam::123456789012:role/AdminRole
16:03:31 [INFO] [Exfil] S3 buckets matching keywords: prod-backups (2.3GB), internal-configs (447MB)
16:03:31 [WARN] [Exfil] Dry-run mode — 2.7GB would be exfiltrated
[✓] Cloud engagement complete — 10 critical findings | report: cloud-findings.json
```
## MITRE ATT&CK 覆盖范围
| 技术 | ID | 模块 |
|---|---|---|
| Valid Accounts: Cloud Accounts | T1078.004 | ReconModule |
| Abuse Elevation Control Mechanism | T1548 | PrivEscModule |
| Unsecured Credentials: Cloud Instance Metadata API | T1552.005 | CredDumpModule (IMDS) |
| Unsecured Credentials: Credentials in Files | T1552.001 | CredDumpModule (user-data, env vars) |
| Account Manipulation: Additional Cloud Credentials | T1098.001 | PersistModule |
| Create Account: Cloud Account | T1136.003 | PersistModule |
| Use Alternate Authentication Material | T1550 | LateralModule (role assumption) |
| Transfer Data to Cloud Account | T1537 | ExfilModule |
| Permission Groups Discovery: Cloud Groups | T1069.003 | ReconModule |
**战术:** TA0001 Initial Access · TA0003 Persistence · TA0004 Privilege Escalation · TA0006 Credential Access · TA0008 Lateral Movement · TA0009 Collection · TA0010 Exfiltration
## 触及的 CWE 覆盖范围
| CWE | 描述 | 位置 |
|---|---|---|
| CWE-250 | Execution with Unnecessary Privileges | IAM 权限提升路径 |
| CWE-269 | Improper Privilege Management | 过于宽松的 IAM 策略 |
| CWE-306 | Missing Authentication for Critical Function | IMDSv1 (无 token 要求),无资源策略的 Secrets Manager |
| CWE-522 | Insufficiently Protected Credentials | Lambda 环境变量,EC2 user-data,SSM 参数 |
| CWE-732 | Incorrect Permission Assignment for Critical Resource | IAM 角色信任策略,S3 存储桶策略 |
| CWE-200 | Exposure of Sensitive Information | 无 KMS 的 Secrets Manager、Parameter Store |
## 法律声明
Nebula 专为已获得云账户所有者明确书面授权的授权渗透测试和云安全评估活动而设计。未经授权创建 IAM 资源、代入角色或访问云凭证违反了云提供商的服务条款,并在大多数司法管辖区被认定为违法行为。作者对任何滥用行为不承担责任。
标签:AWS, Azure, DPI, GCP, Web报告查看器, 云攻防, 协议分析, 权限提升, 红队框架, 逆向工具