Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
bucky — S3アカウントIDの列挙とバケットディスカバリーツール | Kitploit
ツール/GitHubGitHub/umair9747/bucky
OSINT (オープンソースインテリジェンス)偵察脆弱性分析情報収集ペネトレーションテストクラウドセキュリティ
GitHubumair9747/bucky

bucky

S3アカウントIDの列挙とバケットディスカバリーツール

リポジトリを見る
215ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Bucky

S3アカウントIDの列挙とバケット発見ツール




1つのアクセス可能なS3バケットを指定すると、buckyはその所有者の12桁のAWSアカウントIDを抽出し、ワードリストに対してバケット名をファジングすることで同じアカウントに属する追加のバケットを発見します。すべて1つのコマンドで行えます。

機能

  1. アカウントIDを列挙 — s3:ResourceAccount IAM条件キーを使用して、インラインSTSセッションポリシーを介して12桁のAWSアカウントIDを1桁ずつブルートフォースします。
  2. さらにバケットを発見 — ワードリストからバケット名をファジングし、同時ワーカーを使用して同じアカウントが所有する追加のバケットを見つけます。
  3. すべてを報告 — アカウントID、バケットリージョン、発見されたすべてのバケット。

これが重要な理由

当初、S3バケット名は単一のグローバル名前空間を共有しており、バケットスクワッティング(攻撃者が組織が作成すると予想される名前を先取りすること)を引き起こしました。AWSはこれに対処するために、アカウントリージョナル名前空間(各バケットをその所有者アカウントとリージョンに関連付ける命名スキーム)を展開しました:

root@kitploit:~
{name}-{accountID}-{region}-an

myapp-123456789123-eu-north-1-anというバケットはhttps://myapp-123456789123-eu-north-1-an.s3.eu-north-1.amazonaws.comに存在します。AWSは現在新しいバケットにこの形式を推奨していますが、まだデフォルトではありません。(新しい名前空間がバケットスクワッティングをどのように撲滅するかの背景については、One Cloud Pleaseを参照してください。)

トレードオフとして、アカウントIDとリージョンがバケット名自体に組み込まれるようになりました。攻撃者がターゲットのアカウントIDを入手すると、ワードリストと組み合わせて有効なバケットURLを体系的に構築でき、S3はバケットがプライベートであっても各バケットが存在するかどうかを確認します。それだけでも有用な偵察となります。

Buckyはまさにこれを利用しています。Pwned Labsの研究に基づき、まずs3-account-search技術を使用してアクセス可能なバケットから12桁のアカウントIDを回復し、その後{name}-{accountID}-{region}-anパターンをブルートフォースしてターゲットのより広範なS3フットプリントを明らかにします。

技術の仕組み

  1. 自分の AWSアカウントに、ターゲットバケットに対するs3:ListBucketまたはs3:GetObjectを持つIAMロールを作成します。
  2. そのロールに対してsts:AssumeRoleを呼び出し、"1*"のようなs3:ResourceAccount条件を持つインラインセッションポリシーを渡します。
  3. ターゲットバケットの所有者アカウントが1で始まる場合、HeadBucket呼び出しは成功します。それ以外の場合は403を返します。
  4. 各桁の位置(0~9)について、12桁すべてが判明するまで繰り返します。
  5. インラインセッションポリシーは許可境界として機能します。ロールの権限と交差するため、条件が一致した場合のみアクセスが許可されます。

これには最大120回のAPI呼び出し(12桁×10数字)が必要で、通常は1分以内に完了します。

インストール

go installを使用

root@kitploit:~
go install github.com/umair9747/bucky@latest

ソースから

root@kitploit:~
git clone https://github.com/umair9747/bucky.git
cd bucky
go build -o bucky .
sudo mv bucky /usr/local/bin/

更新

root@kitploit:~
bucky --update

これにより、リポジトリから最新バージョンをプルしてインストールします。

前提条件:IAMロールのセットアップ

buckyを使用する前に、ターゲットS3バケットにアクセスできる自分のAWSアカウントにIAMロールが必要です。ターゲットバケットは公開アクセス可能であるか、あなたのアカウントからのアクセスを許可するバケットポリシーが必要です。

ステップ1: 信頼ポリシーを作成

trust-policy.jsonを作成します — これによりIAMユーザーがロールを引き受けられるようになります:

root@kitploit:~
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<YOUR_ACCOUNT_ID>:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

<YOUR_ACCOUNT_ID> をあなたの12桁のAWSアカウントIDに置き換えてください。プリンシパルを :root の代わりに特定のIAMユーザーまたはロールARNにスコープできます。

ステップ2: 権限ポリシーを作成

s3-policy.jsonを作成します。このロールには広範なS3読み取りアクセスが必要です(buckyのインラインセッションポリシー内のs3:ResourceAccount条件がアカウントレベルのフィルタリングを処理します):

root@kitploit:~
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": "*"
    }
  ]
}

ステップ3: ロールを作成

