【第30回】Security-JAWS DAYS CTF [!writeup#1]

 

まえがき

Security-JAWSのCTFイベントに参加してきたので問題の共有をさせていただきます!

Writeupは書けないので、いただいた解説資料を参考にしながら、
どんな問題があったのかを紹介していきます。

 

まずはイベントの基本情報です。

 

イベント概要

イベントの内容

出題する全ての問題がAWSサービスに特化した内容のものとなっている
AWS縛りのCTFイベント」

作問者

競技形式

Jeopardy形式(出題される問題をクイズ形式で回答することで得点を競う方式)

問題の種類

  • Trivia
    • CTF初心者用
    • 一問一答のクイズ
  • Warmup
    • CTF初心者用
    • AWS CLIの基本的な操作や仕組みを理解していれば簡単(?)な問題
      ※この記事ではWarmupの問題だけ取り扱います。
  • Easy
    • AWSのサービスについての理解が必要なCTF(初級)
  • Medium
    • CTF(中級)
    • かなり難しい
  •  Hard
    • レッドチーム寄りの本格的なCTF(上級)
    • SSRFを使ったりしてた
    • ペンテスターなら解けるのかな?レベル

チャレンジ

ここから問題の紹介をしていきます。

Trivia以外は基本的にAWS CLIを使ってターミナル上で操作する問題が多かったです。

一部コンソールに入って操作する問題もありました。

AWSは全く使ったことなかったので、
今回のイベントでいくつかコマンドを知れました。

 

ただ、Warmupは難易度が低めなので、
セキュリティ的な学びみたいなものはあまりなかったです。

AWS CLIの使い方を学ぶためのCTFって感じ。

 

次回は、Hardとかを紹介しようと思ってるのですが、
そこではかなりセキュリティ的な学びがありました。
ぜひ、楽しみにしていてください;)

 

Warmup

AWS CLI practice
  • 問題
    • このIAMユーザー(シークレットキー+アクセスキー)が所属するAWSアカウントIDは何?
  •  配布データ
    • Access key ID:AKIA5YYUV3PDUQZK35HR
    • Secret access key:tDyHHDd1rinqmmccbfsG7zks9nzoUXQR070yiRLD
  • 解法
    1. もらったCredentialをAWSにセット
      【使えるコマンド】
      configureAWS CLI に関する情報を設定します。このコマンドを引数なしで実行すると、AWS Access Key IdAWS Secret Access Key などの設定値の入力を求められます。 引数--profileを使用すると、名前付きプロファイルを設定できます。 設定ファイルが存在しない場合(デフォルトの場所は~/.aws/config)、AWS CLIが作成してくれます。 既存の値を保持するには、値を入力するプロンプトが表示されたらEnterキーを押します。 情報を入力するプロンプトが表示されたら、現在の値が[]内に表示されます。 configure項目に値がない場合は、[None]と表示されます。(※configureコマンドはコンフィグファイルの値でのみ動作することに注意してください。 環境変数やIAMロールの設定値は使用しません。)

      docs.aws.amazon.com

      $ aws configure

      AWS Access Key ID []: AKIA5YYUV3PDUQZK35HR
      AWS Secret Access Key []: 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
      Default region name []: ap-northeast-1
      Default output format []: json
    2. アカウントIDを取得するためのコマンドを叩く
      $ aws sts get-caller-identity

      {
          "UserId": "AIDA5YYUV3PDXROBLRDKF",
          "Account": "946546793415",
          "Arn": "arn:aws:iam::946546793415:user/ctf_challenge_0"
      }
      ※ここはアカウントIDを入力する練習問題なので"946546793415"を入力したら終わり


