ふるつき

v(*'='*)v かに

InterKosenCTF2019 開催記

初級〜中級者向けのCTF、 InterKosenCTFを開催したので色々まとめておきます。

感想

CTF開催するのしんどいけど楽しいです。スコアサーバが50Xを返したときは最悪ですが。

概要

チームinsecure( @theoldmoon0602 , @ptr-yudai, @yoshiking)として、 2019-08-11 10:00:00 〜 2019-08-12 22:00:00 (JST) で InterKosenCTF と銘打ったCTFを主催しました。特に参加資格やチームサイズに制限は設けませんでしたが、日本の初級〜中級者向けのCTFのつもりで開催していました。

今回は高専セキュリティコンテスト(が今年もあるとして)のための予習とかモチベーションアップをそもそもの目的としていたのですが、なかなか高専セキュリティコンテストの日程が出なかった(というかあるかどうかさえわからなかった。あると思っていますが……)うえ、大体準備ができたので開催しました。

作問

Welcome問題とSurvey問題を除外すると全部で22問作って、 ptr-yudaiが11問、私が9問、yoshikingが2問つくりました。前回に比べるとバランスがよくなったと思います。作問の難易度としては、easyが「当該ジャンルを知っていると解ける」でmediumが「高専セキュリティコンテストで一番難しいレベル」、hardは「高専セキュリティコンテストにはちょっと出ないレベル」くらいの意識です。高専セキュリティコンテストの問題は簡単すぎるくらいだと思っているので、このくらいで作ると、得意なジャンルだと全部解けるか一問くらい解けないくらいの丁度良い難易度になると思って作っていました。

一応すべての問題について相互に解けることをチェックしたり、解法のスクリプトを書いたりして解けない問題が出題されたりはしないように気をつけていました。非想定解は想定できなかったので防げませんでした。もうちょっと気を遣いたいところではありますが難しいですね。

ちなみに各問題はこちらから見れます。

github.com

writeupはこちらから

hackmd.io

スコアサーバ

また書きました。そのうち公開します。我々のチームの見解としてはなんとなくCTFdは重そうだというのでいちいち書き直したりしているんですが、参加者も多くないだろうということで富豪的プログラミングをしたりしていてCTFdでもそんなに変わらないと思います。こういうのを作るのは楽しいけど安定しないし普通に難しいのでなんとかしたいですね。というかWebアプリケーション普通にかけないんだが。

そういえばスコアサーバに問題のデプロイ機能をつけるとか、配布ファイルの自動アップロード機能をつけるとか、色々工夫しました。良かったのかはわかりませんが。

30秒ごとにありとあらゆるデータをpollingしてくるという成金みたいな実装をしているので修正したいですね。

github.com

スポンサー

前回の出費を見て1万円くらいあればなんとかなりそうだな、と思ってtwitterでスポンサーを募集したところ全部で2万円のご支援をいただきました。開催直前にも数度スポンサードの申し出がありましたが十分な資金が集まっていると判断したためこちらはお断りさせていただきました。ありがとうございました。みなさん「お金ある? 大丈夫? もっと出そうか?」とまるで『案山子』のように心配してくださり逆にこちらが恐縮しきりでした。

インフラ

前回と同様にAWSを使いました。GCPやAzureよりは知っていた、みたいな理由で選びましたがそれでもまるで詳しくないので詳しい方に訪ねたりしながら構築しました。サーバは前回よりは豪華にして t2.medium を使い、テスト用のサーバには t2.micro を使いました。開催直前になって下記のブログに行き当たり、CTFはOther Simulated Eventに該当するということで急いでメールを出しました。

tigerszk.hatenablog.com

AWSのサポートは迅速に対応してくれて(とはいえ生活リズムの違いから1日一通しかメールが交換できなくて、AWS側からOKをもらったときにはCTFは終わっていたんですが)、結局以下のことを聞かれました。Route53やS3についてはシステムの構築に使っただけでそれ自体に何かしら攻撃性のパケットが飛んでくるわけじゃない、ということは追加で説明する必要がありました。

Thank you for contacting Amazon Web Services about your upcoming CTF Simulated Event. Since the time and date is nearly coming to a close we will excuse this request as a onetime courtesy, but please note that all customers are required to request pre-approval prior to conducting a CTF Simulated Event.

