aws-iam-policy-analysis
$
npx mdskill add wgpsec/AboutSecurity/aws-iam-policy-analysisAnalyze AWS policies to derive attack surfaces from permissions.
- Identify dangerous patterns in IAM and resource policies.
- Detect principal wildcards and condition bypass attempts.
- Map service trust relationships and role chains.
- Surface actionable findings from policy documents.
SKILL.md
.github/skills/aws-iam-policy-analysisView on GitHub ↗
---
name: aws-iam-policy-analysis
description: "AWS IAM / Resource Policy 分析方法论。当目标涉及 AWS 云服务且提供了 IAM Policy、Resource Policy、Lambda 代码、CloudFormation 模板等策略文件时使用。覆盖 IAM Policy 危险模式识别、Resource Policy Principal 分析、Condition 键绕过模式、服务信任关系图推导。发现 AWS 策略文件(json/yaml)、*.amazonaws.com 端点、IAM ARN 时应使用此技能"
metadata:
tags: "aws,iam,policy,cloud,resource-policy,principal,condition,trust,策略分析,权限分析"
category: "cloud"
---
# AWS IAM / Resource Policy 分析方法论
拿到 AWS 策略文件(IAM Policy、Resource Policy、Lambda 代码等)后的系统化分析方法。核心目标:**从策略中推导攻击面,而非盲目枚举**。
## ⛔ 深入参考(必读)
- S3 策略分析 + 常见漏洞模式 → [references/s3-attack-techniques.md](references/s3-attack-techniques.md)
- Lambda/API Gateway/SNS 资源策略漏洞模式 → [references/aws-resource-policy-exploits.md](references/aws-resource-policy-exploits.md)
---
## 核心原则
1. **策略文件优先** — 拿到 IAM Policy / 源代码 / CloudFormation 模板时,**第一时间分析**,不要先盲目枚举
2. **从策略推导攻击面** — 策略告诉你"允许什么",攻击面就在"允许范围的边界"
3. **Principal 是入口** — `"Principal": "*"` 意味着跨账户/匿名访问,是最高优先级检查项
4. **Condition 可能被绕过** — `StringLike` 通配符在不同协议/上下文中含义不同
5. **信任关系 > 单个权限** — 关注服务之间的信任链(谁能调用谁、谁能传递角色给谁)
---
## Step 1: 策略文件快速分类
拿到附件/下载的文件后,先分类:
| 文件类型 | 识别方式 | 关注点 |
|---------|---------|--------|
| IAM Policy | `"Version": "2012-10-17"`, `"Statement"` | Action/Resource 范围 |
| Resource Policy | 同上,但有 `Principal` 字段 | 谁能访问、条件限制 |
| Lambda 代码 | `.py`/`.js` 文件,`handler(event, context)` | 输入处理、路径拼接、注入点 |
| CloudFormation | `AWSTemplateFormatVersion`, `Resources` | 完整架构、角色绑定 |
| Trust Policy | `"Action": "sts:AssumeRole"` | 角色可被谁 assume |
---
## Step 2: IAM Policy 危险模式识别
### 2.1 检查 Principal
```
🔴 "Principal": "*" → 任何 AWS 身份(含匿名)可访问
🔴 "Principal": {"AWS": "*"} → 同上
🟡 "Principal": {"Service": "lambda.amazonaws.com"} → 特定服务可调用
🟢 "Principal": {"AWS": "arn:aws:iam::123456:root"} → 限定账户
```
### 2.2 检查 Action 范围
| Action 模式 | 风险 |
|------------|------|
| `"Action": "*"` | 🔴 完全控制 |
| `"Action": "s3:*"` | 🔴 S3 完全控制 |
| `"Action": ["s3:GetObject", "s3:PutObject"]` | 🟡 可读可写 |
| `"Action": "s3:GetObject"` on `"Resource": "*"` | 🟡 可读所有 Bucket |
| `"Action": "sts:AssumeRole"` | 🟡 可切换角色(权限提升入口) |
| `"Action": "iam:PassRole"` | 🟡 可传递角色(间接提权) |
| `"Action": "lambda:InvokeFunction"` with `Principal:*` | 🔴 任何人可调用 Lambda |
### 2.3 检查 Resource 范围
```
🔴 "Resource": "*" → 所有资源
🟡 "Resource": "arn:aws:s3:::bucket/*" → bucket 内所有对象
🟢 "Resource": "arn:aws:s3:::bucket/public/*" → 仅 public 前缀
```
### 2.4 检查 Condition 绕过
```json
// StringLike 通配符 — 不同上下文含义不同
"Condition": {"StringLike": {"sns:Endpoint": "*@company.com"}}
// email 协议: Endpoint = 邮箱 → 必须是 xxx@company.com
// https 协议: Endpoint = URL → URL 中包含 @company.com 即可绕过
// IpAddress 条件 — 可能有 VPN/代理绕过
"Condition": {"IpAddress": {"aws:SourceIp": "10.0.0.0/8"}}
// StringEquals vs StringLike — 前者精确匹配,后者支持通配符
```
---
## Step 3: 服务信任关系图推导
从策略文件中画出"谁信任谁"的调用关系:
```
读取所有策略文件
↓
识别所有 Principal(谁是调用者)
↓
识别所有 Resource(谁被访问)
↓
连线: Principal → Action → Resource
↓
找到最弱一环(Principal:* 或过宽权限的边)
```
常见服务关系:
- API Gateway → Lambda(API GW 触发 Lambda)
- Lambda → S3/DynamoDB/SNS(Lambda 执行角色权限)
- SNS → Lambda/SQS/HTTP(消息推送目标)
- IAM User → AssumeRole → 高权限角色
**关键**: 分析 Lambda Execution Role 的权限 — 这决定了 Lambda 能访问什么资源。
---
## Step 4: Lambda / 应用代码审计
拿到 Lambda 代码(handler.py/index.js)后重点检查:
| 漏洞类型 | 代码模式 | 利用方式 |
|---------|---------|---------|
| 路径穿越 | `os.path.join(prefix, user_input)` | 绝对路径绕过:`/flag` |
| 命令注入 | `os.system(f"cmd {user_input}")` | `; cat /flag` |
| SSRF | `requests.get(user_input)` | `http://169.254.169.254/...` |
| 环境变量泄露 | `os.environ['SECRET']` | 错误信息/Stack Trace |
| SQL 注入 | 字符串拼接 SQL | `' OR 1=1 --` |
| 反序列化 | `pickle.loads()`/`yaml.load()` | 构造恶意对象 |
---
## Step 5: AWS 服务端点发现
```bash
# 从目标页面提取 AWS 相关 URL
curl -s TARGET_URL | grep -oE 'https?://[a-z0-9.-]+\.amazonaws\.com[^"]*'
curl -s TARGET_URL | grep -oE 'https?://[a-z0-9]+\.execute-api\.[a-z0-9-]+\.amazonaws\.com[^"]*'
# 从 JS/HTML 中提取 S3 Bucket、API GW URL
curl -s TARGET_URL | grep -oE 's3\.amazonaws\.com/[^"]*'
# Presigned URL 信息泄露
# X-Amz-Credential 包含 AccessKeyId 和 Region
```
---
## Step 6: 常用辅助工具
```bash
# webhook.site — 接收 AWS 服务回调(SNS、S3 Event 等)
# 当需要外部 Endpoint 接收 AWS 推送时使用
# AWS CLI 策略检查
aws iam get-policy-version --policy-arn ARN --version-id v1
aws s3api get-bucket-policy --bucket BUCKET
aws lambda get-policy --function-name FUNC
# ScoutSuite — AWS 安全配置审计
# Prowler — AWS 安全基线检查
```
---
## ⚠️ 避免的错误
1. **不要盲目枚举** — 连续 3 次 AccessDenied/404 后应停下来重新分析策略
2. **不要忽略附件** — 附件中的策略文件包含了解题所需的全部信息
3. **不要假设固定攻击链** — 每个场景的服务组合和漏洞点不同,从策略分析出发而非套模板
4. **不要忽略 Condition 字段** — 很多看似安全的策略,其 Condition 可被绕过
More from wgpsec/AboutSecurity
- 401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
- ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
- ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
- ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
- ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
- ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
- adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
- adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
- agent-security|
- ai-data-security|