CTFを始めるときのTips
この記事は, OIT Advent Calendar 2019の21日目の記事です.
目次
はじめに
CTFを触ったことがない人を対象としています.
CTFを始めるまでのハードルを下げることを目的にしています.
記事の信憑性については保証できません.
CTF(Capture The Flag)とは
なんらかの脆弱性やら設定不備やらを突いてFlagと呼ばれる文字列を手に入れる競技.
Jeopardy形式とAttack&Defense形式があるが一般的にはJeopardy形式を指すことが多い.
(オンラインコンテストや常設サイトはJeopardyがほとんどのため)
-
Jeopardy形式
クイズ形式. -
Attack&Defense形式
基本的にはオフラインコンテスト.
各チームごとに与えられたコンピュータに対して攻撃と防御を行う形式.
派生系にKing of the Hill形式がある. この記事では触れない.
必要とされる知識
Computer Scienceを完全理解していると良い.
出題範囲はコンテストによって異なるが, 多くのサイトで以下のジャンルが出題されることが多い.
-
Reversing
実行ファイルの挙動を解析する.
アセンブリ言語や実行ファイルフォーマットの知識など. -
Web
任意の脆弱性を持つWebページを攻撃する.
Web系言語やWebのセキュリティ機構の知識など. -
Pwnable
実行ファイルの脆弱性を突く.
Reversingの知識や実行ファイルのセキュリティ機構の知識など. -
Crypto
暗号.
数学や暗号の脆弱性に関する知識など. -
Forensics
与えられたファイルを解析し隠されたデータを抽出する.
OSに関する知識など. -
Misc
どのジャンルにも分類されない問題.
すべてのジャンルをマスターするのは厳しいので, 多くの人間は担当するジャンルを絞っていることが多い.
初めは色々なジャンルに手を出して得意なジャンルを探すと良い気がする.
常設サイト
オンラインコンテストは難易度が不透明なことが多く, 初めは常設サイトでCTFに慣れるのが良い.
cpawCTFとpicoCTFは簡単な問題が多いのでおすすめ.
CTFでは無いがLinuxコマンドの練習としてOverTheWire Banditもおすすめ.
ある程度CTFに慣れてきたら
など
オンラインコンテスト
基本的に期間限定のコンテスト.
CTFtimeのCalendarを見ていれば大体のオンラインコンテストは見逃さない.
CTFtimeにチーム登録すると参加したコンテストの順位に応じてレートが付いたりする.
多くのコンテストは終了後一定期間を経てコンテストサイトが閉じるので, 問題と問題ファイルはDLしておいたほうが良い.
コンテストが終了すると多くの人間がWriteup(解法)をアップロードするので, それを読みながら復習すると良い.
CTF環境を作る
環境としてLinuxとWindowsの両方があったほうが良いと思う.
(exeが降ってきたときにWindowsが無いと実行できない.逆も然り.)
環境が汚れたり, マルウェアだったりすると面倒なので仮想マシンに環境を作ったほうが良い.
始めるにあたって最低限必要になりそうなツールの紹介だけ.
-
Reversing
IDA, Ghidraなどのリバースエンジニアリングツール
gdb-peda等のデバッガ
dnSpy等のデコンパイラ -
Web
Burp Suite, Fiddlerなどのプロキシツール
CookieやUserAgentを変更できるブラウザプラグイン -
Pwnable
radare2等のリバースエンジニアリングフレームワーク
checksec等のセキュリティ機構調査ツール
rp++等のROP Gadget解析ツール
socat等のプロキシツール
gdb-peda等のデバッガ
pwntools等のライブラリ -
Crypto
紙とペン -
Forensics
Volatility等のメモリフォレンジックツール
FTK imgaer, Autopsy, The Sleuth Kit等のディスクフォレンジックツール
青い空を見上げればいつもそこに白い猫(汎用ファイルアナライザ)
bviやstirling等のバイナリエディタ
Wireshark等のネットワーク・アナライザ
あとは必要に応じて追加していく.
便利なサイト
-
CyberChef
各種エンコード, デコードなど.
エンコードされてるっぽい文字列があればCyberChefのMagicに突っ込むといい感じにデコードしてくれる. -
Post HTTTP Requests Online
HTTP request各種をWeb上で作って投げれる. -
RequestBin
一時的にHTTP requestを記録してくれる.
WebのXSS問題でadminのcookieを奪うときなどに利用する.
(本来, 自前のサーバを公開してそこにアクセスさせる.)
思い出したら追記する.