簡易CTF競技可視化システム
(EasySaucer)

Windows版を追加しました(バージョン1.13)

■ 概要

簡易CTF用(EasyCTF) 用の簡単な可視化システムです. FreeBSDやCentOSなどのいわゆるPC-UNIX,もしくはWindowsで動作します.

作者があまりデザインセンスが無いので,なんかデザイン的にどうなのかなと 思っています(笑).
好きに改造して使ってください.

FreeBSD/CentOS/ラズベリーパイ2/Windows7で動作を確認してあります.

UFOみたいなのをイメージして作ってみました.

■ 注意点

動かすことを優先して即席で作ったため現時点でかなり荒削りで, ものすごく手抜きです.

様々な問題があるかもしれません.セキュリティ的な脆弱性などもあるかも しれません.(TCPでのサーバ動作や通信を行います)

自由に使って構いませんが,損害など出ても作者は責任はとれません. 各自の責任の下で利用してください.

EasyCTFと同様に,とにかくシンプルな作りなので, 自分でいろいろ改造したり,実験したり, 機能追加するためのベースとして使うといいでしょう.

■ 機能

競技ユーザごとに,円盤が出ます.

円盤内は,半径と角度ごとに,ブロックに分割されています (ハードディスクのトラックとセクタのようなイメージ).

それぞれのブロックが問題に相当します.ブロックには最初は青い壁が立っていて, 問題に挑戦すると白の小さい板が飛んできて壁にぶつかります.
板が飛んできている間は壁が赤や紫になります.板がぶつかると破片が飛び散ります.
正答だと壁がゆっくり倒れて緑色になります.

同じジャンルの問題は同じ角度に割り当てられます.つまりあるジャンルの問題を 全問正解すると,緑のピザのピースのような形ができることになります. ジャンルごとのレーダーチャートのような感じになります.
(注意:saucer-1.6から,半径と角度の役割が逆になりました.saucer-1.5以前は,あるジャンルの問題を全問正解すると緑の輪になります)

ジャンルごとの問題数が一致していることが理想ですが,そうでなくても構いません.
問題数が足りなくて空いたブロックは,回答されない状態で残るだけです.
(つまり,そのジャンルは全問正解しても完全なピザのピースにならない)
が,全ジャンルの問題数が一致していれば,全問正解で円盤が緑一面になって きれいでわかりやすいです.

動作中にユーザ追加やジャンル&問題追加(EasyCTFのlist.txtへの問題追加) などがあった場合にも,動的に追随します.
例えば動作中にユーザ追加されると円盤が増えていきますし, 問題が追加されるとトラックが細く多くなります.

■ とりあえず見てみたいときには

サーバへの接続無しでのスタンドアロンの状態でも動作します.
とりあえずサーバ連携無しに,どんなものかパッと見てみたいという人向けです.

makeでビルドして,./saucer をオプション無しで起動してください.

起動したら以下のキーを押して,いろいろ動作を見てみてください.

■ 操作方法

可視化システム上で,以下のキー操作ができます. (以下はSaucer-1.3から追加) (以下はSaucer-1.4から追加) (以下はSaucer-1.7から追加) (以下はSaucer-1.13から追加)

■ 使うための準備

OpenGLとGLUTを使っています.
以下のようにして,freeglutをインストールしておきます.
# yum install freeglut-devel          (CentOSの例)

$ sudo apt-get install freeglut3-dev  (Ubuntuの例)
SaucerをダウンロードしてZIPを展開します.

展開するとscriptsというディレクトリに reporter.pl というスクリプトがあります.
これは,情報を送信するためのサーバとして使います.

ZIPの展開ディレクトリでmakeを実行してsaucerをビルドします.

■ Windows版の使いかた

ビルドに以下のツール・ライブラリを利用しています. ライブラリ類はZIPファイルに同包していますので,ライセンスなどはそちらを 参照してください. Windows版のZIPファイルを展開すると saucer.exe という実行ファイルがあるので, とりあえずそれをダブルクリックして起動できます.

実際に使う場合にはパラメータ指定が必要なので,コマンドプロンプトから 引数指定して起動するか,ショートカットを作成して引数指定してください.

■ サンプルデータで動かしてみる

EasyCTFと連携してちゃんと動かしてみる前に,とりあえず競技だとどんな感じなのか, サンプルデータで動かして見てみる方法についてです.

以下に,後述する疑似データの生成スクリプトで生成した サンプルデータがあるのでダウンロードします.
(ただしサンプルとして,激し目(笑)にパラメータ調整しています)

サンプルデータ(7分程度)