Run function
  • 問題
    • アクセスキーを調べてFLAGを入手せよ!
  •  配布データ
    • Access key ID:AKIAQZ2IU22WLIFMFL6G
    • Secret access key:9s+Yt+YYM8xXEvrxvTCpUziVnMKT/bnUTuW3pmXV
  • 解法
    1. もらったCredentialをセット
      $ aws configure --profile runfunction

      AWS Access Key ID []: AKIAQZ2IU22WLIFMFL6G
      AWS Secret Access Key []: 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
      Default region name []: ap-northeast-1
      Default output format []: json
      ※「runfunction」という新しいプロファイルを作成して、そこに新しいクレデンシャルをセットしている

    2. IAMユーザの名前を取得
      【使えるコマンド】
      sts:get-caller-identity:操作の呼び出しに使用されたクレデンシャルを持つ IAM ユーザーまたはロールの詳細を返します。(※このコマンドは実行に権限が必要なく、明示的に拒否するポリシーが書かれていたとしても常に同じ結果を返す。)

      docs.aws.amazon.com


      $ aws sts get-caller-identity --profile runfunction 

      {
          "UserId": "AIDAQZ2IU22WIFYNZDUBU",
          "Account": "055450064556",
          "Arn": "arn:aws:iam::055450064556:user/ctf_challenge_6"
      }

      ※ Security Token Service(sts)の"get-caller-identity"コマンドを叩いて、IAMユーザ名(ctf_challenge_6)を取得している

    3. ユーザにアタッチされているインラインポリシー名を取得
      【使えるコマンド】
      iam:list-user-policies:--user-nameで指定したIAMユーザに組み込まれたインラインポリシーの一覧を表示します。

      docs.aws.amazon.com


      $ aws iam list-user-policies --user-name ctf_challenge_6 --profile runfunction

      {
          "PolicyNames": [
              "runlambda"
          ]
      }
      ※"Identity and Access Management(iam)"の"list-user-policies"コマンドで"ctf_challenge_6"(ユーザ名)のインラインポリシーを確認すると、"runlambda"が付与されていることが分かる

    4. ポリシーの詳細を確認
      【使えるコマンド】
      iam:get-user-policy:指定された IAM ユーザーに組み込まれている指定されたインラインポリシードキュメント(指定したポリシーの詳細?)を取得します。

      docs.aws.amazon.com


      $ aws iam get-user-policy --user-name ctf_challenge_6 --policy-name runlambda --profile run_function

      {
          "UserName": "ctf_challenge_6",
          "PolicyName": "runlambda",
          "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Sid": "readiam",
                      "Effect": "Allow",
                      "Action": [
                          "iam:Get*",
                          "iam:List*"
                      ],
                      "Resource": "arn:aws:iam::055450064556:user/ctf_challenge_6"
                  },
                  {
                      "Sid": "lambdaInvoke",
                      "Effect": "Allow",
                      "Action": [
                          "lambda:InvokeFunction"
                      ],
                      "Resource": "arn:aws:lambda:ap-northeast-1:055450064556:function:run_me"
      ※"get-user-policy"コマンドで"ctf_challenge_6"にアタッチされている"runlambda"というインラインポリシーの詳細を確認すると、"run_me"という関数の実行権限が付与されていることが分かる

    5. "run_me"を実行してみる
      【使えるコマンド】
      lambda:invoke:ラムダ関数を呼び出す。関数は同期的に呼び出すことも、非同期的に呼び出すこともできます。関数を非同期に呼び出すには、InvocationTypeをEventに設定します。

      docs.aws.amazon.com


      $ aws lambda invoke --function-name run_me out --log-type Tail --profile run_function

      {
          "StatusCode": 200,
        "LogResult": "U1RBUlQgUmVxdWVzdElkOiBiMjQ1Y2NlNi0wN2RlLTRjMTktOGUxZS00NmJjZTA3ZWE2MDIgVmVyc2lvbjogJExBVEVTVApTSkFXU3tZb3Vfd2FzX2FibGVfdG9fYXJyaXZlX0B0X3RoZV9sYW1iZGFfZnVuY3Rpb24uLXdlbGxfZG9uZSF9CkVORCBSZXF1ZXN0SWQ6IGIyNDVjY2U2LTA3ZGUtNGMxOS04ZTFlLTQ2YmNlMDdlYTYwMgpSRVBPUlQgUmVxdWVzdElkOiBiMjQ1Y2NlNi0wN2RlLTRjMTktOGUxZS00NmJjZTA3ZWE2MDIJRHVyYXRpb246IDEuMDkgbXMJQmlsbGVkIER1cmF0aW9uOiAyIG1zCU1lbW9yeSBTaXplOiAxMjggTUIJTWF4IE1lbW9yeSBVc2VkOiA0MCBNQgkK",
          "ExecutedVersion": "$LATEST"
      }
      ※ "run_me"を実行してログ形式で出力すると、base64エンコードされた文字列が出てくるのでCyberChefなどでデコードすると"SJAWS{You_was_able_to_arrive_@t_the_lambda_function.-well_done!}"が取得できる

 

Find data 1
  • 問題
    • FLAGはバケツに突っ込んであるので探してね!

コンソール上でポチポチするだけだったので割愛

 

FInd data 2
  • 問題
    • FLAGはバケツに突っ込んであるので探してね!
  •  配布データ
    • Access key ID:AKIAQZ2IU22WFLIJ47XF
    • Secret access key:/e0wQSYgKV8RpsMe1U7a28z1Io5xu9sy1FuWjVxo
  • 解法
    1. この問題用のプロファイルを作成して、クレデンシャルをセット
      $ aws configure --profile finddata2

      ----------------省略----------------
    2. バケットの一覧を確認
      【使えるコマンド】
      s3:ls:S3オブジェクトと共通のプレフィックス、または全てのS3バケットをリストアップする。(※このコマンドでは--outputと--no-paginate引数は無視されることに注意。)

      docs.aws.amazon.com


      $ aws s3 ls --profile finddata2

      2023-08-13 23:13:07 backup-37szjp8pny7xx01
      2023-08-26 22:43:13 camouflagedrop-wxhqft4lqf-assets-wxhqft4lqf-assets
      2023-08-26 22:39:22 camouflagedrop-wxhqft4lqf-web-wxhqft4lqf-static
      2023-08-22 20:16:14 cdk-hnb659fds-assets-055450064556-ap-northeast-1
      2023-08-25 03:05:46 file-storage-afeffefespntbaiw7o5
      2023-08-06 21:55:59 himituno-bucket1
      2023-08-06 21:58:33 himituno-bucket2
      2023-08-06 23:08:46 himituno-bucket3
      2023-08-27 02:41:30 my-backup-file-ulxmhiw3jroec7sclynr06fkvhqssf
      2023-08-22 20:56:47 s3misssignurl-t6j4qj4r-assets-t6j4qj4r-assets-bucket
      2023-08-22 20:52:31 s3misssignurl-t6j4qj4r-web-t6j4qj4r-static-host-bucket
      2023-08-24 04:24:09 totemo-kawaii-neko-no-namae-ha-lise-desu
      2023-08-27 01:18:59 ulxmhiw3jroec7sclynr06fkvhqssf
      ※S3バケットの一覧を取得している

    3. 取得したバケット名で再起的にディレクトリを探索
      $ aws s3 ls s3://himituno-bucket2 --recursive --profile finddata2

      ----------------省略----------------
      2023-08-06 22:01:53      62896 SECRET/44/flag.jpg
      2023-08-06 22:01:54      62896 SECRET/440/flag.jpg
      2023-08-06 22:01:54      62896 SECRET/441/flag.jpg
      2023-08-06 22:01:54      62896 SECRET/442/flag.jpg
      2023-08-06 22:01:55      62896 SECRET/443/flag.jpg
      2023-08-06 22:01:55      72674 SECRET/444/flag.jpg
      2023-08-06 22:01:55      62896 SECRET/445/flag.jpg
      2023-08-06 22:01:56      62896 SECRET/446/flag.jpg
      2023-08-06 22:01:56      62896 SECRET/447/flag.jpg
      2023-08-06 22:01:56      62896 SECRET/448/flag.jpg
      2023-08-06 22:01:56      62896 SECRET/449/flag.jpg
      ----------------省略----------------

      ※一つだけファイルサイズが異なるものがある


    4. ファイルサイズの異なる怪しいファイルをローカルにダウンロード
      【使えるコマンド】
      s3:cp:ローカルファイルまたはS3オブジェクトをローカルまたはS3の別の場所にコピーする。

      docs.aws.amazon.com

      $ aws s3 cp s3://himituno-bucket2/SECRET/444/flag.jpg /Users/shimano/Dropbox/Mac/Downloads --profile finddata2

      download: s3://himituno-bucket2/SECRET/444/flag.jpg to ../Dropbox/Mac/Downloads/flag.jpg
      ※この画像を表示させると以下のような画像が確認できる

      flag.jpg

       

      ※これにより"SJAWS{t@1hen-yoku_mitukemasita!}"が取得できる

Show IAM policy
  • 問題
    • このユーザーにアタッチされているポリシーを確認してみよう!Policyドキュメントを注意深くみたらFLAGが隠れているかも。
  •  配布データ
    • Access key ID:AKIAQZ2IU22WCSKUSTUF
    • Secret access key:Qw0q8RLnpZRnreIYxpflFZIJhD7bD1raJQcveJbG
  • 解法
    1. この問題用のプロファイルを作成して、クレデンシャルをセット
      $ aws configure --profile showiam

      ----------------省略----------------
    2. IAMユーザの名前を取得
      $ aws sts get-caller-identity --profile showiam

      {
          "UserId": "AIDAQZ2IU22WGWQKEMXU3",
          "Account": "055450064556",
          "Arn": "arn:aws:iam::055450064556:user/ctf_challenge_5"
      }

      ※"get-caller-identity"コマンドでIAMユーザ名(ctf_challenge_5)を取得している

    3. IAMユーザが所属しているグループ名を確認
      $ aws iam list-user-policies --user-name ctf_challenge_5 --profile showpolicy

      {
          "PolicyNames": []
      }
      ※IAMユーザには直接アタッチされていないため、グループのインラインポリシーを確認しに行く必要がある

      その前にIAMユーザが所属しているグループ名が必要なため、調べる。

      【使えるコマンド】
      iam:list-groups-for-user:指定した IAM ユーザーが所属する IAM グループを一覧表示します。

      docs.aws.amazon.com

      $ aws iam list-groups-for-user --user-name ctf_challenge_5 --profile showiam

      {
          "Groups": [
              {
                  "Path": "/",
                  "GroupName": "ctf5",
                  "GroupId": "AGPAQZ2IU22WHDOHFQVUC",
                  "Arn": "arn:aws:iam::055450064556:group/ctf5",
                  "CreateDate": "2023-08-06T14:48:22+00:00"
              }
          ]
      }

      ※"list-groups-for-user"コマンドにより"ctf_challenge_5"は"ctf5"というグループに所属していることが分かる

    4. 見つけたグループのポリシーを確認
      【使えるコマンド】
      iam:get-gropu-policy:指定された IAM グループに組み込まれている、指定されたインラインポリシードキュメントを取得します。

      docs.aws.amazon.com

      $ aws iam get-group-policy --group-name ctf5 --policy-name selfcheck --profile showpolicy

      {
          "GroupName": "ctf5",
          "PolicyName": "selfcheck",
          "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": {
                  "Sid": "U0pBV1N7RG9feW91LWZpbmRfdGhlX0B0dGFjaGVkX3AwbDFjeT99",
                  "Effect": "Allow",
                  "Action": [
                      "iam:Get*",
                      "iam:List*"
                  ],
                  "Resource": [
                      "arn:aws:iam::055450064556:group/ctf5",
                      "arn:aws:iam::055450064556:user/ctf_challenge_5"
                  ]
              }
          }
      }

      ※グループのポリシーを確認すると、"sid"にbase64エンコードされた文字列が出てくるのでCyberChefなどでデコードすると"SJAWS{Do_you-find_the_@ttached_p0l1cy?}"が取得できる

 

Where is the password?
  • 問題
    • AWSのとあるサービスからパスワードを取得してください!ヒント:AWSで安全にパスワードを管理したときに利用するサービスと言えば?」
    • パスワードがFLAGになっています
  • 配布データ
    • ログイン時に使用するURLとクレデンシャル
  •  解法
    1. 配布されたデータを用いてコンソールにログイン
    2. AWS Secret Manager」にアクセス
    3. "secretpassword"にフラグが入っている
      • "SJAWS{Use_Secrets_Manager_for_`@ssw0rd_Management!}"

 

あとがき

今回は解説を見ながらですが、Wamupの問題をやってみました!

AWS CLIを操作するための基礎中の基礎みたいな知識はつけれたかなと思ってます:)

今後はDay1でおすすめしてたAWSのSecurityに関するWorkshopをちょっとずつやっていこうかなと


ただ、MediumやHardの問題がペンテスターの実務に寄せられていて、
とても勉強になったので、
次回も問題の情報共有させていただきます。

ヾ(・◇・)ノ ピヨピヨ