脆弱性実験環境を構築してみる【前編】

Computer Society では、サークル員が執筆した Advent Calendar を公開しています。他の記事も充実した内容になっていますので、ぜひ読んでみてください！

[前の記事](https://qiita.com/3_Jugem/items/0f3364123d66550d3e82)
↑
この記事
↓
[次の記事](https://curiouspursuit.net/obsidian%e3%81%a7%e6%ae%b5%e8%90%bd%e6%9c%80%e5%88%9d%e3%81%ae%e4%b8%80%e6%96%87%e5%ad%97%e3%82%92%e4%b8%8b%e3%81%92%e3%82%8c%e3%82%8b%e3%82%88%e3%81%86%e3%81%ab%e3%81%97%e3%81%9f%e8%a8%98%e9%8c%b2/)

# はじめに
こんにちは。ストーンチョコです。
最近、情報セキュリティに対するモチベが高まってきており、「マイ脆弱性実験環境を構築したい！」という気持ちに駆られていました。
実験環境として、 VirtualBox でもよいのですが、クラスタで運用できるという拡張性やブラウザベースで管理することができるというメリットを備えた Proxmox を利用したいと考えていました。
そのため、Proxmox 用のサーバーを買おうかなと迷っていたのですが、大きいサーバーを置くスペースはないし、実家住みということでファンがうるさいと叱られそうだな、、と悩んでいました。そこで、先輩に相談したところ、「ミニPCでも Proxmox 立てられるぞ！」という温かいアドバイスをいただいたので、早速ミニPCを買って実験環境を実際に作ってみました。
同じく Proxmox 上で実験環境を構築してみたいという方に、少しでもお役に立てれば幸いです。また、実験環境の構築イメージが湧かない方や、現時点で構築予定のない方にも、雰囲気を掴んでいただけるよう、画像を多く取り入れて分かりやすくまとめています。
こういう構築はまだ不慣れな部分が多いので、デタラメなことを書いてしまっていたらコメントを頂けるとありがたいです！

この記事は前編と後編で分かれています。

# 目次
１．Proxmox をミニPCに入れる【前編】
２．Proxmox で Kali の仮想マシンを立てる【前編】
３．Proxmox で Metasploitable 2 の仮想マシンを立てる【前編】
４．攻撃実践【後編】
５．cloudflared を用いて外部接続できるようにする【後編】

# 前提

## ミニ PC について
ミニ PC のスペックは以下の通りです。価格は４万円超えない程度で購入できました。

・OS： Windows 11 が予め入っている状態。
・CPU： AMD Ryzen 7
・メモリ： 16GB DDR4
・ストレージ： 512GB NVMe SSD

## 構築図
次の図のような感じで構築する流れです。

![proxmox構成図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/ea1767c4-2602-fef3-fdf1-431bcecea9d0.png)

Kali は外部ネットワークにつなぐことができるようにし、Metasploitable 2 は Kali からしか繋げられないようにしています。

## 前提知識

・Proxmox Virtual Environment (Proxmox VE)：オープンソースのサーバ仮想化プラットフォーム。KVM（カーネルベースの仮想マシン） と LXC（Linuxコンテナ） をサポートしており、仮想マシンやコンテナを簡単に管理することができる。

・Kali：セキュリティテストやペネトレーションテスト用に特化した Linux ディストリビューション。

・Metasploitable 2：脆弱性の学習やテストのために使用される意図的に脆弱性を含む仮想マシン。Metasploitable の改良版。


前置きは以上です。それでは構築フェーズに入っていきましょう！

# １．Proxmox をミニPCに入れる

まずは、Proxmox 環境を整えていきます。
はじめに、他の PC で [公式ダウンロードページ](https://www.proxmox.com/en/downloads) から iso イメージをダウンロードします。私の場合は、Windows 11 を利用しているので、Rufus という Windows 向けの軽量で使いやすいブート可能USBドライブ作成ツールを用いて、USBブートメディアを作成しました。

↓ Rufus でダウンロードした ISO イメージを選択する。
![スクリーンショット 2024-12-19 002932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/5eee2362-fd67-6e58-e863-2e1b4fa07912.png)

準備が整った USB をミニ PC にさして電源をつけると次のような画面がでてきます。

![スクリーンショット 2024-12-19 003243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/8700a949-4a89-3096-a275-212ab799f08e.png)

私は Graphical で設定を進めました。出身国、パスワード、ネットワークなどの設定を行っていけばインストール準備完了となります。ネットワーク設定の際、

・WSL における route コマンドでゲートウェイの IP アドレスを確認する。
・ルーターに接続して ARP テーブルを覗いたり、ping で確認したりして、重複のない IP アドレスを割り当てる。

などを意識しました。また、言語は英語に設定し、ネットワーク設定において有線の eno1 を選択しました。

インストールが完了した後は一旦電源を切って、USB を抜き、もう一度電源を入れると別の画面が出てきます。

![スクリーンショット 2024-12-19 004240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/032beb2a-9570-28f7-6204-d5ed08a61758.png)

この一番上を選択すると、別の PC で表示された URL で Proxmox のマネジメントコンソールに入るように言われるので、URL でアクセスします。ここで、アクセスできない場合、次のようなことを試してみるといいかもです。

・一旦 Proxmox に root でログイン（パスワードは自分で作成したもの）し、/etc/network/interfaces から、自分の設定したネットワーク設定に誤りがないか確認する。
・ルーターの管理画面に移り、ARP テーブルに自分が設定した Proxmox の IP アドレスがないか確認する。
・LAN ケーブルを指す場所が間違えていないか、ethtool などを用いて確認する。

アクセスすると、次のような画面が出てくるかもしれませんが、「詳細情報を表示しない」→「〇〇にアクセスする」を押せば大丈夫です。

![スクリーンショット 2024-12-18 150119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/06cb13a8-f3f5-ae8d-aad5-b227bdf66543.png)

:::note warn
記事を書く際においては、グローバル IP を漏らさないように注意しましょう。
:::

アクセスすると以下のような画面が出てくるので root でログインします。

![スクリーンショット 2024-12-18 150141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/64af6e3e-653c-1c7e-ab08-aa80c668701c.png)

ログインすると次のようなものが出てきます。

![スクリーンショット 2024-12-19 131309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/b2a555f8-819a-71b2-7076-0c46138118f4.png)

初期設定ではエンタプライズ契約向けのリポジトリが設定されているので、無償版リポジトリを設定する必要があります。

[Responsitories] から [Add] をクリックし、[No-Subscription] のリポジトリを追加しましょう。

![スクリーンショット 2024-12-19 010053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/78474fab-5f02-4876-2e28-b551fdc63905.png)

その後、元々あった２つの enterprise のリポジトリを無効化しましょう。

![スクリーンショット 2024-12-19 010104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/e08b1a14-e771-5ad6-3bbf-29289775831b.png)

これでリポジトリの設定に関しては終了です。

また、[Datacenter] -> [Two Factor] から２段階認証を設定できるので、こちらも気になる方は設定しておくとよいでしょう。

![スクリーンショット 2024-12-19 132110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/72dbbbc0-be23-0878-5e25-051925f9adae.png)

以上で Proxmox の設定は完了です！

# ２．Proxmox で Kali の仮想マシンを立てる

それでは次に、Kali の仮想マシンを立てていきましょう。

まず Kali の [公式ダウンロードページ](https://www.kali.org/get-kali/#kali-installer-images) に飛びます。Proxmox をダウンロードしたときとは異なり、別の PC 上にiso イメージをダウンロードする必要はなく、なんとダウンロード用のリンクを用いて Proxmox に直接ダウンロードすることができます。（便利！）

↓ 公式ダウンロードページ
![スクリーンショット 2024-12-18 172630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/1a05657a-d391-0f36-3fe1-cced828371a1.png)

上の写真の [Installer] を左クリックせずに右クリックしてリンクをコピーしましょう。

そうしたら、[local] のストレージを選択し、[ISO Images] から [Download from URL] を押して、コピーした URL を張り付けてダウンロードしましょう。

![スクリーンショット 2024-12-19 133911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/0d67abf2-80bd-702c-64c9-b08caae7cb3e.png)

![スクリーンショット 2024-12-18 172802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/d4f243b7-cf60-08f3-d72c-9d6e22d639e2.png)

ダウンロード出来たら、新たに Kali の仮想マシンの設定を行っていきます。
ホーム画面右上の [Create VM] をクリックしましょう。

まずは General の設定ですが、Node, VM ID はそのままで、Name を分かりやすいものに設定します。

![スクリーンショット 2024-12-19 134845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/ad1cec73-0be5-514e-219a-b5354750d43e.png)

次に OS の設定ですが、[ISO image] に先ほどの ISO イメージを指定します。それ以外はそのままで大丈夫です。

![スクリーンショット 2024-12-18 173500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/d44cb9d2-1dd0-0281-c9d6-cec6303d28b0.png)

System の設定もそのままで大丈夫です。

![スクリーンショット 2024-12-18 173555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/1f265100-9a54-55e6-ab13-d23d5b617b62.png)

Disk の設定ですが、Disk size でディスク容量を設定しましょう。メインの仮想マシンとなるので、私は少し多めの 128 GB にしました。

![スクリーンショット 2024-12-19 135336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/da26c607-adf5-d94f-bcbf-aa2b38512fdf.png)

CPU の設定で、ソケット数とコア数の設定をしましょう。Ryzen 7 なので、コア数は全体的に８個ありますが、Proxmox には２コアを残しつつ、攻撃対象の仮想マシンは１～２コアを割り当てて基本的に１台、多くても２台立てようと考えていたので、CTF のときでも使いたいなという理由もあることから少し欲張りめの４コアに設定しました。

![スクリーンショット 2024-12-18 175300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/cbc9b146-6862-d45f-63a1-4f2b3adb7046.png)

メモリも同じような理由で少し多めの 8 GB にしました。

![スクリーンショット 2024-12-18 175455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/e5052469-5e81-ec07-826c-ed91ceb4358b.png)

Network の設定はそのままでも大丈夫です。デフォルトで NAT になっているようです。

![スクリーンショット 2024-12-18 175527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/a1f7cb0d-aca7-1844-8b32-947bbb45fa2f.png)

以上で設定は完了です。以下のように kali の仮想マシンが立ちました。

![スクリーンショット 2024-12-18 175630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/624a5b65-1309-93a7-cb87-e1aff7f60330.png)

[Start] で仮想マシンを起動させ、[Console] から Kali の画面に飛びましょう。

Kali の設定をしていきます。設定に関しては省略します。

![スクリーンショット 2024-12-18 181204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/ae22350c-087c-dd0d-904b-0d61673ead62.png)

設定を済ませ、いろいろとインストールが終わると以下のようなホーム画面が表示されます！

![スクリーンショット 2024-12-18 183122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/136eff14-c88d-887f-7719-6de391639aac.png)

そのままだと比率が少しおかしいので、[Settings] -> [Display] で 1920 × 1080 に変えることをお勧めします。

![スクリーンショット 2024-12-18 183243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/8d0ee5db-e5a9-a8e7-2268-fa073e905c23.png)

![スクリーンショット 2024-12-18 183448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/2c3b14ae-11a9-fe71-2065-99c63f49853b.png)

これで Kali の準備は完了です！

# ３．Proxmox で Metasploitable 2 の仮想マシンを立てる

同様に Metasploitable 2 も入れていきます。

https://www.rapid7.com/products/metasploit/metasploitable/

Metasploitable となっていますが、Metasploitable 2 は Metasploitable の改良版なので、2 を省くこともあるようです（多分）。

厄介なことに、Metasploitable 2 は iso イメージでダウンロードすることができません。ダウンロードすると、zip ファイルが入っており、それを解凍すると vmdk ファイルが入っています。

![スクリーンショット 2024-12-19 143210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/e1511f3f-e8d7-d42d-a298-2b16acccf2a2.png)

この vmdk という形式は、仮想マシン（VM）の仮想ディスクイメージを保存するためのファイル形式の１つで、VMwareが開発した形式であり、VMware や VirtualBox でよく用いられています。この形式のまま Proxmox にインポートすることもできるのですが、Proxmox ではその形式よりも qcow2 形式としてインポートすることが推奨されています。主な理由としては、VMware や VirtualBox と異なり、Proxmox VE は KVM をベースにしており、qcow2 形式は KVM に最適化されているからです。

というわけで、まずこの vmdk 形式を qcow2 形式に変換していきましょう。
この変換には qemu-utils パッケージを必要とします。Proxmox にデフォルトでそのパッケージが含まれているので、vmdk ファイルを転送してから ssh で入って変換するのもよいですが、元々 qemu-utils がノート PC に入っていたので、変換してから転送を行いました。

qemu-utils パッケージが入っていない場合は、パッケージをインストールしましょう。以下の例は APT の場合です。

```shell
$ sudo apt update
$ sudo apt install qemu-utils
```

その後、qemu-img を用いて、先ほどダウンロードした vmdk 形式のファイルを qcow2 形式に変換し、proxmox 環境に転送しましょう。

```shell
$ qemu-img convert -f vmdk Metasploitable.vmdk -O qcow2 metasploitable.qcow2
$ scp metasploitable.qcow2 root@<Proxmox の IP アドレス>:/var/lib/vz/template
```
/var/lib/vz/template は Proxmox VE 環境におけるテンプレートファイルや ISO イメージを格納するためのデフォルトのディレクトリです。

また、proxmox に ssh 接続し、得られた qcow2 のディスクイメージを Metasploitable 2 の仮想マシン（ID を 101 に設定している）のストレージに登録しましょう。一旦、ストレージは local-lvm にしておき、後ほどこのストレージと仮想マシンを紐づけることにします。

```
qm importdisk 101 /var/lib/vz/template/metasploitable.qcow2 local-lvm
```

Proxmox に qcow2 ファイルを転送することができたので、Metasploitable 2 の仮想マシンの設定を行っていきます。qcow2 ファイルに OS やディスクの情報が既に含まれているので、今回の設定では OS やディスクの設定は特に行う必要がありません。

また、Metaspoitable 2 は外部ネットワークとつなげず、Kali との内部ネットワークで完結させてしまいたいので（セキュリティ面の問題で）、仮想マシンの設定を行う前に新たにブリッジを作成する必要があります。

[Network] -> [Create] -> [Linux Bridge] から新たにブリッジを作成しましょう。

![スクリーンショット 2024-12-18 194059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/c8b3178a-f3d4-0985-eea8-5b6d0a782cb3.png)

基本的に IP アドレスは、プライベート IP であるかつ、外部ネットワークのものと被らなければ問題ありません。

![スクリーンショット 2024-12-18 204401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/60d1f678-e71e-521a-80ff-b1f43a933716.png)

これでブリッジが作成できたので、 Kali で設定したときと同じような流れで仮想マシンの設定をしていきます。

以下の折りたたみを展開するとその設定の流れを見ることができます。

<details><summary>仮想マシンの設定方法</summary>

![スクリーンショット 2024-12-18 185127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/d440f8d4-cd0e-ca2c-d0ca-105ca71d1d11.png)

![スクリーンショット 2024-12-18 185142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/1d673353-7201-fded-2c1d-24ac265dcba9.png)

![スクリーンショット 2024-12-18 185236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/b50f6591-5c4b-0a6b-3dd5-1c1b39595596.png)

![スクリーンショット 2024-12-18 185506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/31f96315-66f9-45e7-313f-dee5c2543a99.png)

![スクリーンショット 2024-12-18 185525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/95e3d433-9600-80b5-2531-5ef143cdee86.png)

![スクリーンショット 2024-12-18 185549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/00401957-8cbf-5d74-b3c9-4832934363aa.png)

![スクリーンショット 2024-12-18 204648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/39621eab-ef2d-5bad-803b-992263ac6bfc.png)

</details>

設定を終えた後、[Hardware] -> [Add] -> [Hard Disk] でディスクの設定を行いましょう。ディスクイメージを登録しておいた local-lvm というストレージを指定し、Bus/Device は VirtIO Block に設定しましょう。VirtIO Block とは仮想マシン（ゲストOS）と仮想ストレージ（ディスク）間のデータ転送を効率に行うためのインターフェースのことです。

![スクリーンショット 2024-12-19 160237.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/16e2d831-57ac-640f-5330-89ac7c9cb367.png)

また、仮想マシンが起動時にどのデバイスからオペレーティングシステム（OS）を読み込むかを決定するためのブート順序を次のように設定しましょう。

![スクリーンショット 2024-12-18 213111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/8151c040-6c47-e9f9-e6fb-3118c42a4e58.png)

これで仮想マシンを起動する準備ができました。起動してログインした後の画面は以下のようになります。
デフォルトのユーザーとパスワードは msfadmin です。

![スクリーンショット 2024-12-18 213404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/0608dc1a-395f-1d48-144a-82d474821ecb.png)

これで Metasploitable 2 の仮想マシンの準備もできました！
しかし、ネットワークの設定が不十分なので、Kali と Metasploitable 2 の両方でネットワーク設定を行っていきます。

↓ ネットワークの設定をこのように行っていきたい
![proxmox構成図.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/2acf1594-12ca-cb2a-524f-15b4f2cf92a7.png)


まず、 Metasploitable 2 のネットワーク設定についてですが、IP アドレスはデフォルトで DHCP により自動割り当てされるという設定になっているため、/etc/network/interfaces にて静的に設定する必要があります。

↓ 元々の設定
![スクリーンショット 2024-12-18 214834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/24ba1397-e491-21f2-203a-9dde88522a53.png)

↓ 設定後（gateway は省略可能）
![スクリーンショット 2024-12-18 214921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/fc9477d6-d63a-fcb4-3663-a0061420b0d2.png)

設定した後、以下のコマンドで設定を反映させましょう。Metasploitable 2 は Systemd でなく SysVinit を利用している関係上、systemctl コマンドを用いることはできないので注意してください。
```shell
$ sudo /etc/init.d/networking restart
```

また、Kali の方では次のように設定します。

↓ 設定後
![スクリーンショット 2024-12-18 220618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/86236ad1-b83e-b9a1-0a4e-47dd61f5f03a.png)

忘れずに、設定を反映させましょう。

```shell
$ sudo systemctl restart networking
```

最後に ping で疎通できているかを確認します。

↓ Metaspoitable 2 から Kali へ
![スクリーンショット 2024-12-19 164227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/cbcbfb50-fa22-3245-4847-51082060da82.png)

↓ Kali からルーターへ & Kali から Metaspoitable 2 へ
![スクリーンショット 2024-12-19 164131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/41b69e21-302a-fc4b-aa29-ba9aa59e84c4.png)

↓ 別の PC から Kali へ & 別の PC から Metasploitable 2 へ
![スクリーンショット 2024-12-19 164459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587520/5ef9446f-538d-0a49-1400-cc137ec2e4ae.png)

この結果から以下のことがわかります。
・Metasploitable 2 は Kali と疎通可能
・Kali は外部ネットワークと Metasploitable 2 と疎通可能。
・192.168.40.0/24 に属するデバイスからの Metasploitable 2 への通信は遮断されており、結果として Metasploitable 2 は外部ネットワークからのアクセスを防ぐ形になっている。

無事に期待通りにネットワークの設定ができていますね！

# まとめ

Proxmox 環境を整えてからその上で Kali と Metasploitable 2 の仮想マシンを立てていきました。後編では実際に Kali を用いて Metasploitable 2 内の脆弱性に対して実際に攻撃しかけていきたいと思います。

最後までお読みいただき、ありがとうございました！