TL;DR: 如果你正嘗試在 Linux/KVM + AMD 平台上運行 Metasploitable3,我最好的建議是:別這麼做,直接換到 Wintel 環境。幫你自己省下大把時間與力氣。
背景 Link to heading
網路上許多資安入門文章都推薦使用 Metasploitable3 作為靶機,但這個專案目前已不再積極維護。在 Wintel 環境下,你依然可以透過 Vagrant 輕鬆啟動它(連 Repo 中指向 Vagrant Registry 的連結都已經失效了 …)。相反地,在 KVM/QEMU 環境中,由於沒有官方支援,使用者必須自行重新建置映像檔——但實際上這幾乎是不可能的任務。
該專案提供了兩種系統版本:Windows Server 2008 與 Ubuntu 14.04。
Windows Server 2008 Link to heading
建置 Windows Server 2008 的過程相當順利,但在嘗試開機時,你很可能會遇到以下錯誤:
hv-time unsupported HyperV Enlightenment feature: time
根據這篇部落格文章與技術解析,Hyper-V Enlightenments 是 Windows Server 2008+ 虛擬機器在 Linux 主機上啟用 Hyper-V Paravirtualization所必需的特性。然而,AMD 處理器並不支援。若手動將其停用,又會直接導致開機失敗。如果沒有 Intel CPU,要成功運行這個映像檔會變得極其困難。
Ubuntu 14.04 Link to heading
直接為 KVM/QEMU 建置 Ubuntu 14.04 幾乎是不可能的。
首先,建置腳本中的指令本身就有問題,必須依據此 PR 手動進行修補:https://github.com/rapid7/metasploitable3/pull/627/changes/9d8a669fbdef64158b6684ec3755b31e1462e611。
其次,建置 Ubuntu 14.04 需要透過 packer-plugin-chef 來安裝套件,但此外掛已停止維護,且無法再從 Packer 的官方外掛來源取得。雖然手動安裝依然可行,但 Chef 本身已不再開源。該外掛在執行 cookbook 時需要下載安裝 Chef 執行檔,但除非使用者自行修改原始碼並注入授權,否則安裝程序一定會失敗。
好消息是,官方提供的 Ubuntu 14.04 VirtualBox Box 可以透過 vagrant-mutate 轉換為 libvirt 格式:
vagrant box add rapid7/metasploitable3-ub1404
vagrant mutate rapid7/metasploitable3-ub1404 libvirt
其他修復項目 Link to heading
為了順利開機並讓攻擊機能夠連線到靶機,你還需要重新設定靶機的網路。在我的配置中,攻擊機運行於 KVM 的 Default Network 上,因此可以使用以下 Vagrantfile 設定:
Vagrant.configure("2") do |config|
config.vm.synced_folder '.', '/vagrant', disabled: true
config.vm.define "ub1404" do |ub1404|
ub1404.vm.box = "rapid7/metasploitable3-ub1404"
ub1404.vm.hostname = "metasploitable3-ub1404"
config.ssh.username = 'vagrant'
config.ssh.password = 'vagrant'
ub1404.vm.provider "libvirt" do |v|
v.memory = 2048
v.management_network_autostart = false
v.management_network_name = "default"
v.management_network_keep = true
end
end
end
如果 management_network_* 相關設定報錯,可能是缺少了 vagrant-libvirt 外掛,需要先執行安裝:
vagrant plugin install vagrant-libvirt
此外,由於 management_network_autostart = false 會停用 KVM/QEMU Default Network 的自動啟動,未來若需要手動啟動它,要執行:
sudo virsh net-autostart default
sudo virsh net-start default