thc-ipv6パッケージに入っているコマンドの使い方

#1 thc-ipv6パッケージとは?
IPv6のセキュリティ脆弱性をテストするためのコマンドが多数収録されています。
ネットワーク、マシンの負荷を上げるので、注意して使う必要があります。
本番環境では使わないほうが良いでしょう。

#2 環境
##2.1 ネットワーク構成
VMware Workstation 14 Player上の仮想マシン(2台)を使いました。
IPv6リンクローカルアドレスは以下のとおりです。

```
  client(eth0) ---------------------------------------------------- (eth0)router
   fe80::20c:29ff:fef0:6ea2/64                      fe80::20c:29ff:fea8:bf66/64
```


##2.2 仮想マシンのOS版数
各仮想マシンのOS版数は以下のとりです。

```
[root@client ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

[root@client ~]# uname -r
3.10.0-693.el7.x86_64
```


#3 インストール方法

```
thc-ipv6パッケージは、epelリポジトリにあるので、epel-releaseパッケージをインストールします。
[root@client ~]# yum -y install epel-release

thc-ipv6パッケージをインストールする。
[root@client ~]# yum -y install thc-ipv6
[root@client ~]# rpm -qa |grep thc-ipv6
thc-ipv6-2.5-2.el7.x86_64
```

#4 コマンド一覧
パッケージに下記のコマンドが収録されています。

```
/usr/bin/address6
/usr/bin/alive6
/usr/bin/covert_send6
/usr/bin/covert_send6d
/usr/bin/denial6
/usr/bin/detect-new-ip6
/usr/bin/detect_sniffer6
/usr/bin/dnsdict6
/usr/bin/dnsrevenum6
/usr/bin/dnssecwalk
/usr/bin/dos-new-ip6
/usr/bin/dump_dhcp6
/usr/bin/dump_router6
/usr/bin/exploit6
/usr/bin/fake_advertise6
/usr/bin/fake_dhcps6
/usr/bin/fake_dns6d
/usr/bin/fake_dnsupdate6
/usr/bin/fake_mipv6
/usr/bin/fake_mld26
/usr/bin/fake_mld6
/usr/bin/fake_mldrouter6
/usr/bin/fake_pim6
/usr/bin/fake_router26
/usr/bin/fake_router6
/usr/bin/fake_solicitate6
/usr/bin/firewall6
/usr/bin/flood_advertise6
/usr/bin/flood_dhcpc6
/usr/bin/flood_mld26
/usr/bin/flood_mld6
/usr/bin/flood_mldrouter6
/usr/bin/flood_redir6
/usr/bin/flood_router26
/usr/bin/flood_router6
/usr/bin/flood_rs6
/usr/bin/flood_solicitate6
/usr/bin/four2six
/usr/bin/fragmentation6
/usr/bin/fuzz_dhcps6
/usr/bin/fuzz_ip6
/usr/bin/implementation6
/usr/bin/implementation6d
/usr/bin/inject_alive6
/usr/bin/inverse_lookup6
/usr/bin/kill_router6
/usr/bin/ndpexhaust26
/usr/bin/ndpexhaust6
/usr/bin/node_query6
/usr/bin/parasite6
/usr/bin/passive_discovery6
/usr/bin/randicmp6
/usr/bin/redir6
/usr/bin/redirsniff6
/usr/bin/rsmurf6
/usr/bin/sendpees6
/usr/bin/sendpeesmp6
/usr/bin/smurf6
/usr/bin/thcping6
/usr/bin/thcsyn6
/usr/bin/toobig6
/usr/bin/trace6
```

#5 flood_solicitate6コマンド
本コマンドは、NS(Neighbor Solicitation)メッセージを連続で送信します。
NSは、IPv4のARP要求に相当します。

```console:概要(上がIPv4,下がIPv6)
    hostX                   hostY
      |---- ARP request ----->|
      |<--- ARP reply --------|

    hostX                   hostY
      |--------- NS --------->| ★本コマンドで送信するメッセージ
      |<-------- NA ----------|
```

##5.1 Target IPを指定しない方法
ルータ側でtcpdumpを実行します。

```console:ルータ側
[root@router~]# tcpdump -i eth0 icmp6 -n
```

```console:クライアント側
[root@client ~]# flood_solicitate6 eth0
Starting to flood network with neighbor solicitations on eth0 (Press Control-C to end, a dot is printed for every 1000 packets):
.............^C
```

tcpdumpの実行結果を確認する。

