はじめに
いきなりネガティブな情報ではありますが、本エントリで利用しているCTFスコアボードアプリは現時点で非推奨となっており、2022年1月以降メンテナンスされていません。(じゃあ紹介すんなよ!と言われてしまいそうです、ごめんなさい)
また、SplunkやApp/Add-Onの最新バージョンに追従していないため、利用する場合でも用途を限って利用したほうがよさそうです。
なお、BOTSv1を利用するだけであれば、公式で提供している Boss of the SOC が手っ取り早いです。
本エントリでは、Splunkが提供している(していた?)CTFスコアボードというアプリを利用して、Boss of the SOC (BOTS)のVersion1というCTFシナリオを再現するものです。BOTSv1のコンテンツが入手できなくても、サンプルシナリオ(というかチュートリアル程度のものですが)を記載しているので、簡単なCTFを開催できるようになっています。
利用する環境は Azureコンテナーインスタンス もしくは ローカル環境のDocker で構築する例としていますが、Dockerコンテナを単体で起動させるだけなので、ほかのパブリッククラウドを利用する場合でもやることは同じのはずです。
環境構築
環境は以下のいずれかを利用する
- Azureコンテナーインスタンス
- ローカルDocker
コンテナを準備してしまえば、コンテナ内の操作はどちらでも同じになる。
SplunkのCTFアプリ
詳細な説明は公式を参照のこと。
なお、このエントリではGitHubにあるとおり、Splunkのバージョンが8.2.xである必要があるため、コンテナのタグを8.2にしている。
また、SplunkBaseからアプリを取得する際にはアカウントが必要となるため、作成していない場合は アカウント作成 が必要。
コンテナ作成
Azureコンテナーインスタンスを利用する場合と、ローカルDockerを利用する場合の2通りがあるので、好きなほうで構築する。
Azureのコンテナーインスタンスを利用する場合
Azure Container Instance の 非永続ローカルストレージは50GBあるので、動作は問題ない。
環境変数でコンテナ動作を指定する
RG_NAME=rg-p2
CONTAINER_CPU=2
CONTAINER_MEM=8
CONTAINER_NAME=p2-splunk
SPLUNK_VERSION=8.2
SPLUNK_PASSWORD="#supuranku#"
コンテナを起動する
az container create \
--resource-group ${RG_NAME} \
--name ${CONTAINER_NAME} \
--cpu ${CONTAINER_CPU} \
--memory ${CONTAINER_MEM} \
--image splunk/splunk:${SPLUNK_VERSION} \
--restart-policy OnFailure \
--ports 8000 \
--dns-name-label ${CONTAINER_NAME} \
--environment-variables \
"SPLUNK_START_ARGS"="--accept-license" \
"TZ"="Asia/Tokyo" \
"SPLUNK_PASSWORD"="${SPLUNK_PASSWORD}" \
"SPLUNK_LAUNCH_CONF"="OPTIMISTIC_ABOUT_FILE_LOCKING=1"
まちがった場合や利用終了時はいったんコンテナを削除してから再作成する
az container delete \
--resource-group ${RG_NAME} \
--name ${CONTAINER_NAME} \
--yes
起動ログをチェックして、Ansibleのタスクが完了すれば起動OK
az container logs \
--resource-group ${RG_NAME} \
--name ${CONTAINER_NAME} \
--follow
これから先の作業ではShell取得してコンテナ内で作業をする
az container exec \
--resource-group ${RG_NAME} \
--name ${CONTAINER_NAME} \
--exec-command "/bin/bash"
ローカルのDockerで動作させる場合
ローカルDockerではストレージはホストそのものが利用されるので、10GB程度は確保しておく。
環境変数でコンテナ動作を指定する
CONTAINER_NAME=p2-splunk
SPLUNK_VERSION=8.2
SPLUNK_PASSWORD="#supuranku#"
コンテナを起動する
docker run -d \
--hostname ${CONTAINER_NAME} \
--name ${CONTAINER_NAME} \
-p 8000:8000 \
-e "SPLUNK_START_ARGS=--accept-license" \
-e TZ=Asia/Tokyo \
-e "SPLUNK_PASSWORD=${SPLUNK_PASSWORD}" \
-e "SPLUNK_LAUNCH_CONF"="OPTIMISTIC_ABOUT_FILE_LOCKING=1" \
splunk/splunk:${SPLUNK_VERSION}
まちがった場合や利用終了時はいったんコンテナを削除してから再作成する
docker stop ${CONTAINER_NAME}
docker rm ${CONTAINER_NAME}
起動ログをチェックして、Ansibleのタスクが完了すれば起動OK
docker logs ${CONTAINER_NAME} -f
これから先の作業ではShell取得してコンテナ内で作業をする
docker exec -it ${CONTAINER_NAME} /bin/bash
Splunkセットアップ(コンテナ内での操作)
ここから先はAzureコンテナーインスタンスでもローカルDockerも同じ作業となる。
HTTPS化
SplunkのDockerイメージをそのまま起動した場合には、HTTPでWebUIへアクセスするようになっているので、HTTPS化する。
自己署名証明書によるHTTPS化
# 証明書配置ディレクトリの指定
CERTS_DIR=/opt/splunk/etc/auth/certs
sudo -u splunk mkdir $CERTS_DIR
# 自己署名証明書の作成
sudo -u splunk /opt/splunk/bin/splunk cmd \
openssl req -x509 \
-sha256 -nodes -days 365 -newkey rsa:2048 \
-subj /CN=localhost \
-keyout ${CERTS_DIR}/server.key \
-out ${CERTS_DIR}/server.crt
# WebUIに自己署名証明書を利用するための設定を追加
sudo -u splunk tee -a /opt/splunk/etc/system/local/web.conf <<EOF >/dev/null
[settings]
enableSplunkWebSSL = true
privKeyPath = ${CERTS_DIR}/server.key
serverCert = ${CERTS_DIR}/server.crt
EOF
Splunkサービスの再起動が必要だが、あとでまとめて再起動するので、ここではやらなくてOK
CTFスコアボードアプリのセットアップ
SplunkBaseからアプリをダウンロードするためにアカウントを設定しておく
SB_USER='<SplunkBaseユーザ名>'
SB_USER='<SplunkBaseパスワード>'
# ヒストリに残るのが嫌な場合はこれで代入する手段もある
# read -sp "password: " SB_PASS; echo
DL用のトークンを取得
TOKEN=$(curl -s -k -XPOST -D - https://splunkbase.splunk.com/api/account:login/ -d "username=${SB_USER}&password=${SB_PASS}" | grep '<id>.*</id>' | sed -r 's/.*<id>(.*)<\/id>.*/\1/')
echo $TOKEN
ここで $TOKEN
の中身がない場合はユーザ名とパスワードが違うので、やりなおす。
スコアボードに必要なアプリはGitHubの説明の通り以下のもの。バージョンは提供されていなかったり、動作が怪しいものは違うバージョンをインストールする。
Install the following prerequisite Splunk apps and add-ons
- Lookup File Editor app (Note: Tested with version 3.0.3)
- Parallel Coordinates Custom Visualization (Note: Tested with version 1.2.0)
- Simple Timeseries Custom Visualization (Note: Tested with version 1.0)
- Timeline Custom Visualization (Note: Tested with version 1.2.0)
これらをSplunkBaseからダウンロードしてくる。
展開時に文字コード(?)の警告が表示されるが、特に問題ない。
# CTFアプリが必要とするアプリの取得
APP_ID=1724
APP_VER=4.0.2
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=3137
APP_VER=1.2.0
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=3436
APP_VER=1.0
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=3120
APP_VER=1.6.2
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
curl -s -L https://github.com/splunk/SA-ctf_scoreboard/archive/master.tar.gz | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
sudo mv /opt/splunk/etc/apps/SA-ctf_scoreboard-master /opt/splunk/etc/apps/SA-ctf_scoreboard
curl -s -L https://github.com/splunk/SA-ctf_scoreboard_admin/archive/master.tar.gz | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
sudo mv /opt/splunk/etc/apps/SA-ctf_scoreboard_admin-master /opt/splunk/etc/apps/SA-ctf_scoreboard_admin
# 全部ダウンロードしたらSplunkを再起動する。
sudo -u splunk /opt/splunk/bin/splunk restart
# ディレクトリを作成
sudo -u splunk mkdir /opt/splunk/var/log/scoreboard
# サービスアカウントを追加
SVCACCOUNT_USER=svcaccount
SVCACCOUNT_PASS=svc_pass
sudo -u splunk /opt/splunk/bin/splunk add user ${SVCACCOUNT_USER} -password ${SVCACCOUNT_PASS} -role ctf_answers_service -auth admin:${SPLUNK_PASSWORD}
# サービスアカウント用のコントローラー設定を追加
sudo -u splunk tee /opt/splunk/etc/apps/SA-ctf_scoreboard/appserver/controllers/scoreboard_controller.config <<EOF >/dev/null
[ScoreboardController]
USER = ${SVCACCOUNT_USER}
PASS = ${SVCACCOUNT_PASS}
VKEY = $(sudo -u splunk /opt/splunk/bin/splunk cmd openssl rand -hex 8)
EOF
# Splunkを再起動する。
sudo -u splunk /opt/splunk/bin/splunk restart
以下のログが出力されていることを確認する
[ansible@splunk splunk]$ sudo ls -l /opt/splunk/var/log/scoreboard
total 8
-rw------- 1 splunk splunk 106 Dec 24 15:23 scoreboard.log
-rw------- 1 splunk splunk 106 Dec 24 15:23 scoreboard_admin.log
ユーザへのロール設定と参加者の追加
# adminユーザに admin , ctf_admin , can_delete のロールを割り当てる
sudo -u splunk /opt/splunk/bin/splunk edit user admin -role admin -role ctf_admin -role can_delete -auth admin:${SPLUNK_PASSWORD}
# 参加者を追加する
HACKER_NAME=user01
HACKER_PASS=user01_pass
sudo -u splunk /opt/splunk/bin/splunk add user ${HACKER_NAME} -password ${HACKER_PASS} -role user -role ctf_competitor -auth admin:${SPLUNK_PASSWORD}
HACKER_NAME=user02
HACKER_PASS=user02_pass
sudo -u splunk /opt/splunk/bin/splunk add user ${HACKER_NAME} -password ${HACKER_PASS} -role user -role ctf_competitor -auth admin:${SPLUNK_PASSWORD}
HACKER_NAME=user03
HACKER_PASS=user03_pass
sudo -u splunk /opt/splunk/bin/splunk add user ${HACKER_NAME} -password ${HACKER_PASS} -role user -role ctf_competitor -auth admin:${SPLUNK_PASSWORD}
HACKER_NAME=user04
HACKER_PASS=user04_pass
sudo -u splunk /opt/splunk/bin/splunk add user ${HACKER_NAME} -password ${HACKER_PASS} -role user -role ctf_competitor -auth admin:${SPLUNK_PASSWORD}
CTFシナリオの設定(WebUIでの操作)
ここから先はWebUIやローカルマシンからの操作です。
WebUIへのアクセス
Azureコンテナーインスタンスを利用している場合は、以下でコンテナのFQDNを取得する。
SPLUNK_FQDN=$(
az container show \
--resource-group ${RG_NAME} \
--name ${CONTAINER_NAME} \
--query "ipAddress.fqdn" \
--output tsv
)
echo https://${SPLUNK_FQDN}:8000/
で、取得されるURLにブラウザでアクセスする。
ローカルDockerの場合は https://[DockerホストのIP/FQDN]:8000/ のURLにブラウザでアクセスする。
SplunkWebのログイン画面が表示されるのでログインする。
(ログインアカウントは、ユーザ名「admin」、パスワードは環境変数で設定した「$SPLUNK_PASSWORD」)
CTFシナリオのファイル準備&アプリ設定
サンプルシナリオの場合
BOTSv1用のシナリオがある場合はサンプルではなく BOTSv1用のセットアップ を実施する。
BOTSv1用のシナリオがない場合は、以下のサンプルシナリオで動作させる。
サンプルシナリオで利用する以下のCSVファイルをローカルに作成しておく
Number,Question,StartTime,EndTime,BasePoints,AdditionalBonusPoints,AdditionalBonusInstructions
1,"これは操作チェックのための問題です。日本語で「おはようございます」と入力してください。",0,1893456000,10,0,
101,"鬼ヶ島へ鬼退治に行ったのは誰でしょう?(回答は漢字で入力)",0,1893456000,50,0,
102,"足柄山で動物たちと相撲を取っていたのは誰でしょう?(回答は漢字で入力)",0,1893456000,100,0,
201,"ウサギとカメがかけっこしました。ゆっくり自分のペースで進んだのはどちらでしょうか?(回答はカタカナで入力)",0,1893456000,150,0,
202,"アリとキリギリス、バイオリンを弾けるのはどちらでしょうか?(回答はカタカナで入力)",0,1893456000,200,0,
Number,Answer,_user
1,"おはようございます",nobody
101,"桃太郎",nobody
102,"金太郎",nobody
201,"カメ",nobody
202,"キリギリス",nobody
HintCost,Hint,HintNumber,Number
5,"この人は桃から生まれています",1,101
5,"最初の文字は「金」",1,102
10,"2つめの文字は「太」",2,102
5,"もしもし かめよ かめさんよ せかいのうちで おまえほど あゆみののろい ものはない どうしてそんなに のろいのか",1,201
5,"鳴き声があるほうはどっち?",1,202
DisplayUsername,Email,Event,FirstName,LastName,ScoringUrl,SearchUrl,SearchUrl2,SearchUrl2Desc,SearchUrl3,SearchUrl3Desc,SearchUrl4,SearchUrl4Desc,SearchUrlDesc,Team,Username
"さる",,First CTF,,,https://localhost:8000,http://vmdev01.prosper2.net:8000/ja-JP/app/search/search,,,,,,,,"さるかに合戦",user01
"かに",,First CTF,,,https://localhost:8000,http://vmdev01.prosper2.net:8000/ja-JP/app/search/search,,,,,,,,"さるかに合戦",user02
"たぬき",,First CTF,,,https://localhost:8000,http://vmdev01.prosper2.net:8000/ja-JP/app/search/search,,,,,,,,"かちかちやま",user03
"うさぎ",,First CTF,,,https://localhost:8000,http://vmdev01.prosper2.net:8000/ja-JP/app/search/search,,,,,,,,"かちかちやま",user04
EulaContent,EulaDefault,EulaId,EulaName
"このゲームに参加する場合はAcceptをクリックしてください。",1,1,"参加了承"
サンプルシナリオの場合はアプリを利用しないのでこれでおしまい。
次の CTFシナリオのインポート に進む。
BOTSv1シナリオ用のファイル準備&アプリ設定
BOTSv1シナリオに以下が含まれていることを確認する。
- ctf_questions.csv
- ctf_answers.csv
- ctf_hints.csv
再度コンテナにログインして、前述手順の トークンを取得 をしてから、アプリをダウンロードする。
BOTSv1に必要なアプリはGitHubの説明の通り以下のもの。バージョンは提供されていなかったり、動作が怪しいものは違うバージョンをインストールする。
App / Add-on Version Download Splunk Enterprise 6.5.2 http://www.splunk.com Fortinet Fortigate Add-on for Splunk 1.3 https://splunkbase.splunk.com/app/2846 Splunk Add-on for Tenable 5.0.0 https://splunkbase.splunk.com/app/1710/ Splunk Stream Add-on (Note Stream 6.6.1 is no longer available. Use Version 7.1.1 instead.) 6.6.1 https://splunkbase.splunk.com/app/1809/ Splunk App for Stream (Note Stream 6.6.1 is no longer available. Use Version 7.1.1 instead.) 6.6.1 https://splunkbase.splunk.com/app/1809/ Splunk Add-on for Microsoft Windows 4.8.3 https://splunkbase.splunk.com/app/742/ TA-Suricata 2.3 https://splunkbase.splunk.com/app/2760/ Microsoft Sysmon Add-on 3.2.3 https://splunkbase.splunk.com/app/1914/ URL Toolbox 1.6 https://splunkbase.splunk.com/app/2734/
アプリのインストール
# BOTSv1が必要とするアプリの取得
APP_ID=2846
APP_VER=1.3
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=4060
APP_VER=6.3.0
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=4061
APP_VER=6.0.5
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=5234
APP_VER=8.1.1
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=5238
APP_VER=8.1.1
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=1809
APP_VER=8.1.1
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=742
APP_VER=8.8.0
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=2760
APP_VER=2.3
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=1914
APP_VER=3.2.3
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=2734
APP_VER=1.6
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
APP_ID=3985
APP_VER=1.2.2
curl -s -L -H "X-Auth-Token: ${TOKEN}" "https://api.splunkbase.splunk.com/api/v2/apps/${APP_ID}/releases/${APP_VER}/download/?origin=sb" | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
# データセット取得
curl https://s3.amazonaws.com/botsdataset/botsv1/botsv1-attack-only.tgz | sudo -u splunk tar -xz -C /opt/splunk/etc/apps/
# 全部おわったらサービスを再起動しておく
sudo -u splunk /opt/splunk/bin/splunk restart
WebUIから以下が検索できることを確認する
index=botsv1 earliest=0
955,807件のイベントが存在していることが確認できる(が、時間がかかるので待たなくていい)
CTFシナリオのインポート
ログインしたら左側メニュから「Capture the Flag Admin」を選択する。
上部メニュのEdit > Edit Questions を選択する。
ダイアログが開くので、先ほど作成した「ctf_questions.csv」をドラッグして「Import」をクリック
同様にSplunkWebで CTF Admin App から問題をロードする。
- Edit > Edit Questions > Import > ctf_questions.csvをインポート
- Edit > Edit Answers > Import > ctf_answers.csvをインポート
- Edit > Edit Hints > Import > ctf_hints.csvをインポート
- Edit > Edit eBadges > Import > ctf_badges.csvをインポート(ある場合)
- Edit > Edit Teams/Users > Import > ctf_users.csvをインポート(ある場合)
- Edit > Edit User License Agreement > Import > ctf_eulas.csvをインポート(ある場合)
ctf_eulas.csvがない場合は、Data Management > Load SAMPLE data (DANGER) > Load sample User Agreements を選択する。
CTFの開始時間と終了時間を設定するために、上部メニュのEdit > Edit Time Setup を選択する。
「1 Specify new Start/End Times」とある部分に開始時刻と終了時刻を設定して「Submit Changes」をクリックする。
以下のように「Done! Verify results below.」と表示されればOK
CTFとしての利用
ユーザ画面
手順のなかで作成したユーザ(user01~user04)は、参加者となる。
SplunkWebUIにログインしてメニュから「Capture the Flag」をクリックする。
Welcomeページに遷移するので、下部のUserAgreementの「View/Accept」をクリックする。
ダイアログが表示されるので「AcceptAgreement」をクリックする。
上部メニュのQuestionsをクリックすると問題ページに遷移する
StealthModeをオンにすると、チーム名が隠されてチームの順位をわからなくさせることができる。
管理者画面
adminユーザはCTF管理者にしているので、全体のスコア確認や各メンバー/チームの回答を確認することが可能。
これも、メニュとか眺めてるとなんとなく使い方はわかりそう。けど、質問する機能(?)みたいなのはどうやって使うのかよくわかりませんでした。
Splunkアカウント作成
SplunkのアプリはほとんどがSplunkBaseからダウンロードできる。
が、アカウントが必要となっているので、アカウント登録していない場合には、まずアカウントを登録しておく。(費用はかからない)
SplunkBaseのサイトへアクセスし、右上にある「LogIn」を選択すると、アカウント入力画面になる。
アカウント入力画面で「sign up」をクリックすると、アカウント作成画面になる。
すごく縦長なアカウント作成画面になるので、必要な項目を入力して、利用規約を読んで問題なければ「CreateYourAccount」をクリックするとアカウントが作成できる。
あとの進め方は忘れましたが、たぶんメール認証してログインして、とかだったと思いますが、特にむつかしいことはなかったと思います。
ここで設定したメールアドレスとパスワードはあとで利用します。
さいごに
Splunkのアプリって、けっこう力技で作られているものが多いのかも、なんて思ってしまった。ダッシュボードを自由に作ることができれば、いろんな情報が可視化できるんだろうなぁ、とおもいつつ、周辺アプリとも対応させていかなきゃいけないから、メンテナンス大変そうだなぁ、とも思う。
SplunkSupportedになっているアプリも以前はダッシュボードとか「App」として配布されていたものも、そっちは廃止されて「Add-On」だけになったやつとかもあって、メンテが大変のなかな、とか変な方向の想像をしてしまった。
情報を収集してCIMで一般化できるなら、あとはSESとかESSを集中的に管理する、みたいな感じなんですかね?このあたりは経験浅いので全くよくわからないです。