AWS - S3 Unauthenticated Enum

htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

S3パブリックバケット

バケットは、バケットの内容を誰でもリストできる場合は**「パブリック」と見なされ、バケットの内容を特定のユーザーだけがリストまたは書き込みできる場合は「プライベート」**と見なされます。

企業は、バケットの権限が誤って構成されている可能性があり、すべてにアクセスできるか、AWSの任意のアカウントで認証されたすべてのユーザーにアクセスできるようになっているかもしれません。ただし、そのような誤構成があっても、バケットには独自のアクセス制御リスト(ACL)があるため、一部のアクションを実行できない場合があります。

AWS-S3の誤構成についてはこちらを参照: http://flaws.cloud および http://flaws2.cloud/

AWSバケットの検出

WebページがAWSを使用してリソースを保存している場合の検出方法:

列挙とOSINT:

  • wappalyzerブラウザプラグインを使用する

  • burpを使用して(Webをスパイダリングする)またはページを手動でナビゲートしてすべてのロードされたリソース履歴に保存する

  • ドメイン内のリソースをチェックする:

http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
  • resources.domain.comのようなCNAMEをチェックすると、bucket.s3.amazonaws.comというCNAMEがあるかもしれません

  • すでに発見されたオープンバケットがあるhttps://buckets.grayhatwarfare.comをチェックする

  • バケット名バケットドメイン名同じである必要があります

  • flaws.cloudIP 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/にアクセスすることもできます。

ブルートフォース

企業に関連する名前をブルートフォースしてバケットを見つけることができます:

# パーミュテーションを作成するためのワードリストを生成
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
## 前述のツールはサブドメインのパーミュテーションを作成するために特化しています。そのリストをフィルタリングしましょう
<strong>### ".で終わる行を削除"
</strong>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による

**dignslookup**を使用して、発見された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.

Check that the resolved domain have the word "website". You can access the static website going to: flaws.cloud.s3-website-us-west-2.amazonaws.com or you can access the bucket visiting: 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]

パブリック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のURL、LambdaのURL、Data Exchangeのデータセット、さらにはタグの値(タグキーを知っている場合)を取得するためにも機能します。この悪用を自動化するためのconditional-loveというツールや、元の研究で詳細情報を見つけることができます。

参考文献

**htARTE(HackTricks AWS Red Team Expert)**でAWSハッキングをゼロからヒーローまで学ぶ こちら

HackTricksをサポートする他の方法:

最終更新