TXTレコードでトンネリングする疑似マルウェアの仕様とデモンストレーション
しゅーとです。
以前AレコードでトンネリングするHelminthというマルウェアのC2サーバを作成しましたが、
今回はTXTレコードでトンネリングする疑似マルウェアおよびC2サーバを作ってみました。
DNSでトンネリングする理由などの詳細は以前の記事で記載しているのでそちらをご覧ください。
shutingrz.hatenablog.com
今回は研究者向けに仕様とデモンストレーションした際のpcapファイルを提供します。(本音: 詳細な説明が面倒くさい)
標的型攻撃でよく使われるDNSトンネリングマルウェアは、今回のようにTXTレコードを使用するものが多いです。芸がないですね。
pcap
localhostでデモンストレーションした際のpcapです。
http://www.shutingrz.com/misc/txtdoor.pcap
概要
本疑似マルウェアはqnameをランダム化しキャッシュされないように工夫しています。
そのため、キャッシュサーバを経由してサーバとやり取りすることが可能です。
※pcapではlocalhostで送受信しているため応答でAAフラグが立っていますが、
本来想定されるクライアントPCとキャッシュサーバ間の通信ではAAフラグが立たないので注意してください。
特徴
以下の特徴点から、セキュリティ機器による検知が容易です。
- qnameが長い
- 実行結果をhexとしてqnameに埋め込むため可読性が高い
- クライアントPCの通常利用としてあまり見られないTXT RRを用いる
- 命令コマンドが平文
仕様
クライアントからサーバ
※クライアントからサーバの送信は前回の記事のHelminthと同じ仕様です。
全てqnameでトンネリングします。
botid の取得
00000000 + .example.com
コマンド命令有無の受付(keepalive)
00 + botid(a char) + 00000 + random(XXX) + 30 + .example.com
コマンド命令の受信受付
00 + botid(a char) + 00000 + random(XXX) + partid(XXX) + .example.com
コマンド実行結果の送信
00 + botid(a char) + fileid(XX) + partid(XXX) + ramdom(XXX) + data(length<25) + .example.com
※ data は hex文字列
サーバからクライアント
全てANSWERセクションのTXT RRでトンネリングします。
botid の応答
botid(a char)
コマンド命令に対して命令させたいコマンドがある場合の応答
fileid(XX)
コマンド命令の応答
plain
※送信終了時「###end###」を応答
クライアントからのコマンド実行結果の応答
recv
おまけ
クライアントから受信した実行結果をデコードする python コード
def recvData(self, qdata): # qdata はドメイン名の最初のラベル botid = qdata[2:3] cmdid = qdata[3:5] #fileid partid= qdata[5:8] #partid (base36) rand = qdata[8:11] #rand data (base36) data = qdata[11:] #txt data for dec in [(i+j) for (i,j) in zip(data[::2], data[1::2])]: encstr = "%" + dec print("%s" % urllib.unquote(encstr))
※このコードは partid の整列をしてないので注意