```console:ルータ側
[root@router~]# tcpdump -i eth0 icmp6 -n
16:49:50.279765 IP6 fe80::218:5aff:fee7:7dfa > ff02::1: ICMP6, neighbor solicitation, who has ★fe80::218:caff:fe39:9b6e, length 32
16:49:50.280214 IP6 fe80::218:7dff:feb4:4d0d > ff02::1: ICMP6, neighbor solicitation, who has ★fe80::218:5aff:fee7:7dfa, length 32
16:49:50.280245 IP6 fe80::218:26ff:fe2c:8df > ff02::1: ICMP6, neighbor solicitation, who has ★fe80::218:7dff:feb4:4d0d, length 32
(以下、略)
```
送信元IPv6アドレスは、クライアントのIPv6アドレスではありません。
ランダムに選択されたIPv6アドレスが送信元IPv6アドレスとして使われています。

送信先IPv6アドレスは、全ノードマルチキャストアドレス(ff02::1)になっています。
つまり、同一ネットワーク上の全ホストが、NAメッセージを受信することになります。

また、Target IP(★)は、ランダムに変化していることがわかります。


##5.2 Target IPを指定する方法

ルータ側でtcpdumpを実行します。

```console:ルータ側
[root@router~]# tcpdump -i eth0 icmp6 -n
```

コマンドのパラメータとしてTarget IPを指定します。
ここでは、ルータのIPv6リンクローカルアドレス(fe80::20c:29ff:fea8:bf66)を指定しています。

```console:クライアント側
[root@client ~]# flood_solicitate6 eth0 fe80::20c:29ff:fea8:bf66
Starting to flood network with neighbor solicitations on eth0 (Press Control-C to end, a dot is printed for every 1000 packets):
.................^C
```

tcpdumpの実行結果を確認する。

```console:ルータ側
[root@router~]# tcpdump -i eth0 icmp6 -n
17:09:47.954339 IP6 fe80::218:83ff:fecf:2fd5 > ff02::1: ICMP6, neighbor solicitation, who has ★fe80::20c:29ff:fea8:bf66, length 32
17:09:47.954635 IP6 fe80::218:a1ff:fef8:6d45 > ff02::1: ICMP6, neighbor solicitation, who has ★fe80::20c:29ff:fea8:bf66, length 32
17:09:47.954724 IP6 fe80::218:59ff:fe18:70c8 > ff02::1: ICMP6, neighbor solicitation, who has ★fe80::20c:29ff:fea8:bf66, length 32
(以下、略)
```
送信元IPv6アドレスは、クライアントのIPv6アドレスではありません。
ランダムに選択されたIPv6アドレスが送信元IPv6アドレスとして使われています。

送信先IPv6アドレスは、全ノードマルチキャストアドレス(ff02::1)になっています。
つまり、同一ネットワーク上の全ホストが、NAメッセージを受信することになります。

また、Target IP(★)は、ルータのIPv6リンクローカルアドレスになっていることがわかります。


#6 flood_advertise6コマンド
本コマンドは、NA(Neighbor Advertisement)メッセージを連続で送信します。
NAはNS(Neighbor Solicitation)の応答として送信されるメッセージです。
NAは、IPv4のARP応答に相当します。

```console:概要(上がIPv4,下がIPv6)
    hostX                   hostY
      |---- ARP request ----->|
      |<--- ARP reply --------|

    hostX                   hostY
      |--------- NS --------->|
      |<-------- NA ----------| ★本コマンドで送信するメッセージ
```

ルータ側でtcpdumpを実行します。

```console:ルータ側
[root@router~]# tcpdump -i eth0 icmp6 -n
```

クライアント側でflood_advertise6コマンドを実行します。

```console:クライアント側
[root@client ~]# flood_advertise6 eth0
Starting to flood network with neighbor advertisements on eth0 (Press Control-C to end, a dot is printed for every 1000 packets):
.......
```

tcpdumpの実行結果を確認する。

```console:ルータ側
[root@router~]# tcpdump -i eth0 icmp6 -n
15:41:11.168841 IP6 fe80::218:66ff:feea:c70f > ff02::1: ICMP6, neighbor advertisement, tgt is fe80::218:66ff:feea:c70f, length 32
15:41:11.169641 IP6 fe80::218:6dff:fe6a:328c > ff02::1: ICMP6, neighbor advertisement, tgt is fe80::218:6dff:fe6a:328c, length 32
15:41:11.170242 IP6 fe80::218:e7ff:fecb:c93f > ff02::1: ICMP6, neighbor advertisement, tgt is fe80::218:e7ff:fecb:c93f, length 32
(以下、略)
```
送信元IPv6アドレスは、クライアントのIPv6アドレスではありません。
ランダムに選択されたIPv6アドレスが送信元IPv6アドレスとして使われています。

