[ホームサイバーレンジ] Ludusを使ったGOAD自動構築

# 構築したくなった理由
OSCPに合格し、次にOSEPを目指すにあたって情報を調べてみると、脆弱なAD環境を構築している人を多く見かけました。
そのため、自宅でもAD環境を構築したくなって色々と調べてみました。

# GOADについて
ActiveDirectory環境を自分で構築する、しかも脆弱な環境を作るのはかなり骨が折れる作業だと思います。
Game Of Active Directory（以下GOAD）では、そのような環境を自動で構築することができます。

https://orange-cyberdefense.github.io/GOAD/

以前は自分のメインPCで構築していたのですが、メモリが足らなかったりするので別のPCで構築することにしました。

# Ludusについて
Ludusとは、Proxmox上に仮想マシンを自動構築し、必要な設定をPackerやAnsibleを用いて流し込んでくれるツールです。そのため、自動的にサイバーレンジを構築することが可能になります。

https://docs.ludus.cloud/docs/intro/

## 必要要件
Ludusの公式HPには必要要件が記載されています。
少なくともこれらを満たすPCを用意する必要があります。
- x86_64CPU（Ryzenは非推奨）
- メモリは32GB以上
- ストレージは250GB以上

私はMinisforumのNPB7のメモリ32GB、ストレージ1TBを使用しました。
小さい環境の構築だけであればここまでの要件は必要ないと思いますが、今後を考えて32GBメモリは用意しておくと安心だと思います。

## 構築
### OSインストール
まずはDebian12をインストールします。
以下のホームぺージからdebian-12.x.x-amd64-netinst.isoをダウンロードします。

https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/

USBを用意しておき、そこにRufusを利用してISOを書き込みます。

https://rufus.ie/ja/

PCにUSBからブートし、Debian12をインストールしましょう。
SSH Serverを有効にしておくと、自分の環境からアクセスできます。GnomeをインストールしておくとGUIで操作できるので、念のためそのままにしておくことをお勧めします。
ユーザーの作成ですが、私は公式HPのとおりuserを作成しました。

### 準備
Ludusをインストールする前に、必要な作業があるので実施します。
また、IPアドレスは必要に応じて固定化してください。
```bash
# rootに移行
su

# アップデート
apt update

# 必要ツールをインストール
apt install -y curl sudo python3.11-venv
```

### インストール
Ludusを自動でインストールできるスクリプトが用意されているため、それを用いてインストールします。
対話型インストーラーが起動しますが、基本的には変更せずに進めてしまって大丈夫です。
```bash
# 自動スクリプト
curl -s https://ludus.cloud/install | bash
```

インストールが始まると何回か再起動が行われます。
インストールの進捗を確認したい場合は、以下のコマンドを管理者権限で実行すれば確認できます。
```bash
ludus-install-status
```

インストールが終了したら、rootのAPIキーが発行されます。
rootのAPIキーは新規ユーザーの作成にしか使用できません。
```bash
# root APIキーの確認
cat /opt/ludus/install/root-api-key
```

APIキーを使用して新規ユーザーを作成します。
このユーザーを用いて、今後の作業を実施します。
```bash
 LUDUS_API_KEY='ROOT.o>T3BMm!^\As_0Fhve8B\VrD&zqc#kCk&B&?e|aF' \
 ludus user add --name "John Doe" --userid JD --admin --url https://127.0.0.1:8081
```

新しく作成したユーザーのAPIキーが出力されるので、これを環境変数で登録します。
APIキーはこの時にしか表示されないため、必ずメモを取ってください。
```bash
 export LUDUS_API_KEY='JD._7Gx2T5kTUSD%uTWZ*lFi=Os6MpFR^OrG+yT94Xt'
```

LudusはProxmox上で仮想マシンを構築しています。
そのため、Proxmoxにログインできるクレデンシャルを取得できます。
```bash
ludus user creds get
```

WEBページであるhttp://<ludus ip>:8006にアクセスし、ログインできるか確認しましょう。
画像はある程度構築した後のものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850929/b3082b62-86c0-42cd-fd19-f31366b678f3.png)


### テンプレートの準備
次にレンジ環境で展開される仮想マシンの元となるテンプレートを用意します。
初期に用意されているテンプレートには足りていないOSがあるのでそれらも追加します。
```bash
git clone https://gitlab.com/badsectorlabs/ludus
cd ludus/templates
ls -l

# テンプレートを追加
ludus templates add -d win2016-server-x64
ludus templates add -d win2019-server-x64
```

kaliをLudus環境で構築する場合は、ペネトレに使用するツールがインストールされない設定になっているため、`/opt/ludus/packer/kali/kali.yml`の該当箇所をコメントアウトを外しておきましょう。
別で用意したkaliから行うのであれば必要ありません。
```bash
# コメントアウトを消す
	- kali-linux-default # This takes forever (2+ hours) and really slows down template building
```

