初めてCTFの問題を作ってみた所感
これはAizu Advent Calendar 2018の5日目の記事です.
前の人は id:masaponto さんで,
次は id:dennougorilla さんです.
はじめに
先月の11月10日(土)に仙台CTF2018というイベントが開催されました.
Day-1は勉強会という形で9月に開催されていて,Day-2となるこのイベントは競技会になっていて,オンサイトで実際にCTFをやるイベントでした.
去年は参加者として参加させて頂いたのですが,今回はひょんなことから運営の補助的な役割をさせて頂けることになりました.そのうちの一つとしてネットワークジャンルの問題を1問作ることになったのが,初めてCTFの問題を作ることになったきっかけです.
少しでも,初めて作問することになった人の参考になればいいなと思い,今回は初めてCTFの問題を作るにあたって気を付けたことや意識したこと,反省点などを述べていきます.
(一応,僕のスペック的なものを述べておくと,CTFが好きで何年か前から参加していますが入賞経験などはなく,たまにWriteupを投稿していたりするぐらいです... また,普段担当しているジャンルはネットワークではないです.)
出題した問題について
ネットワークジャンルには4問あり,他の3問については他の人が担当していて,その人の作成した問題を僕が解いてみて解けるかどうか確認したり,僕の問題のレビューをして頂いたりしていました.
僕が出題する問題は,ちょっとした知見があったりすることから昨年話題になったWannaCryに関係した問題を作ることになりました.
WannaCryに関係する問題ということで最初は2つ問題案を考えました.
- 感染が疑われる端末が存在するネットワーク上の通信をキャプチャしたファイルから検体を抽出する
- 感染が疑われる端末が存在するネットワーク上の通信をキャプチャしたファイルから感染が疑われる端末を探し出す
問題案1
まず1に関して,WannaCryにはワーム機能があり同一ネットワーク内やランダムなIPアドレスに対して感染を拡大させようとする動きをしますが,この際検体はパケットで一度に送れるサイズの限界上,回数をわけて送る必要があり,この際それぞれのデータ部分をXORで暗号化しているので,この鍵を求めて復号して検体を抽出する問題は面白いのではないかと考えました.
しかしここで,この問題は結果的に「マルウェアの配布」に当たってしまい非常にまずいのではないかと思いました. 昨今マルウェアに関して検挙される事例が増えてきていますし,パケットの検体部分を別の無害なプログラムに書き換えることも考えましたが,結局 問題案2のほうが妥当ではないかと考えました.
問題案2
こちらは,感染が疑われる端末を探し出すというものです.WannaCryに感染した端末が発するパケットは特徴的なので可能ではないかと思いました.この場合は検体を送りつける通信を含めなければ配布にはあたらないですし,感染を広げる段階で暗号化された攻撃コードの一部が含まれますが,これ単体では到底悪用できません.また,この脆弱性をMetasploitを用いて突いたパケットキャプチャファイルが配布されたイベントも過去に日本であったので,これなら法的にも大丈夫ではないかと思い,この問題案で作成することにしました.
作問する時に気をつけたこと
CTFの問題を作る上でのガイドライン的なものをPPPというCTFチームが出していたと思うので,できる限りそれを参考にしました.
日本チームscryptosが和訳したもの github.com
また,icchyさんが書かれたこちらの記事も参考になるかと思います.
フラグの形式に関しては全体で指定されているものがなくて各々で考える感じだったのですが,最終的に他の問題のみなさんのフラグを参考にしながら,「感染が疑われる端末のIPアドレス」が妥当かなと思ったのでこれにしました.本当は,HogeCTF{XXXX}などの共通のフォーマットにしたほうが良かったかと思います.(これは一度運営の方に提案してみてもよかったのかなと思っています...) また,より混乱の少ないように問題文にフラグの例を載せるようにしました.
あとはPPPの資料の問題作成の部分になにかヒントがないか読んでみると,ネットワークのことが書いてあるForensicsはあとから追加されたものなのか,和訳がないので原文を参考にしました.
問題の作り方
これに関しては,もう少しいい作り方がなかったのかと反省すべき点が多いです.
不要なパケットは入れるべきではないので,問題に関係するパケットのみを含める必要がありました.なので,VirtualBoxで3台仮想マシンを立ち上げて,内部ネットワークで通信させ,プロミスキャスモードを「すべて許可」にすることで2点間のパケットがもう1台のマシンに対しても流れるようにし,これをパケット収集用のマシンとしました.
それからは,お互いのIPアドレスを変えながら通信させて,その度にパケットを収集した後,それらのパケットを結合することで複数のマシン間で通信しているようなpcapファイルを作りました.(実際にネットワーク問題を作成している人は,複数の端末が通信しているようなpcapファイルを作る場合,どのように作っているのでしょうか...)
また,パケット上の時間に関しては問題文と整合性が合うようにeditcapのiオプションで変更しました.
そんなこんなで作成したpcapファイルは,感染した端末によるARPスキャンが入っていたり,ターゲットにMS17-010の脆弱性がないか確認するパケット,バックドアであるDoublePulsarがないか確認するパケットなどなど,WannaCryに感染した端末が発するパケットが含まれていました.検体がpcapファイル内に含まれていないことも確認した後,このファイルを運営に提出しました.
反省点
・出現するIPアドレスが少なすぎた
これは本当に反省すべき点だなと思っていて,出現するIPアドレスは8つしかなく,問題を見ずとも出現している8つのIPアドレスを全てsubmitすれば解けてしまう問題でした.ですが,僕は一番低い得点である100点のものを作る予定だったので,これは逆に問題を簡単にする一つの要素になったのかなとも思っています.(ですが明らかに欠陥だと思うので,もう少し増やすべきでした...)
・フラグの形式
これは上述の通り,運営の方に一度提案してみてもよかったと思っています.当日,大きな混乱はなかったものの,共通のフラグフォーマットを用いたほうがわかりやすいはずなので.
最後に
当日はほとんどの参加者がこの問題を解いてくれていて,よかったのかなと思うと同時にもう少し悩むような要素を入れるべきだったのかなとも考えていて,出現するIPアドレスは少ない&見るべきパケットの量も少ないので,勘で解かれた人も多いのではないかと思いました.
しかし,僕が参加者に理解してほしかったこととして,昨年あれほど話題になったWannaCryがどのようなパケットを発し,どのように感染を広げていくのか,その過程を少しでもわかってくれたらいいなと思っていて,その為100点問題なのにWriteupが少し長くなってしまったのですが,是非当日解いた方も一度読んでみて理解を深めてくれたら嬉しい限りです.