🐑

flAWSのレベル1やる。

2023/03/26に公開

そうしてAWSの設定ミスにより8万円の請求を受けた私。
AWS カキン コワイ
しかも会社が4万円補填してくれた。本当にごめん。

今回はflAWSでAWSについて学び、設定ミスや不正利用につよい人間になります。
flAWSは、AWSでありがちな設定ミスや脆弱性をテーマにした設問が6レベル用意されていて、私たちがクラッカー役となり実際に抜け穴を見つけてステージクリアを目指します。

flAWSにアクセス

まずはflAWSのWEBサイトにアクセス。
flAWS
マトリックスなムード。

Level1
ページ下部。さっそく1問目が始まります

1問目の出題はこう。

This level is buckets of fun. See if you can find the first sub-domain.

”バケット”に関することだと。まずサブドメインが見つかるかやってみてと。
ふむふむバケットってことはS3のことですねー?ハイハイ
そしてサブドメイン探索はクラッキングを実行の初手ですよね〜本で読みました〜

で、どうするの?

問題文1行だけ?なんのサブドメインを探索?ヒントオ!

flAWSサイトを逆引き

なるほど、このサイト自体を実際に調べれば良いんですね。

ではまずflaws.cloudを名前解決します。(2-3行目は秘匿してます)

zsh
% nslookup flaws.cloud
Server:		
Address:	

Non-authoritative answer:
Name:	flaws.cloud
Address: 52.92.136.67
Name:	flaws.cloud
Address: 52.218.217.98
Name:	flaws.cloud
Address: 52.92.243.187
〜以下略〜

でてきたIPアドレスを逆引きしてみます。

zsh
% nslookup 52.92.136.67
Server:		
Address:	

Non-authoritative answer:
67.136.92.52.in-addr.arpa	name = s3-website-us-west-2.amazonaws.com.

Authoritative answers can be found from:

このIPアドレスは、s3-website-us-west-2.amazonaws.com.というドメインのものであることがわかります。(一緒に出てきた他のIPアドレスも結果は同じ。)
ということで、このflaws.cloudというサイトはAmazon S3バケットを使って公開されていることがわかりました。

S3はストレージサービスですが、githubでサイトを公開するのと同じように、静的なコンテンツならS3を使うことはよくあるそう。

そしてS3を使っているということは?と繋がるんですが、事前知識がないと先に進めません。

S3webサーバの特性

この問題を解くには、S3をWebサーバとして使用するときの性質を知っている必要があります。

ドメイン名とバケット名が同じこと

S3バケットを作成するとき、バケット名はグローバルに一意な文字列にする必要があります。
さらにWebサイトホストとして使用するには、バケット名とドメイン名を一致させる必要があります。(これはS3バケットを何度も作成したことがあれば体が覚えているはずです。私は違います)

ということで、S3バケットで公開されているflAWSのドメイン名は"flaws.cloud"なので、バケット名も"flaws.cloud"であるはずです。

URLが特定の形式になること

Webサイトとして使用されるS3バケットの全てには、独自にDNSを設定しなくてもコンテンツにアクセスできるようにAWSドメインが割り当てられ、そのURLは次のような形式になります。
http://<バケット名>.s3-<リージョン名>.amazonaws.com/(仮想ホスト形式)
http://s3-<リージョン名>.amazonaws.com/<バケット名>(パス形式)

つまりflAWSのサイトにもAWSドメインが存在しているわけで、独自ドメインである"flaws.cloud"のほかに、AWSドメインでもコンテンツにアクセスできるはずです。

ということは?
このサイトのAWSドメインURLが分かれば、なにか次に進めそうです。
AWSドメイン名を完成させるためには「バケット名」と「リージョン名」が必要ですが、
バケット名はドメイン名と同じ"flaws.cloud"。
リージョン名は、サイトのIPアドレスを逆引きした時のname = s3-website-us-west-2.amazonaws.com.から"us-west-2"であることがわかります。

すなわち、flAWSのAWSドメイン名は次のどちらかです。

http://flaws.cloud.s3-us-west-2.amazonaws.com/
http://s3-us-west-2.amazon.com/flaws.cloud

サブドメインを発見

じゃあ試しにhttp://flaws.cloud.s3-us-west-2.amazonaws.com/としてアクセスしてみます。

flaws.cloud.s3-us-west-2.amazonaws.com/
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>flaws.cloud</Name>
<Prefix/>
<Marker/>
<MaxKeys>1000</MaxKeys>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>hint1.html</Key>
<LastModified>2017-03-14T03:00:38.000Z</LastModified>
<ETag>"f32e6fbab70a118cf4e2dc03fd71c59d"</ETag>
<Size>2575</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
<Contents>
<Key>hint2.html</Key>
<LastModified>2017-03-03T04:05:17.000Z</LastModified>
<ETag>"565f14ec1dce259789eb919ead471ab9"</ETag>
<Size>1707</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
〜以下略〜

これじゃん。
S3バケットにアクセスできて、ディレクトリツリーが一覧で見えてしまっています。
これが"http://flaws.cloud/" 以降のサブドメインたちです。

おや?そのなかに、ひときわ見えちゃいけなさそうな名前のファイルがあります。

<Contents>
<Key>secret-dd02c7c.html</Key>
<LastModified>2017-02-27T01:59:30.000Z</LastModified>
<ETag>"c5e83d744b4736664ac8375d4464ed4c"</ETag>
<Size>1051</Size>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>

"http://flaws.cloud/secret-dd02c7c.html"としてアクセスしてみると…クリアとなります。
Level1クリア
やったークリアです!
わかるかー!!
これはノーヒントで解こうと思ったら、AWSの基礎知識がかなり必要です。
私はヒントを見ながらお勉強をかねてやります。(笑顔)

もちろん専門の人はこんなもん超簡単らしい。スゴイ

問題を回避する方法

ところで一番大切なところです。
今回の設問のような脆弱な状況を防ぐためにはどうしたら良いのかというはなしです。

今回は結局、ディレクトリリスティングが可能になっていた、ということが問題でしたが、
いまのAWSではここの部分かなり厳重になっていて、わざわざ手の込んだ設定をしない限り、今回の設問のような状況にはならないようになっています。

一応、あえて全世界にディレクトリリスティングを許可する設定を確認してみます。

まずS3バケットをWebサイトホストにする通常の手順を完了させます。

次にアクセスコントロールリストの編集をするために「バケット所有者の強制」をクリックします。
アクセスコントロールリスト
ACLはデフォルトで無効状態

アクセスコントロールリストを有効にします。警告メッセージがめちゃ出てきます。
オブジェクト所有者の変更
とても物騒な雰囲気。
「私は、ACLが復元されることを了承します。」にチェックを入れ、変更を保存。

アクセスコントロールリストが編集できるようになったので、編集をクリック。
編集可能なACL

ここで「全員(パブリックアクセス)」に「リスト」の「読み込み」権限を追加。
ACLを編集

するとさらに警告が出てくるので、チェックを入れて変更を保存。
警告

これで完了しましたが、ここにもでかでかと警告。
ACLに表示された警告

こんな感じで、素人目に見ても「なんか違うのかな」と気づく、警告だらけの設定をしない限りは、うっかりディレクトリリスティング可能にしてしまうことはありません。
(RDSのインスタンスタイプ選択も同じようにして欲しいです🌟)

以上!

Discussion