はじめに
この記事は、KINDAI Info-tech HUBという団体での小規模イベントとして開催した、CTFやってみようの会の参考資料です。
そもそもCTFって何?やCTFやってみたいけどやり方がわからない といった人に向けて作られています。
【注意】本記事の内容は、セキュリティ学習目的のものです。許可のないシステムへの攻撃的操作は犯罪です。
必ず自身の管理下、またはCTFなどの許可された環境でのみ検証してください。本記事の利用により生じた一切の問題について、筆者は責任を負いません。
CTFとは
CTFとは、「Capture the flag」の略称で、サイバーセキュリティにまつわる事柄をゲームやクイズ感覚で問題を解きながら学習することができます。
CTFには、いくつか形式がありますが今回はJeopardyという最もメジャーな形式に絞ってやっていきます。
Jeopardyは簡単に言うと、様々な問題が用意されていて好きに選ぶことができ、問題を解くたびに点数が加算される方式です。問題を解くたびにポイントが貰えるのでモチベが上がります!
(他にはAttack-DefenseやKing of the Hillという形式があります。)
また今回使うのは常設CTFと呼ばれる、いつでも遊ぶことのできるタイプのCTFを使いますが、CTFの中にはリアルタイムでやることをメインとしたものが多くあります。(実はそっちがメインだったりしますが、それらについては今回は省きます)
さっそくやっていこう!
準備
今回はpicoCTFという常設CTFをメインに遊んでいきます
上のURLから入って右上のloginを押したあと、sign upから登録をしてください。(すぐ終わります!)
その後ヘッダーからPracticeに移動すると、問題があります。
写真のような画面にいけたらOK

続いて、Web問題を解くのに使うBurp Suiteというツールをダウンロードします。
ダウンロード
入ったら、Go straight to downloadsを押すか、メアドを入れてオレンジ色のダウンロードを押します。
左側がCommunityエディションになっていることと、右側が自分のPCに合ったものになっているのを確認してください。(なってなかったらクリックして変更)
問題を解く前に
問題に移る前に、CTFの心構えを説明します。
意外と大事なので一回読んでください!
- 解けないのが当たり前と考える
- 検索やAIなど、何でも使ってOK!(ただし答えは一回調べてから)
- 検索やAI、答えを見てなぜそうなったか考える
- 解けたとこまでメモしよう
CTFは難しいです。だから解けたとき楽しめます。
なので解けなくても才能がないのではなく、解けたら凄いだけです。
当然色々な知識が必要になるので、それらは都度身につけて行けばOKです。
調べてもわからなかったら、Write upと呼ばれる答えを見ればOKです。
ただなぜそうなったか、できるだけスッキリするまで理解しましょう。
Write upは読むものだけでなく書くものです。(自戒)できたとこまでや、Write upを見た後でいいので自分の言葉で書きましょう。
1. Cryptography Mod 26
記念すべき第一問目です。
サイドバーのカテゴリーと難易度をそれぞれ CryptographyとEasyにすると、すぐ見つかると思います

