TXTレコードでトンネリングする疑似マルウェアの仕様とデモンストレーション

f:id:shutingrz:20171215043026p:plain
疑似マルウェアを動かして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 の整列をしてないので注意