Black Hat Asia 2024 ArsenalでMINI Hardeningの方々によるZANSINが公開された。
なんと、ZANSINを使うことでMINI Hardeningのv4を自宅で動かすことができちゃう。
しかも環境が手元にあるので何度も繰り返し実施して腕を磨くことができる。やったぜ。MINI Hardening v4についてはこちらを参照。
というわけで手元で動かしてみた。
コンピュータのセットアップ
最低2台のコンピュータが必要となる。1台は攻撃の実施やクローリング、スコアの算出といった訓練の制御を行うコントロールサーバ、もう1台は訓練を受ける者が操作して防御を実践する訓練用マシン。
コンピュータは物理でも仮想でもクラウドでもいいが、公式の推奨は、スナップショットが取れることから何度も訓練を繰り返すのに適しているVirtualBox上のVMを使用すること。
それぞれのコンピュータにはUbuntu Serverが導入されている必要がある。20.04以上が必要とのこと。私の手元では22.04で正常に動作することを確認済み。ZANSINのリリース後に出たUbuntu Server 24.04を使う際にはちょっと工夫が必要。これについては最後のおまけパートに記載。攻撃までうまく行くかは未検証。
他にもいくつか満たしておくべき条件がある。
- コントロールサーバと訓練用マシンが互いに通信できるようになっていること
- 2台ともインターネットにアクセス可能な環境であること
- 2台とも
sudo
可能なzansin
ユーザが作成されていること zansin
ユーザのパスワードは2台で共通であること- どちらのコンピュータにもパスワード認証可能なSSHサーバが導入されていること
1つめは2台を同じネットワークセグメントに設置して同じサブネットのIPアドレスを振ってやればよい。後ろ3つはUbuntuセットアップ時にzansin
ユーザを作成し、OpenSSHサーバをインストールするチェックボックスをOnにすればよい。
ZANSINのセットアップ
セットアップは簡単である。GitHubからセットアップ用スクリプトをダウンロードしてきて実行するだけ。裏でAnsibleを使ってパッケージインストールだのDockerコンテナの導入などが行われる。ここは時間がかかるのでゆっくり待とう。
# セットアップスクリプトのダウンロード
wget https://raw.githubusercontent.com/ZANSIN-sec/ZANSIN/main/zansin.sh
# 実行パーミッションを設定して実行
chmod +x zansin.sh
./zansin.sh
訓練の実施
コントロールサーバ上でred_controller.py
を実行することで訓練を開始できる。開始前に訓練用マシンのスナップショットを取っておくと良い。再度訓練をしたい場合にはスナップショットに書き戻すことでセットアップの手間を省ける。
zansin@control-server:~$ source red-controller/red_controller_venv/bin/activate
(red_controller_venv) zansin@control-server:~$ cd red-controller/
(red_controller_venv) zansin@control-server:~/red-controller$ python3 red_controller.py -n tkito -t 192.168.1.2 -c 192.168.1.1 -a 1
-a
は実施するシナリオを指定する。1だと通常モード。2だと攻撃半減モード。0は開発用なので使わない。シナリオ内容は設定ファイルをいじることでカスタマイズできなくもない(後述)。わかってる人向け。
訓練開始したら、訓練を受ける者は訓練用マシンにvendor
アカウント(初期パスワードはPassw0rd!23
)でログインして防御を開始する。
(2024/07/14 初期パスワードの記載が間違っていたので修正)
訓練時間は4時間。初めは攻撃が来ないが、少しすると攻撃が始まる。放っておくとやりたい放題やられてしまうので、やられないよう防御していこう。
訓練時間が終わると、スコアが表示される。全ての通信をブロックする最強モード()で防御してみた。Operationが100なのは謎。コントロールサーバ側で訓練時間などいじったりしたのでそのせいかも?あとずれてる。
訓練のカスタマイズ
ここからはわかってる人向けの自己責任エリア。
red-controller/config.ini
で設定変更できる。training_minues
は訓練時間を分単位で指定する。デプロイ直後は240(4時間)が設定されている。ここを変更することで5分で終わらせることも可能。ただしこの後に説明するシナリオで指定した時間の方が長い場合はそちらが優先される。
細かい話をすると、training_minutes
は、攻撃シナリオの実行と並行して実行されるクローラの実行時間を規定するパラメータである。攻撃シナリオとクローラの両方が終了することで訓練が終了となるため、クローラが実行終了しても攻撃シナリオが終わってなければ訓練は続くというわけである。このため、training_minutes
で設定した時間で訓練が終わるわけではないことには注意が必要。
シナリオはred_controller/attack/attack_config.ini
に記載されている。中を見ると以下のような行がある。
1-001 : 001@nmap@0
1-003 : 003@nikto@0
1-006 : 031@nmap@0
1-008 : 033@nikto@0
コロンの左側がシナリオ番号(1桁)とイベント番号(3桁)である。右側が実行するアクションを指定している。@
で区切られたうち1つめが訓練開始からアクション実行までの待機時間(単位は分)、2つ目が実行する関数(red_controller/attack/attack_controller.py
内で定義)、3つめは関数に渡す引数(0は引数無し)である。
この内容を変えることで、攻撃を好きな順番で実行させることができる。ちなみに、シナリオ番号が0の場合は待機時間が秒単位になるため、高速で訓練を終わらせたい場合には有用。デバッグ用途以外の需要はたぶんない。
おわりに
MINI Hardeningをお手軽に体験できるZANSINがリリースされたことで、Hardening競技者の自己鍛錬に革命が起きる!たぶん!
MINI/Micro含めたHardening競技に参加するのはちょっと難がある(時間とか物理的な距離とか)という方でも楽しめるのでぜひやろう!
おまけ:Ubuntu Server 24.04について
訓練用マシンをUbuntu Server 24.04にする場合、コントロールサーバも24.04である必要がある。そうしないとAnsibleのバージョンの関係でエラーが出る。コントロールサーバが24.04の場合には訓練用マシンはどのバージョンでもよい(たぶん)。
また、コントロールサーバがUbuntu Server 24.04の場合、zansin.sh
の最後の方でPython 3.10をマイナーバージョン決め打ちでインストールしているが、24.04には3.10は無く3.12となるため、ここを書き換えておく必要がある。
攻撃がちゃんとうまくいくかまでは未検証。python3 red_controller.py -h
した際にWarningが出るのでもしかしたらうまくいかないかもしれない。
おまけ:崩れるロゴ
PuTTYなどで接続してセットアップすると最初のロゴが崩れる場合がある。これはフォントのせい。というかUnicodeのAmbiguous widthのせい。滅びてほしい。
訓練用マシンにアクセスする際のvendorアカウントの初期パスワードは「Passw0rd!23」かと思います…
すみません、1月以上放置しちゃってました…(通知メールが来なくなってた)
ご指摘ありがとうございます。修正しました。何かと勘違いしてたようです。