問題
cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_hyLicInt}という文字列が与えらるので、これを解読します。
まずは一旦自分で考えてみましょう!
ここで大事なのは、知らないことはすぐ調べることです
3分考えてわからなかったらヒントを見たり調べる!
15分たって全く進まなくなったら下の答えをみよう
【ヒント】どこから調べる?(クリックで開く)
問題文に ROT13 という怪しい単語があります。これをまず検索してみましょう。【答えと考え方】※ネタバレ注意(クリックで開く)
答えと考え方
問題文に、大事なことが書いています。
Cryptography can be easy, do you know what ROT13 is?
ROT13という単語が出てきたので調べます。
ネット検索すると一番最初にWikiが出てきます。
どうやらこれは、アルファベットをズラす事で暗号化する、シーザー暗号らしい。
概要の部分を読むと、ROT13の13は、13文字分ずらすという意味らしい。
概要
ROT13という呼称は1980年代の初めにUsenetで用いられ始め、デファクトスタンダードとなった。英語のアルファベットを、その並び順で26文字のちょうど半分である13文字ぶんずらすものである。暗号と言えないこともないが、強度は無きに等しい。アルファベット文字のみが対象であるため、それ以外の文字を暗号化するのには使えず、もし対象を広げたい場合は他の手法が必要である。
また問題名のmod26は、すぐ下の方法での式に出てくるものっぽい
これらから、今回の暗号は13文字のズレを元に戻したら復号できるとわかる。
方法は自力でやる、python等でワンライナー書く、AIに聞く、など何でもよさそう。
今回はネット検索で「シーザー暗号 解読」といれると、ツールが出てきたのでそれを使う。
そのまま一番上に暗号化された文を入れると、key=13に読めそうな文字列が出てくる。
これが今回の答えです。
2. Web Insp3ct0r
問題
ヒント:先程の問題もそうだったが、CTFの多くは問題名や説明が重要となる。
キショール・バランから、以下のコードの検証が必要かもしれないとの情報を得ました
3分考えてわからなかったらヒントを見たり調べる!
15分たって全く進まなくなったら下の答えをみよう
【ヒント1】まずどこを見る?(クリックで開く)
問題名が「Insp3ct0r (Inspector)」ですね。ブラウザの「検証」ツール(多くのブラウザでF12キーか、右クリック→「検証」)を開いてみましょう。【ヒント2】HTMLは見たけど…(クリックで開く)
HTMLのコメントに「1/3」とありました。サイトの構成要素は「HTML, CSS, JS」と書かれています。 検証ツールの「ソース (Sources)」タブなどで、CSSファイルやJSファイルの中身も見てみましょう。【答えと考え方】(クリックで開く)
答えと考え方
HowとWhatを切り替えても特になにもない。(まずは一旦サイトを触るのが重要)問題や説明にinspectorとあるので、検索してみる。
するとAIの概要がこのように出てくる
Webインスペクターは、ウェブサイトのHTML、CSS、JavaScriptをデバッグ・検査するための開発者ツールです。ブラウザに内蔵されているのが一般的で、ウェブページ上で要素の構造やスタイルを確認したり、その場でコードを編集して結果をリアルタイムで確認したりすることができます
言われるがまま、検証ツールを開くと、クリックできる閉じられた部分がある。
(隠れてれる部分はとりあえず見る)

それらをとりあえず開いてみると、flagの断片が見つかる。

がしかし他のパーツは見つからない。
ここでflagとともにあるHtml is neat.に注目する。
HOWやすぐ上にこうある。
I used these to make this site:
HTML
CSS
JS (JavaScript)
1/3とHTMLという単語から、残りはCSSとJSが怪しい。
ここでAIなどでもう少し、検証ツールについて調べる。
https://gemini.google.com/share/eb05be71cb4f
するとSourcesタブがあるとわかる。
3. Web Cookies
問題
検索フォームから始まる。
こういうとき最初は薄く書いてる文字をそのまま入れればいい。
あと何かしら入力をしたりする際は、先程のBurp Suiteを使おう!
使い方は、AIで調べるか公式チュートリアルのステップ3くらいから見るとよい。

3分考えてわからなかったらヒントを見たり調べる!
15分たって全く進まなくなったら下の答えをみよう
【ヒント1】どこに注目する?(クリックで開く)
まずは snickerdoodle と入力した場合と、適当な文字を入力した場合で、Burp Suiteの通信履歴(Proxy > HTTP history)にどんな違いが出るか見比べてみましょう。 特に「レスポンス」タブの「Headers」にある Set-Cookie や、次のリクエストの「Request」タブにある Cookie: に注目です。【ヒント2】Cookieの値を変えたい(クリックで開く)
name=0 や name=-1 というCookieが設定されているのがわかります。この 0 という値をいろいろ変えて試せないでしょうか? Burp Suiteの「Repeater」機能を使って、/check へのリクエストの Cookie: name=0 の値を name=1, name=2, ... と手動で変えてSendしてみましょう。【答えと考え方】(クリックで開く)
答えと考え方※ネタバレ注意
Burpを開き、Next2回を押したあとTargetタブに移りOpen browserボタンを押す。 するとChromeっぽいタブ(chrominium)が開くので、そこで先程のURLを開く そのままsnickerdoodleといれると、画面が遷移する。 ProxyタブのHTTP historyを見ると、先程の一通りのやり取りが見れる。

