TOUCH THE SECURITY Powered by Security Service G
社内でCTF大会を開催するにあたり、facebook社がOSSとして提供するスコアサーバ「fbctf」を使ってみました。
そもそも「スコアサーバとは?」という点に先ず触れますと、CTFの参加者が問題を閲覧してフラグ(回答)を入力したり、あるいは自他チームの得点状況などを参照できるような仕組みを想像して頂ければ良いかと思います。尚、「XXというサーバの脆弱性をついてフラグをゲットせよ」といった問題を提示する場合、XXというサーバはスコアサーバの機能で補えるものではなく、別途用意する必要がある点はご留意下さい。
fbctfのOSS配布に関する、facebook社からのアナウンスはFacebook CTF is Now Open Source!にてご覧頂けます。
目次
1.インストールと起動
ソフトウェアの配布、及びインストール手順や使用上のTIPSなどは、facebook社のgithubで公開中です。英語ではあるものの、wikiが用意されていたりと情報は充実。よって詳細な記述は避けつつ、本記事では大きな流れと注意点だけをまとめます。
GitHub - facebook/fbctf: Platform to host Capture the Flag competitions
1-1.二つのインストール方法
一つ目の方法は、Ubuntu14.04(x64)のホストに直接パッケージをインストールするProductionモード。
二つ目の方法は、Vagrant+Virtualboxをインストールしたホスト上に、パッケージインストール込みのUbuntu14.04(x64)環境を"vagrant up"させるDevelopmentモード。githubからホスト上にインストール用パッケージをクローニングすると、その為のVagrantfileも含まれているようです。
インストールパッケージに含まれるVagrantfile。Developmentモードでトライする場合に使用します。
その他、双方共にdockerコンテナとして実行する方法なども紹介されていまが、今回紹介するのは、最もベーシックな一つ目の方法です。
1-2.インストール開始
①先ずはUbuntu14.04(x64)のサーバを用意
Ubuntuサーバはベースシステムのみをインストールして、LAMP等のミドルウェア・パッケージの追加は行わないで下さい。Prodactionモードでインストールする場合、これらはfbctfのインストーラーによって自動で追加・設定されます。
「何も足さない。何も引かない。」ってやつですね(平成生まれの人は無視でOK)。
②サーバ時刻の調整
インストーラーが種々のパッケージをダウンロードするにあたり、証明書の有効期限の妥当性がとれなくなってしまわないように、サーバ時刻を正しく設定します。
- $ sudo apt-get install ntp
- $ sudo service ntp stop
- $ sudo ntpd -gq
- $ sudo service ntp start
③リポジトリをアップデートした後、gitをインストールします。
- $ sudo apt-get update
- $ sudo apt-get install git
④facebookのgithubより、インストールパッケージをクローニングします。
- $ git clone https://github.com/facebook/fbctf
⑤パッケージのクローニング先であるfbctfディレクトリへ移動、インストーラーを実行します。
- $ cd fbctf
- $ ./extra/provision.sh -m prod -s $PWD
※最後に管理者(admin)用のパスワードが自動生成・表示されますので、これを控えておいてください。
2.fbctfへアクセス
インストールが完了したらブラウザからホストへ早速アクセス。アカウント:admin、パスワード:先ほど控えたもの、でログインして管理画面を見てみましょう。
尚、接続に際しては自己署名証明書による暗号通信となる為、ブラウザから警告があがります。今回は無視して接続しますが、正式な運用においてはドメインを取得の上、正式なサーバー証明書を導入しましょう。 ※Wikiにはインストールスクリプトの内容に関する詳細な記述があり、Let's Encryptによるサーバ証明書の導入方法にも触れています。
おおっ。世界征服!えいえいオーッ!
問題作成、スコア表示、参加者アカウントの管理、開始終了のタイマーセット、一斉アナウンス、データのエクスポート、インポートなどなど。かなり多機能な印象です。
Admin用の管理画面
データのバックアップ、インポートもメニュー単位で可能
作成した問題は、トップ画面の世界地図上に散りばめられる。チャレンジャーは特定の国をクリックすることで、仕込まれた問題がにゅーんと表示されるギミック
3.ゲームの進め方、気づきなど
画面のツアーが終わったところで、早速問題を投入してみましょう。fbctfには、三つのゲーム機能が存在しており、問題作成のメニューも別々に用意されています。三つの機能によって用意した問題を混在させることも可能ですが、ここは適宜使い分けといったところでしょうか。
尚、三つのモードに共通する事として、一問につきヒントは一つしか出せません。「断片的な複数のヒントを徐々に開封してもらうことで、ペナルティポイントと引き換えに回答(FLAG)へ導く」といった事が出来ないので、ヒントの内容はかなり吟味する必要がありました。
3-1.QUIZ
その名の通り、クイズ(CTFでいうところのJeopardy)的な問題を出題する為の機能。問題のタイトル+問題文があって、挑戦者が回答のFLAGを入力するというパターン。とてもシンプルな作り。作成した問題をカテゴリーに属させる事が出来ないので、「どういうカテゴリーの部類かも伏せたまま、とにかく一問一答してもらう」といった時に使うものかもしれません。
QUIZによる問題の入力画面
3-2.FLAGS
こちらはQUIZとよく似ているのですが、機能が追加されます。先ずは問題のカテゴリー分け。「この問題は”暗号系”」といった旨を挑戦者に明示できます。更にQUIZでは出来ない「ファイルの添付」や「リンクURLの表示」といった事も可能。Jeopardyの問題は、通常このFLAGSを使用する事が多いのではないでしょうか。
FLAGSによる問題の入力画面。QUIZにはない”CATEGORIES”という項目が存在。”EDIT”を押下すると、ファイルのアタッチメントやリンクURLの入力も可
3-3.BASES
上記二つと大きく性格の異なるモードがこちらのBASES。大きな大会などで「king of the hill」という攻防戦方式が採用される場合があるのですが、それ用です。訳すると”お山の大将”といったところでしょうか。
この方式、簡単に説明するとこんな感じ。先ず運営側は「お山=問題用サーバ」を別途用意。この”お山サーバ”にfbctfのエージェントとして「/tmp/SCORE_POINTS」というファイルを仕込んでおきます。そして挑戦者たちは”お山サーバ”の脆弱性などをついて一斉に攻略。
echo "ThisIsATeamName" > /tmp/SCORE_POINTS
のように、自チーム(ATeam)の名前を書きこんだら、Ateamはポイントをゲット。他チームも同様のトライを仕掛けてきますが、この状態をATeamがキープし続けられたらATeamは更に周期ポイントをゲット。BTeamにこの状態を奪われてしまうと、周期ポイントの獲得権はBTeamに移る、こんな感じのようです。
ちなみにBASESには、前二つの画面に存在する「FLAGS」の項目が見当たりませんが、そういうゲームの仕様上からですね。残念ながら今回は使用しませんでしたが、かなり高度なゲーム展開が求められそうです。
BASESによる問題の入力画面。、前二つの画面に存在する「FLAGS」の項目が見当たりませんが、これはゲームの性質上によるもの
以上ざっとではありますが、Facebook社のOSSスコアサーバ「fbctf」の紹介でした。「突然CTFを企画する気が湧いてきた」「OSSのスコアサーバを片っ端から検証したい」など、そういうのって皆さんよくあるんじゃないかと思いますが(無いか...)、比較的に簡単に準備可能ですので、是非触ってみて下さい。