マルウエアDatperをプロキシログから検知する(2017-08-17)
マルウエアDatperをプロキシログから検知する
今回は、国内の組織を標的とした攻撃で使われるマルウエアの1つであるDatperの通信内容の特徴と検知方法などについて説明します。
JPCERT/CCでは、2016年6月頃からDatperが攻撃に使われていることを確認しています。Datperを使う攻撃グループについては、LAC[1]やSecureWorks[2]、Palo Alto Networks[3]から詳細が報告されています。また、Datperを使う攻撃グループは、過去にはDaserfと呼ばれるマルウエアを使っており、シマンテックはこの攻撃グループをTick[4]と名付けています。
感染経路
Datperに感染する経路として以下を確認しています。
- ドライブバイダウンロード攻撃
- 資産管理ソフトの脆弱性を悪用する攻撃[2]
なお、ドライブバイダウンロード攻撃では、CVE-2016-7892の脆弱性が悪用され、Datper のダウンロードおよび実行が行われることを確認しています。また、資産管理ソフトの脆弱性を悪用する攻撃では、端末がwaliと呼ばれるダウンローダーに感染する事例を確認しています。waliについてはKaspersky[5]やCybereason[6]により分析内容が報告されています。JPCERT/CCではwaliがダウンロードするマルウエアとして複数種のマルウエアを確認しており、Datperはそのうちの1つということになります。
挙動の詳細
Datperは、特定のサイトとHTTPで通信を行い、受信したコマンドに応じて動作するマルウエアです。通信を行う時間帯を設定値として持っており、設定された特定の時間帯にしか通信しないという特徴があります。
以下はDatperがC&Cサーバに対してコマンドを要求する際に送信するHTTPリクエストの例です。User-Agent には、あらかじめマルウエアに固定で設定されている文字列が使われます。
GET /hoge/index.php?fnyup=940785246f0c22b41joikeddfngjokyptui HTTP/1.1 Accept: */* Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Host: [ホスト名] Pragma: no-cache Connection: close
上記HTTPリクエストに対するレスポンスとしてコマンドを受信し、それに応じた機能を実行します。Datperが実行可能な機能は以下の通りです。
- ホスト名やOSバージョンなどの取得
- ドライブ情報の取得
- 通信間隔の秒数を設定
- 指定した時間スリープ
- プログラムの実行
- ファイル関連操作(リストの取得、ダウンロード、アップロード、削除)
- シェルコマンドの実行
Datperはこれらの機能を実行後、結果をC&Cサーバに送信します。
通信の検知
DatperによるHTTP GETリクエストのクエリ文字列の形式は、以下のとおりformat 1とformat 2の2通りに分かれます。
図1に示した通り、クエリ文字列の<a>, <b>, <c> までは通信毎に異なる文字列になります。<c>の直後に続く固定値の文字が"1"のリクエスト(図1のformat 1)は、コマンドを要求する際のリクエストであり、"2"のリクエスト(図1のformat 2)は、コマンドの実行結果をC&Cサーバに送信する際のリクエストです。このとき、コマンドの実行結果は、暗号化されたデータの中に含まれています。なお、暗号化後のデータが1024バイトよりも大きい場合にはPOSTメソッドが使われます。
上記と同じ形式の通信は、Webサイトの閲覧などではほぼ発生しないDapterに固有のものであるため、<a>=<b><c>の形式や、<b>のCRC32値を計算し<c>と一致するかを確認することで、プロキシサーバのログなどからDatperによる通信を発見できる可能性があります。以下のPythonスクリプトは、それらの確認を行うための一例です。ログの形式に応じて、正規表現は微調整が必要です。
import re import sys from binascii import crc32 from ctypes import c_uint filter_1 = re.compile('(http://[\da-z\.-]+\.[a-z\.]{2,6}/[\/\w_\.-]+\?[\da-z]{3,8}=([\da-f]{8})([\da-f]{8})[1-2]{1}\S+)\s', re.IGNORECASE) def main(): for line in sys.stdin: m1 = filter_1.search(line) if m1: url = m1.group(1).lower() d1 = m1.group(2).lower() d2 = m1.group(3).lower() else: continue d1_crc32 = "%08x" % c_uint(crc32(d1)).value if d1_crc32 == d2: print "hit: %s" % line if __name__ == '__main__': main()
上記スクリプトをdatper_search.pyとして保存した場合、例として以下のようなコマンドでプロキシログを検索することができます。
$ tar -zxOf /var/log/squid/archive/access_20170728.tar.gz | python ./datper_search.py
Datperの通信が存在する場合は、図2のように該当行が出力されます。
圧縮アルゴリズムの変化
これまでに説明してきた通り、Datperの通信データには暗号化されたデータが含まれています。もう少し詳細に説明すると、実際には、平文のデータを圧縮し、暗号化した後に、エンコード処理を施しています。圧縮方式についてはLZNT1という圧縮アルゴリズムが使われていましたが、2016年11月ごろからLZRW1/KHという圧縮アルゴリズムに変化したことを確認しています。以下に、Datperが用いる圧縮方式と暗号方式の一覧を記載します。
表 1:圧縮方式と暗号方式の一覧
圧縮方式 | 暗号方式 | エンコード方式 | |
Datper(2016/10以前 | LZNT1 | RC4 | Base64(変則table) |
Datper(2016/11以降) | LZRW1/KH | xor + RC4 | Base64(変則table) |
Datperを使う攻撃グループはこれまで、Datperやそれ以外のマルウエア(xxmm / Minzen)においてもLZNT1を多用してきました。LZNT1はRtlDecompressBufferというWindows APIを呼び出すことで手軽に使用できる一方で、LZRW1/KHはWindows APIでは実装されていません。あえてこのような圧縮方式を使う理由は不明ですが、暗号方式にも若干の修正を加えていることから、解析の妨害を意図した変更なのかもしれません。
おわりに
Datperを使う攻撃グループは、過去にはDaserfというマルウエアを使い、長期にわたって国内の組織を標的とした攻撃活動を行ってきました。今後も攻撃は続く可能性があるため、JPCERT/CCでは引き続き、Datper とそれを利用した標的型攻撃に注目していきます。
分析センター 中村 祐
参考情報
[1]CYBER GRID VIEW Vol.2 | セキュリティ情報 | 株式会社ラック
http://www.lac.co.jp/security/report/pdf/20160802_cgview_vol2_a001t.pdf
[2]日本企業を狙う高度なサイバー攻撃の全貌 – BRONZE BUTLER
https://www.secureworks.jp/%7E/media/Files/JP/Reports/SecureWorksBronzeButlerReport.ashx
[3]“Tick” Group Continues Attacks
https://researchcenter.paloaltonetworks.com/2017/07/unit42-tick-group-continues-attacks/
[4]日本を狙い始めたサイバースパイグループ「Tick」
https://www.symantec.com/connect/ja/blogs/tick
[5]Old Malware Tricks To Bypass Detection in the Age of Big Data – Securelist
https://securelist.com/blog/research/78010/old-malware-tricks-to-bypass-detection-in-the-age-of-big-data/
[6]ShadowWali: New variant of the xxmm family of backdoors | Cybereason
https://www.cybereason.com/labs-blog/labs-shadowwali-new-variant-of-the-xxmm-family-of-backdoors
Appendix A 検体のSHA-256ハッシュ値
Datper(LZNT1)
efa68fcbd455a72276062fb513b71547ea11fedf4db10a476cc6c9a2fa4f67f7
12d9b4ec7f8ae42c67a6fd030efb027137dbe29e63f6f669eb932d0299fbe82f
331ac0965b50958db49b7794cc819b2945d7b5e5e919c185d83e997e205f107b
90ac1fb148ded4f46949a5fea4cd8c65d4ea9585046d66459328a5866f8198b2
2384e8ad8eee6db1e69b3ee7b6b3d01ae09f99a86901a0a87fb2788c1115090c
7d70d659c421b50604ce3e0a1bf423ab7e54b9df361360933bac3bb852a31849
Datper(LZRW1/KH)
7bc042b9a599e1024a668b9921e2a42a02545429cf446d5b3d21f20185afa6ce
1e511c32cdf8abe23d8ba7c39da5ce7fc6c87fdb551c9fc3265ee22ac4076e27
2f6745ccebf8e1d9e3e5284a895206bbb4347cf7daa2371652423aa9b94dfd3d