上記データをダウンロードしたら解凍します.
「sample-result」というディレクトリが生成されるので, Saucerに付属のreporter.plを以下のようにディレクトリ指定して起動します.

$ ./reporter.pl -d sample-result -replay
実行するとSaucer可視化システムからの接続待ちになります.
(注意:reporter.plはポート(デフォルトでは12345)を開けて, 認証無しで接続受け付けします.インターネットに接続されているような サーバで安易に起動しないように注意してください)

次にSaucer可視化システムをmakeでビルドして,以下のようにして起動して サーバに接続します.

$ ./saucer -h <reporter.plを起動したサーバのホスト名もしくはIPアドレス>

■ ちゃんとした使いかた

可視化システム(Saucer)には reporter.pl というスクリプトが付属しています.
このスクリプトが,EasyCTFのCGIのフォルダからユーザ情報や問題の回答情報を 読んで,それを送信するサーバをやってくれます.
で,Saucer可視化システムは reporter.pl に接続して,もらった情報を 円盤のグラフィックで表示します.

このため手順としては,以下のようになります.

EasyCTF起動 → reporter.plを起動してサーバ起動 → Saucer可視化システムを起動してサーバに接続

具体的には以下のような感じです.

  1. EasyCTFをインストールして起動 (これについてはEasyCTFのほうを参照)

  2. EasyCTFを起動しているシステム上で,reporter.pl を以下のようにして起動
        $ ./reporter.pl -d <EasyCTFのCGIのディレクトリ>
        
    (例えばCentOSなら以下のような感じ)
        $ ./reporter.pl -d /var/www/cgi-bin/easyctf
        
    ※ ポート番号はデフォルトで12345になっています.
    他のアプリとぶつかるようなら-pオプションで変更できます.

    (注意:reporter.plはポート(デフォルトでは12345)を開けて, 認証無しで接続受け付けします.インターネットに接続されているような サーバで安易に起動しないように注意してください)

  3. Saucer可視化システムを以下のようにして起動する.
        $ ./saucer -h <reporter.plを起動したサーバ名もしくはIPアドレス>
        
    ※ ポート番号はデフォルトで12345になっています.
    変更が必要なら,やはり-pオプションで変更できます.
reporter.plは複数のSaucer可視化システムからの接続を受け付けます.
Saucer可視化システム側をいったん終了して再接続したりすることもできます.

■ リプレイモード

reporter.plは通常起動だと,現時点で存在している回答情報を一気に送り, あとは新しい回答が出るたびに送る,という動作をします.

つまり動作中にreporter.plやSaucer可視化システムを再起動し再接続した場合には, 現在の状態まで早送りで一気に進められ,それ以降はリアルタイムで動作することに なります.これは競技中に再起動や再接続をすることを想定しています.

reporter.plを -replay というオプションで起動すると, 現時点で存在している回答情報(と,新たに追加されていく回答情報)を, 回答されたときの時間のインターバルをおいて送ります.
これは競技後に,競技の状況を再現するのに使えます.

ちなみにreporter.plにSaucer可視化システムを接続した状態でreporter.plを 終了した場合(つまりセッションが切断された場合)には, Saucer可視化システムは終了せずにそのまま動き続けます (ただしサーバからの情報送信が無いので,何も情報が得られず ただ動き続けるだけです).

なのでreporter.plを再起動した場合には,Saucer可視化システムを手動で終了& 再起動する必要があります.
これは競技中にreporter.plを再起動したいが,Saucer可視化システムは (プロジェクタなどでギャラリーに見せているため)別のタイミングで再起動したい, という状況を想定しています.

■ 実行時オプション

■ reporter.pl (以下はSaucer-1.1から追加) (以下はSaucer-1.6から追加) (以下はSaucer-1.13から追加)

■ Saucer可視化システム

(以下はSaucer-1.3から追加) (以下はSaucer-1.8から追加) (以下はSaucer-1.9から追加) (以下はSaucer-1.10から追加) (以下はSaucer-1.12から追加)

■ ユーザ名・ジャンルの漢字表示

ユーザ名とジャンルは漢字を利用できます.ただし漢字の利用時には, 以下のようにしてフォントファイルの作成と指定が必要です. (フォントファイルを指定しない場合,漢字部分は表示されません)

まず,漢字フォントのBDFファイルが必要です.これは pcf2bdf というコマンドで, PCFファイルから変換することができます.PCFファイルはX11のものが利用できます.
以下はFreeBSDでの例です.

