ふるつき2

裏ブログです。うそです

CTF初心者の手引き

NOTE: この記事は公開から時間が経って古くなっているためあまり参考になりません。具体的には、記事中で紹介している常設CTFの人気が減っていて、そのCTFに取り組んで詰まったときに周りに助けを求めるのが難しくなっていたりします。

2024/04/21: 読み返したら口が悪かったので打ち消しました

CTFに参入してくれる、したいと思っている人は増えているような気はしつつ、CTFがなんなのかとか、はじめるには具体的にどうすればいいのかといった事柄についてはこの界隈はかなり不親切だなと思っています。多少の不案内でつまづいていては”ハッカー”にはなれないぞ、みたいな理屈がないわけではないですが、それが門戸を狭くする理由にはならないと思って、CTFを始めたいとかちょっと勉強したんだがこれからどうすれば良いかわからないという人向けの案内を書いてみます

……本音を言うと、「CTF始めました! どうすればいいですか???」みたいな質問を見るたびに甘えてんじゃねえみたいな気持ちが出てきてしまい、そんな権利もないのに勝手に腹が立ってしまって悲しいので、腹を立てる権利を得るためにとりあえずこれでも読んでろ、をぶん投げられるようにしたいです。この記事も読まずにそんなこと言ってるの? と腹を立てられるようになりたい

TL;DR

  • 初心者のうちは書籍で具体的な基礎を身につけて体系的な知識を獲得しましょう
  • とにかくCTFに出て、解ける問題を順番に解き、簡単には解けない問題にであったらその問題に力を入れて取り組みましょう
    • 解けなかったらwriteupで復習しましょう

CTFについて全く知らない人

とにかく名前だけは聞いたことがあるがパソコンには全く詳しくないとか、何をやっているかのイメージはつくが具体的に問題を出されたら歯が立ちそうにないとか、そういう人です。

そういう人にまず知っておいてほしいことは「CTFとはこう言うものです、と言い切れるような定義はない」と言うことです。何らかの権威的な組織や標準化されたルールというものは存在せず、世界各国のCTFプレイヤーが草の根的に自分が良いと思うそれをCTFと言い張ってやっているというのが現状です。したがって「これを勉強すればCTFで勝てる!」という、ある意味受験勉強的な学習で100%をカバーできることはありません。とはいえ、頻出の分野や問題というのはもちろん存在してるのでそういう事柄について学習していく、というのが最も素直で効率が良い勉強方法になるでしょう。

そういう勉強をするためには、まずは書籍に頼ることが一番だと思います。具体的にはハリネズミ本や迷路本と呼ばれる書籍で、これらは「CTF」という競技に話題を絞って解説してくれているので、CTFを始めたいと思った方はまずこれらを読んで基礎的な知識やCTFについてのイメージを養うと良いでしょう。とにかく実践をやりたい、本なんか読んでる暇はないという場合は止めませんが、大体の場合は突撃して行ってもなんかよくわからなくて撃沈して戻ってくることになると思います*1。あるいは、他の場所では策謀本などがお薦めされるかもしれませんが、策謀本はCTF自体やCTFで取り扱われるジャンル全体にわたっての説明をしてくれている本ではないので入門には向かないと思っています。

CTFについて多少は知識があるが、実践的な問題は解けないという人

フラグがbase64されているのは解けるけどRSAの原理はわからないとか、stringsはできるけどアセンブリを読むのは難しいとか、JavaScriptソースコードに書いてあるコメントやrobots.txtは辿れるけどXSSで情報を抜くのはどうやるかわからない、という人です。

こういう人は…まず基礎に立ちかえるためにハリネズミ本や迷路本を読むと良いと思います。個々の技術についてはインターネット上でも得られるかもしれませんが、結局原理について詳細に説明したり、個々の命令について網羅的に説明したりしてくれているのは書籍なので、本を読むのが一番早いと思います。ちなみに内容としては迷路本の方が新しく、また詳しいものが多い印象なので迷路本の方がおすすめです。

