Emotetを解析していて思いがけずバッチファイルの書き方について学んだ

こちらの記事で取り上げられているようにバンキング・マルウェアのEmotetのばら撒きが近頃見受けられています。私もいくつか解析しました。
で、解析の過程で思いがけずバッチファイルのあれこれについて学んだので、メモしておきます。
(普段からバッチファイルを書き慣れている人にとっては特に目新しい情報ではないと思います。)

添付ファイルを開くとおおよそ以下のような難読化されたDOSコマンドが実行されます。


cmd /c C%PrOgrAMfILES(x86):~ +9, +1%D; ; /v:o ; ; ; /%APPdATA:~ 6, 1% " ; (SEt hoge=[bunch of strings]& ; fOr ; /L ;%E ; ; ;IN; ; ; ( ;+1559 -3 ; ; ; +2) ;; ; do; ; ( ;; ; sET fUga=!fUga!!hoge:~ %E, 1!)&& ; If ;; ;%E ; ; ; == ; ; ;2 ;( ; ; (CAlL ; ; %fUga:~ -520% ) )"

変数hogeには大量の文字列が格納されています。forループで変数hogeから文字列を1文字ずつ切り取り変数fUgaに格納します。( sET fUga=!fUga!!hoge:~ %E, 1!) )。そして最後に変数fUgaをcallして実行します。
call文をechoに置き換えて上記のコマンドをコマンドプロンプトにコピペして実行すれば、callしているペイロードの中身がわかりそう!と思って実行してみたのですが、うまく行かず。。。

以下のようなバッチファイルを作ることで解読できました。


@echo off
SETLOCAL EnableDelayedExpansion
SEt hoge=[bunch of strings]& ; fOr ; /L ;%%E ; ; ;IN; ; ; ( ;+1559 -3 ; ; ; +2) ;; ; do; ; ( ;; ; sET fUga=!fUga!!hoge:~ %%E, 1!)&& ; If ;; ;%%E ; ; ; == ; ; ;2 ;( ; ; (echo ; ; !fUga:~ -520! ) )

主なポイントは:

SETLOCAL EnableDelayedExpansionを追加する

もとのコマンドをよく見ると/v:oオプションで環境変数の遅延展開を有効にしています。バッチファイルで遅延展開を有効にする場合はSETLOCAL EnableDelayedExpansionの1文を追加します。

forループの変数の%を%%に書き換える (%E -> %%E)

バッチファイル中でforループの変数を記述する場合は%%のように%記号を2つ重ねます。
※変数の中身のデータに%記号が含まれている場合は、そちらも%%と書き換える必要があります。
例)set fuga=Ab%C$ -> set fuga=Ab%%C$

変数の%記号を!記号に書き換える (%fUga:~ -520% -> !fUga:~ -520!)

即時展開の環境変数は変数を%記号で括ります。遅延展開の環境変数は変数を!記号で括ります。それ故かどうかはわかりませんが%fUga:~ -520%のままでバッチファイルを実行すると変数の展開が上手くいきませんでした。

上記3点の変更を加えてバッチファイル実行したところEmotetをダウンロードするためのPowerShellのコマンドが現れました。
※上記の方法を試す場合は必ず仮想環境などの解析環境で実行してください。

(まあ、大体のエンドポイントのセキュリティ製品はPowerShellの実行を検知できるので、わざわざ手動でDOSコマンドを解読するまでもないのですが、あくまで後学のために。。)

以上。

ちなみにコマンド冒頭の

C%PrOgrAMfILES(x86):~ +9, +1%D は CmD
/%APPdATA:~ 6, 1%/r

を表します。


echo %PrOgrAMfILES(x86)%
C:\Program Files (x86)

echo %PrOgrAMfILES(x86):~ +9, +1%
m

echo C%PrOgrAMfILES(x86):~ +9, +1%D
CmD

環境変数 %ProgramFiles(x86)%のオフセット9から1文字切り出しているので、「m」となるわけです。


echo %APPdATA%
C:\Users\user\AppData\Roaming

echo %APPdATA:~ 6, 1%
r

echo /%APPdATA:~ 6, 1%
/r

環境変数%APPDATA%のオフセット6から1文字切り出しているので、「r」となるわけです。

デフォルトの環境変数の値から文字列を切り取って連結しているのですね。

参考
http://doudemoexe.com/Batch/0001.jsp

Leave a Reply

Your email address will not be published. Required fields are marked *