🌊

SECCON CTF 2021に参加してみた話

2021/12/14に公開

きっかけ

書店で詳解セキュリティコンテストという本を見つけたのが始まり。もともと、セキュリティ周りのことに関しては興味があったが、勉強の仕方がわからず手を付けていなかった。そのセキュリティの勉強のモチベーションの一つとして CTF があるのは知っていたが、やっぱり学び方が全く分からなかった。

その場で軽く本の中身を見てみると、初心者向けに体系的に書かれていて、勉強の初手がわかりそうだったので購入。そのままただ読むだけではなく、何か目標があればいいなぁと思って調べていると、今回参加した SECCON CTF 2021 を見つけた。これに参加しようと決意した。

勉強

一人でやるのも悪くはないが、モチベーション向上のため、興味ある友人を巻き込むことにした。つれたのは二人。全員断られると思っていたが、割と興味がある人がいてよかった。

友人二人と毎週末、朝9時半から昼12時過ぎごろまで discord に集まって勉強。休日の朝9時は平日の朝4時だと言って毎週のように遅れてくる人がいたんだよねー、いったい誰なんだろー(棒)。ま、まぁ10時までには来ていたし???

1時間は上記で紹介した本をみんなで黙読、後半の時間は練習問題のサイト ksnctf を解いていった。ただ全く解けなかった。1時間以上考えてわからなかったら、writeup を検索して答えを見るようにした。解法を見て自分で実装して理解を深めた。

ksnctf は難易度が高いということで CpawCTF を解いていくことにした。が、僕がやっていると得点がバグって、次のステージに進めなくなってしまった...。というのも、僕は windows と mac の 2 台使いをしていて、問題によって使い分けていた(つまり各々でログインしていた)。多分それが悪さをして得点がバグったと思われる。その仕組みも多分こうじゃないかなぁと推測できたが、そこを考えるところじゃない、とセルフツッコミ。結局どうしようもなくなったので、当初やっていた ksnctf のほうを解いていった。

参加登録

これについては色々物申したい。ルールが出たのが1週間(?)ほど前で、参加登録できるようになったのが二日前。ちょっと遅くないかなぁと。レギュレーションによっては1チームで構成できる人数の上限が決められたりするから、そこをずっと気にしていた(3人ならどのみち問題ないと思っていたが)(結局は上限なしっぽかった)。もしかすると、ハッキングして参加フォームを見つけるものかと思った(笑)。

参加登録は自分の名前とチーム名を決めて登録。チーム名を決める際、3人が知っていることにするのは迷ったが、みんな AmoungUs を知っているということで Imposters とした。無事、登録できてよかった。

本番

コンテストの期間は 2021/12/11 14:00 から 2021/12/12 14:00 までの 24 時間。今回の目標は参加することと、上位50%以内に入ること。なので、ガチで参加するつもりはなく、1, 2問解ければヨシッ、という緩い感じで参加した。チームで解くとなると分担が難しいが、各々解きたい問題を解くということにした。

最初の問題は welcome という問題。いわゆる hello world 的な問題。深読みしてしまい出遅れた。単純に考えればよかっただけの問題で悔しい。

以下、僕が解こうとした問題。

Vulnerabilities (web)

指示されたサイトに行くと脆弱性のリストがあり、それがヒントなのかと一つずつ調べていった。 httpoxy が該当しそうだったが、それ以上どうこうすることもできなった。
また、dockerfile もダウンロードでき起動してみると、指示されたサイトと同じものを表示させる web サーバが立ち上がった。ローカルで色々試せるようにと気遣いなのかわからないが、何をすれば僕はわからなかった。

pppp (crypto)

ファイルを見ると明らかに RSA 暗号。素因数分解できるようにしてあるんだろう、と決めつけて素因数分解をするツールをダウンロードしてきて実行。だがしかし、8時間経ってもできなったので解けなった...。

oOoOoO (crypto)

ソースコードが与えられていて、そこから解読しようとした。 "o" か "O" の違いしかなく ASCII コードで見ると 1 ビットの違い。そこをうまく使って kM + S = messege をみたす k を探ろうとしたがうまくいかず。 M がメッセージ長の 5/8 で、先に述べた通り 1 ビットの違いなのでメッセージのは 7/8 わかっている状態。感覚的はうまく計算すれば解けるといことはわかったが、具体的な方法が思いつかず...。学生時代にもっと数学勉強しておけばよかった(数学科院卒の発言)。

s/<script>//gi (misc)

与えられた巨大なテキストファイルから <script> という文字列をひたすら取り除いていく問題。正攻法でやると時間がかかりすぎて解けない。ファイル分割して各々除去する処理を終了間近まで回したが、プログラムのバグがあり解けなかった。つらい。

<flag> (reversing)

これは友人が解いているのを見ていたもの。 wasm ファイルを c 言語にコンパイルすることろまでやっていて、もう少しで解けるんじゃないかという雰囲気を醸し出していたもの。結果解けなかったが一番惜しいところまで行ったと思っている。

結果

上記のように welcome 以外解けなかった。初参加とはいえ一問は解きたかった。結果は 506 チーム中 295 位だった。目標の半分である 253 位も welcome だけしか解けていなく、同点の場合は先に解いたほうが上位となる。そのチームが解いたのが 14:07:19.567 で僕らが 14:16:56.694 で 10 分程差があった。まぁそれで上位半分になっても微妙だが...(welcome 以外も解けたチームが 190 チームしかなかった)。

感想

散々な結果だったが、参加するという目標が達成できたということで良しとする。参加することによって、大会の空気感や問題の難易度も分かったので。今回、解けなかったのは圧倒的な勉強不足、というよりも演習不足だと思っている。解法がわかれば自分で実装できる自信はあったので、もっと問題を解いてパターンを覚えていくべきだった。

来年も参加する。Crypto を重点的に勉強してリベンジだ。

Discussion