送信先IPv6アドレスは、全ノードマルチキャストアドレス(ff02::1)になっています。
つまり、同一ネットワーク上の全ホストが、NAメッセージを受信することになります。

#7 flood_rs6コマンド
本コマンドは、RS(Router Solicitation; ルータ要請)メッセージを連続で送信します。
IPv6のアドレスを設定したいノードは、プリフィクス情報を送るようRSメッセージを、 
すべてのルータに対して送信します。

```console:概要
    client                   Router
      |--------- RS --------->| ★本コマンドで送信するメッセージ
      |<-------- RA ----------|

```

ルータ側でtcpdumpを実行します。

```console:ルータ側
[root@router~]# tcpdump -i eth0 icmp6 -n
```

クライアント側でflood_rs6コマンドを実行します。

```console:クライアント側
[root@client ~]# flood_rs6 eth0
Starting to flood with ICMPv6 redirects on eth0 (Press Control-C to end, a dot is printed for every 1000 packets):
.....^C
```

tcpdumpの実行結果を確認する。

```console:ルータ側
[root@router~]# tcpdump -i eth0 icmp6 -n
20:23:54.734436 IP6 fe80::20c:29ff:fef0:6ea2 > ff02::1: ICMP6, router solicitation, length 16
20:23:54.734488 IP6 fe80::20c:29ff:fef0:6ea2 > ff02::1: ICMP6, router solicitation, length 16
20:23:54.734804 IP6 fe80::20c:29ff:fef0:6ea2 > ff02::1: ICMP6, router solicitation, length 16
(以下、略)
```
送信元IPv6アドレスは、クライアントのIPv6アドレスになっています。
送信先IPv6アドレスは、全ノードマルチキャストアドレス(ff02::1)になっています。

【疑問】
RSメッセージの送信先IPアドレスは、全ルータマルチキャストアドレス(ff02::2)
になるべきだと思いますが、なぜか、全ノードマルチキャストアドレス(ff02::1)になっています。
コマンドのバグ???


#8 flood_router26コマンド
本コマンドは、RA(Router Advertisement; ルータ広告)メッセージを連続で送信します。
flood_router6というコマンドもあるようですが、廃止(deprecated)されるようです。

```console:概要
    client                   Router
      |--------- RS --------->|
      |<-------- RA ----------| ★本コマンドで送信するメッセージ
```

クライアント側でtcpdumpを実行します。

```console:クライアント側
[root@client ~]# tcpdump -i eth0 icmp6 -n
```

ルータ側でflood_router26コマンドを実行します。

```console:ルータ側
[root@router ~]# flood_router26 eth0
Starting to flood network with router advertisements on eth0 (Press Control-C to end, a dot is printed for every 1000 packets):
^C
```

tcpdumpの実行結果を確認する。

```console:クライアント側
[root@client ~]# tcpdump -i eth0 icmp6 -n
22:04:31.795432 IP6 fe80::32:c8c2:6be9:b01 > ff02::1: ICMP6, router advertisement, length 1432
22:04:31.798564 IP6 fe80::32:c8f5:6be9:b01 > ff02::1: ICMP6, router advertisement, length 1432
22:04:31.801198 IP6 fe80::32:c828:6ce9:b01 > ff02::1: ICMP6, router advertisement, length 1432
(以下、略)
```
送信元IPv6アドレスは、ルータのIPv6アドレスではありません。
ランダムに選択されたIPv6アドレスが送信元IPv6アドレスとして使われています。

送信先IPv6アドレスは、全ノードマルチキャストアドレス(ff02::1)になっています。
つまり、同一ネットワーク上の全ホストが、RAメッセージを受信することになります。


#X参考情報
[THC-IPV6](https://tools.kali.org/information-gathering/thc-ipv6)
[THC-IPV6 A toolkit for attacking IPv6 and ICMPv6](https://www.idsv6.de/Downloads/2013-13-06-BMBF_08_THC-IPV6.pdf)
[Attacking the IPv6 Protocol Suite](https://pacsec.jp/psj05/psj05-vanhauser-en.pdf)
[THC-IPV6パッケージの説明](https://translate.google.co.jp/translate?hl=ja&sl=en&u=https://tools.kali.org/information-gathering/thc-ipv6&prev=search)
[IPv6 Penetration Testing](http://www.linux-magazine.com/Online/Features/IPv6-Penetration-Testing)