みなさん、こんにちは。Noriaki Hayashiです。
本記事では、Apple Silicon(Apple M3 Pro)を搭載したMacBook Proにて「VulnHub」提供の x86_64 ボックスを「UTM」仮想環境で楽しむ方法についてご紹介します。
検証環境:
- ハードウェア:MacBook Pro (14-inch, 2023)
- ホストOS:macOS Sequoia 15.1.1
- 仮想化ソフトウェア:UTM バージョン4.6.3 (106)
CPUアーキテクチャの違いによる影響
Apple社は2020年に発表されたMacBookから、同社の独自プロセッサーである「Apple Silicon」を搭載しています。Apple SiliconはこれまでのIntelアーキテクチャとは異なりARMアーキテクチャがベースになっています。
一方で、VulnHubにて提供されている仮想マシンの多くは、x86_64(Intel)アーキテクチャです。
チップ、CPUのアーキテクチャが異なるとどうなるのか。
これまでIntel Mac環境にて使ってきた仮想環境「VMware Fusion」や「Parallels」にはチップのエミュレーション機能がありません。したがって、Apple SiliconにインストールされたVMware Fusionでは、ARMアーキテクチャのOSしか動作させることができません。
すなわち、VulnHubで提供されているx86_64アーキテクチャのボックスを動かすことができません。
Full-system emulation な QEMU の利用
Apple Silicon環境でx86_64アーキテクチャのボックスを動作させるにはどうすればよいのか。CPUエミュレーション機能を備えた「QEMU」を使うことで解決できます。
私がUdemyにて提供している「ファームウェア解析コース」でも、無線LANルーター TP-Link TL-WR841Nの解析レクチャーにおいて、x86_64環境にて、ARM環境のファームウェアを動作させる手段としてQEMUを紹介しています。
今回その逆を行うことになります。すなわち、QEMUを使い、ARM環境にてx86_64環境を動作させることになります。
QEMU のインストール
QEMUはmacOS用のパッケージマネージャー「Homebrew」を使ってインストールすることが可能です。
コマンド構文は次のとおりです。
まず、Homebrew 環境が整っていることを確認します。
% brew -v
出力例:
Homebrew 4.4.11
Homebrewを使って、QEMUのインストールを行います。HomebrewがQEMUに関連するライブラリの依存関係を自動的に管理してくれます。
% brew install qemu
インストールされたQEMUのバージョン情報を確認します。
% qemu-system-x86_64 --version
出力例:
QEMU emulator version 9.2.0
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
これでApple Silicon搭載機でx86_64アーキテクチャを動作させる環境を整えることができました。
OVA を QCOW2 形式の仮想ディスクイメージに変換
VulnHubで公開されているボックスのほとんどは、OVA(Open Virtualization Archive)形式のファイルで公開されています。OVA形式のファイルは、仮想マシン全体(仮想マシンの設定(.OVF
)およびハードドライブ(.VMDK
))を含む単一のアーカイブです。
しかし、OVA形式のファイルはQEMUにて取り扱うことができません。
そこで、QEMUでも取り扱うことのできるQCOWE2 (QEMU Copy-On-Write version 2)形式に変換を行います。
ここでは、VulnHubで公開されている「VulnUni: 1.0.1」を例にその手順を確認します。
1. OVAファイルの確認
VulnHub のサイトから、vulnuni1.0.1.ova
ファイルのダウンロードを行います。file
コマンドにて、そのファイル形式を確認してみましょう。POSIX tar archive
形式であることが確認できるはずです。
% file vulnuni1.0.1.ova
vulnuni1.0.1.ova: POSIX tar archive
2. OVAファイルの展開tar
コマンドにて、vulnuni1.0.1.ova
ファイルの展開を行います。仮想マシンの設定(.OVF
)およびハードドライブ(.VMDK
)、各ファイルの SHA ダイジェスト値が記載されたマニフェスト(.MF
)を取得できます。
% tar -xvf vulnuni1.0.1.ova
x vulnuni1.ovf
x vulnuni1-disk001.vmdk
x vulnuni1.mf
3. VMDKをQCOW2形式に変換
QEMUパッケージにてインストールされた qemu-img
コマンドを使って、VMDKファイルをQCOW2形式に変換します。コマンド構文は次のとおりです。
% qemu-img convert -O qcow2 vulnuni1-disk001.vmdk vulnuni1.qcow2
4. QCOW2形式に変換されたファイルの確認
最後に出力された vulnuni1.qcow2
ファイルを file
コマンドにて、そのファイル形式を確認してみましょう。QEMU QCOW2 Image (v3)
形式であることが確認できるはずです。
% file vulnuni1.qcow2
vulnuni1.qcow2: QEMU QCOW2 Image (v3), 10737418240 bytes
あとは、 vulnuni1.qcow2
ファイルを qemu-system-x86_64
を介して動作させれば、x86_64 アーキテクチャで提供されているボックスも楽しむことができそうです。
仮想化ソフトウェア UTM
QEMU は CUI(Character User Interface)ベースのツールです。
複数の仮想マシン利用を想定している場合、管理しづらさもあります。
そこで頼りになるのが QEMU のGUI(Graphic User Interface)フロントエンドである「UTM」です。
サイバーセキュリティ領域において「UTM」というと、「Unified Threat Management, 統合脅威管理」を思い浮かべますね。
この記事で取り扱っているのは「UTM Virtual Machines」です。
UTM のインストール
UTM のインストールにあたり、そのパッケージを入手します。公式サイトのほか、次の経路から入手することが可能です。
- 公式サイト, https://mac.getutm.app/
- GitHubリポジトリ, https://github.com/utmapp/UTM/releases
- Homebrew
- Mac App Store, UTM Virtual Machines
ダウンロードした UTM.dmg
を Finder
で実行し、UTMを Applications
フォルダへドラッグ&ドロップします。これでインストールは完了です。
UTM に 空の仮想マシン を新規作成
インストールしたUTMに対して、空の仮想マシンを新規作成します。
1. エミュレートの開始
UTMを起動し、[新規仮想マシンを作成]を選択します。または、メイン画面にて「+」アイコンを押し、「開始」画面を表示します。「開始」画面では[エミュレート]を選びます。
2. オペレーティングシステムはカスタム
「オペレーティングシステム」画面にて、[カスタム]の[その他]を選びます。
3. 起動デバイスはなし
「その他」画面にて、[起動デバイス]は[なし]のオプションスイッチを選び、[続ける]ボタンをクリックします。
4. ハードウェアスペックの割当
「ハードウェア」画面にて、スペックの割当を行います。[アーキテクチャ]は[x86_64]。[システム]は[Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-9.1) (q35)]を選択しています。初期設定のままです。
[メモリ]は[4096 MiB]を割り当てています。VulnHub のボックスを楽しむことが目的の場合、より小さな値(1024 MiB)でも問題ありません。
[CPU]の[CPUコア数]は変更せずに、[続ける]ボタンをクリックします。
5. ストレージの割当
「ストレージ」画面にて、仮想ハードディスクの容量を決定します。ここで作成したストレージはのちほど削除し、変換した QCOW2 形式の仮想ディスクイメージに差し替えます。このため、初期設定のままで、[続ける]ボタンをクリックします。
6. 共有ディレクトリの割当
「共有ディレクトリ」画面にて、仮想マシン内部でアクセスできるディレクトリを選択します。今回は、初期設定のままで、[続ける]ボタンをクリックします。
7. 概要にて名前の設定
「概要」画面にて、これまでの設定値を確認し、仮想マシンの[名前]を入力します。今回は「VulnUni」と名付け、[保存]ボタンをクリックします。
UTM へ 仮想ディスクイメージ をインポート
新規作成した空の仮想マシンに接続されているストレージを削除し、変換した仮想ディスクイメージ(QCWOE2)ファイルと差し替えます。
1. 仮想マシンの編集
UTM に新規作成した 空の仮想マシン を選択し、右クリックメニューから[編集]を選択します。または、右上のスライダーアイコンを選択します。
2. 仮想マシン接続ドライブの変更
表示された仮想マシンの設定画面における、左側メニューから[ドライブ] – [IDEドライブ]の項目を選択します。空の仮想マシンを作成した際に設定した[64 GiB]のストレージが表示されているはずです。これを[削除]ボタンをクリックし、取り除きます。
次に左側メニューから[ドライブ] – [新規]の項目を選択します。[インターフェイス]、[サイズ]の項目は初期設定のまま[読み込む]ボタンをクリックします。ファイル選択ウインドウにて、変換した vulnuni1.qcow2
ファイルを選択します。
[名前]項目に vulnuni1.qcow2
ファイルが読み込まれていることを確認します。
3. QEMUの調整
仮想マシンの設定画面における、左側メニューから[QEMU]の項目を選択します。[調整]項目にある[UEFI起動]チェックボックスをオフにします。最後に[保存]ボタンをクリックし、設定を反映させます。
4. 仮想マシンの起動確認
UTMのメイン画面の左ペインから vulnuni1.qcow2
ファイルを読み込んだ仮想マシンを選択し、起動します。
VulnUniの場合、Ubuntu 12.04 LTSのログイン画面まで表示されれば成功です。
解決すべき課題
一連の手順にて、VulnHubにて提供されている標的マシンをApple Silicon環境下で動作させることに成功しました。これで過去の資産を有効活用することができそうです。
攻撃マシンの用意
VulnHubにて公開されているボックスを楽しむには、同一ネットワーク上に攻撃マシンを用意する必要があります。
「Parrot OS」の場合、公式サイトにてUTM用のファイルが用意されています。
「Kali Linux」の場合、UTMのGalleryにKali Linuxが公開されています。このほか公式サイトに「Kali inside UTM (Guest VM)」手順書が公開されています。
すこし手順は煩雑ですが、プロダクションネットワークから分断したラボネットワーク上に、攻撃マシンと標的マシンを用意することができそうです。
実際にUTMで同一ネットワーク上にKali Linuxの仮想マシンとVulnUniの標的マシンを用意し検証を行いました。その結果、Linux Kernelの脆弱性(Dirty COW, CVE-2016-5195)を突き、一般ユーザー権限から管理者権限の取得が可能であることが確認できました。
メモリサブシステム内の copy-on-write 機能(COW)の実装に依拠するDirty COWような脆弱性であっても、QEMEのエミュレーション環境にて再現が可能であることがわかります。
クリップボード共有
仮想マシンのゲストOSとホストOS間でコピー&ペーストをサポートする「クリップボード共有」機能は欠かすことができません。UTMではバージョン 4.6.1よりサポートしています。
SPICE プロトコルを使用することで実現します。
まず、UTMの仮想マシン設定画面における、左側メニューから[共有]の項目を選択します。右側の[クリップボード共有]項目にて、[クリップボード共有を有効にする]チェックボックスをONにしてください。
その上で、ホストOS(今回は、Kali Linux)側に SPICE のゲストエージェントをインストールします。パッケージ管理コマンド apt
にてインストールすることが可能です。コマンド構文は次のとおりです
$ sudo apt install spice-vdagent spice-webdavd
なお、ターミナルのショートカットはmacOSとは異なります。
- コピー:
Ctrl + Shift + C
- ペースト:
Ctrl + Shift + V
スナップショットの作成・管理
qemu-img
コマンドならびに、そのフロントエンドである「UTM Snapshot Manager」を使うことである程度、実現できそうです。
参考情報
- 公式ドキュメント: QEMU Documentation
- Arch Wiki: QEMU
- 技術評論社, 第595回 リモートデスクトップのためのSPICEクライアントあれこれ, 20219/11/20
- PC Watch, UTMを使ってM1 Mac上でArm版Windows 11を動かす!無償の仮想化ツールが完成度アップ, 2022/01/28
- officeの杜, M1 MacやiOSでも動く高機能な仮想環境UTMを使ってみた, 2022/03/08
コメント