Apple Silicon Mac(M1 Mac)で「詳解 セキュリティコンテスト」の実習環境(もどき)を動かす

# はじめに
「詳解 セキュリティコンテスト」(以降、CTF本)の実習環境はvagrantを使用してデプロイすることとなっていますが、x86_64アーキテクチャを前提とした構成となっており、アーキテクチャが異なるApple Silicon Macではそのまま動かすことができません。
...この手の実習系はASM民には辛いですね。
今回、Mac向けの仮想化環境である[UTM](https://mac.getutm.app)を使って何とか動かすことができましたので、備忘として公開します。
なお、CTF本の手順通りに構成した場合はUbuntu Server 20.04 vagrant could imageをベースに構成したものが出来上がりますが、この記事ではcloud imageではないUbuntu Server上に同等の環境を再現するという方針で構成します。完全に同等の環境となるものではなく、動作の保証は出来かねる点は予めご留意ください。

# 想定する読者
  - CTF本を買って実習しようとワクテカしてたけど、Apple Silicon Macしか持ってなくてつまづいてしまった方

# なぜ動かない?
CTF本の実習環境はx86_64アーキテクチャのvagrant+VirtualBox環境を前提としていますが、Apple SiliconのCPUはARMアーキテクチャであり**互換性がない**ためです。

# 使うもの
<dl>
  <dt>Apple Silicon Mac</dt>
  <dd>言わずもがなですね。本記事の執筆にあたってはMacBook Air(M1, 2020)で確認しています。</dd>
</dl>
<dl>
  <dt><a href="https://brew.sh/index_ja">Homebrew</a></dt>
  <dd>サードパーティのパッケージマネージャーです。UTMを導入するのに使用します。</dd>
</dl>
<dl>
  <dt><a href="https://mac.getutm.app">UTM</a></dt>
  <dd>Mac向けの仮想化環境ソフトウェアです。同一アーキテクチャのハイパーバイザーに加えて、<b>異なるアーキテクチャのエミュレーションにも対応</b>しています。遅くなりますが。<br>実態としてはQEMUにGUIのフロントエンドが付いたものです。本記事ではHomebrew経由でインストールしますが、App Storeの有償版(App Storeから更新できる以外には機能差異無し)や、サイト上のdmgイメージからの導入でもOKです。</dd>
</dl>
<dl>
  <dt><a href="https://ubuntu.com/download/server">Ubuntu Server 20.04</a></dt>
  <dd>実習環境を構成するベースのOSとして、x86_64向けのUbuntu Server 20.04を使用します。Manual Installation用のISOイメージをダウンロードしておきましょう。</dd>
</dl>

# 手順1. 各種ソフトウェアの導入
まずはHomebrewをインストールします。ターミナル上でHomebrewのトップページに記載されているインストールコマンドを実行します。

```shell
# Homebrewインストールコマンドの実行
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
==> Checking for `sudo` access (which may request your password).
Password: (パスワードを入力)
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
==> The following new directories will be created:
/opt/homebrew/Cellar
/opt/homebrew/Caskroom

Press RETURN to continue or any other key to abort (Enterを入力)
==> /usr/bin/sudo /bin/mkdir -p /opt/homebrew/Cellar /opt/homebrew/Caskroom

(中略)

==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (or will be during this `install` run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/kumaneko/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh
%
# Next stepsとして指示されたコマンドを実行
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/kumaneko/.zprofile
% eval "$(/opt/homebrew/bin/brew shellenv)"
% rehash        
```

続いてUTMをインストールします。

```shell
% brew install UTM
(中略)
% rehash
```

これで必要なソフトウェアのインストールは完了しました。

# 手順2. Vagrantfileのダウンロードと内容確認
実習環境を構成するにあたり参考とするため、Vagrantfileをダウンロードし内容を確認します。

``` shell
# 作業用ディレクトリの作成・移動
% mkdir ~/ctfbook2
% cd ~/ctfbook2
# Vagrantfileのダウンロード
% curl (CTF本記載のURL) -o Vagrantfile 
# Vagrantfileの内容確認
% less Vagrantfile
```
Vagrantfileの内容から、主に以下の3点を確認しておきます。
<ul>
<li>仮想マシンの構成情報
<li>rootユーザーで実行するコマンド群
<li>vagrantユーザーで実行するコマンド群
</ul>

# 手順3. 仮想マシンの作成
アプリケーションにUTM.appが導入されていますので、これを起動します。
ウィンドウ上部の"+"をクリックして仮想マシンを追加します。
![スクリーンショット 2022-02-12 6.55.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/3f35fbc0-5354-a779-613c-9d88e499d72a.png)
"Emulate"をクリックします。
![スクリーンショット 2022-02-12 6.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/de675a18-a8ec-bf76-e73a-afea168e788e.png)
"Linux"をクリックします。
![スクリーンショット 2022-02-12 6.56.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/6f7b31be-7559-d625-a0c1-29595dc00f94.png)
"Browse"をクリックし、予めダウンロードしてあるUbuntu ServerのISOイメージファイルを選択します。その後、"Next"をクリックします。
![スクリーンショット 2022-02-12 6.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/7c9a9f6d-4070-bdc4-c951-31132588a326.png)
Hardwareは既定のままで、"Next"をクリックします。 ※ CTF本に合わせるならMemory 2048MB、CPU Cores 2でも可。
![スクリーンショット 2022-02-12 6.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/6011a2b2-be43-b881-6d61-d44fad26df9b.png)
Storageは既定のままで"Next"をクリックします。
![スクリーンショット 2022-02-12 6.56.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/0a6fc053-69ca-e392-7739-62e6599799c8.png)
Shared Directoryも既定のまま、"Next"をクリックします。
![スクリーンショット 2022-02-12 6.56.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/bcb8a063-a57b-444a-f0f2-e2677e035344.png)
SummaryではNameで名前を付け、"Save"をクリックします。
![スクリーンショット 2022-02-12 6.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/fac4e9de-ec95-fdf9-a1c2-acb3515b7e2a.png)
これで仮想マシンの作成は完了です。

# 手順4. OSのインストール
続いて仮想マシンにOSをインストールします。
UTMの左ペインで作成した仮想マシンを選択し、ウィンドウ上部右から2番目のボタン(Run selected VM)をクリックします。
![スクリーンショット 2022-02-12 6.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/154da112-4709-8829-0ec0-67f49178148b.png)
仮想マシンコンソールのウィンドウが開き、Ubuntu Serverのインストールが開始されます。
![スクリーンショット 2022-02-12 7.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/9b9b6648-e1b8-529d-490e-86d0a5819f9d.png)
インストーラー上の手順は割愛します。大体言いなりで大丈夫です。
ちょっと気になった点をいくつか。
<ul><li>言語はEnglishとする(Japaneseがない)
<li>キーボードレイアウトはJapanese/Japanese
<li>OpenSSH Serverは有効にする
<li>インストーラーのアップデートはやる
<li>ユーザー名/パスワードはCTF本に倣ってvagrant/vagrantとする
<li>インストール完了まで80分ほど(initramfs更新走り過ぎ!)</ul>
インストールが完了しRebootをさせる際に、ISOイメージのマウントを外す必要があります。ウィンドウ上部右２番目をクリックして、仮想CD/DVDデバイスのメディアのEjectを行なってください。
![スクリーンショット 2022-02-12 8.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2043976/abcc8d32-f75e-e40c-7ca7-a06ed7950d3d.png)

# 手順4. 仮想マシンの調整
Vagrantfileの記載を参考に、rootユーザーおよびvagrantユーザーで実行するコマンド群を仮想マシン上で実行させます。

``` shell
# パッケージのアップデート
$ sudo apt-get update
$ sudo apt-get upgrade -y
# IPアドレスを確認(SSH経由で作業したいので)
$ ip addr
```

MacのターミナルからSSHでログインし直して作業続行。

``` shell
% ssh vagrant@(仮想マシンのIPアドレス)
$ sudo bash
# 
(以降Vagrantfileの「inline: <<-ROOT_SHELL」から「ROOT_SHELL」までの内容を実行する)
```
注意点
<ul><li>一気に複数行コピペしてもうまく通らない場合があるので、ていねいに一行ずつ気持ちを込めてコピペしましょう(笑)。
<li>libc関連のパッケージにバージョン指定(=2.31-0ubuntu9)が入っており、エラーを招く。バージョン指定を外して回避する(但しあえてバージョン指定してあるので、何か影響があるかもしれない)。
<li>docker-composeのバージョンが古いので、<a href="https://github.com/docker/compose/releases">docker-composeのリリースページ</a>から最新版を確認し、URLを置き換えた方がよい(もちろん何か影響があるかもしれない)。
<li>Burp Suiteもバージョンが古いので、<a href="https://portswigger.net/burp/releases/">リリースページ</a>を確認して最新版に差し替えた方が良い。また、インストーラーへの入力がインラインで記載されているが、バージョンが変わると入力内容が変わる可能性があるので、念の為手入力した方がよい。</ul>

続いてvagrantユーザーで実行するコマンド群を投入します。

``` shell
# exit
$
(以降Vagrantfileの「inline: <<-USER_SHELL」から「USER_SHELL」までの内容を実行する)
$ 
# 念の為リブート
$ sudo reboot
```

さて、これで一通り同等の構成ができたはずです。
問題が見つかりましたら適宜アップデートします。