書籍で知識をつけたら、常設のCTFなどで試しながら知識を血肉に変えましょう。頭では理解していると思っているものでも、実践でいきなり手を動かそうと思うとうまくいかないものです。まずは Cpaw CTFpicoCTF の問題が解けるかどうか試すと良いでしょう。とりあえずCpawCTFは激烈に簡単で親切なので誰かに頼りながらでも全完できるように、picoCTFは問題数が異常なほどあるので、各ジャンルで2〜3時間程度悩んで解ける問題までは答えを見ながらでも全部解く、くらいをすると良いと思います*2

常設ではない、LiveのCTFで実践的に取り組みたいと思うかもしれませんが、わざわざワンショットのCTFを初心者のために開こうという人間がまともな実力・思考を持っていることは少なく、あまり良い問題は出ない印象です。

CTFの問題が解けるようになってきた人

知っている問題は解けるようになってきたが、知らない問題や頭を使う少し捻った問題に苦戦している、という人です。個人的にはこのくらいのレベル以上の人を指して「CTFプレイヤー」と呼ぶことが多い気がします。ここまで来ると、取り組んでいる問題の半分くらいはもう書籍では解説できないです。単に紙面が足りなくなってきたり、応用が入ってきて一つずつを解説するフェーズではなくなってきています。

こういう人は、とにかくいろんなCTFに片っ端から出て解ける問題をどんどん解いて、するっとは解けない問題に出会ったら3時間でも5時間でも悩みながら挑戦すると良いと思います。関連ワードをググりまくったり、過去の似たような問題に当たったりして知見を深めていきましょう。もし競技時間内に解けなかったら、必ずwriteupをみて復習しましょう。既に問題に何時間も取り組んでいるはずなので前提は十分に理解できているはずですから、writeupもすんなり頭に入ってくるはずです*3。これを繰り返して、自分の持っている知識と与えられた問題を比較して、どういうアプローチが取れそうかということを学んでいくと、解ける問題の幅が広がります。

こうして問題が解けたり、あるいはwriteupを読んで理解したら自分でもその問題についてまとめると良いです。writeup(やupsolveの記録)として公開するのがベストですが、非公開でも自分の理解をアウトプットすることはどのようなジャンルでも上達につながります。

あとは常設で特定のカテゴリにフォーカスした問題集に取り組むと良いでしょう。具体的にはCryptoHackpwnable.twなどで、これらのページには入門〜程度の知識で解ける問題から巷のCTFで言うボス問題レベルの難問までが取り揃えられていて知識の幅を広げるのに役立つはずです。

そしてこのくらいのレベルになってきたら、チームを組んで複数人でCTFに取り組むと良いかもしれません。単純に人数が増えるので順位が上がりやすく、モチベーションに繋がるとか、わからない問題について議論できるといったメリットがあります。主戦場としているジャンルが違って議論できなくても、反応があるだけでやる気は結構違ってくると思います。チームについて細かくはおまけにでも書いておきます

CTFに出てそこそこの順位には食い込めるが、難しい問題が解けずに困っている人

私です。助けて

おまけ1 / FAQ

チームはどうやったら組めますか

すみません。わかりません。ただ、大きいチームに所属するのはあまりお勧めしません。問題に集中できないとか、自分の役割が薄まってしまうとか、inactiveな人に釣られてしまうとか、良くないことはいくらでもありそうです。個人的な感覚では3人〜6人くらいの活発に活動する、大体実力のラインが揃っていそうな面子を集められると良いと思いますが、そんなことは可能なんで消化

CTFへの参加方法がわかりません

https://ctftime.org/ というサイトがあって、CTFの開催情報が集まってくるのでこれをみて参加しましょう。URLをクリックできて、ルールを読めれば参加できるはずです。

CTFで何をしたら良いかわかりません

