アオカケスの鳥かご

日々の出来事を綴っていきたい

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ページの用意自体はすぐにできましたが、実際にユーザーが設定したページを見に行くプログラムを作るのに苦労しました。

色々方法を考えた結果、pythonseleniumを使って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」のところぐらいしか知りませんでした。結構長かったんですね。


この問題はなんかのツールを使えば結構ポンと解けしまうようでした。悲しみ。

SHA-1 collision

いつかの問題で様々な制限下でSHA-1が一致するファイルをアップロードするというものがあったことを思い出したので、その問題から「様々な制限」を取っ払って超お手軽問題が完成しました。

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

これもどこかで見た問題のパクり。
専門的な知識が無くてもひらめき次第で解ける高得点な問題にしました。

Very Mosaic

そういえばモザイクを消す技術が話題になっていたりした時期があったな~、と思ってつくった問題です。

いわゆる普通のタイル状のモザイクを完全に消すのはとうてい無理な話ですが、pythonでのモザイクについてggっていたら元に戻せるモザイクなんていうのがあったのでそれを問題にしました。

プログラムを動かすだけなので面倒なだけのクソ問です。
今後はこのような問題を錬成してしまわないようにがんばります。

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

A little missing QR

QRコードの4隅は読み取る上で結構大事であることを伝えたかった問題です。

white or black

当初はこれからもう一段階ぐらい何かさせるつもりだったような気がします。
その「何か」は忘れました。

Three codes

RGB使えば3つぐらいは簡単に表現できるな~、と思って作った問題です。

Barely

以前友人がデンソーQRコードリーダーを使っているのを見て、かなり強そうだったので色々検証してみました。するとやはりほかのリーダーよりも強いので、デンソーのリーダー以外だと読めないぐらいに隠したQRコードを用意しました。

QR Puzzleたち

SECCONのパクり。
スライドパズルにするのが地味に苦労しました。FinalでさらにSECCONっぽくしています。

最後に

つい最近の話です。

CSSという学会が長崎のハウステンボスで開催され、そのアルバイトとして私も動員されていました。
その際に自分で足を持たない人たちを送迎していて、その道中で後輩と色々話をする中でCTFの話題になりました。

その後輩はハイスペックな方なので各地で開催される勉強会などにも積極的に参加しているようで、過去に九州大学でのenpitで、現地の学生とMaidakeCTFの話題が上がったそうです。
本当にありがたい話です。

来年も開催しようと決心しました。よろしくお願いします。