For all future simulated event request, please forward the required information in the format below:

Account Information

Account Name: Account Number: Email Address: Additional Email address to cc: Do you have an NDA with AWS? AWS Account Team Contact:

Target Data AWS Targets:

EC2 Resource: Cloudfront Distribution: API Gateway / Lambda: RDS Resourc: ELB Name: Other AWS Resource: Route 53 is not permitted and S3 is only allowed for Layer 7 testing. Testing the S3 buckets itself is against our policy

Non-AWS Targets:

IP Addresses:

Source Data

IP Address: Is the above IP address on your prem? Who owns IP Address? Contact for team doing testing: Does testing team have a NDA with us?

Testing Details

Simulated Security Event Type (red team, war games, phishing, etc.): Expected peak bandwidth in Gigabits per second (Gbps): Expected peak requests per second (RPS): Start Date/Time: End Date/Time:

Additional testing details and why it is needed: What criteria/metrics will you monitor to ensure the success of the event? Will your event require AWS interaction? If so, please let us know what capacity and why:

Do you have a way to immediately stop the traffic if we/you discover any issue? 2 Emergency contact names and phone numbers:

Abuse Reporting Do you want to be notified of any abuse reports received? If so, please provide an email address that will be monitored during the event If not, please advise how you would like us to address these reports

Abuse reports cannot be resolved without a reply to the reporter ---- end of required information ----

開催期間について

ptr-yudaiが自身の夏休みを勘案して「8/11 - 8/12あたりでどう?」と言ってきたので何も考えずにOKをだしました。後から見るとコミケ、DEFCON、セキュリティキャンプあたりと日程が被っていたり近かったりで微妙だったかもしれません。

一方で開催時間は「全部解ける実力があるチームが全部解ける時間」ということで36時間にしましたがこれはかなり良かったと思っています。狙いどおり上位3チームは全完していましたし、そうでないチームも各問題に1度は取り組めたのかなと思っています。

開催中

開始早々 504を連発する 504 CTFになりました。本当に申し訳ないと思っているし、504を出すCTFはダメCTFだと認識しているので自分がそれをやってしまったことがとてもショックです。スコアサーバを何回も再起動したり、データベースをDockerでもっていたものをRDSに移したりいろいろやりましたが、結局はgunicornで動かしていたスコアサーバの並列度が足りずにキューが詰まっていたのが問題だったようです。開催一時間後くらいにgeventをインストールしてなんとかしました。

その後は順調に見えたのですが夜9時ごろにまたエラーがでるようになって、今度はまるで理由がわからず、ホスト毎再起動しても効果がなかったので別インスタンスを2つたてて、そちらで運用していました。データベースをRDSに移していたのが後から功を奏した感じです。流石にこれ以上落ちるとまずいと思ってCloudWatchのアラームを使ってヘルスチェックに失敗するとslackに通知を飛ばす設定をしたのですが、結局その後は順調に動きました。謎

f:id:Furutsuki:20190813170844p:plain
これは50Xを出した回数のグラフ

請求

t2.mediumを何台か立てたのと、急遽RDSを立てたのとで当初の見積もりよりは少し高くなりましたが、ご支援いただいた額のうちにおさまりました。今後もスコアサーバを立て続けるなら考えないといけませんが、この記事がpublishされる頃には落ちている予定です。

f:id:Furutsuki:20190813171448p:plain
RDSバカ高くないですか?

なお、ご支援いただいた分の余りは次回開催資金の補助に回します。

次回について

何事もなければ2020年1月頃に「WinterKosenCTF 2020」を予定しています。こちらは中〜上級者向けで、ptr-yudaiが張り切って作問しています。

その他

もうちょっと色々しっかりやるべきなんだろうなと思っています。特にサーバの監視やBANの仕組みがまるで整っていなくて、いざというときが訪れたら困り果てるしかなくなってしまいます。勉強したいような気もするしそれは面倒のような気もする。

あとCTFの準備とか運営とかを実質2人で回すのは結構厳しいのでyoshikingにはもっと強くなってもらいたいです。

special thanks

  • ptr-yudai
  • yoshiking
  • スポンサー様
  • 参加者の皆様

本当にありがとうございました