% pcf2bdf /usr/local/lib/X11/fonts/local/jiskan16-2000-1.pcf.gz > kanji.bdf
次に,BDFファイルを添付のスクリプトでフォントファイル(独自形式)に変換します.
% ./saucer-1.8/scripts/bdf2sfont.pl kanji.bdf > kanji.sfont
生成したフォントファイルを-kanjiオプションで指定して,saucerを起動します.
% ./saucer -kanji kanji.sfont
USERコマンドによるユーザ情報の送信時とQUESTIONコマンドによる問題情報の送信時 に,ユーザ名/ジャンルに漢字が指定されたときに, 漢字で表示するようになります.(漢字コードはUTF-8のみです)

■ 疑似的なXXの追加

「操作方法」のところにありますが,キーボードからの操作により円盤の数などを 疑似的に増加させることができます.

サーバに接続しての実際の動作中に,上記の「疑似的なXXの追加」を行っても, 実害はありません.

例えば「b」を押すと円盤が追加されますが,その円盤は, (対応するユーザがいないので)何も回答されない状態で動き続けます.

その後に実際にユーザ追加された場合には,すでに追加されている (が,対応するユーザがいない状態の)余っている円盤がそのユーザに 割り当てられます.

もちろんそのような余った円盤が無い場合には,その都度円盤が増えます.

ジャンルや問題についても,そのような感じで動作します.

ただ当然ながら実際のユーザやジャンル数とは食い違うことになって見栄えは 悪くなるので,競技中に間違ってキー操作してしまってあーやっちまったと思った 場合には,Saucer可視化システムを終了させて再起動&再接続するといいでしょう.

■ 疑似データの作成

実際に競技しないと動作を見ることができないというのでは不便なので, 疑似的に競技データを作成するスクリプトを添付してあります.

reporter.plと同じディレクトリに,mksample.pl というスクリプトがあります.

以下のようにして実行することで,EasyCTFのユーザ情報と問題情報を読み込んで, 競技者の回答情報を疑似的に生成していきます.

$ ./mksample.pl -d <EasyCTFのCGIのディレクトリ>
(例えばCentOSなら以下のような感じ)
$ ./mksample.pl -d /var/www/cgi-bin/easyctf
mksample.pl を動作させている状態で,そのディレクトリ指定で reporter.pl を 起動すれば,生成データをSaucer可視化システムに送信することができます.

mksample.plは以下の実行時オプションを指定できます.

■ 通信内容

reporter.pl と Saucer可視化システムは,TCPでの通信を行います. 通信内容はテキストです.
このためtelnetで接続してのデバッグが可能です.
(reporter.plにtelnetで接続するとわかります)
これは reporter.pl 側の通信系のデバッグに使えます.

またSaucer可視化システムは,-sオプションでサーバモードで起動することが できます.
サーバモードで起動すると,自身が接続にいくのでなく,他からの接続を待ちます.
つまりSaucer可視化システムをサーバモードで起動し,そこにtelnetで接続して コマンドを手動で発行することで,Saucer可視化システムを操作することができます.
これはSaucer可視化システム側の通信系のデバッグに使えます.

■ 通信フォーマット

reporter.pl → Saucerに,以下の4種類の情報を送信します.

ユーザ情報

(書式)

USER <ユーザID> <ユーザ名>  (ユーザIDはユニークな文字列なら何でもいい)
                            (ユーザ名に空白など入れたい場合には "" でくくることができます)
                            (バックスラッシュでエスケープします)
                            (漢字はUTF-8で指定し,-kanji オプションでフォントファイルを指定します)
(例)
USER 0001 TestUser
USER 0002 "Sample User"
USER 0003 "\"Sample User 2\""
USER 0004 "漢字の名前"

問題情報

(書式)

QUESTION <問題ID> <ジャンル> <スコア>  (問題IDはユニークな文字列なら何でもいい)
                                       (ジャンルはBinaryとかWebとか)
                                       (ジャンルはユーザ名と同様に "" やバックスラッシュによるエスケープ,漢字が使えます)
(例)
QUESTION Q001 Binary 100
QUESTION Q002 Web 200
QUESTION Q003 "Genre Web" 300
QUESTION Q004 "バイナリ" 400

回答したけど不正解だったときの情報

(書式)

REPLY <ユーザID> <問題ID> <時刻>    (時刻はtime()の値)
(例)
REPLY 0001 Q001 1432476751

正答したときの情報

(書式)

CLEAR <ユーザID> <問題ID> <時刻>    (時刻はtime()の値)
(例)
CLEAR 0001 Q001 1432476751

■ スクリーンショット集

(Saucer-1.1から追加)

(Saucer-1.3から追加)