17歳からのプログラミング入門。

情報系の門の先で起きたことをたまにメモ。

高専セキュリティコンテストでCTFに触れてきた

要約

  • CTF初めての人4人でチームを組んだら35チーム中6位になれた
  • KoH問題を除いて一番高得点な500点問題を解けて嬉しい
  • この2日でみんないっぱい勉強して、CTFが好きになった

書き出し

10/21-22の期間、高専セキュリティコンテストというイベントに参加してきました。 解いた問題について言及することをwrite upというらしいので、それをやりながらエモい自慢をします。

チーム結成まで

いるやんは今までCTFには興味があったけれど、なかなか一歩目が踏み出せませんでした。 でももうすぐ卒業しちゃうし、結局CTFやらずに卒業するのはもったいないなあ、と思ったら、同じようにCTFに手を出せなかった3年生が3人集まってくれました。 名前はまあ、危険シェル芸高専ということで :(){:|:&};: (forkbombと読む)で良いだろうと決めましたがこのコマンドは絶対に実行しないでください。 本校にはBiPhoneというCTF熟達者達のチームがあったので、今回は成果を狙わず「0点以外の点数を狙っていこう」という目標を立てていました。

で、何をするコンテストなのか

大きく分けて、問題が2つ。

  1. ITクイズ
    • Jeopardyというらしいです。
    • 問題サーバからファイルをダウンロードしたり、暗号を解いたりして、隠された鍵を見つけます。
    • それをサーバに提出すると100点~500点くらい手に入ります。
  2. King of the Hill(KoH)
    • いわゆる陣取り合戦です。
    • サーバの脆弱性などをついて問題サーバに乗り込み、flagというファイルに自分のチームの名前を書くと10分ごとに30点ずつ手に入ります。
    • 一度乗り込んだら相手に侵入されないように侵入経路を閉じるなどをするらしいです。

write up

うちのチームを含め、ほとんどすべてのチームがKoH問題を解けなかったので、ここではITクイズについて自分が解いた範囲で言及していきたいと思います。

00 サンプル

ページを開くと鍵が置いてあって、提出すると100点です。 開始30秒で目標を達成してしまいました。

07 簡単な暗号化

数字とアルファベットのみだったので、これはbase64エンコードされた文字列だな!と #シェル芸 の勘が囁きました、大正解。チーム :(){:|:&};: なのでまあ、これは取れていい問題かな、と思いました。

U0NLT1NFTntiYXNlNjRfaXNfdmVyeV9lYXN5fQ

11 君(脆弱性)の名は

最近話題のWPA2のお話だったので、WPA2とか適当な文字を投げていたのですが、最後のレポートに"KRACKs"とあったのでこれが正解でした。Twitterやってるとこういう語彙力がついて良いです。 f:id:Iruyan_Zak:20171022161420p:plain

12 便利なプロトコル

「alter dhcp 1998」とかで調べてもいまいちだったので、Google Scholarに「dhcp」、著年1998で調べてそれっぽいものを入れると正解。「Management of IP numbers by peg-dhcp」という論文らしいです。 f:id:Iruyan_Zak:20171022161426p:plain

03 ボスを倒せ

アクセスすると名前を聞かれ、その後ボスとの戦闘が始まります。ボスの体力が圧倒的だし、コマンドもないので勝ち目がありません。

ログ

バイナリを落として来られる雰囲気もないので、とりあえず「AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA」と名乗ると自分の体力が増えましたやったね。 名前→自分の体力→ボスの体力というメモリ配置っぽいので、いい感じに長さを調整して名前を入力するとボスの体力が68くらいになりました、わーい。

19 灯台下暗し

サーバにアクセスするとこんなページが。

ページ

「the FLAG is admin's password.」と書かれていたので、「FLAG」とかいろいろ試したんですがダメで、hintをよく読むと、ファイル名を指定してDBを見に行ってました。そのままwgetでDBファイルをもらってsqlite3でusersを覗いてゲームセットです。

21 Web2

穴埋め問題です。もしかしたら高速な解法もあるのかもしれませんが、mapという文字列が見えた(関数型好きだから使い方を推測できた)のと、問題のやりたいことがすぐに掴めたので正攻法で解きました。 問題作る方は楽しそうだなと思いました。

f:id:Iruyan_Zak:20171022161638p:plain

20 Web1

難読化したJSを読む問題です。

JSファイル

再代入、ブロックによる変数の隠蔽、状態の変わるリストから属性を取り出すなど、悪意に満ちたコードでした。 地道に溶かして、コンソール上で実行したら鍵が現れました。

05 簡単な暗号化

暗号化は簡単(base64)ですが、その先は簡単なんて一言も言ってない、そんな問題。

ファイル

base64デコードすると16進の数字が出てきて、これをバイナリ化するとよくわかんないdataが出来てしまいました。 ただ、中にファイル名の断片みたいなのがあって圧縮ファイルっぽいなと思ったのでマジックナンバーを調べるとzipでした。 ファイル名はチグハグ(順番が入れ替わっている)になっていたのですが、手作業で並べ替えるとこれはミドルエンディアンだったことがわかり、元の16進数をよしなに並び替えてバイナリ生成したら解凍に成功しました。

・・・なのですが、そもそもファイル名が word/document.xml だったり _rels/ で始まっていたり・・・って、これdocx!?となって圧縮ファイルの状態でLibreOffice Writerで開いたら鍵が縦並びに書いてありました。docxが圧縮ファイルというのは #シェル芸 界隈では有名なことのようなので、気づいて良かったなって思いました。


正直、ここまでで解ける問題がなくなって満足していたのですが、1日目終了前に問題が追加されました。

04 OreNoFS

満を持して登場した500点問題。 オレオレファイルシステムの中からzipファイルを取り出す問題です。

ちょっと詳細に書きたい気持ちなので、記事を分けることにします。解法は こちら に。

結果

2800点で6位です。予想の28倍頑張りました。

f:id:Iruyan_Zak:20171022162713p:plain

また、上位15チームみんな解いているRSAの問題(08,09)が解けなかったり、逆に上位3チームしか解いていないファイルシステム(04)の問題を解いていたり、変なチームです。

所感

  • みんな初心者だったのに、パケットキャプチャの問題をほとんど(KoH2のヒント鍵までたどり着いてるし)解いていてすごい!って思った。
  • #シェル芸 とかやってるとあいてぃー雑学強くなるなあと思いました。が、優勝したinsecureチームのふるつきくんはシェル芸botというものを作ってました。敗北。
  • 他の大会との比較はできませんが、楽しく解けるいい問題が多かったように思います。
  • RSAはダメ(ダメ)

謝辞

本大会を企画・運営してくださった皆様、およびこの雨の共に競って下さった各高専の競技者の皆様に、ありがとうございました、とお伝えします。