POST/searchのリクエストとレスポンスを確認すると、 リクエストのbodyにsncikerdoodleが入っているのがわかる。
またレスポンスには、Set-cookieヘッダとname=0という値がある。

次の/checkのリクエストを見てみると、先程セットされたcookieが入っている。

今度はHomeから先程のパスに戻り、適当な値を入れてみる。
すると赤くThat doesn't appear to be a valid cookie.と出てきた。

Burpに戻り確認すると、homeに戻ったときとPOST /searchで適当な値を入れたときにSet-cookieに-1が入っているのがわかる。
この状態で/checkパスを追加してもどうようにエラーがでる。
cookieの違いが/checkに行けるかどうかに関わっていそうだ。
まずは焦らず、cookieとは何かを調べる。
どうやら状態を保存したりユーザーを判別するのに使い、個人情報が含まれることもあるようだ。
(webは本来ステートレス ぜひ各自で調べて見てほしい)
つまり予想通りこのcookieでどう/checkをどのように表示するかを判断している とわかる
この値を変えることができたら、ページの表示が変わると思われる。
再度Burpの機能を調べると、RepeaterやIntruderという機能がある。
先程の/checkを右クリックしてRepeaterを選ぶ。

そしてRepeaterタブに飛ぶと、Sendというボタンとリクエストが表示される。
このリクエストはそのまま変えることができるので、name=の後を1に変えてSendを押すと以下のようにレスポンスが帰ってきた。

レスポンスのPrettyをスクロールしてもよいが、Renderに変えるとWebページの見た目で表示される。
予想通り別のクッキーになった。

ここからname=の後をひたすら変えてもいいが、正直面倒くさい。
そんなときに使えるのがIntruderとなっている。
先程同様ProxyのHTTP historyにある/checkを右クリックしてIntruderを選択して飛ぶ。

今回は0の部分を消したあとAddボタンを押す。すると右側のモーダルが変わる。
そのモーダルの上から二段目にあるPayload configurationのAddボタンの横に数値を入れてはエンターを繰り返すのでもいいが、面倒な場合1個上の段にあるSimple Listからnumberに変えて、toに30くらいをいれる

この状態で左に戻ってオレンジ色のStart attackを押すと実行できる。
結果を見る時は、最初はrequestになっているので、responseに変えたあとrenderにすることをおすすめのする。

またテクニック的な部分として、一つ一つ見ていってもいいが、length等に着目すると、極端に違うものを見つけることができる。
その証拠にステータスが200で正常に返って来ているもののうち周りが1900近いのに対して、1200近いものが一つあるが(500あたりはステータスが302)、これが今回のflagである。
4. Web SSTi1
[補足]この問題は少し難しめなので、簡単には解けない問題を体感したり完全に理解はしなくてもAI等を用いれば問題は解けることを知ってもらうための問題です。
問題
まず、青色のボタンを押してインスタンスを立てないとできないことに注意

今回は入力フォームがあり、文字を入れるとそのまま表示される。
今回も本来はBurpでリクエストを見ながらやるべきだが、正直なくても良い。


