BLOG

ブログ

2021/09/27 社外

初めてCTFに参加してみた

この記事を書いた人 Y.H

はじめまして、Y.Hと申します。

今回初めてCTFに参加してみたのでそもそもCTFとは何か、参加してみた感想を書くことにしました。

CTFとは

CTFとはCapture The Flagの略で、情報セキュリティに関する問題を解くことで知識・技術を競う競技です。
Capture The Flagは直訳すると旗取りゲーム、つまり旗=Flagで情報をとるゲームです。
問題にはフラグと呼ばれる文字列が隠されており、そのフラグを見つけて各設問の解答欄に入力することで得点を獲得することができます。
フラグの形式は開催されるCTFごとに異なります。今回参加したCTFではflag{} の形式で文字列が隠されていました。

開催規模

スポンサー企業が複数つく大規模なものから、個人が開催する小規模なものなど様々です。
大規模なCTFだと日本ではSECCONが国内最大規模となります。
開催期間もCTFによって異なり、24〜48時間のものや1週間の期間をとっているものもあります。

またいつでも参加可能なCTFも存在します。
こちらは競技用のCTFのように開催期間が定められておらず、いつでも問題に挑戦することができるため、「常設CTF」と呼ばれます。
CTF初心者にはCpawCTFという常設CTFが初心者向けでおすすめとのことです。

今回は個人が開催運営しているsetodaNote CTF(開催期間:2021.8.21 PM9:00 ~ 2021.9.4 PM9:00 (JST))に参加させていただきました!

競技形式

CTFにはいくつか競技形式がありますが、ここでは代表的な2つの形式を軽く紹介します。

Jeopardy形式

私が今回参加したCTFはこのJeopardy形式の問題になります。
いわゆるクイズ形式で出題され自由に問題を解いていき、最終的な合計得点を競うものです。
この形式では問題ごとに得点が異なり、難易度が高い問題ほど獲得できる得点が大きくなります。

Jeopardy形式は「Webアプリケーションに関する問題」や「暗号に関する問題」など、問題が複数のジャンルに分かれています。
開催されるCTFにによって多少異なる場合もあるようですが、代表的なジャンルは以下のようです。

  • Web:Webアプリケーションの脆弱性をついてフラグを取得する問題
  • Crypto:暗号技術に関する問題
  • Rev:リバースエンジニアリングの略で、実行可能なファイルを解析してフラグを取得する問題
  • Pwn:プログラムの脆弱性をついてフラグを取得する問題
  • Forensics:様々なデータから情報を集める問題
  • Network:ネットワークセキュリティに関する問題
  • Misc:カテゴリ分けが難しい、いわゆる「その他」の問題

問題紹介

参加したCTFの運営に問い合わせたところ、開催終了後であれば各設問の解釈や解説を自由に記載し、また解説に必要な範囲で問題や添付ファイルの使用することも問題ないと返信いただきました。

実際にどのような問題が出題されたのか、Misc、Webのジャンルからそれぞれ1問紹介します。

画像解析問題

ジャンルはMiscから、まずは簡単な画像解析の問題です。

問題はシンプルで、画像からフラグを入手しろというものでした。
問題の画像はこちらです。

出典:setodaNote CTF

画像をよく見ると中央にうっすらと文字が見えることがわかります。
この画像のコントラストを中央の文字が見えるように調整すると 1s_cReA73d_by という文字列が確認できました。しかしこの文字列を解答欄に入力しましたが、流石にこれだけでは正解になりませんでした。

改めて画像全体をコントラストを変えながら文字が隠れてないか探してみました。すると画像左上と右下にそれぞれ flag{Re4l17y__7h3_m1nd_rA9} の文字列が隠れていました!(文字列が見えるように調整した画像は著作権の関係上掲載することを控えます)

最初に見つけた中央の文字列も合わせ、3つの文字列をつなげた flag{Re4l17y_1s_cReA73d_by_7h3_m1nd_rA9} が解答です。

特別な知識も必要なく簡単にフラグを見つけることができる問題でした。

リダイレクト処理を追う問題

ジャンルはWebで、結論から言うとリダイレクト処理を追ってフラグを見つける問題でした。
問題はこちらです。

出典:setodaNote CTF

問題のサイトにアクセスしてソースコードを確認してみると以下のスクリプトが紛れ込んでいました。

<script>!function(){var ref = document.referrer;var domain = ref.match(/^http([s]?):\/\/([a-zA-Z0-9-_\.]+)(:[0-9]+)?/)[2];if(domain == "www.google.com" || domain == "www.google.co.jp" ){location.href = ('aHR0cHM6Ly9jdGYuc2V0b2Rhbm90ZS5uZXQvd2ViMDA0L2JXRnNhMmwwLmh0bWw=');}}();</script>

どうやら現在のページURLを書き換えているようなので、書き換え後のURLにアクセスしてみます。すると以下の文言がサイトに表示されました。

どうやらリダイレクト処理を追っていけばいいということがわかります。
そこでBurp Suite Community Editionというツールを使って通信内容を確認していきます。
(ツールの使い方については説明を省略させていただきます。)

こちらがツールを使って処理を確認したものです。

赤枠で囲った部分でパラメータ値を確認するとリダイレクトURLを指定していることがわかります。リダイレクトが複数回行われているので、処理を見ながらファイルを追っていくとフラグが表示されるサイトのURLがわかります。
処理を追って見つけた、フラグが表示されるサイトにアクセスしてみます。

無事フラグを獲得できました!

感想

初めてCTFに参加してみましたが、Burp Suite Community EditionやWiresharkなど普段頻繁に使うことのないツールを使い、ゲーム感覚でセキュリティについての知識も学べて楽しみながら挑戦することができました。今後開催される他のCTFにも積極的に参加していきたいと思います!

また弊社はWeb系の受託開発業務を行っているため、Webの問題を多く解くことを目標にしていました。
今回参加したCTFは知り合いと相談OKとルールに記載されてたため、知り合いに教えてもらいながら解答にたどり着いた問題もありますが、Webの問題を全問フラグを見つけることができました!(開催されるCTFによっては他人と相談することはルール上禁止にしている場合もあるので、参加する大会のルールは要確認です)

今回はヒントをもらいながらの挑戦だったので、いつかWebのジャンルは自力で全問正解できるように頑張ります!


ちなみに今回の私の獲得スコア・ジャンル別の解答状況はこちらになります。
得点は2210点で、592ユーザー中221位でした。
(いつかレーザーチャートを綺麗な円形に近づけたい・・・!)

出典:setodaNote CTF

アーカイブ