見出し画像

IcedIDのWordマクロを解読してみる 前編

IcedIDダウンローダーのWordマクロの解読を行ったので、備忘録として書き残しておきます。検体はこちら

DOCファイルを開き、マクロを有効化すると、AutoOpenマクロからmain関数が呼び出されます。IcedIDのダウンローダーであるDOCファイルには、6つの標準モジュールが含まれていますが、この中の「atxgZM」にmain関数が存在します。ご覧の通り、不要なコメントがいっぱい含まれています。

画像1

コメントを取り除くと、5行にまで短くなりました。
(以降はVSCodeに転記しながら解読しています。)

画像2

どうやら2行目の「aAPZK」と3行目の「aSadP」の2つの関数を呼び出して、最終的にシェルを起動するするようです。

それではmain関数に呼び出される2つの関数を見てみます。

画像3

さらに別の関数が呼び出されており、よくわかりません。試しにどちらの関数にも登場する「a6fip」を見てみます。

画像4

ここでも別の関数が呼び出されていますが、「mshta.exe」「in.com」「in.html」「windir」「system32」「temp」といった文字列が出てきました。

文字列の間に連結される「aH3EVi」ですが、こちらはPathSeparatorであり、パスの連結に使用されているようです。

画像5

「windir」「temp」を引数としている「a3KwbH」はEnviron関数でした。WindowsのインストールフォルダやTEMPフォルダのパスを取得しています。

画像6

ここまでの解析内容を「aAPZK」に適用してみました。「mshta.exe」と「in.com」に対して、何かの処理を行うようです。

画像7

「mshta.exe」に対する処理である「a9zyg」ですが、見てみると「aXcu3」という別の関数を呼び出すだけの不要な関数です。

画像8

ということで「aXcu3」を見てみますが、入力文字列に含まれる""を""で置換するという、こちらも全く意味のない処理でした・・・。

画像9

同様に「in.com」「in.html」に対する処理についても、意味のない関数が噛まされており、解析に無駄な時間がかかるようになっています。一旦整理すると、このようになります。

画像10

「aAPZK」内の「aTg3Do」はFileCopyを行う関数です。

画像11

ということで、main関数の1つ目は「mshta.exe」をTEMPフォルダに「in.com」としてコピーという処理になります。

画像12

続いて、2つ目の関数「aSadP」内の処理を順に見ていきます。DOCファイルのビルトインドキュメントプロパティの「category」を取得するようです。

画像13

categoryに何が設定されているか、VBAのイミディエイトウィンドウ機能を使用して見てみます。すると、タグやコードらしきものが出てきましたが、内容がよくわかりません。

画像14

Wordからプロパティを確認すると、「分類」の項目に例のコードが入っています。ちなみにこの画面では改行以降は表示されず、1行目の<ugzy>しか見ることができません。

画像15

このコードを引数として「a5LuP」が実行されます。

画像16

この関数でも、無駄な関数や計算が多数含まれているのですが、それらをすべて取っ払い、カウンターを見やすく「i」に置き換えると…

画像17

このようになります。これはシーザー暗号の一種であるROT13を復号する関数になります。ROT13というのは、アルファベットを13個後ろにずらすことにより暗号化を行う手法です。不審なコードを暗号化することで、ウイルス対策ソフトの検知を逃れる工夫がされています。

categoryプロパティに設定されていたコードを復号すると、HTMLのコードになることがわかります。

画像18

そしてその復号したHTMLコードをどうするか「a0uHN」を見てみると、

画像19

「in.html」と復号したHTMLコードに対する処理は、ファイルへの書き込みであることがわかりました。ということで、main関数の2つ目はドキュメントのプロパティ内の分類に入力された文字列(暗号化されたHTMLコード)をROT13で復号し、TEMPフォルダに「in.html」として保存するという処理となります。

画像20

最後に、3つ目の処理のVBA.Shellの引数「aaP6r7」を見ていきます。1・2行目は見覚えのある関数が使われており、3行目で文字列を連結しています。

画像21

これらを整理するとこうなります。

画像22

先程コピーした「in.com」と、保存した「in.html」をスペースで区切って結合していることがわかります。

というわけで、たった3行のmain関数でしが、
ようやく処理の全体像が見えました。

画像23

難読化のレベルとしてはさほど高いものではなかったため、解読は比較的容易でしたが、不要なコードが多く、解読に無駄な時間を掛けさせるようにはなっていました。

次回はシェルによって実行される「in.html」を解読したいと思います。
後編を公開しました

この記事が気に入ったらサポートをしてみませんか?