CTF自体のルールを読んだり、本文中で紹介した書籍を読めばわかるのではないかと思います。それでも問題やCTFプラットフォームを目の前にすると固まってしまう。本当にわからないという時は例えば下記のチャンネルにあるような、問題を解いている動画を見てみるというのはどうでしょう

www.youtube.com

どういうCTFに出ると良いですか

とにかく片っ端から出てみて、解けるところまで問題を解くのが良いです。途中で諦めて放り投げても良いので、最初からCTFを選ぼうとはしない方が良いです。ただ、CTFtimeのレーティング(CTF自体のvoting weightというやつです)が50を超えているようなCTFは難易度が高いことが多いので避けても良いかもしれません

writeupはどこで読めますか

一番のお勧めは、CTFの開催ごとに立てられるDiscordサーバ*4にJoinすることです。CTFの開催後にそのCTFに参加していたプレイヤーがwriteupを共有したり、解法について議論しているので、それを読んだり会話に参加するのが良いです。

一応CTFtimeにもwriteupを投稿できる機能がありますが、CTFtimeにちゃんとwriteupを紐づけてくれる人は少ないので、それで見つかることはあんまり期待できないと思います。

CTFの過去問に取り組みたいです

最近のCTFはGitHubなどで問題を公開してくれていることが多いです。たいていdockerが使えれば自分で問題を立ち上げてローカルホストで試せるようになっているはず*5なので、GitHubなどから辿ると良いでしょう。

一方、昔のCTFの問題は失われてしまっていることが多いです。なんとかその時代にCTFをやっていた人やauthorを見つけて、問題を持っていないかと突撃することになるでしょう

SECCONというのが日本最大らしいのでやってみましたが、歯が立ちません

そういうものです。なぜなら(特に最近の)SECCONは難しいので。逆に、SECCONの問題が1問でも解けたらCTFプレイヤーとしての素養はあると思います。

SECCONが難しい場合はSECCON Beginnersに参加すると良いでしょう。とはいえSECCON Beginnersもなかなかハードなので、個人的にはWaniCTFという大阪大学のCTFチーム、WaniHackaseが開催しているCTFに挑戦するのがお勧めです。

◯◯という攻撃手法について知りたいのですが、どこに詳しく載っていますか?

詳しく書いてあるところには書いてあるし、そうでないところはそうでないです。今のところ、全ての情報が網羅されている場所や、知識が蓄積されていく場所というのはないので、自力で探すことになると思います。

CTFや問題に関して質問したい時はどうすればいいですか

問題に関する質問があるときは、その問題のauthorに聞くと良いです。CTFに関する質問も、特定のCTFということであれば、organizerに聞くと良いです。それ以外の一般的な質問については、今のところここに聞けば良い、という場所はありません。暗号問題に関してはCryptoHackのDiscordで聞けば誰か答えてくれるような気はしますが、私が認識しているのはそのくらいです

CTF、草の根的かつ未成熟な競技なのであんまり初心者に優しくないんですよね

おまけ2 / CTF入門者に便利なサイト一覧

*1:あるいは完全にやる気を失ってしまうか、なんかうまくいくか。なんかうまく行ったら才能か素養があります

*2:実際にしたから全部順番に埋める必要はなくて、かったるいなと思った問題は飛ばせば良いです。picoCTFはプラットフォームとしてよくできていたり、難易度が色々揃っている点は良いですが、全ての問題が良い問題ではなく、大体3割〜半分くらいの問題は解く価値ない問題だと思っています。ただ、それをいきなり判断する能力はあなたにはおそらくまだ備わっていないでしょうから、一旦は手を動かすことになると思います

*3:逆に、全く取り組んでいない問題のwriteupを読んで理解することは驚くほど難しいです

*4:Discordに限ることはないんですが、最近はDiscordのことが多いのでそう書いています

*5:最低限Dockerは使えてください