root@kitploit:~
aws iam create-role \
  --role-name bucky-role \
  --assume-role-policy-document file://trust-policy.json

aws iam put-role-policy \
  --role-name bucky-role \
  --policy-name S3ReadAccess \
  --policy-document file://s3-policy.json

ステップ4: ロールARNを取得

root@kitploit:~
aws iam get-role --role-name bucky-role --query 'Role.Arn' --output text
# 出力: arn:aws:iam::123456789012:role/bucky-role

ステップ5: AssumeRole権限を確認

IAMユーザーにまだsts:AssumeRole権限がない場合は、付与します:

root@kitploit:~
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::<YOUR_ACCOUNT_ID>:role/bucky-role"
    }
  ]
}

使用法

完全ワークフロー(デフォルト)

buckyの主な使用方法 — 既知のバケットからアカウントIDを列挙し、その後一挙にさらにバケットをファジングします:

root@kitploit:~
bucky \
  --role-arn arn:aws:iam::123456789012:role/bucky-role \
  --bucket target-bucket \
  --wordlist wordlists/default.txt \
  --access-key AKIA... \
  --secret-key wJal...

既知のオブジェクトキーを使用する場合(信頼性が向上します):

root@kitploit:~
bucky \
  --role-arn arn:aws:iam::123456789012:role/bucky-role \
  --bucket s3://target-bucket/index.html \
  --wordlist wordlists/default.txt \
  --workers 20

複数バケット(カンマ区切り):

root@kitploit:~
bucky \
  --role-arn arn:aws:iam::123456789012:role/bucky-role \
  --bucket bucket1,bucket2,bucket3 \
  --wordlist wordlists/default.txt

ファイルから複数バケット:

root@kitploit:~
bucky \
  --role-arn arn:aws:iam::123456789012:role/bucky-role \
  --bucket-file targets.txt \
  --wordlist wordlists/default.txt

結果をJSONに保存:

root@kitploit:~
bucky --bucket target-bucket --wordlist wordlists/default.txt --json
bucky --bucket target-bucket --wordlist wordlists/default.txt --json --output results.json

出力:

root@kitploit:~
=== Phase 1: Account ID Enumeration ===
[*] Verifying access to bucket: target-bucket
[+] Access confirmed
[+] Bucket region: us-west-2
[*] Enumerating account ID...
  [██████████████████████████████] 12/12 | 675351422352

[+] Account ID: 675351422352

=== Phase 2: Bucket Discovery ===
[*] Fuzzing buckets for account: 675351422352
[*] Loaded 312 candidates from wordlist
[+] FOUND: target-backups
[+] FOUND: target-logs
  [██████████████████████████████] 312/312 | 2 found

=== Summary ===
Account ID : 675351422352
Source     : target-bucket
Region     : us-west-2
Discovered : 2 additional bucket(s)
             - target-backups
             - target-logs

列挙のみ

アカウントIDのみが必要な場合:

root@kitploit:~
bucky enum \
  --role-arn arn:aws:iam::123456789012:role/bucky-role \
  --bucket target-bucket

複数バケットとJSON出力はサブコマンドでも機能します:

root@kitploit:~
bucky enum --bucket bucket1,bucket2 --json
bucky enum --bucket-file targets.txt --json --output results.json

ファジングのみ

すでにアカウントIDを持っていてバケットを発見したい場合:

root@kitploit:~
bucky fuzz \
  --role-arn arn:aws:iam::123456789012:role/bucky-role \
  --account-id 675351422352 \
  --wordlist wordlists/default.txt \
  --workers 20

環境変数

すべてのフラグは環境変数で設定できます。両方が設定されている場合はフラグが優先されます。

環境変数を使用した例

root@kitploit:~
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=wJal...
export BUCKY_ROLE_ARN=arn:aws:iam::123456789012:role/bucky-role

# あとはターゲットを指定するだけ
bucky --bucket target-bucket --wordlist wordlists/default.txt

ワードリスト

Buckyにはwordlists/default.txtにあるデフォルトのワードリストが付属しており、約300の一般的なS3バケット命名パターンが含まれています:

  • 汎用名(backups、logs、data、assets、uploads)
  • AWSサービスのパターン(cloudtrail-logs、terraform-state、lambda-artifacts)
  • 環境バリアント(prod-logs、staging-data、dev-backups)
  • アプリケーションパターン(api、web-assets、cdn-origin)
  • インフラストラクチャ(ci-artifacts、、)

カスタムワードリスト

ターゲットを絞ったエンゲージメントでは、組織名を先頭に付けてカスタムワードリストを生成します:

