docker-ipv6natとMetasploit Frameworkを使用して、DockerコンテナからIPv6のホストをポートスキャンし、結果をPostgreSQLに格納する

# この記事で行うこと

下図のように、Mac上のVirtualBoxで仮想マシン2つ（Metasploitable、Ubuntu）を作成し、Ubuntu上で起動したDockerコンテナ（metasploit-framework）からMetasploitableに対し、IPv4とIpv6の両アドレスにポートスキャンを行い、結果をPostgreSQLに格納します。

<img width="703" alt="スクリーンショット 2019-07-19 15.56.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/f1e64517-43bf-fd54-4232-e3ae97a72e60.png">

## 参考ページ（感謝します）

[mastodon/docker_ipv6](http://fmscb.fumi2kick.com/mastodon/docker_ipv6.md)
[Ubuntu 18.04にDockerをインストールする(+docker-composeも)](https://qiita.com/iganari/items/fe4889943f22fd63692a)
[systemd時代のDockerをProxy環境下で使う](https://qiita.com/whywaita/items/526f2eb0ab9f3fd3ea65)
[Metasploitをバッチで実行する](https://tx-driver.hatenablog.com/entry/2018/12/31/100000)

## 参考文献（感謝します）

[プロフェッショナルIPv6（無料版）](https://professionalipv6.booth.pm/items/913273)
[ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習](https://www.amazon.co.jp/dp/4798155306/)
[インフラエンジニア教本――セキュリティ実践技術編 (Software Design[別冊])](https://www.amazon.co.jp/dp/4774189243/)
[スティーリング・ザ・ネットワーク―いかにしてネットワークは侵入されるか](https://www.amazon.co.jp/dp/427406560X/)

# VirtualBoxの仮想ネットワークを設定する

本記事では、VirtualBoxの仮想マシンを2つ作成します。

MetasploitableのVMは外部に接続する必要がありませんので、ホストオンリーアダプターのみ割り当てます。

UbuntuのVMは、NAT用とホストオンリー用の2枚挿しとします。NATは外部通信時に使用し（apt、docker pull等）、ホストオンリーアダプターはMetasploitableへのポートスキャン時に使用します。
安全のため、NATをオンにしたままポートスキャンを行わないことにします。あるいは、ポートスキャンを行うときはホストマシンのLANケーブルを抜いても良いでしょう。

## ホストオンリーネットワークの作成と設定

本記事で使用しているVirtualBoxのバージョンは「6.08 r130520」です。
まずポートスキャン用にホストオンリーネットワークを作成します。VirtualBoxのファイルメニューからホストネットワークマネージャーを選択します。

<img width="440" alt="スクリーンショット 2019-07-18 13.47.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/7c41239f-f638-7d12-3c44-2faa1974775e.png">

作成ボタンを押して、適当なプライベートIPアドレスを設定します。
本記事では以下のように設定しました。

```
アダプター
　IPv4アドレス　　　　192.168.10.1
　IPv4ネットマスク　　255.255.255.0
　IPv6アドレス　　　　fd00:10:10::1
　IPv6ネットマスク長　64
```

<img width="478" alt="スクリーンショット 2019-07-18 13.52.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/30f358c2-1f11-3640-9c26-f2fac71f82cb.png">

```
DHCPサーバー
　サーバーアドレス　　192.168.10.100
　サーバーマスク　　　255.255.255.0
　アドレス下限　　　　192.168.10.101
　アドレス上限　　　　192.168.10.254
```

<img width="478" alt="スクリーンショット 2019-07-18 13.52.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/9a7383b5-c2ce-e191-b64a-3a423df7a46c.png">

# VirtualBoxの仮想マシン（その1）を作成し、Metasploitableをインストールする

[Metasploitableのサイト](https://sourceforge.net/projects/metasploitable/files/Metasploitable2/)から、metasploitable-linux-2.0.0.zipをダウンロードします。
このファイルを展開すると、Metasploitable2-Linuxディレクトリの下にMetasploitable.vmdk等のファイルがあります。

```
Metasploitable2-Linux/  $ ls
Metasploitable.nvram    Metasploitable.vmsd     Metasploitable.vmxf
Metasploitable.vmdk     Metasploitable.vmx
```

仮想マシンを以下の値で新規作成します。

```
仮想マシン
　名前　　　　　Metasploitable2
　タイプ　　　　Linux
　バージョン　　Ubuntu (64-bit)

メモリーサイズ
　1024MB

ハードディスク
　すでにある仮想ハードディスクファイルを使用する（ダウンロード後に展開したvmdkファイルを指定）
```

ネットワークアダプターのアダプター1をホストオンリーアダプターにします。

<img width="775" alt="スクリーンショット 2019-07-18 15.05.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/cd9b5939-132b-06a6-3a59-c342cc19d798.png">

仮想マシンを起動してログインします。ID・パスワード共に「msfadmin」です。

<img width="1080" alt="スクリーンショット 2019-07-18 15.17.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/294b7a59-7fda-d7e2-9c99-d852a4ac012c.png">

日本語キーボードを使っているのであれば、以下を実行してレイアウトを変更します（再起動すると元の状態に戻りますが）。

```
sudo loadkeys jp
```

静的IPアドレスを設定します。エディタを起動：

```
sudo vi /etc/network/interfaces
```

auto eth0の箇所を以下のように書き換えます。

```
auto eth0
iface eth0 inet static
address 192.168.10.101
netmask 255.255.255.0
gateway 192.168.10.1
iface eth0 inet6 static
address fd00:10:10::101
netmask 64
```

<img width="1080" alt="スクリーンショット 2019-07-18 15.32.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/1a4bace0-70f3-0dbe-9c7f-dc032ec89591.png">

設定を反映させます。

```
sudo /etc/init.d/networking restart
```

eth0のIPv4アドレスが192.168.10.101に、IPv6アドレスがfd00:10:10::101になっていることを確認します。

```
ip a
```

<img width="1080" alt="スクリーンショット 2019-07-18 15.36.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/fc3e6b9b-0d7d-5cf4-02b0-3bb60428b59b.png">

ホストオンリーネットワークのホストOSにIPv4でpingが通ることを確認します。

```
ping 192.168.10.1
```

<img width="1080" alt="スクリーンショット 2019-07-18 15.40.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/f6978267-e11d-c1ab-b906-2d70fcb4d226.png">

同様にIPv6でpingが通ることを確認します。

```
ping6 fd00:10:10::1
```

<img width="1080" alt="スクリーンショット 2019-07-18 15.42.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/b4bda642-f303-0ae8-25cf-72d448e5c26d.png">

Metasploitableを終了するには、以下を実行します。

```
sudo shutdown -h now
```
最後に「System halted.」と表示されて停止しますが、電源は自動で落ちません。仮想マシンのウィンドウの×ボタンを押すと、選択肢が提示されますので、電源オフを選択します。

<img width="1080" alt="スクリーンショット 2019-07-18 15.49.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/70dbf2eb-3097-6831-db8c-cf62140e1f93.png">

# VirtualBoxの仮想マシン（その2）を作成し、Ubuntu 18.04をインストールする

本記事では、DockerのホストとしてUbuntu 18.04 LTS 日本語 Remixを使用します。お好みにより、CentOS等でも構いません。
[Ubuntu 18.04 LTS 日本語 Remixのサイト](https://www.ubuntulinux.jp/News/ubuntu1804-ja-remix)から、ISOイメージをダウンロードします。

仮想マシンを以下の値で新規作成します。

```
仮想マシン
　名前　　　　　Ubuntu 18.04
　タイプ　　　　Linux
　バージョン　　Ubuntu (64-bit)

メモリーサイズ
　2048MB以上(？)

ハードディスク
　仮想ハードディスクを作成する
```

ネットワークアダプターのアダプター1はデフォルトでNATになっていますので、そのままでOK。
アダプター2をホストオンリーアダプターにします。

<img width="771" alt="スクリーンショット 2019-07-18 16.15.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/bfe0a4b8-6e43-15f9-40c7-700adb4cbde4.png">

ネットワーク以外の設定として、「一般→高度」でクリップボードの共有を双方向にしておくと、ホストOSとゲストOS間でコピペができて便利です。

<img width="771" alt="スクリーンショット 2019-07-18 16.18.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/82bc8c3a-d5f5-2f33-0882-72cb935a0d7d.png">

それでは仮想マシンにUbuntuをインストールします。
「ストレージ」の光学ドライブにダウンロードしたISOファイルを割り当てます。

<img width="771" alt="スクリーンショット 2019-07-18 16.22.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/00d49bb6-2328-645a-491c-0935cd40fd8d.png">

仮想マシンを起動するとUbuntuのインストールが始まります。選択肢を提示されたらデフォルトのままでもOKですが、お好みに合わせてご選択ください。

インストールが完了したらUbuntuにログインします。最初にVirtualBox Guest Additionsをインストールしておくと、ホストOSとクリップボード経由のコピペが効くので便利です。Devicesメニューから「Insert Guest Additions image...」を選択してインストールを実行し、終了したら仮想マシンを再起動し、ホストOS間とコピペできるか確認しておきます。

次に、ネットワークの現状を調べます。「ip a」を実行すると、以下のように表示されました。

```
username@username-VirtualBox:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:0b:63:1a brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
       valid_lft 86081sec preferred_lft 86081sec
    inet6 fe80::eb56:783e:5ad3:53c0/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:36:cd:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.105/24 brd 192.168.10.255 scope global dynamic noprefixroute enp0s8
       valid_lft 881sec preferred_lft 881sec
    inet6 fe80::7a38:9acf:f826:a016/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
```

表示内容から、enp0s3がNAT、enp0s8がホストオンリーアダプターということが分かります。
まずNAT経由でapt update ＆ upgradeします。もしProxy配下の環境でなければ外部に接続できるはずですが、Proxy配下であればまだ外部に接続できません。

```
username@username-VirtualBox:~$ sudo apt update
[sudo] username のパスワード: 
エラー:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
  security.ubuntu.com:80 (91.189.88.162) へ接続できませんでした。

（後略）
```

apt用にProxyを設定します。

```
sudo vi /etc/apt/apt.conf.d/80proxy 
```

```/etc/apt/apt.conf.d/80proxy
Acquire::http::proxy "http://proxy:8080";
Acquire::https::proxy "http://proxy:8080";
```

再び「sudo apt update」を実行すると、aptが外部に繋がりました。

```
username@username-VirtualBox:~$ sudo apt update
取得:1 http://archive.ubuntulinux.jp/ubuntu bionic InRelease [15.4 kB]
ヒット:2 http://archive.ubuntulinux.jp/ubuntu-ja-non-free bionic InRelease

（中略）

49.6 MB を 59秒 で取得しました (844 kB/s)                             
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
アップグレードできるパッケージが 322 個あります。表示するには 'apt list --upgradable' を実行してください。
```

引き続きapt upgradeを行います。

```
sudo apt upgrade -y
```

後々のために、パッケージを追加でインストールしておきます。bridge-utilsパッケージをインストールすると、brctlコマンドが使用できるようになります。

```
sudo apt install vim bridge-utils
```

Proxy設定の続き：
GUIでも設定しておきます。

<img width="798" alt="スクリーンショット 2019-07-18 17.32.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/92fe8177-b348-afb9-ca80-0e18c293459f.png">

~/.bashrcにもProxy設定を追加しておきます。一般ユーザとrootの両方でやっておくと良いでしょう。

```
export http_proxy="http://proxy:8080"
export https_proxy=$http_proxy
```

OSの更新が完了したら、一旦NAT側の接続をオフにします。

<img width="798" alt="スクリーンショット 2019-07-19 9.48.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/b0b3aa1c-f870-53ec-62f5-15cde03d708c.png">


引き続き、ホストオンリー側の静的IPアドレスを設定します。本記事ではGUIで行います。
IPv6アドレスを設定します。

```
IPv6アドレス
    fd00:10:10::102/64
```

<img width="798" alt="スクリーンショット 2019-07-18 16.58.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/faf85ead-99fa-114b-b1ce-fdd84f9e6f85.png">

IPv4アドレスを設定します。
DHCPで自動割当されたアドレスでも良いのですが、ホスト部をIPv6アドレスに合わせて102にしておくとわかりやすいでしょう。

```
IPv4アドレス
    192.168.10.102/24
```

<img width="798" alt="スクリーンショット 2019-07-18 17.06.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/0bc9b20f-e51e-801a-5622-b6418a00157b.png">

設定を反映させるために、enp0s8を一旦オフにし、再びオンにします。

<img width="798" alt="スクリーンショット 2019-07-19 9.54.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/1dc9dbac-10cf-badf-4037-3c56ad6d16c1.png">

「ip a」を実行して、enp0s8のIPv4アドレスが192.168.10.102に、IPv6アドレスがfd00:10:10::102になっていることを確認します。


```
username@username-VirtualBox:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:0b:63:1a brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:36:cd:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.102/24 brd 192.168.10.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
    inet6 fd00:10:10::102/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::7a38:9acf:f826:a016/64 scope link 
       valid_lft forever preferred_lft forever
```

ホストオンリーネットワークのホストOSにIPv4でpingが通ることを確認します。

```
ping 192.168.10.1
```

```
username@username-VirtualBox:~$ ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.448 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.372 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.826 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=0.690 ms
^C
--- 192.168.10.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3035ms
rtt min/avg/max/mdev = 0.372/0.584/0.826/0.182 ms
```

同様にIPv6でpingが通ることを確認します。

```
ping6 fd00:10:10::1
```

```
username@username-VirtualBox:~$ ping6 fd00:10:10::1
PING fd00:10:10::1(fd00:10:10::1) 56 data bytes
64 bytes from fd00:10:10::1: icmp_seq=1 ttl=64 time=0.492 ms
64 bytes from fd00:10:10::1: icmp_seq=2 ttl=64 time=0.311 ms
64 bytes from fd00:10:10::1: icmp_seq=3 ttl=64 time=0.567 ms
64 bytes from fd00:10:10::1: icmp_seq=4 ttl=64 time=0.296 ms
^C
--- fd00:10:10::1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3060ms
rtt min/avg/max/mdev = 0.296/0.416/0.567/0.117 ms
```

# Ubuntuの仮想マシンにDockerをインストールする

NAT接続をオンにします。

<img width="798" alt="スクリーンショット 2019-07-19 10.05.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/61ffbfa9-a5b0-0812-4f13-b528579c79a8.png">

[「Ubuntu 18.04にDockerをインストールする(+docker-composeも)」](https://qiita.com/iganari/items/fe4889943f22fd63692a)の手順に従い、Dockerとdocker-composeをインストールします。本記事では手順は割愛しますが、インストールした時の画面表示だけコピペしておきます。

Dockerをインストールした時の画面表示：

```
username@username-VirtualBox:~$ sudo apt install -y \
>      apt-transport-https \
>      ca-certificates \
>      curl \
>      software-properties-common
[sudo] username のパスワード: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
ca-certificates はすでに最新バージョン (20180409) です。
ca-certificates は手動でインストールしたと設定されました。
software-properties-common はすでに最新バージョン (0.96.24.32.9) です。
software-properties-common は手動でインストールしたと設定されました。
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libllvm7
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  libcurl4
以下のパッケージが新たにインストールされます:
  apt-transport-https curl libcurl4
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
374 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,189 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 apt-transport-https all 1.6.11 [1,692 B]
取得:2 http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libcurl4 amd64 7.58.0-2ubuntu3.7 [214 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 curl amd64 7.58.0-2ubuntu3.7 [159 kB]
374 kB を 1秒 で取得しました (647 kB/s)
以前に未選択のパッケージ apt-transport-https を選択しています。
(データベースを読み込んでいます ... 現在 163749 個のファイルとディレクトリがインストールされています。)
.../apt-transport-https_1.6.11_all.deb を展開する準備をしています ...
apt-transport-https (1.6.11) を展開しています...
以前に未選択のパッケージ libcurl4:amd64 を選択しています。
.../libcurl4_7.58.0-2ubuntu3.7_amd64.deb を展開する準備をしています ...
libcurl4:amd64 (7.58.0-2ubuntu3.7) を展開しています...
以前に未選択のパッケージ curl を選択しています。
.../curl_7.58.0-2ubuntu3.7_amd64.deb を展開する準備をしています ...
curl (7.58.0-2ubuntu3.7) を展開しています...
apt-transport-https (1.6.11) を設定しています ...
libcurl4:amd64 (7.58.0-2ubuntu3.7) を設定しています ...
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
curl (7.58.0-2ubuntu3.7) を設定しています ...
username@username-VirtualBox:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
username@username-VirtualBox:~$ sudo add-apt-repository \
>      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
>      $(lsb_release -cs) \
>      stable"
ヒット:1 http://jp.archive.ubuntu.com/ubuntu bionic InRelease
ヒット:2 http://jp.archive.ubuntu.com/ubuntu bionic-updates InRelease 
ヒット:3 http://archive.ubuntulinux.jp/ubuntu bionic InRelease        
ヒット:4 http://jp.archive.ubuntu.com/ubuntu bionic-backports InRelease
ヒット:5 http://archive.ubuntulinux.jp/ubuntu-ja-non-free bionic InRelease
取得:6 https://download.docker.com/linux/ubuntu bionic InRelease [64.4 kB]
ヒット:7 http://security.ubuntu.com/ubuntu bionic-security InRelease  
取得:8 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages [7,236 B]
71.7 kB を 1秒 で取得しました (56.0 kB/s)                      
パッケージリストを読み込んでいます... 完了
username@username-VirtualBox:~$ sudo apt update
ヒット:1 http://archive.ubuntulinux.jp/ubuntu bionic InRelease
ヒット:2 http://jp.archive.ubuntu.com/ubuntu bionic InRelease         
ヒット:3 https://download.docker.com/linux/ubuntu bionic InRelease    
ヒット:4 http://jp.archive.ubuntu.com/ubuntu bionic-updates InRelease 
ヒット:5 http://archive.ubuntulinux.jp/ubuntu-ja-non-free bionic InRelease
ヒット:6 http://jp.archive.ubuntu.com/ubuntu bionic-backports InRelease
ヒット:7 http://security.ubuntu.com/ubuntu bionic-security InRelease  
パッケージリストを読み込んでいます... 完了                 
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
パッケージはすべて最新です。
username@username-VirtualBox:~$ sudo apt install -y docker-ce
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libllvm7
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  aufs-tools cgroupfs-mount containerd.io docker-ce-cli git git-man
  liberror-perl pigz
提案パッケージ:
  git-daemon-run | git-daemon-sysvinit git-doc git-el git-email
  git-gui gitk gitweb git-cvs git-mediawiki git-svn
以下のパッケージが新たにインストールされます:
  aufs-tools cgroupfs-mount containerd.io docker-ce docker-ce-cli git
  git-man liberror-perl pigz
アップグレード: 0 個、新規インストール: 9 個、削除: 0 個、保留: 0 個。
58.1 MB のアーカイブを取得する必要があります。
この操作後に追加で 287 MB のディスク容量が消費されます。
取得:1 https://download.docker.com/linux/ubuntu bionic/stable amd64 containerd.io amd64 1.2.6-3 [22.6 MB]
取得:2 http://jp.archive.ubuntu.com/ubuntu bionic/universe amd64 pigz amd64 2.4-1 [57.4 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu bionic/universe amd64 aufs-tools amd64 1:4.9+20170918-1ubuntu1 [104 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu bionic/universe amd64 cgroupfs-mount all 1.4 [6,320 B]
取得:5 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 liberror-perl all 0.17025-1 [22.8 kB]
取得:6 http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 git-man all 1:2.17.1-1ubuntu0.4 [803 kB]
取得:7 http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 git amd64 1:2.17.1-1ubuntu0.4 [3,907 kB]
取得:8 https://download.docker.com/linux/ubuntu bionic/stable amd64 docker-ce-cli amd64 5:18.09.8~3-0~ubuntu-bionic [13.2 MB]
取得:9 https://download.docker.com/linux/ubuntu bionic/stable amd64 docker-ce amd64 5:18.09.8~3-0~ubuntu-bionic [17.4 MB]
58.1 MB を 14秒 で取得しました (4,266 kB/s)                           
以前に未選択のパッケージ pigz を選択しています。
(データベースを読み込んでいます ... 現在 163766 個のファイルとディレクトリがインストールされています。)
.../0-pigz_2.4-1_amd64.deb を展開する準備をしています ...
pigz (2.4-1) を展開しています...
以前に未選択のパッケージ aufs-tools を選択しています。
.../1-aufs-tools_1%3a4.9+20170918-1ubuntu1_amd64.deb を展開する準備をしています ...
aufs-tools (1:4.9+20170918-1ubuntu1) を展開しています...
以前に未選択のパッケージ cgroupfs-mount を選択しています。
.../2-cgroupfs-mount_1.4_all.deb を展開する準備をしています ...
cgroupfs-mount (1.4) を展開しています...
以前に未選択のパッケージ containerd.io を選択しています。
.../3-containerd.io_1.2.6-3_amd64.deb を展開する準備をしています ...
containerd.io (1.2.6-3) を展開しています...
以前に未選択のパッケージ docker-ce-cli を選択しています。
.../4-docker-ce-cli_5%3a18.09.8~3-0~ubuntu-bionic_amd64.deb を展開する準備をしています ...
docker-ce-cli (5:18.09.8~3-0~ubuntu-bionic) を展開しています...
以前に未選択のパッケージ docker-ce を選択しています。
.../5-docker-ce_5%3a18.09.8~3-0~ubuntu-bionic_amd64.deb を展開する準備をしています ...
docker-ce (5:18.09.8~3-0~ubuntu-bionic) を展開しています...
以前に未選択のパッケージ liberror-perl を選択しています。
.../6-liberror-perl_0.17025-1_all.deb を展開する準備をしています ...
liberror-perl (0.17025-1) を展開しています...
以前に未選択のパッケージ git-man を選択しています。
.../7-git-man_1%3a2.17.1-1ubuntu0.4_all.deb を展開する準備をしています ...
git-man (1:2.17.1-1ubuntu0.4) を展開しています...
以前に未選択のパッケージ git を選択しています。
.../8-git_1%3a2.17.1-1ubuntu0.4_amd64.deb を展開する準備をしています ...
git (1:2.17.1-1ubuntu0.4) を展開しています...
aufs-tools (1:4.9+20170918-1ubuntu1) を設定しています ...
git-man (1:2.17.1-1ubuntu0.4) を設定しています ...
containerd.io (1.2.6-3) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /lib/systemd/system/containerd.service.
ureadahead (0.100.0-21) のトリガを処理しています ...
liberror-perl (0.17025-1) を設定しています ...
cgroupfs-mount (1.4) を設定しています ...
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...
systemd (237-3ubuntu10.24) のトリガを処理しています ...
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
docker-ce-cli (5:18.09.8~3-0~ubuntu-bionic) を設定しています ...
pigz (2.4-1) を設定しています ...
git (1:2.17.1-1ubuntu0.4) を設定しています ...
docker-ce (5:18.09.8~3-0~ubuntu-bionic) を設定しています ...
update-alternatives: /usr/bin/dockerd (dockerd) を提供するために自動モードで /usr/bin/dockerd-ce を使います
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.
ureadahead (0.100.0-21) のトリガを処理しています ...
systemd (237-3ubuntu10.24) のトリガを処理しています ...
username@username-VirtualBox:~$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor 
   Active: active (running) since Fri 2019-07-19 10:14:38 JST; 5s ago
     Docs: https://docs.docker.com
 Main PID: 19710 (dockerd)
    Tasks: 8
   CGroup: /system.slice/docker.service
           └─19710 /usr/bin/dockerd -H fd:// --containerd=/run/containe

 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
 7月 19 10:14:38 username-VirtualBox systemd[1]: Started Docker Applica
 7月 19 10:14:38 username-VirtualBox dockerd[19710]: time="2019-07-19T1
username@username-VirtualBox:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
username@username-VirtualBox:~$ whoami
username
username@username-VirtualBox:~$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: dial unix /var/run/docker.sock: connect: permission denied
username@username-VirtualBox:~$ cat /etc/group | grep docker
docker:x:998:
username@username-VirtualBox:~$ sudo gpasswd -a username docker
ユーザ username をグループ docker に追加
username@username-VirtualBox:~$ cat /etc/group | grep docker
docker:x:998:username
username@username-VirtualBox:~$ sudo chmod 666 /var/run/docker.sock
username@username-VirtualBox:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

docker-composeをインストールした時の画面表示：

```
username@username-VirtualBox:~$ export compose='1.24.0'
username@username-VirtualBox:~$ sudo -E curl -L https://github.com/docker/compose/releases/download/${compose}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:-100   617    0   617    0     0   1434      0 --:--:-- --:--:-- --:--:--  1438
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:-  1 15.4M    1  186k    0     0   102k      0  0:02:34  0:00:01  0:02:3 12 15.4M   12 1954k    0     0   697k      0  0:00:22  0:00:02  0:00:2 37 15.4M   37 5837k    0     0  1534k      0  0:00:10  0:00:03  0:00:0 66 15.4M   66 10.1M    0     0  2168k      0  0:00:07  0:00:04  0:00:0 92 15.4M   92 14.2M    0     0  2522k      0  0:00:06  0:00:05  0:00:0100 15.4M  100 15.4M    0     0  2559k      0  0:00:06  0:00:06 --:--:-- 3591k
username@username-VirtualBox:~$ sudo chmod 0755 /usr/local/bin/docker-compose
username@username-VirtualBox:~$ docker-compose -v
docker-compose version 1.24.0, build 0aa59064
```

もしProxy配下の環境であれば、[「systemd時代のDockerをProxy環境下で使う」](https://qiita.com/whywaita/items/526f2eb0ab9f3fd3ea65)の手順に従い、設定を行います。本記事では手順は割愛しますが、設定した時の画面表示だけコピペしておきます。

```
username@username-VirtualBox:~$ sudo mkdir -p /etc/systemd/system/docker.service.d
[sudo] username のパスワード: 
username@username-VirtualBox:~$ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
```

```/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy:8080/"
```

```
username@username-VirtualBox:~$ sudo vim /etc/systemd/system/docker.service.d/https-proxy.conf
```

```/etc/systemd/system/docker.service.d/https-proxy.conf
[Service]
Environment="HTTPS_PROXY=http://proxy:8080/"
```

```
username@username-VirtualBox:~$ sudo systemctl daemon-reload
username@username-VirtualBox:~$ sudo systemctl restart docker
```

# Ubuntuの仮想マシンにDockerコンテナ [docker-ipv6nat](https://hub.docker.com/r/robbertkl/ipv6nat) と [metasploit-framework](https://hub.docker.com/r/metasploitframework/metasploit-framework) を導入し、MetasploitableとのIPv6の疎通を確認する

docker-ipv6natの機能については、[robbertkl/docker-ipv6nat](https://github.com/robbertkl/docker-ipv6nat) のドキュメントをご参照ください。

## docker-ipv6natのための前準備

Ubuntu側がIPv6をルーティングするために、カーネルにip6_tablesモジュールが組み込まれている必要があります。
lsmodしてip6_tablesがあるか確認：

```
lsmod | grep tables
```

```
username@username-VirtualBox:~$ lsmod | grep tables
ip_tables              28672  2 iptable_filter,iptable_nat
x_tables               40960  5 xt_conntrack,iptable_filter,ipt_MASQUERADE,xt_addrtype,ip_tables
```

ip6_tablesがなければ、以下を実行します。

```
sudo -i
echo "ip6_tables" >> /etc/modules
```

Ubuntuを再起動後、lsmodしてip6_tablesがあることを確認します。

```
lsmod | grep tables
```

```
username@username-VirtualBox:~$ lsmod | grep tables
ip6_tables             28672  0
ip_tables              28672  2 iptable_filter,iptable_nat
x_tables               40960  6 xt_conntrack,iptable_filter,ipt_MASQUERADE,xt_addrtype,ip6_tables,ip_tables
```

## ipv6natコンテナの起動

[この記事](http://fmscb.fumi2kick.com/mastodon/docker_ipv6.md) を真似して、docker-composeで起動することにしました。起動場所は「~/ipv6nat」にしました。
以下のようにdocker-compose.ymlを用意します。

```
mkdir ~/ipv6nat
cd ~/ipv6nat
vim docker-compose.yml
```

```~/ipv6nat/docker-compose.yml
version: '3'
services:
  driver:
    image: robbertkl/ipv6nat
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    privileged: true
    network_mode: "host"
```

起動します。

```
docker-compose up -d
```

起動確認。

```
username@username-VirtualBox:~/ipv6nat$ docker-compose ps
      Name                    Command               State   Ports
-----------------------------------------------------------------
ipv6nat_driver_1   /docker-ipv6nat-compat --retry   Up           
```

## ネットワーク確認

```
username@username-VirtualBox:~$ brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242f55bb006	no		
```

```
username@username-VirtualBox:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d2635c53d8a7        bridge              bridge              local
afd89bc5a48c        host                host                local
34d1c4e2b022        none                null                local
```

## IPv6が有効なブリッジの作成と、metasploit-frameworkコンテナからの利用

これも [この記事](http://fmscb.fumi2kick.com/mastodon/docker_ipv6.md) を真似して、docker-composeで起動することにしました。起動場所は「~/metasploit」にしました。
以下のように、IPv6疎通確認用に仮のdocker-compose.ymlを用意します（後でmetasploitの部分を書き換えます）。
net6のsubnetには、適当なプライベートIPアドレスを設定します。

```
mkdir ~/metasploit
cd ~/metasploit
vim docker-compose.yml
```

```~/metasploit/docker-compose.yml
version: '2.1'

networks:
  net6:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
      - subnet: fd00:1:2::/64

services:
  metasploit:
    image: metasploitframework/metasploit-framework
    entrypoint: ["bash"]
    networks:
      - net6
    tty: true
```

起動します。

```
docker-compose up -d
```

起動確認。

```
username@username-VirtualBox:~/metasploit$ docker-compose ps
         Name             Command   State   Ports
-------------------------------------------------
metasploit_metasploit_1   bash      Up           
```

必要なDockerイメージのダウンロードが完了していますので、外部との接続（NAT接続）をオフにします。

<img width="798" alt="スクリーンショット 2019-07-19 11.58.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327312/f3ee92ea-36ea-badd-1975-8c4cb5ad373b.png">

ネットワーク確認

```
username@username-VirtualBox:~/metasploit$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:0b:63:1a brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:36:cd:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.102/24 brd 192.168.10.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
    inet6 fd00:10:10::102/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::7a38:9acf:f826:a016/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:f5:5b:b0:06 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
5: br-aa9b8c60c86e: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:61:79:cc:fe brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-aa9b8c60c86e
       valid_lft forever preferred_lft forever
    inet6 fd00:1:2::1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::42:61ff:fe79:ccfe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::1/64 scope link 
       valid_lft forever preferred_lft forever
7: veth101c9e0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-aa9b8c60c86e state UP group default 
    link/ether 16:5b:a2:b5:30:8e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::145b:a2ff:feb5:308e/64 scope link 
       valid_lft forever preferred_lft forever
```

```
username@username-VirtualBox:~/metasploit$ brctl show
bridge name	bridge id		STP enabled	interfaces
br-aa9b8c60c86e		8000.02426179ccfe	no		veth101c9e0
docker0		8000.0242f55bb006	no		
```

```
username@username-VirtualBox:~/metasploit$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d2635c53d8a7        bridge              bridge              local
afd89bc5a48c        host                host                local
aa9b8c60c86e        metasploit_net6     bridge              local
34d1c4e2b022        none                null                local
```

metasploit_net6というブリッジが増えていることが確認できます。これはIPv6が有効なブリッジであり、このブリッジ上でIPv6でもNAT接続が可能となります。
IPv6疎通確認のために、起動したコンテナに入ります。

```
docker exec -it metasploit_metasploit_1 bash
```
無事に入れたら、IPアドレスを確認します。

```
ip a
```

画面から処理結果をコピペ：

```
username@username-VirtualBox:~/metasploit$ docker exec -it metasploit_metasploit_1 bash
bash-4.4# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd00:1:2::2/64 scope global flags 02 
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe12:2/64 scope link 
       valid_lft forever preferred_lft forever
```

eth0のIPアドレスが自動割当されていて、IPv6アドレスはdocker-compose.ymlで指定したsubnet下のアドレスになっていることが確認できました。
VirtualBoxからMetasploitable2の仮想マシンを起動し（ログインする必要はありません）、このDockerコンテナからpingを発行してみます。

```
ping 192.168.10.101
ping6 fd00:10:10::101
```

以下のように、pingが通れば成功です。

```
bash-4.4# ping 192.168.10.101
PING 192.168.10.101 (192.168.10.101): 56 data bytes
64 bytes from 192.168.10.101: seq=0 ttl=63 time=0.685 ms
64 bytes from 192.168.10.101: seq=1 ttl=63 time=0.916 ms
64 bytes from 192.168.10.101: seq=2 ttl=63 time=0.664 ms
64 bytes from 192.168.10.101: seq=3 ttl=63 time=0.800 ms
^C
--- 192.168.10.101 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.664/0.766/0.916 ms
```

```
bash-4.4# ping6 fd00:10:10::101
PING fd00:10:10::101 (fd00:10:10::101): 56 data bytes
64 bytes from fd00:10:10::101: seq=0 ttl=63 time=0.789 ms
64 bytes from fd00:10:10::101: seq=1 ttl=63 time=0.660 ms
64 bytes from fd00:10:10::101: seq=2 ttl=63 time=0.742 ms
64 bytes from fd00:10:10::101: seq=3 ttl=63 time=0.567 ms
^C
--- fd00:10:10::101 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.567/0.689/0.789 ms
```

疎通が確認できたら、Dockerコンテナからexitして、docker-compose stopもしておきます。

```
bash-4.4# exit
username@username-VirtualBox:~/metasploit$ docker-compose stop
Stopping metasploit_metasploit_1 ... done
username@username-VirtualBox:~/metasploit$ docker-compose ps
         Name             Command   State    Ports
--------------------------------------------------
metasploit_metasploit_1   bash      Exit 0        
```

# [metasploit-framework](https://hub.docker.com/r/metasploitframework/metasploit-framework)のDockerコンテナからMetasploitableに対し、IPv4とIpv6の両アドレスにポートスキャンを行い、結果をPostgreSQLに格納する

## PostgreSQL環境

本記事ではホストマシンのMacOSで、PostgreSQLを有効にした[Laradock](http://laradock.io/)を立ち上げており、Mac上でlocalhostのポート5432でPostgreSQLにアクセスできます（ローカルポートフォワード）。
本記事の環境からは、192.168.10.1でPostgreSQLにアクセスできるはずです（後で確認します）。
PostgreSQLの環境設定については、以前書いた記事[「PostgreSQLを操作するAPIを提供する、PostgRESTとPostGraphileを両方試してみた」](https://qiita.com/kanedaq/items/0c3097604d0e86afd1e3)をご参照ください（本記事では環境設定手順は割愛します）。

## nmapのオプションを保守的に決める

ポートスキャンにはnmapを使用します。
セキュリティチェックのファーストステップとして行うことが目的なので、オプションは極力保守的かつ基本的なものに留めることにします。

### バージョンスキャンをやめておく

[インフラエンジニア教本――セキュリティ実践技術編 (Software Design[別冊])](https://www.amazon.co.jp/dp/4774189243/) p.127によれば、TCP/9100〜9107のポートはプリンタで利用されており、バージョンスキャンにより大量の印刷が行われる可能性があるため、バージョンスキャンから除外されているとのことです。
本記事ではバージョンスキャンそのものを行わないことにします。

### OS検出をやめておく

古い本なので今は事情が違うかもしれませんが、[スティーリング・ザ・ネットワーク―いかにしてネットワークは侵入されるか](https://www.amazon.co.jp/dp/427406560X/) p.3によれば、OSフィンガープリント機能を使うとターゲットをダウンさせることがあるそうです。
本記事ではOS検出を行わないことにします。

### 本記事で避けるオプションのまとめ

-sV：バージョンスキャン
-O：OS検出
-A：-sV、-O等を組み合わせたもの

### 本記事で採用するオプション

-6：IPv6スキャンを有効にする（IPv6の時に指定）
-v：verbose
-n：DNSによる逆引きを行わない（時間節約）
-Pn：システムの起動状態の確認にpingを使わず、ホストが生存しているとみなす。ICMPを許可していないネットワークに使う。
-sS：TCP SYNスキャン（管理者ユーザで実行する必要あり）
-sU：UDPスキャン
-iL <inputfilename>：ホストのリストから入力

## metasploitの環境設定

ログファイル格納用のディレクトリを作成します。

```
cd ~/metasploit
mkdir logs
```

docker-compose.ymlを以下のように書き換えます。データベース名をmetasploit_dbにしましたが、何でも良いです。

```
vim docker-compose.yml
```

```~/metasploit/docker-compose.yml
version: '2.1'

networks:
  net6:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
      - subnet: fd00:1:2::/64

services:
  metasploit:
    image: metasploitframework/metasploit-framework
    environment:
      DATABASE_URL: postgres://default:secret@192.168.10.1:5432/metasploit_db
      RUN_URL: /root/metasploit
    volumes:
      - ${HOME}/metasploit:/root/metasploit
    entrypoint: "bash -c /root/metasploit/cmd.sh"
    networks:
      - net6
```

docker-compose.ymlのentrypointで指定したcmd.shを作成します。

```
vim cmd.sh
```

```~/metasploit/cmd.sh
#!/bin/bash

# ホスト側にマウントしているディレクトリで実行する
cd ${RUN_URL}

# msfconsoleのログファイル名（正常実行されたらnmapの結果はPostgreSQLに格納されるのでそっちを見る）
LOGFILE_NAME="${RUN_URL}/logs/msfconsole-`date +%Y-%m-%d_%H%M%S`.log"

# msfconsoleのログファイル設定をリソースファイルに出力
echo "spool ${LOGFILE_NAME}" > run.rc

# msfconsoleで実行するコマンド群を、#行と空行を削除しながらリソースファイルに出力
cat msfconsole.cmd | grep -v '^#' | sed '/^$/d' >> run.rc

# msfconsoleでリソースファイルを実行。ここでnmapを実行し、結果をPostgreSQLに格納している。
$APP_HOME/msfconsole -r run.rc

# ログファイルのエスケープシーケンスを削除して見やすくする
sed -i -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})*)?m//g" ${LOGFILE_NAME}
```

このcmd.shに実行権限を与えます。

```
chmod a+x cmd.sh
```

msfconsole（Metasploitのコンソール）で実行するコマンド群を作成します。このファイルは、cmd.shから使用されます。
今回は試行ということで、処理時間短縮のため、nmapのオプションに-Fを加えました（100ポートのみ実施されます）。

```
vim msfconsole.cmd
```

```~/metasploit/msfconsole.cmd
# データベースに接続する
<ruby>
run_single("db_connect #{ENV['DATABASE_URL']}") if ENV['DATABASE_URL']
</ruby>

# 現在のデータベースを確認する
db_status

# データベースの古いデータを消す
hosts -d

# nmapを実行して結果をデータベースに格納する
db_nmap -F    -v -n -Pn -sS -sU -iL hosts4.txt
db_nmap -F -6 -v -n -Pn -sS -sU -iL hosts6.txt

# nmapの結果を表示する
hosts
services

# データベースを切断してmsfconsoleからも抜ける
db_disconnect
exit
```

ポートスキャンするホストのリストを作成します。本記事ではMetasploitable2のIPアドレスを書き込みます。

```
vim hosts4.txt
```

```~/metasploit/hosts4.txt
192.168.10.101
```

```
vim hosts6.txt
```

```~/metasploit/hosts6.txt
fd00:10:10::101
```

## ポートスキャン実行

以下を実行すると、Dockerコンテナが立ち上がり、ポートスキャンが実行された後、Dockerコンテナが終了します。

```
docker-compose up -d
```

途中経過を見るには、以下を実行します。
正常に動いている様子であれば、logsディレクトリに出力中のログファイルをtail -fするのも良いです。

```
docker-compose logs
```

処理が終了したかを調べるには、以下を実行します。

```
docker-compose ps
```

logsディレクトリに以下の内容のログが出力されました。

```
[*] Spooling to file /root/metasploit/logs/msfconsole-2019-07-19_063414.log...
[*] resource (run.rc)> Ruby Code (71 bytes)
Connected to Postgres data service: 192.168.10.1/metasploit_db
resource (run.rc)> db_status
[*] Connected to metasploit_db. Connection type: postgresql. Connection name: YjL7nxEt.
resource (run.rc)> hosts -d

Hosts
=====

address  mac  name  os_name  os_flavor  os_sp  purpose  info  comments
-------  ---  ----  -------  ---------  -----  -------  ----  --------

resource (run.rc)> db_nmap -F    -v -n -Pn -sS -sU -iL hosts4.txt
[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019-07-19 06:34 UTC
[*] Nmap: Initiating SYN Stealth Scan at 06:34
[*] Nmap: Scanning 192.168.10.101 [100 ports]
[*] Nmap: Discovered open port 139/tcp on 192.168.10.101
[*] Nmap: Discovered open port 21/tcp on 192.168.10.101
[*] Nmap: Discovered open port 445/tcp on 192.168.10.101
[*] Nmap: Discovered open port 23/tcp on 192.168.10.101
[*] Nmap: Discovered open port 25/tcp on 192.168.10.101
[*] Nmap: Discovered open port 53/tcp on 192.168.10.101
[*] Nmap: Discovered open port 111/tcp on 192.168.10.101
[*] Nmap: Discovered open port 22/tcp on 192.168.10.101
[*] Nmap: Discovered open port 3306/tcp on 192.168.10.101
[*] Nmap: Discovered open port 80/tcp on 192.168.10.101
[*] Nmap: Discovered open port 5900/tcp on 192.168.10.101
[*] Nmap: Discovered open port 5432/tcp on 192.168.10.101
[*] Nmap: Discovered open port 8009/tcp on 192.168.10.101
[*] Nmap: Discovered open port 6000/tcp on 192.168.10.101
[*] Nmap: Discovered open port 514/tcp on 192.168.10.101
[*] Nmap: Discovered open port 2121/tcp on 192.168.10.101
[*] Nmap: Discovered open port 2049/tcp on 192.168.10.101
[*] Nmap: Discovered open port 513/tcp on 192.168.10.101
[*] Nmap: Increasing send delay for 192.168.10.101 from 0 to 5 due to 43 out of 143 dropped probes since last increase.
[*] Nmap: Completed SYN Stealth Scan at 06:34, 1.63s elapsed (100 total ports)
[*] Nmap: Initiating UDP Scan at 06:34
[*] Nmap: Scanning 192.168.10.101 [100 ports]
[*] Nmap: Discovered open port 2049/udp on 192.168.10.101
[*] Nmap: Discovered open port 111/udp on 192.168.10.101
[*] Nmap: Increasing send delay for 192.168.10.101 from 0 to 50 due to max_successful_tryno increase to 4
[*] Nmap: Increasing send delay for 192.168.10.101 from 50 to 100 due to max_successful_tryno increase to 5
[*] Nmap: Increasing send delay for 192.168.10.101 from 100 to 200 due to max_successful_tryno increase to 6
[*] Nmap: Increasing send delay for 192.168.10.101 from 200 to 400 due to max_successful_tryno increase to 7
[*] Nmap: Increasing send delay for 192.168.10.101 from 400 to 800 due to 11 out of 12 dropped probes since last increase.
[*] Nmap: UDP Scan Timing: About 50.67% done; ETC: 06:35 (0:00:30 remaining)
[*] Nmap: Discovered open port 53/udp on 192.168.10.101
[*] Nmap: Discovered open port 137/udp on 192.168.10.101
[*] Nmap: Completed UDP Scan at 06:36, 99.84s elapsed (100 total ports)
[*] Nmap: Nmap scan report for 192.168.10.101
[*] Nmap: Host is up (0.0011s latency).
[*] Nmap: Not shown: 176 closed ports
[*] Nmap: PORT     STATE         SERVICE
[*] Nmap: 21/tcp   open          ftp
[*] Nmap: 22/tcp   open          ssh
[*] Nmap: 23/tcp   open          telnet
[*] Nmap: 25/tcp   open          smtp
[*] Nmap: 53/tcp   open          domain
[*] Nmap: 80/tcp   open          http
[*] Nmap: 111/tcp  open          rpcbind
[*] Nmap: 139/tcp  open          netbios-ssn
[*] Nmap: 445/tcp  open          microsoft-ds
[*] Nmap: 513/tcp  open          login
[*] Nmap: 514/tcp  open          shell
[*] Nmap: 2049/tcp open          nfs
[*] Nmap: 2121/tcp open          ccproxy-ftp
[*] Nmap: 3306/tcp open          mysql
[*] Nmap: 5432/tcp open          postgresql
[*] Nmap: 5900/tcp open          vnc
[*] Nmap: 6000/tcp open          X11
[*] Nmap: 8009/tcp open          ajp13
[*] Nmap: 53/udp   open          domain
[*] Nmap: 69/udp   open|filtered tftp
[*] Nmap: 111/udp  open          rpcbind
[*] Nmap: 137/udp  open          netbios-ns
[*] Nmap: 138/udp  open|filtered netbios-dgm
[*] Nmap: 2049/udp open          nfs
[*] Nmap: Read data files from: /usr/bin/../share/nmap
[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 101.54 seconds
[*] Nmap: Raw packets sent: 392 (14.597KB) | Rcvd: 258 (12.842KB)
resource (run.rc)> db_nmap -F -6 -v -n -Pn -sS -sU -iL hosts6.txt
[*] Nmap: Starting Nmap 7.70 ( https://nmap.org ) at 2019-07-19 06:36 UTC
[*] Nmap: Initiating SYN Stealth Scan at 06:36
[*] Nmap: Scanning fd00:10:10::101 [100 ports]
[*] Nmap: Discovered open port 22/tcp on fd00:10:10::101
[*] Nmap: Discovered open port 53/tcp on fd00:10:10::101
[*] Nmap: Discovered open port 2121/tcp on fd00:10:10::101
[*] Nmap: Discovered open port 5432/tcp on fd00:10:10::101
[*] Nmap: Increasing send delay for fd00:10:10::101 from 0 to 5 due to 43 out of 143 dropped probes since last increase.
[*] Nmap: Completed SYN Stealth Scan at 06:36, 1.64s elapsed (100 total ports)
[*] Nmap: Initiating UDP Scan at 06:36
[*] Nmap: Scanning fd00:10:10::101 [100 ports]
[*] Nmap: Increasing send delay for fd00:10:10::101 from 0 to 50 due to max_successful_tryno increase to 4
[*] Nmap: Increasing send delay for fd00:10:10::101 from 50 to 100 due to max_successful_tryno increase to 5
[*] Nmap: Increasing send delay for fd00:10:10::101 from 100 to 200 due to max_successful_tryno increase to 6
[*] Nmap: Increasing send delay for fd00:10:10::101 from 200 to 400 due to max_successful_tryno increase to 7
[*] Nmap: Increasing send delay for fd00:10:10::101 from 400 to 800 due to 11 out of 12 dropped probes since last increase.
[*] Nmap: UDP Scan Timing: About 47.00% done; ETC: 06:37 (0:00:35 remaining)
[*] Nmap: Discovered open port 53/udp on fd00:10:10::101
[*] Nmap: Completed UDP Scan at 06:37, 93.46s elapsed (100 total ports)
[*] Nmap: Nmap scan report for fd00:10:10::101
[*] Nmap: Host is up (0.00082s latency).
[*] Nmap: Not shown: 195 closed ports
[*] Nmap: PORT     STATE SERVICE
[*] Nmap: 22/tcp   open  ssh
[*] Nmap: 53/tcp   open  domain
[*] Nmap: 2121/tcp open  ccproxy-ftp
[*] Nmap: 5432/tcp open  postgresql
[*] Nmap: 53/udp   open  domain
[*] Nmap: Read data files from: /usr/bin/../share/nmap
[*] Nmap: Nmap done: 1 IP address (1 host up) scanned in 95.42 seconds
[*] Nmap: Raw packets sent: 366 (22.356KB) | Rcvd: 262 (20.118KB)
resource (run.rc)> hosts

Hosts
=====

address          mac  name  os_name  os_flavor  os_sp  purpose  info  comments
-------          ---  ----  -------  ---------  -----  -------  ----  --------
192.168.10.101              Unknown                    device         
fd00:10:10::101             Unknown                    device         

resource (run.rc)> services
Services
========

host             port  proto  name          state    info
----             ----  -----  ----          -----    ----
192.168.10.101   21    tcp    ftp           open     
192.168.10.101   22    tcp    ssh           open     
192.168.10.101   8009  tcp    ajp13         open     
192.168.10.101   23    tcp    telnet        open     
192.168.10.101   25    tcp    smtp          open     
192.168.10.101   53    tcp    domain        open     
192.168.10.101   6000  tcp    x11           open     
192.168.10.101   5900  tcp    vnc           open     
192.168.10.101   53    udp    domain        open     
192.168.10.101   69    udp    tftp          unknown  
192.168.10.101   80    tcp    http          open     
192.168.10.101   111   tcp    rpcbind       open     
192.168.10.101   111   udp    rpcbind       open     
192.168.10.101   137   udp    netbios-ns    open     
192.168.10.101   3306  tcp    mysql         open     
192.168.10.101   139   tcp    netbios-ssn   open     
192.168.10.101   445   tcp    microsoft-ds  open     
192.168.10.101   513   tcp    login         open     
192.168.10.101   514   tcp    shell         open     
192.168.10.101   2049  tcp    nfs           open     
192.168.10.101   2049  udp    nfs           open     
192.168.10.101   5432  tcp    postgresql    open     
192.168.10.101   2121  tcp    ccproxy-ftp   open     
192.168.10.101   138   udp    netbios-dgm   unknown  
fd00:10:10::101  5432  tcp    postgresql    open     
fd00:10:10::101  2121  tcp    ccproxy-ftp   open     
fd00:10:10::101  53    udp    domain        open     
fd00:10:10::101  53    tcp    domain        open     
fd00:10:10::101  22    tcp    ssh           open     

resource (run.rc)> db_disconnect
Successfully disconnected from the data service: local_db_service.
resource (run.rc)> exit
```

IPv6のポートスキャンでも、TCP・UDP共にopenしているポートの存在が確認できます。さすがMetasploitable。

## PostgreSQL確認

処理結果がPostgreSQLに格納されたかどうか、調べてみました。

```
$ psql -U default -h localhost -p 5432 -d metasploit_db
Password for user default: 
psql (11.3, server 11.4)
Type "help" for help.

metasploit_db=# select * from hosts;
 id |         created_at         |     address     | mac | comm | name | state | os_name | os_flavor | os_sp | os_lang | arch | workspace_id |         updated_at         | purpose | info | comments | scope | virtual_host | note_count | vuln_count | service_count | host_detail_count | exploit_attempt_count | cred_count | detected_arch | os_family 
----+----------------------------+-----------------+-----+------+------+-------+---------+-----------+-------+---------+------+--------------+----------------------------+---------+------+----------+-------+--------------+------------+------------+---------------+-------------------+-----------------------+------------+---------------+-----------
  1 | 2019-07-19 06:36:06.545178 | 192.168.10.101  |     |      |      | alive | Unknown |           |       |         |      |            1 | 2019-07-19 06:36:10.039214 | device  |      |          |       |              |          0 |          0 |            24 |                 0 |                     0 |          0 |               | 
  2 | 2019-07-19 06:37:45.773489 | fd00:10:10::101 |     |      |      | alive | Unknown |           |       |         |      |            1 | 2019-07-19 06:37:46.255952 | device  |      |          |       |              |          0 |          0 |             5 |                 0 |                     0 |          0 |               | 
(2 rows)

metasploit_db=# select * from services;
 id | host_id |         created_at         | port | proto |  state  |     name     |         updated_at         | info 
----+---------+----------------------------+------+-------+---------+--------------+----------------------------+------
  1 |       1 | 2019-07-19 06:36:06.694065 |   21 | tcp   | open    | ftp          | 2019-07-19 06:36:06.694065 | 
  2 |       1 | 2019-07-19 06:36:06.92518  |   22 | tcp   | open    | ssh          | 2019-07-19 06:36:06.92518  | 
  3 |       1 | 2019-07-19 06:36:07.148219 |   23 | tcp   | open    | telnet       | 2019-07-19 06:36:07.148219 | 
  4 |       1 | 2019-07-19 06:36:07.277935 |   25 | tcp   | open    | smtp         | 2019-07-19 06:36:07.277935 | 
  5 |       1 | 2019-07-19 06:36:07.396815 |   53 | tcp   | open    | domain       | 2019-07-19 06:36:07.396815 | 
  6 |       1 | 2019-07-19 06:36:07.555868 |   80 | tcp   | open    | http         | 2019-07-19 06:36:07.555868 | 
  7 |       1 | 2019-07-19 06:36:07.667929 |  111 | tcp   | open    | rpcbind      | 2019-07-19 06:36:07.667929 | 
  8 |       1 | 2019-07-19 06:36:07.775778 |  139 | tcp   | open    | netbios-ssn  | 2019-07-19 06:36:07.775778 | 
  9 |       1 | 2019-07-19 06:36:07.869133 |  445 | tcp   | open    | microsoft-ds | 2019-07-19 06:36:07.869133 | 
 10 |       1 | 2019-07-19 06:36:07.964888 |  513 | tcp   | open    | login        | 2019-07-19 06:36:07.964888 | 
 11 |       1 | 2019-07-19 06:36:08.075891 |  514 | tcp   | open    | shell        | 2019-07-19 06:36:08.075891 | 
 12 |       1 | 2019-07-19 06:36:08.175428 | 2049 | tcp   | open    | nfs          | 2019-07-19 06:36:08.175428 | 
 13 |       1 | 2019-07-19 06:36:08.278987 | 2121 | tcp   | open    | ccproxy-ftp  | 2019-07-19 06:36:08.278987 | 
 14 |       1 | 2019-07-19 06:36:08.3691   | 3306 | tcp   | open    | mysql        | 2019-07-19 06:36:08.3691   | 
 15 |       1 | 2019-07-19 06:36:08.471806 | 5432 | tcp   | open    | postgresql   | 2019-07-19 06:36:08.471806 | 
 16 |       1 | 2019-07-19 06:36:08.63471  | 5900 | tcp   | open    | vnc          | 2019-07-19 06:36:08.63471  | 
 17 |       1 | 2019-07-19 06:36:08.840415 | 6000 | tcp   | open    | x11          | 2019-07-19 06:36:08.840415 | 
 18 |       1 | 2019-07-19 06:36:09.146391 | 8009 | tcp   | open    | ajp13        | 2019-07-19 06:36:09.146391 | 
 19 |       1 | 2019-07-19 06:36:09.426134 |   53 | udp   | open    | domain       | 2019-07-19 06:36:09.426134 | 
 20 |       1 | 2019-07-19 06:36:09.594851 |   69 | udp   | unknown | tftp         | 2019-07-19 06:36:09.594851 | 
 21 |       1 | 2019-07-19 06:36:09.696363 |  111 | udp   | open    | rpcbind      | 2019-07-19 06:36:09.696363 | 
 22 |       1 | 2019-07-19 06:36:09.790798 |  137 | udp   | open    | netbios-ns   | 2019-07-19 06:36:09.790798 | 
 23 |       1 | 2019-07-19 06:36:09.89251  |  138 | udp   | unknown | netbios-dgm  | 2019-07-19 06:36:09.89251  | 
 24 |       1 | 2019-07-19 06:36:10.002336 | 2049 | udp   | open    | nfs          | 2019-07-19 06:36:10.002336 | 
 25 |       2 | 2019-07-19 06:37:45.80868  |   22 | tcp   | open    | ssh          | 2019-07-19 06:37:45.80868  | 
 26 |       2 | 2019-07-19 06:37:45.922504 |   53 | tcp   | open    | domain       | 2019-07-19 06:37:45.922504 | 
 27 |       2 | 2019-07-19 06:37:46.019622 | 2121 | tcp   | open    | ccproxy-ftp  | 2019-07-19 06:37:46.019622 | 
 28 |       2 | 2019-07-19 06:37:46.124534 | 5432 | tcp   | open    | postgresql   | 2019-07-19 06:37:46.124534 | 
 29 |       2 | 2019-07-19 06:37:46.219566 |   53 | udp   | open    | domain       | 2019-07-19 06:37:46.219566 | 
(29 rows)

metasploit_db=# \q
```

以上です。