MaidakeCTF2019の作問裏話
MaidakeCTF2019の作問中、大会中に発生したアクシデントなどを残しておこうと思います。
MaidakeCTF2019のgithubもここで公開しておきます。
https://github.com/fulutori/MaidakeCTF2019
CTFを主催した感想とかも書いてます。よければ見ていってください。
aokakes.hatenablog.com
Web
White flag
真っ白なページに白文字でFlagを書いただけでした。
どこかで白背景に白文字は定番みたいなのを見かけたので作りました。テンプレをちょろっと書き換えるだけだったので作成時間も3分ぐらいです。
2048
私にとって2048は結構思い出のあるゲームです。
大学のJavaの講義で「何かゲームを作る」という課題で私が作成したのが2048でした。
ほかにも私が2年生のときの学園祭で展示したのも2048でした。このときはJavaではなくHSPです。
MaidakeCTFではJavaでもHSPでもなくJavascriptで実装しました。
といってもその辺に転がっているものをほぼそのまま使っているので自分で作ったとは言えませんね。
実は今回使用した2048にはバグがあって、たまに予期せぬ動きをすることがあります。
たとえば、左4マスのすべてに「2」があったとき、「↓」キーを入力すると「8」になってしまいます。
2048の本来の動きとしては左の下2マスが「4」とならなければなりません。
このバグはMaidakeCTF開催前から把握していましたが、CTFの問題としてはとくに関係の無い部分だったので放置しました。
まぁこれで困る人もいないので。
また、2048のランキングも用意していました。
純粋に2048をプレイしてスコアを伸ばしてくれていた方、ありがとうございます。
ranking.phpが入力値をとくにチェックしていないことに気付いて不正にスコアを上げたりしてくれた方、さすがです。
SQLインジェクションを試した方、さすがにそんなヘマはしません。
ランキングは開催当初は正常に機能しておらず、直したと思っていたら権限設定が適切でなくDBを更新できなくなっていたりと無駄に時間を取られました。
利用できなかった方、申し訳ありませんでした。
まぁとくに関係ない部分なので...
Baked goods
cookieにFlagを持っているような問題を作りたくて作った問題です。
最初は問題タイトルを「Cookie」にしようと思っていましたが、さすがにそれだとそのまますぎるかと思って「焼き菓子」にしました。
クッキーを言い換えただけです。
この問題はページの背景をクッキーにしたのがこだわりです。
Not hiding
cssファイルにFlagを隠すのはCTFの初心者向け問題としては定番なのではないでしょうか。
Usual
私が所属するサークルでは、「' or 1 = 1 -- 」とかを入力するのはいつものことです。
XSS Alert
XSSの問題を作るにはどうやったらいいかな~、と考えた結果こんなものが出来上がりました。
この問題は手抜きもいいところで、入力された文字にが含まれているかどうかしか見ていません。
本当にXSSしているかどうかなんて見ていません。
imgタグとかでやる人もいたかと思いますが、なんかすみません。
Agent
どこかで見た問題をほぼそのままパクりました。
No form
POSTされたものはちゃんと確認しないと意図しない場所から飛んできたものも処理してしまう、ということを伝えたかった問題です。
確認する方法としてはリファラーなんかが簡単かと思いますが、リファラーなんて偽造できますし方法としては確実ではありません。
phpで、ユーザーに見えないところで色々やるしかないのでしょうか。
Hijack
セッションハイジャックの問題を作ってみたかっただけでした。
Kancolle Engine
お気に入りの問題です。
よくある問題ですが、見えないところで取ってきた情報が見える情報の数と一致しないようにして、ほんの少しだけ難易度を上げています。
とは言ってもソースにテーブルの構成が載っているのでSQLの書き方が分かる人には簡単な問題です。
勉強がてらKancolle Engineで使用したデータベースをもとに色々検索できるサイトを作ろうかと思います。
MaidakeCTFにおけるWebページではbootstrapとjQuery以外のフレームワークは一切使用していません。
というのも私がフレームワークの使い方が分からないからなのですが、いままでフレームワークの勉強をしようと思っても「自分で全部書いたほうがスッキリするな...」なんて考えて途中で止めてしまうんですよね。
世間的にはフレームワークを使うのが一般的ですし、卒業するまでには一通り扱えるようにしておきたいものです。
Maze
良い問題作ったな~と思っていたら穴だらけだった悲しい問題です。
デベロッパーツールで迷路を書き換えることもできますし、迷路のcsvファイルが読み込まれていなくてもコンソールで空の配列を作ってdraw関数を呼び出してあげれば壁がない迷路が作れます。
とどめにresult.phpにアクセスしたらそのままFlagが表示される始末。
泣きそうになりました。
デベロッパーツールを使って解くのはまだ構いませんが、result.phpにアクセスするのはもうダメです。
result.phpにはちゃんと迷路をたどってゴールにたどり着いたかどうかを判定するようなプログラムを書いたつもりだったのですが、どこか勘違いしていたようです。
もっと時間をかけて検証するべきでした。
Haiku contest
よくあるXSSの問題です。
cookieを持った人にスクリプトを実行させてcookieを奪い取るものです。
webページの用意自体はすぐにできましたが、実際にユーザーが設定したページを見に行くプログラムを作るのに苦労しました。
色々方法を考えた結果、pythonでseleniumを使って1分ごとに確認する手法を選択しました。
なお、設定した人全員を見に行くのはリソースがもったいないので、採点ボタンを押した人だけ見に行くようにしています。
seleniumではfirefoxを使っていましたが、やはりメモリの消費が激しいですね。
CTFdも稼働しているサーバーで一緒に動かすのは少し無理がありました。
やはりスコアサーバーと問題サーバーは分けるべきでした。
Crypto
Is this a cipher
BASE64はもはやネタ枠です。BASE64であることをひと目で見抜けるぐらいにはなってほしいという思いで作りました。
果たしてcryptoの問題に入れてよかったのでしょうか。
Easy crypto
ROT13も初心者向けCTFでは定番かもしれません。
今回は単純に全文字を13個ずらしているだけなので簡単ですが、当然13じゃない場合もあります。ズラす数がランダムだったときは発狂ものですね。(ご期待ください)
Old input
今まで携帯入力が正式名称だと思っていました。トグル入力だったんですね。
こうやって数字に置き換えるのは地味にお気に入りです。
Kancolle hash
なんとしてでも艦これを絡ませた問題を作りたかったが故に生まれた問題の1つです。
暗号文が文字化けしているような感じになっているのはascii文字コードを無理やり変換しているからです。
そのへんに転がっているwebサイトではおそらく変換できません。
Caesar's Friends
シーザー暗号とは異なる換字式暗号も用意したかったので、頻度分析を行うような問題を作りました。
頻度分析させるためにはそれなりの文量が必要になるので、長めで有名なスピーチを用意しました。
実はスティーブ・ジョブズの例のスピーチは「Stay Hungry」のところぐらいしか知りませんでした。結構長かったんですね。
この問題はなんかのツールを使えば結構ポンと解けしまうようでした。悲しみ。
Reversing
Strings
stringsコマンド一発で解ける問題はCTFに必須だと思います。
Watchword
バイナリを解析する問題はもうダメです。解き方は当然ながら作り方なんて意味不明です。
苦し紛れにこんな問題が完成しました。
Misc
Hex
16進数を変換するだけの問題があってもいいじゃないか、と思いました。
Strong line
バーコードも読めるリーダーってあまり無いような気がしました。CODE128はもっと少ないかな~、と思っていました。
Turtle speed
人々をイラつかせるために作りました。
当然と言えば当然ですがctrl+Aでモールス信号を含めてすべて選択できます。
A walking cat
これもどこかのCTFのパクりです。
いったいどこでFlagを書き間違えてしまったのでしょうか。
Condensed image
gifを分解し、そこから色々複雑なことをやって解いていく難しい問題をどこかで見かけたのがきっかけで作った問題です。
Let's Janken
問題作成に取り掛かったときは本当に連打しないとFlagが得られないような問題にするつもりでした。
ケイスケ〇ホンダのやつを取り入れたのがこだわりです。
実はseleniumで自動で1000回連打させるsolveも作りました。本当にムダです。
Picked up document
証明書の中身を見てもらおうかな、と思いました。
MD5
問題の大部分を作り終えた直後はハッシュ値の総数が100を超える程度でしたが、問題公開時にはかなり増えて578になっていました。
こうしてみると艦これもかなり艦娘の数が増えたな~、と思います。とても素晴らしいことです。
自分がプレイしているゲームに登場するキャラクターの名前は知らないうちに覚えているものだと思うのですが、海防艦あたりはもう正直あんまり分かりません。
海防艦はまぁ...いいかな...
という気持ちになってしまいます。ごめんなさい。
What's color
3桁の数字が並んでたらだいたいRGBなんじゃないかと思います。
Teleport
過去にスマホの座標からリアルタイムに住所を割り出していろいろやるウェブアプリを作っていたので、それに関連する問題を作ろうとして出来上がったものです。
実は問題を作ったときはデベロッパーツールでGPSの座標を弄れることを知りませんでした。
わざわざスマホで座標を偽造したりなんてしなくてよかったんですね...
なんか悔しいのでデベロッパーツールでは回避できないような問題を作りたいですね。
Vertical reading
これもどこかで見た問題のパクり。
専門的な知識が無くてもひらめき次第で解ける高得点な問題にしました。
Programming
Only reserved words
ただのppencodeです。最近CTFでちょくちょく見かけるような気がします。
Calculator
SECCONのビギナーズでこんな感じのやつがあったな~と思って少し形は違いますがだいたい再現したものです。
Not ending
これもいつかのSECCONの丸パクリ。
Not output
Javascriptでcondole.logてわりと使いますよね。
Calculator 2nd
手で解くのはほぼ不可能な問題を用意したかっただけです。
Forensics
Unzip
ggって出てきたことをそのままやるだけの問題を用意しました。
Meta
これもggるだけ。
Magic
これもg
Stupid picture
白背景に明るい色の文字で書くのはタブーです。
Another image
1枚の画像に別の画像が繋がっているのはよくあるやつなので、作らずにはいられませんでした。
Hidden Flag
クソ問。
画像に文字を隠したかっただけなのですが、テキトーにggって一番上に出てきたものをお借りしたらとても面倒になってしまいました。
Network
Weak communication
パケットを見るだけで解ける問題を用意したかっただけです。
See-through Auth
何かしらの認証を行っているパケットを解析してもらいたかったのですが、作り方が雑すぎたようでムダになってしまった部分がありました。悲しみ。
From oluri
wiresharkを使えば簡単にファイルとかを取り出せるということを伝えたかった問題です。
QR
white or black
当初はこれからもう一段階ぐらい何かさせるつもりだったような気がします。
その「何か」は忘れました。
Three codes
RGB使えば3つぐらいは簡単に表現できるな~、と思って作った問題です。
Barely
以前友人がデンソーのQRコードリーダーを使っているのを見て、かなり強そうだったので色々検証してみました。するとやはりほかのリーダーよりも強いので、デンソーのリーダー以外だと読めないぐらいに隠したQRコードを用意しました。
QR Puzzleたち
SECCONのパクり。
スライドパズルにするのが地味に苦労しました。FinalでさらにSECCONっぽくしています。