3分考えてわからなかったら調べる!
15分たって全く進まなくなったら下の答えをみよう
【ヒント1】この脆弱性は何?(クリックで開く)
問題名が「SSTi」です。まずは「SSTiとは何か」を調べてみましょう。 多くの解説サイトに、「SSTiかどうかを確かめる方法」として、ある簡単な計算式が載っているはずです。【ヒント2】脆弱性があるのはわかったけど…(クリックで開く)
{{7*7}} が 49 と表示されたら、SSTiで間違いありません。 ここからは、「SSTiでOSコマンドを実行する(RCE)」方法を調べる必要があります。 「SSTi チートシート」などで検索してみましょう。Webサイトが使っている技術(Python, PHP, Rubyなど)によって攻撃方法が異なりますが、チートシートには大抵、どの技術で使えるかが書いてあります。片っ端から試してみましょう。【答えと考え方】(クリックで開く)
答えと考え方※ネタバレ注意
題名のSSTiを調べると、脆弱性の一種であるとわかる。 まず、本来であれば入力できるとなるとXSSを代表とする入力不備からくる脆弱性を色々検証するべきだが、今回も題名からメタ読みしてSSTiを狙う。とりあえず生成AI等を使ったり調べると文字列をテンプレートとして処理してしまうためコマンド等を実行できてしまう脆弱性とわかる。とりあえず{{7*7}}を入れるとわかるらしいので入れてみる。
49と計算された値が出てきたので、刺さっているとわかる。
さてここからがどうすればいいかわからないと思います。
RCEがどういうものかわかっていたら、とりあえず使えるOSコマンドを見たりいきなりファイル構造を調べるためにlsコマンドを実行したりと思いつくかもしれませんが、そうでなくともAIを使ったり調べればある程度出てきます。
AIに聞く際に、そのまま攻撃方法を聞いても以下のように断られます。
https://gemini.google.com/share/c10817e2bc19
よってCTFで使うことを明示しましょう。
たったそれだけと思われるかもしれませんが、全然出力が変わります。
https://gemini.google.com/share/69ffccf19074
(あくまでCTF等で使い、決して悪用しないよう自己責任でお願いします。)
しかしながらそれでも、肝心なlsコマンド等はうまくいきませんでした。
勿論AIと対話形式で情報を提示しながら進めていくのも良いですが。最初は難しいこともあります。
そのような場合では、〇〇(脆弱性の名前)チートシートといった風に調べると、様々な攻撃方法のペイロードを調べることができます。
一番上に出てきた以下のサイトを使います。
https://blog.hamayanhamayan.com/entry/2021/12/15/225142
ここにあるPythonのRCEを入れてみる
すると以下のようにファイルの一覧が見れた。

そのまま何をしているかを聞いけば、popenの引数にコマンドを入れているとわかるので、cat flagなどを入れればflagが見れる。
わからなくても、このペイロードが刺さったことをAIに伝えて、ファイルを見るといった指示を加えてアレンジしてもらえば良い。
このように脆弱性に対する専門的な知識がなくても、AIをうまく活用すれば知識をその場で身につけながら問題を解くことができます。
これからやること
- Write upを書く
- 別のジャンルを解く
- 脆弱性を掘り下げる
- より実践へ
1.Write upを書く
まずやるべきことは、今回解いた問題を、メモ書き程度にまとめましょう!
どこまで解けたかや、わからなかった部分を文字に起こすだけで頭の整理ができ、定着や成長に圧倒的な差ができます。
Write upは読むものだけでなく書くものでもあります。(自戒)
2.別のジャンルを解く
今回は実質的にWebの問題だけを解きましたが、CTFには他にも様々なジャンルがあります。
まずは色んなジャンルの問題を解いてみて、一番楽しいと思えるジャンルを見つけましょう。
3.脆弱性を掘り下げる
CTFをひたすら解くのもいいですが、ちゃんとした理論を学んだほうが理解できるという人もいるでしょうし、CTFを解き続けるには限界を感じることがあると思います。
そういった時は、先に脆弱性等の知識をつけることをおすすめします。
ここから先は一例としてWebのおすすめを紹介します。
Webの脆弱性を体系的に学ぶならまずこれ!CTFがわからない人もWebこれだけやってればOK!
ウェブアプリの攻撃と防御を両方学べる金字塔。開発者はこれを読んでるとレベルアップ間違いなし
本格的にセキュリティを学びたい人向け。脆弱性の更に奥へ
4.より実践へ
ある程度スキルが身についたら、より実践的な演習をやってみるととても楽しいと思います。
CTF初心者にもおすすめ!
より実践的なCTF
これより先は、バグバウンティなどがありますが
それはまた機会があれば...




