Final(CTFの攻防戦)についてNECセキュリティブログTweetShare2020年1月17日あけましておめでとうございます。サイバーセキュリティ戦略本部セキュリティ技術センターの木津です。Playerとしての活動が終わり、現在、チームnoraneco(*2)として2019年に参加したCTFの大会(全部で94大会)の総まとめをしているところです。国際決勝の話を、どこにも記載していませんでしたので書いてみようと思います。Writeupを掲載するタイミングからは時間が経ちすぎましたので、次のような観点で書いてみます。決勝に出場できるメンバは4名だけですので、毎回チーム編成に悩んでいます。Finalの出題ジャンル/出題傾向を整理した結果を参考に、決勝メンバ4名を決めました。参考までに、独自に整理してみた結果を以下に記載します。1*3システムの脆弱性をついてリモート端末の制御権を奪取し、フラグを得る類の問題のこと。いう言葉が生まれ、「勝つ」や「打ち負かす」といった意味のスラングとして定着したとのこと*4問題を解くためにプログラムをチューニングしていかないとフラグがとれないような問題。競技プログラミング的なジャンル。複数ジャンルにまたがって出題されるケースもあります。2つのジャンルにまたがる問題の場合は1つの問題で2件(各ジャンル1件ずつ)でカウントしました。整理してみた結果、Web,Pwn/Reversing,Crypto,PpcあたりがFinalで出題される可能性が高そうということが見えてきました。上記を参考に、2019年は次のようなメッセージをチームメンバに通知して決勝メンバ4名を決めました。決勝メンバ選出方法の通知文の概要SECCON予選を含め、今後のCTF世界戦での点数獲得率(*5)の合計値で、決勝メンバを選出します。決勝メンバ届け出の締め切り日(11月中旬くらい)までの世界大会を対象として点数獲得率を計算していく予定です。それぞれ点数獲得率を加算していき、各カテゴリで点数獲得率の大きいメンバを1名ずつ選出します。100(%)獲得した点数が1000点で、1位のチームの獲得点数が5000点の場合、点数獲得率は20.0。試合毎に点数獲得率を計算していき、点数獲得率の合計値の高かった人が本戦の出場権を得る。Ppc/Network/Miscは各ジャンルを得意とするコアメンバであれば解けるはずという見解で外しました。この方法で決めたのには2つ理由があります。一つはチーム内でのメンバ選出でもめないようにすること。ひとつは、チーム内の決勝メンバ選出期間中、チームメンバ(決勝に出たいメンバ)のやる気が変わってくるという点です。出場してポイントを稼がないと決勝に出場できないということもあり、週末のCTFの参加メンバが増えて、この期間のCTFは盛り上がってたのしいです。社会人チーム特有というわけではありませんが、社会人チームの大きな課題として「平日仕事で疲れているので週末は休みたい。週末CTFの参加メンバが極めて少ない」といった課題があるのですが、色々チーム内でやり方を考えてみるとモチベーションアップできておもしろいかもしれません。Pointの合計ポイントを競う攻防戦形式のCTFです。図にすると次のようなイメージです。Pointを書きこめたチームが競技を優位に進められ、妨害などにより他チームの書き込みを妨害できたりします。Hillという名称がついたのだと推測しています。Pointの対象となるサーバが5つでした。Pointは各100点で、全部と解けると1800ポイント取れるようになっていました。Pointの対象となるサーバを1つでも抑えることができれば5位以内に入れる可能性があるという配点になっていました。Pointが極めて重要になってくるのは昔から変化していません。Pointはもう少し細かく、次のような観点で分類していった方がよいと考えています。Pointを取れるのは1チームのみ。Pointを取れるのは1チームのみ。Pointを占有できない問題。勝つためには、aよりもbを優先すべきと考えています。Pointを占有できた方が他チームと比べて優位に立てるからです。Pointは後から(例えば2日目朝一)でも回収できる可能性が高いため優先度は落として考えたほうがよいと考えています。x,y,zについては、解けそうな場合はx優先と考えています。yとzは後からでも得点できる可能性があるためです。上記のような分類に関する情報は問題文には記載されていません。問題文からある程度推測は可能ですが、問題を解き進めないと見えてこないことが多いです。Hillのおもしろいところと考えています。Pointの占有を取り返せるような問題が多い方が競技がおもしろくなりますが、他チームに先を越されて手詰まりとなる問題も必ず出題されるというイメージがあります。サーバ参の問題をチーム内の勉強会で共有しました。参考までに少し記載してみたいと思います。と反面教師にしていただければと思います。サーバ参の問題は概ね次のような内容でした(認識間違っていた場合はすみません)。400ポイント)サーバは全部で23個。それぞれプログラムの脆弱性を利用して、サーバ上の秘密情報(word.txt)を参照する各サーバはそれぞれ次のCPUアーキテクチャ上で動作するARM,MIPS,PowerPC,Aarch64,V850,FR-V,MicroBlaze,SH64,MIPS64,H8,Moxie,M32C,MN10300,MSP430,CRIS,CR16,M32R,SH,Thumb,Blackfin,RX,MIPS16,M.CORE23個のサーバの内、4つのサーバのみにflag文字列が格納されている。リモートサーバ上の秘密情報(password.txtとkey.bin)を脆弱性を利用して読み込むエクスプロイトを書いて、password.txtとkey.binの内容をxorして復号。復号したデータとディフェンスキーワードをフラグサーバに指定フォーマットで投入すると加点されるサーバに送信できるメッセージ(エクスプロイトコード)のサイズに上限があり、サイズ上限はトップチームの投げたメッセージのサイズに応じて、小さく制限されていく。password.txtとkey.binの内容は接続の度に変えられる出題されたCPUアーキテクチャは全部で23種類。次のようなタイミングでサービスが公開されました。Pointを以下のような感じで解いていました。どのCPUアーキテクチャのサービスも概ねデバッガの動作する環境およびクロスコンパイルできる環境を構築した後、次のような方法で攻略できた。例として以下に記載する問題文などからサービスはgdbのシミュレータ上で動作していることが分かった。攻撃コードを微調整する。KEYWORD★ダミーフラグ...上記のようにパッチをあてていない素のgdbのシミュレータで動こすことができるケースについてはなんとかなった。動かないものが難しかった。orzこのあたりで変なスイッチが入り。Pointの問題)を攻略するために多くの時間を浪費してしまった。Pointは取れなかった。Pointに集中していればと、後悔しました。競技時間は12時間で短めですので、このようにリソース配分、優先度の方針を誤ると後で後悔することになります。Pointを如何に早く占有するかです。チーム内で情報共有しつつ、チームの方針を臨機応変どう変えていくかが重要になってくると再認識しました。競技終了後に確認できたことですが、素のgdbのシミュレータでは実行ファイルが動かなかったARM,AArch64,MIPS,PowerPCのサービスを攻略するとFlagが取得できたとのことです。攻略方法をもう少し工夫する必要があったようです。難しいですが少しだけ書いてみます。Finalのwriteup(*6)やFinalの競技形式でよく採用されているAttack-Defense形式の大会のwriteupが公開されることは少ないため難しいのですが、SECCONについてはwriteupが公開されることが多いようですのでSECCONのwriteupを探して学習していくという手が一つありそうです。*6:他チーム/個人が解けた問題の解法を整理して、インターネット上に公開している情報SECCON以外でCTFのFinalの出題内容やAttack-Defense形式の大会のwriteupが公開されたケースとしては以下などがあります。形式(クイズ形式)の大会だけでなく、Attack-Defense形式(攻防戦形式)の大会にも参加して経験を積む必要があると考えています。基本はCTFのFinalもJeopardy形式の延長というイメージですが、のんびりマイペースでJeopardy形式だけやっていてもスピードを身につけるのは難しいです。オフラインの大会などにも出ながら実戦経験を積んでスピード勝負に慣れていく必要があると考えています。Attack-Defense形式については、パケットキャプチャと問題回収が重要です。収集データが使えるようになります。フラグが各チームのVMに一定間隔で格納されていきます。このフラグが格納された状態でかつ、一定時間経過して各サービスのログが出力された状態のVMイメージを回収するのが重要と考えています。パケットキャプチャしたデータを付き合わせてじっくり見てみると攻略方法/防御方法をイメージできるようになります。上記2つをセットにしてチーム内で共有しておくと、学習が捗ると思います。Attack-Defense形式の大会を1回経験すると、どこを自動化して効率UPしていていく必要があるのか、どのような方法でどこをモニタリングしたらよいか、どういう優先度で対応したらよいか、どのような事前準備が必要か、どのように攻撃を防御したらよいのか、などが見えてくると思います。Finalに関するチームnoranecoの取り組みや思っていることを可能な範囲で書いてみました。あと、参のwriteupらしきものが見当たりませんでしたので書いてみました。参考にしていただけるような情報がありましたら幸いです。今年もSECCONのオンライン予選から決勝までチームメンバと色々楽しむことができました。SECCON運営のみなさま、楽しいイベントの開催ありがとうございました。来年も是非継続していただきたいと思っています。1位をとれず悔しい思いをしたので、来年も予選を突破して再チャレンジしたいと思っています。現在、2019年のPwnジャンルの問題をふりかえりながら一つ一つタグ付け作業やおもしろかった問題のピックアップなどを行っています。2019年も心が折れそうなくらい問題数が多く、今回の掲載には間に合いませんでしたが、地道に整理作業を続けてアウトプットはどこかで共有したいと思います。リスクハンティングチーム主にネットワークセキュリティ製品・サービスの開発に従事してきたが、最近はCTFに取り組んできた経験を活かし、ペネトレーションテスト、脆弱性診断などの領域にも仕事の範囲を拡大中。Corporation。