AWS - S3 認証なし列挙
Reading time: 13 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
S3 パブリックバケット
バケットは、任意のユーザーがバケットの内容をリストできる場合に**「パブリック」と見なされ、特定のユーザーのみがリストまたは書き込みできる場合に「プライベート」**と見なされます。
企業は、バケットの権限が誤って設定されている可能性があり、すべてのユーザーまたはAWSの任意のアカウントに認証されたすべてのユーザーにアクセスを許可することがあります(つまり、誰でも)。このような誤設定があっても、バケットには独自のアクセス制御リスト(ACL)があるため、いくつかのアクションは実行できない場合があります。
AWS-S3の誤設定についてはこちらで学ぶ: http://flaws.cloud および http://flaws2.cloud/
AWS バケットの発見
ウェブページがAWSを使用してリソースを保存しているかどうかを見つけるためのさまざまな方法:
列挙 & OSINT:
- wappalyzer ブラウザプラグインを使用
- burpを使用して(ウェブをスパイダーする)または手動でページをナビゲートすることで、すべてのリソースが履歴に保存されます。
- ドメインでのリソースを確認:
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
- CNAMESを確認します。
resources.domain.com
はbucket.s3.amazonaws.com
のCNAMEを持っている可能性があります。 - s3dns – DNSトラフィックを分析することでクラウドストレージバケット(S3、GCP、Azure)を受動的に特定する軽量DNSサーバー。CNAMEを検出し、解決チェーンを追跡し、バケットパターンを一致させ、ブルートフォースやAPIベースの発見に対する静かな代替手段を提供します。偵察やOSINTワークフローに最適です。
- https://buckets.grayhatwarfare.com、すでに発見されたオープンバケットのウェブサイト。
- バケット名とバケットドメイン名は同じである必要があります。
- flaws.cloudはIP 52.92.181.107にあり、そこに行くとhttps://aws.amazon.com/s3/にリダイレクトされます。また、
dig -x 52.92.181.107
はs3-website-us-west-2.amazonaws.com
を返します。 - バケットであることを確認するには、https://flaws.cloud.s3.amazonaws.com/を訪問することもできます。
ブルートフォース
ペンテストしている会社に関連する名前をブルートフォースすることでバケットを見つけることができます:
- https://github.com/sa7mon/S3Scanner
- https://github.com/clario-tech/s3-inspector
- https://github.com/jordanpotti/AWSBucketDump(潜在的なバケット名のリストを含む)
- https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets
- https://github.com/smaranchand/bucky
- https://github.com/tomdev/teh_s3_bucketeers
- https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3
- https://github.com/Eilonh/s3crets_scanner
- https://github.com/belane/CloudHunter
# パーミュテーションを作成するためのワードリストを生成
curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt
# テストするためのドメインとサブドメインに基づいてワードリストを生成
## これらのドメインとサブドメインをsubdomains.txtに書き込む
cat subdomains.txt > /tmp/words-hosts-s3.txt
cat subdomains.txt | tr "." "-" >> /tmp/words-hosts-s3.txt
cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt
# 攻撃するためのドメインとサブドメインのリストに基づいてパーミュテーションを作成
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## 前のツールはサブドメインのパーミュテーションを作成することに特化しているので、そのリストをフィルタリングします
### "."で終わる行を削除
cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### TLDなしのリストを作成
cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
### ドットなしのリストを作成
cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### ハイフンなしのリストを作成
cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5
## 最終的なワードリストを生成
cat /tmp/final-words-s3.txt.temp2 /tmp/final-words-s3.txt.temp3 /tmp/final-words-s3.txt.temp4 /tmp/final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp/final-words-s3.txt
## s3scannerを呼び出す
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt | grep bucket_exists
S3 バケットの略奪
S3のオープンバケットがある場合、BucketLootは自動的に興味深い情報を検索できます。
リージョンを見つける
AWSがサポートするすべてのリージョンは、https://docs.aws.amazon.com/general/latest/gr/s3.htmlで確認できます。
DNSによる
dig
およびnslookup
を使用して、発見されたIPのDNSリクエストを行うことでバケットのリージョンを取得できます:
dig flaws.cloud
;; ANSWER SECTION:
flaws.cloud. 5 IN A 52.218.192.11
nslookup 52.218.192.11
Non-authoritative answer:
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com.
解決されたドメインに「website」という単語が含まれていることを確認してください。
静的ウェブサイトには次のURLでアクセスできます: flaws.cloud.s3-website-us-west-2.amazonaws.com
または、バケットには次のURLでアクセスできます: flaws.cloud.s3-us-west-2.amazonaws.com
試してみる
バケットにアクセスしようとした場合、指定したドメイン名に別のリージョンが含まれている(たとえば、バケットが bucket.s3.amazonaws.com
にあるが、bucket.s3-website-us-west-2.amazonaws.com
にアクセスしようとした場合)、正しい場所に誘導されます:
バケットの列挙
バケットのオープン性をテストするために、ユーザーは単にURLをウェブブラウザに入力することができます。プライベートバケットは「アクセス拒否」と応答します。パブリックバケットは、保存された最初の1,000オブジェクトをリストします。
誰でもアクセス可能:
プライベート:
これをCLIでも確認できます:
#Use --no-sign-request for check Everyones permissions
#Use --profile <PROFILE_NAME> to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions
#--recursive if you want list recursivelyls
#Opcionally you can select the region if you now it
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]
バケットにドメイン名がない場合、列挙しようとするときは、バケット名のみを入力し、AWSs3ドメイン全体は入力しないでください。例: s3://<BUCKETNAME>
公開URLテンプレート
https://{user_provided}.s3.amazonaws.com
公開バケットからアカウントIDを取得する
新しい S3:ResourceAccount
ポリシー条件キーを利用することで、AWSアカウントを特定することが可能です。この条件は、アカウントが存在するS3バケットに基づいてアクセスを制限します(他のアカウントベースのポリシーは、リクエスト元のプリンシパルが存在するアカウントに基づいて制限します)。
ポリシーにはワイルドカードを含めることができるため、アカウント番号を1つずつ見つけることが可能です。
このツールはそのプロセスを自動化します:
# Installation
pipx install s3-account-search
pip install s3-account-search
# With a bucket
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket
# With an object
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext
この技術は、API Gateway URLs、Lambda URLs、Data Exchange データセット、さらにはタグの値を取得するためにも機能します(タグキーがわかっている場合)。詳細については、元の研究と、この悪用を自動化するためのツールconditional-loveを参照してください。
バケットが AWS アカウントに属していることを確認する
このブログ投稿で説明されているように、バケットをリストする権限がある場合、次のようなリクエストを送信することで、バケットが属する accountID を確認することが可能です。
curl -X GET "[bucketname].amazonaws.com/" \
-H "x-amz-expected-bucket-owner: [correct-account-id]"
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">...</ListBucketResult>
エラーが「Access Denied」の場合、アカウントIDが間違っていることを意味します。
ルートアカウント列挙としての使用メール
このブログ記事で説明されているように、S3バケットに対してACLを介してメールに権限を付与しようとすることで、メールアドレスがAWSアカウントに関連しているかどうかを確認することが可能です。これがエラーを引き起こさない場合、そのメールは何らかのAWSアカウントのルートユーザーであることを意味します。
s3_client.put_bucket_acl(
Bucket=bucket_name,
AccessControlPolicy={
'Grants': [
{
'Grantee': {
'EmailAddress': 'some@emailtotest.com',
'Type': 'AmazonCustomerByEmail',
},
'Permission': 'READ'
},
],
'Owner': {
'DisplayName': 'Whatever',
'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef'
}
}
)
参考文献
- https://www.youtube.com/watch?v=8ZXRw4Ry3mQ
- https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。