テンプレートを追加したので、これを構築します。
構築には時間が数時間かかるので気長に待ちましょう。
```bash
ludus templates build
```

構築の状況は以下で確認できます。
```bash
# 構築状況
ludus templates status

# 状況のモニター
ludus templates logs -f
```

全て構築できればBUILTがTRUEに変更されています。
```bash
ludus templates list
```

### GOAD構築
いよいよGOADの構築に入ります。
ここではGOADをインストールしますが、他にもGOAD-Light等あるので自分に適した環境を構築してください。
```bash
git clone https://github.com/Orange-Cyberdefense/GOAD.git
cd GOAD

# GOAD構築用の対話型インストーラーが起動
./goad.sh -p ludus

# GOAD構築に必要な要件が満たされているかを確認
GOAD/ludus/local > check

# どの種類のラボをインストールするかを選択
# set_labを入力した後、どのようなラボがあるかを確認できる
GOAD/ludus/local > set_lab GOAD

# 設定が終わればインストール開始
GOAD/ludus/local > install
```

もしkaliを追加で構築する場合は、GOAD構築後に以下を実行してください。
kaliを構築する必要が無ければ実施する必要はありません。
```bash
# 以下のGOADd126caはGOADを構築した際のUserIDに変更してください。
ludus --user GOADd126ca range config get > config.yml

# 下記記載のコンフィグに変更
vim config.yml

# 構築するためのコンフィグを設定
ludus --user GOADd126ca range config set -f config.yml

# kaliをデプロイ
ludus --user GOADd126ca range deploy -t vm-deploy

# デプロイ状況の確認
ludus --user GOADd126ca range logs -f

# デプロイが終了後実施
ludus --user GOADd126ca range deploy --limit localhost,GOADd126ca-kali
```

```bash
# config.yml
# 以下を末尾に追加する
  - vm_name: "{{ range_id }}-kali"
    hostname: "{{ range_id }}-kali"
    template: kali-x64-desktop-template
    vlan: 10
    ip_last_octet: 99
    ram_gb: 4
    cpus: 4
    linux: true
    testing:
      snapshot: false
      block_internet: false
```

:::note warn
注意
公式HPでは、この後スナップショットを取るコマンドが記載されています。
ただし、私の環境ではうまく動作せず、手動でスナップショットを取得しました。
:::

### アクセス
ここまでで、GOADの環境は構築できました。
次に自分のkaliからアクセスできるよう設定します。

まずは、Ludus上でWireguardのコンフィグファイルを用意します。
```bash
# ユーザーID（ここではGOAD094335）は適宜GOADのものに変更
ludus user wireguard --user GOAD094335 --url https://127.0.0.1:8081

# 出力例
[Interface]
PrivateKey = uGC6qlBJQOaC/Ax5zGbTMwfDaPoeqGOpKaGiicpKs1s=
Address = 198.51.100.4/32

[Peer]
PublicKey = ZKU5Gawt3e/trKNebFyKqKAVTcEEEERpzmHmTBR0wE4=
Endpoint = 192.168.0.10:51820
AllowedIPs = 10.4.0.0/16, 198.51.100.1/32
PersistentKeepalive = 25
```

kaliにWireguardをインストールします。
```bash
# kali
sudo apt install -y wireguard
```

出力されたコンフィグを保存します。
```bash
nano wg0.config
```

ネットワーク設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850929/1e8f1b87-82d0-1426-da5a-649eff5b6302.png)

ネットワークを追加する箇所を選択し、保存したコンフィグファイルを使用してVPNを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850929/81cf935a-8e45-4ff4-26ce-d1be82bf9d4f.png)

正常にコンフィグファイルを読み込むと画面のようになります。
そのままインポートを実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850929/1a798536-3c6e-538e-b423-cd0a76f49132.png)

レンジまでの導通が取れていることが確認できました。
```bash
ping 10.4.10.11
PING 10.4.10.11 (10.4.10.11) 56(84) bytes of data.
64 bytes from 10.4.10.11: icmp_seq=1 ttl=126 time=8.20 ms
64 bytes from 10.4.10.11: icmp_seq=2 ttl=126 time=4.46 ms
64 bytes from 10.4.10.11: icmp_seq=3 ttl=126 time=6.44 ms
64 bytes from 10.4.10.11: icmp_seq=4 ttl=126 time=5.72 ms
^C
--- 10.4.10.11 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 4.460/6.205/8.202/1.353 ms
```

# 終わりに
Ludusを使うことで、時間こそかかりましたが簡単にサイバーレンジを構築することができました。
イメージとしては、Hack The BoxのProLabやOffsecのOSCP等のレンジ環境に近いものができたのではないでしょうか。
つぎはEDRとしてWazuhを、SIEMとしてElasticSearchを追加で構築できるそうなので、時間を見つけて構築したいと思います。