root@kitploit:~
ORG="acme"
while read -r line; do
  [[ "$line" =~ ^#.*$ || -z "$line" ]] && continue
  echo "${ORG}-${line}"
  echo "${line}-${ORG}"
  echo "${ORG}${line}"
done < wordlists/default.txt > wordlists/acme.txt

ffufやgobusterなどのツールと互換性のあるワードリストが使用できます。形式:1行に1つのバケット名、#はコメント、空行は無視されます。

コマンドリファレンス

コマンド説明
bucky完全ワークフロー — アカウントIDを列挙し、さらにバケットをファジング
bucky enum既知のバケットから12桁のアカウントIDを列挙
bucky fuzz既知のアカウントIDに対してバケット名をファジング

フラグ

グローバルフラグ(すべてのコマンド):

bucky(完全ワークフロー):

フラグ説明
--bucketターゲットS3バケット(カンマ区切り)

bucky enum:

フラグ説明
--bucketターゲットS3バケット(カンマ区切り)
--bucket-fileバケット名/URLが1行に1つずつ書かれたファイル

bucky fuzz:

フラグ説明
--account-idターゲットの12桁AWSアカウントID

バケットの入力形式

--bucketフラグと--bucket-fileは複数の入力形式を受け入れます。Buckyは自動的にバケット名(およびオプションのキー)を次の形式から抽出します:

形式例
プレーン名my-bucket
S3 URIs3://my-bucket/path/to/key
バーチャルホストURL

複数のバケットは--bucketでカンマ区切りで渡せます:

root@kitploit:~
--bucket bucket1,s3://bucket2/key,https://bucket3.s3.amazonaws.com/

または--bucket-fileでファイルに1行1つずつリストします:

root@kitploit:~
my-bucket
s3://another-bucket/index.html
https://third.s3.us-east-1.amazonaws.com/

複数のバケットが同じアカウントIDに解決される場合、buckyは重複を排除し、一意のアカウントごとにファジングを1回だけ実行します。

JSON出力

--jsonを使用して結果をJSONファイルに保存します。デフォルトのファイル名はカレントディレクトリのbucky-{uuid}.jsonです。または--outputでパスを指定します:

root@kitploit:~
bucky --bucket target-bucket --wordlist wordlists/default.txt --json
bucky --bucket target-bucket --wordlist wordlists/default.txt --json --output results.json

出力形式:

root@kitploit:~
{
  "timestamp": "2024-01-15T10:30:00Z",
  "results": [
    {
      "bucket": "target-bucket",
      "account_id": "675351422352",
      "region": "ap-south-1",
      "discovered_buckets": [
        "dev-675351422352-ap-south-1-an.s3.ap-south-1.amazonaws.com",
        "prod-675351422352-ap-south-1-an.s3.ap-south-1.amazonaws.com"
      ]
    }
  ]
}

バケットリージョンの処理

Buckyはターゲットバケットのリージョンを自動的に検出します。S3が301リダイレクトを返した場合(バケットが--regionとは異なるリージョンにある場合)、buckyはx-amz-bucket-region HTTPレスポンスヘッダーを介して正しいリージョンを解決し、後続のすべてのリクエストのためにキャッシュします。ターゲットバケットに手動でリージョン設定を行う必要はありません。

連絡しましょう!

Genzaiに関するご質問やフィードバック、または私との連絡をご希望の場合は、LinkedInやメールでお気軽にご連絡ください。

ツールをダウンロード
変数フラグ説明
AWS_ACCESS_KEY_ID--access-keyAWSアクセスキーID
AWS_SECRET_ACCESS_KEY--secret-keyAWSシークレットアクセスキー
AWS_SESSION_TOKEN--session-tokenAWSセッショントークン(一時的な認証情報用)
AWS_REGION--regionAWSリージョン(デフォルト: us-east-1)
AWS_DEFAULT_REGION--regionAWS_REGIONが設定されていない場合のフォールバック
AWS_PROFILE--profile~/.aws/credentials からのAWS名前付きプロファイル
BUCKY_ROLE_ARN--role-arn引き受けるIAMロールのARN
BUCKY_BUCKET--bucketターゲットS3バケット名
BUCKY_ACCOUNT_ID--account-idターゲットAWSアカウントID(fuzzのみ)
BUCKY_WORDLIST--wordlistワードリストファイルへのパス
BUCKY_WORKERS--workers同時ファジングワーカー数(デフォルト: 10)
build-output
docker-images
フラグ説明
--access-keyAWSアクセスキーID
--secret-keyAWSシークレットアクセスキー
--session-tokenAWSセッショントークン
--regionAWSリージョン(デフォルト: us-east-1)
--profileAWS名前付きプロファイル
--role-arn引き受けるIAMロールのARN
--json結果をJSONファイルに保存
--outputJSON出力ファイルのパス(デフォルト: bucky-{uuid}.json)
--bucket-fileバケット名/URLが1行に1つずつ書かれたファイル
--wordlistワードリストファイルへのパス
--workers同時ワーカー数(デフォルト: 10)
--wordlistワードリストファイルへのパス
--workers同時ワーカー数(デフォルト: 10)
--regions名前の変異のためのカンマ区切りのリージョン
https://my-bucket.s3.us-west-2.amazonaws.com/key
パス形式URLhttps://s3.us-west-2.amazonaws.com/my-bucket/key