サーバーを運用していると毎日のようにソフトウェアの脆弱性を突いた攻撃があります。
それほどアクセス数の多くないサーバーであってもインターネット上にある限りはその脅威に晒されています。
- 脆弱性を放置しておくことがどれほど危険なことなのか
- 攻撃者はどういった方法でその脆弱性を悪用するのか
そのあたりのことを勉強してみたくなったのでそれ用の環境を構築してみました。
言うまでもなくそのような状態のものを不特定多数の人がアクセスしてくる可能性のあるインターネット上におくのは極めて危険です。
必然的に仮想環境上に構築することになるのですが、それ用の最適な仮想マシンがあります。
その名を「Metasploitable3」といいます。
Metasploitable3とは
OSや各種ソフトウェアの脆弱性を敢えて残した状態で構築された仮想マシンです。
セキュリティアップデートをずっとしていない状態を思い浮かべていただければいいかと思います。
つまり、諸々のバージョンは今のものよりも古くなっています。
GitHubで公開されています。
環境情報
以下のようなホストマシンに構築しました。
- Windows 11 Home
- VirtualBox (7.0.6)
- Vagrant (2.3.4)
VirtualBoxのダウンロードはこちらから。
Vagrantのダウンロードはこちらから。
インストールの方法については割愛させていただきますが、基本的にはどちらもダウンロードしたファイルを実行するだけです。
構築手順
上記のGitHubにある「Quick-start」のコマンドを実行しました。
全てホストマシンでの作業になります。
PowerShellを起動(管理者権限は不要)を起動して下記のコマンドを順次入力します。
mkdir metasploitable3-workspace
cd metasploitable3-workspace
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/rapid7/metasploitable3/master/Vagrantfile" -OutFile "Vagrantfile"
vagrant up
下記のエラーメッセージが表示されて途中で処理が止まりました。
Stderr: VBoxManage.exe: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter' (VERR_INTNET_FLT_IF_NOT_FOUND).
VBoxManage.exe: error: Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
処理の途中で追加された「ホストオンリーアダプタ」が認識されていないためだと思われます。
ホストマシン(Windows)を再起動します。
ホストマシンの再起動が終わったら改めてPowerShellを起動して「vagrant up」を実行します。
vagrant up
うちの環境では以降は大きな問題もなく、無事に仮想環境が構築されて起動までできました。
Bringing machine 'ub1404' up with 'virtualbox' provider...
Bringing machine 'win2k8' up with 'virtualbox' provider...
==> ub1404: Checking if box 'rapid7/metasploitable3-ub1404' version '0.1.12-weekly' is up to date...
==> ub1404: Clearing any previously set forwarded ports...
==> ub1404: Clearing any previously set network interfaces...
==> ub1404: Preparing network interfaces based on configuration...
ub1404: Adapter 1: nat
ub1404: Adapter 2: hostonly
==> ub1404: Forwarding ports...
ub1404: 22 (guest) => 2222 (host) (adapter 1)
==> ub1404: Running 'pre-boot' VM customizations...
==> ub1404: Booting VM...
==> ub1404: Waiting for machine to boot. This may take a few minutes...
ub1404: SSH address: 127.0.0.1:2222
ub1404: SSH username: vagrant
ub1404: SSH auth method: password
ub1404: Warning: Connection reset. Retrying...
ub1404: Warning: Connection aborted. Retrying...
ub1404:
ub1404: Inserting generated public key within guest...
ub1404: Removing insecure key from the guest if it's present...
ub1404: Key inserted! Disconnecting and reconnecting using new SSH key...
==> ub1404: Machine booted and ready!
==> ub1404: Checking for guest additions in VM...
ub1404: No guest additions were detected on the base box for this VM! Guest
ub1404: additions are required for forwarded ports, shared folders, host only
ub1404: networking, and more. If SSH fails on this machine, please install
ub1404: the guest additions and repackage the box to continue.
ub1404:
ub1404: This is not an error message; everything may continue to work properly,
ub1404: in which case you may ignore this message.
==> ub1404: Setting hostname...
==> ub1404: Configuring and enabling network interfaces...
==> win2k8: Importing base box 'rapid7/metasploitable3-win2k8'...
==> win2k8: Matching MAC address for NAT networking...
==> win2k8: Checking if box 'rapid7/metasploitable3-win2k8' version '0.1.0-weekly' is up to date...
==> win2k8: Setting the name of the VM: metasploitable3-workspace_win2k8_1674269526980_96288
==> win2k8: Fixed port collision for 22 => 2222. Now on port 2200.
==> win2k8: Clearing any previously set network interfaces...
==> win2k8: Preparing network interfaces based on configuration...
win2k8: Adapter 1: nat
win2k8: Adapter 2: hostonly
==> win2k8: Forwarding ports...
win2k8: 3389 (guest) => 3389 (host) (adapter 1)
win2k8: 22 (guest) => 2200 (host) (adapter 1)
win2k8: 5985 (guest) => 55985 (host) (adapter 1)
win2k8: 5986 (guest) => 55986 (host) (adapter 1)
==> win2k8: Running 'pre-boot' VM customizations...
==> win2k8: Booting VM...
==> win2k8: Waiting for machine to boot. This may take a few minutes...
win2k8: WinRM address: 127.0.0.1:55985
win2k8: WinRM username: vagrant
win2k8: WinRM execution_time_limit: PT2H
win2k8: WinRM transport: negotiate
==> win2k8: Machine booted and ready!
==> win2k8: Checking for guest additions in VM...
win2k8: The guest additions on this VM do not match the installed version of
win2k8: VirtualBox! In most cases this is fine, but in rare cases it can
win2k8: prevent things such as shared folders from working properly. If you see
win2k8: shared folder errors, please make sure the guest additions within the
win2k8: virtual machine match the version of VirtualBox you have installed on
win2k8: your host and reload your VM.
win2k8:
win2k8: Guest Additions Version: 6.0.8
win2k8: VirtualBox Version: 7.0
==> win2k8: Setting hostname...
==> win2k8: Waiting for machine to reboot...
==> win2k8: Configuring and enabling network interfaces...
==> win2k8: Running provisioner: shell...
win2k8: Running: inline PowerShell script
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall set allprofiles state on
win2k8: Ok.
win2k8:
==> win2k8: Running provisioner: shell...
win2k8: Running: inline PowerShell script
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 8484 for Jenkins" dir=in action=allow protocol=TCP localport=8484
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 8282 for Apache Struts" dir=in action=allow protocol=TCP localport=8282
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 80 for IIS" dir=in action=allow protocol=TCP localport=80
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 4848 for GlassFish" dir=in action=allow protocol=TCP localport=4848
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 8080 for GlassFish" dir=in action=allow protocol=TCP localport=8080
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 8585 for WordPress and phpMyAdmin" dir=in action=allow protocol=TCP localport=8585
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Java 1.6 java.exe" dir=in action=allow program="C:\openjdk6\openjdk-1.6.0-unofficial-b27-windows-amd64\jre\bin\java.exe" enable=yes
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 3000 for Rails Server" dir=in action=allow protocol=TCP localport=3000
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 8020 for ManageEngine Desktop Central" dir=in action=allow protocol=TCP localport=8020
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 8383 for ManageEngine Desktop Central" dir=in action=allow protocol=TCP localport=8383
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 8022 for ManageEngine Desktop Central" dir=in action=allow protocol=TCP localport=8022
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 9200 for ElasticSearch" dir=in action=allow protocol=TCP localport=9200
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Open Port 161 for SNMP" dir=in action=allow protocol=UDP localport=161
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Closed port 445 for SMB" dir=in action=block protocol=TCP localport=445
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Closed port 139 for NetBIOS" dir=in action=block protocol=TCP localport=139
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Closed port 135 for NetBIOS" dir=in action=block protocol=TCP localport=135
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Closed Port 3389 for Remote Desktop" dir=in action=block protocol=TCP localport=3389
win2k8: Ok.
win2k8:
win2k8:
win2k8: C:\Windows\system32>netsh advfirewall firewall add rule name="Closed Port 3306 for MySQL" dir=in action=block protocol=TCP localport=3306
win2k8: Ok.
win2k8:
==> win2k8: Running provisioner: shell...
win2k8: Running: inline PowerShell script
win2k8:
win2k8: C:\Windows\system32>copy C:\vagrant\scripts\installs\setup_linux_share.bat C:\Windows
win2k8: The system cannot find the path specified.
win2k8:
win2k8: C:\Windows\system32>reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v share /t REG_SZ /d "C:\Windows\setup_linux_share.bat" /f
==> win2k8: Running provisioner: shell...
win2k8: Running: inline PowerShell script
win2k8:
win2k8: CMDKEY: Credential added successfully.
win2k8: The command completed successfully.
win2k8:
==> win2k8: Running provisioner: shell...
win2k8: Running: inline PowerShell script
仮想環境の起動/停止
PowerShellを起動して、上記STEP1で作成したディレクトリに移動し、下記コマンドを実行します。
Linux(Ubuntu)環境の起動/停止
- 起動 : vagrant up ub1404
- 停止 : vagrant halt ub1404
Windows(Windows Server)環境の起動/停止
- 起動 : vagrant up win2k8
- 停止 : vagrant halt win2k8
ub1404もしくはwin2k8を指定しない場合は両方の環境が起動/停止します
まとめ
非常に簡単に構築することができました。
この環境を使っていろいろと勉強していきたいと思います。
NAT+ホストオンリーアダプタの構成で構築されるので大丈夫だとは思いますが、くれぐれも外部からアクセス可能な状態にすることのないようにご注意ください。
コメント