CTFするぞ

CTF以外のことも書くよ

作った問題がASIS CTFに出題されていた話

追記[2019/04/24]

この記事を見た運営の方から連絡があり、状況を丁寧に説明してくださいました。 私は説明が下手なので重要な部分だけを翻訳してそのまま書きます。

しばらく前に自称韓国国籍のCTFプレイヤーがCTFの作問を手伝うと申し出ました。 我々は彼に難易度の高いreversingとpwnの作問を頼み、彼の要求した通り高い報酬を支払いました。 彼は明らかにあなたの問題を盗んでおり、我々のCTFとASISの評判をひどく損ねました。

ちなみに私の方には自称ベトナム国籍で来ているので国籍も嘘だと思います。

つまり、運営は報酬付きで外部に問題を依頼しただけで、依頼された側が更に別の人に頼んでいることは認知していなかったということです。 ASIS CTFはほとんど数人(1, 2人?)で運営しているそうなので外部委託は仕方ないと思いますし、運営側に全く非はなかったということだけ理解をお願いします

はじめに

土日に開催されたASIS CTFにチームinsecureとして参加しました。 TOEFLがあったり家のネット回線が開通してなかったりという理由であまり参加する予定はありませんでしたが、みんな頑張ってる様子だったので最初に公開されたSilkroad Iというpwnを解くことにしました。 この問題を解いてフラグを提出した段階で別のpwnが2問出題されていたのでncしてみると、何やら見覚えのある表示が出てきました。 この時点で「あれ、これ俺の作った問題じゃん......」と気づきます。 流石に作った人が参加するのはまずいのでチームメンバーに経緯を伝え、離脱しました。

経緯

3月に入ってしばらくすると海外の方から「CTFの作問に興味ない?」という連絡が来ました。 InterKosen CTFで作問したこともあったので興味があると返答したところ、「知り合いが開くCTFのためにrev/pwnを最大8〜9問作ってほしい」と言われました。 難易度が分からないのでどのCTFが教えてほしいと聞いたところ、「それは答えられない。パブリックなCTFとだけ言っておく。難易度はmedium-hardからhardでとても良質な問題を求める。」と返答がありました。 また、主催者と連絡を取りたいと言うと、匿名にしたいから仲介役(その人)を介して連絡するように言われました。 そんな無理な要求でしたが、まぁ知らない人に作問をお願いするくらいだし小さいCTFかなー、と思って中級者ぐらいを対象にした問題を作ることにしました。 3月中は忙しかったため、結果としてはrev1問とpwn2問だけを提供し、それ以上は作らないと言いました。

それから1ヶ月ほど経って今回のCTFに参加したのですが、まさかこんなでっかいCTFで出されるとは......

自分の作った問題を解いてもらえるのは嬉しいですが、レベルの高いCTFに簡単な問題を出題してしまって申し訳ない気持ちの方が大きいです。 誰かが悪いという訳ではないですが、せめてCTFの名前くらい教えてくれたら断るなり始めから参加しないなり対応できたんだけどなー。 【追記】悪い人がいました。

幸いなことに点数はDynamic Scoringだったのと、(たぶん誰か他の人が依頼されて作った)難しいpwnがあったっぽいので、私の簡単なやつはカモフラージュされたと思います。 また、最終結果を見るとそんなに難しい問題ばかりのCTFじゃないっぽいので助かりました。

作った問題

writeupじゃないですが、どういう経緯で作ったのか書いておきます。 各問のソルバとソースコード、Docker環境などは競技が終了したら私のbitbucketにpushします。

rev1

相手がどれくらいの難易度を求めているのか把握できなかったため、まずはrev問を作ることにしました。 ということで、行列の積を利用してチェックされるシリアル番号をangrやZ3で特定するというrev問を提供しました。 これは何の問題もなく受理してもらい、mediumレベルと認定されました。

これ出題されたんですかね? Key MakerがそれっぽいですがWindowsバイナリになってるしアーキテクチャだけ変更された? ちゃんと見てないので分かんないや。

pwn1 (Precise Average)

pwnの1つ目はスタックオーバーフローの問題を作ることを考えました。 スタックオーバーフロー系でhardにあたる問題が思いつかなかったので、scanfの性質を利用してSSPを回避する雑学寄りの問題を作りました。 また、オーバーフローに使うデータもdouble型にし、ちょっとだけややこしくしました。

これはmediumレベルとして提出したのですが、しばらくしたら「exploitが動かない」という連絡が来ました。 詳しく聞くと、主催者側がソースコードを変更し、再度コンパイルしたところ動かなくなったとのことでした。 変更後のソースコードを見せてもらうと、見事に脆弱性が修正されていた上、PIEが有効になっていました。 また、私は"Average Calculator"として問題を作ったのですが、"Median Calculator"と書き換えられていました。 とにかくそれだと動かないと伝えると、「pwnができる人間がいないのでexploitコードを書き直してくれ」と言われたのですが、そんなことにいちいち対応してられないので「ソースコードを勝手に変更するならこれ以上問題は作らない。制約があるなら予め伝えてほしい。」と言うと受理してくれました。 ちなみに中央値と平均値の違いを説明したのですがそこは完全にスルーされ、本番でも平均値を求める"Median Calculator"として動いていました。 何かこだわりがあったのだろうか。

pwn2 (Pwn 101)

スタック系を作ったのでヒープ系も作ることにします。 アドレス帳にoff-by-oneがあり、chunk overlapしてtcache poisoningすればシェルが取れるよーという問題になっています。 典型的なヒープ系問題ですが、stripしたりmallocが複数の箇所で使われたりしてややこしいので、medium-hardくらいと言って提出しました。 こちらはすんなり受理してくれました。 しばらくすると「DockerのUbuntuのバージョンを上げたいんだけど大丈夫?」と連絡が来たので、「配布するlibcのバージョンの変更してexploitコードのlibc、main_arenaのアドレスを変更すればOKだよ」と言いましたが、返事はありませんでした。 無事変更できたのかな?

おわりに

終了した段階でpwn1は44チーム、pwn2は38チームに解かれました。ですよねー。 しかもこのCTFは問題の5段階評価が見れちゃうんですよね。 現状pwn1は星3.15、pwn2は星3.08となっており、別に面白い要素を入れた訳でもないので当たり前の結果となっています。 とりあえずクソ問判定は免れたようなので少し安心です。

作問依頼が来たときはちゃんと自分の力量で対応できるCTFかを判断してから取り組みましょう。 知らない人に付いて行かないこと。