Emotet検体内のマクロを解読してみた

このブログは、株式会社ArmorisアルバイトのShaderoが書いています。 あるもりすぶろぐの内容は個人の意見です。


はじめに

今回はEmotetと呼ばれるマルウェアを解読します。

Emotetとは、ExcelやWord等のマクロ機能を備えたファイルを用いたマルウェアです。多くの場合、ユーザが該当のファイルを開きマクロを有効化すると、外部のWebサイトから悪意あるスクリプトが勝手にダウンロードされ実行されます。この仕組みにより、他のマルウェアを埋め込む事が可能であるため、機密情報の奪取やEmotetに感染したファイルの拡散等、被害は多岐に渡ります。

Emotetのマクロは暗号化されており、マクロの中身を少し覗いただけではどういった挙動をするのか分かりません。そこで今回は調査のために、暗号化されたマクロを解読した際に行った方法と基本的な解読方針を書き記します。

Emotetにはいくつも亜種が存在しており、それによって実際の処理や被害は異なります。あくまで1例としてご覧いただければ幸いです。

本情報を用いて悪用は絶対に行わないでください。

解読環境

今回は、弊社が調査目的で保持しているEmotet検体(Wordファイル)を用いて解読を行います。

本環境は、解読用に用意した仮想環境を用いており、インターネットには接続されていない状態で解読を行っています。

Name Version
Windows 10 Pro 1909
Word 2019

解読

実際に検体のマクロを解読します。

解読の流れとしては、まず暗号化された文字列の復号手法を特定し、マクロ内にある暗号文を全て平文に置き換え、処理全体の解読するといった流れです。

1. とりあえず開く

検体のマクロを開いてみると、変数名と関数名が難読化されており、文字列も暗号化されているため見ただけでは処理内容が分かりません。

emotet-macro

2. 復号手法の特定

まずは暗号文を復号する方法を見つけます。暗号文をマクロ内で有効に扱うためには、必ずマクロ内で復号しなくてはならないためその処理を探します。

今回の検体では、暗号文の付近に必ずそれを引数としたMotztviと呼ばれる関数が呼ばれていたため特定が容易でした。

motztvi.png

Motztvi関数の定義を見てみると、この関数を実行するためには、String型・Long型配列・Long型を引数として必要としている事はすぐに分かります。しかし処理の内容は難読化されていて読みにくく、その引数がどう処理に関わっていて、どのように復号しているか分かりません。

motztvi-detail.png

この状態から気合で解読しても良いですが、かなり大変なのでまずは可能な限り見やすい形に直してから解読を行います。

この関数では、使用する期間が短く変数にする必要性がない変数がありました。冗長で見づらいためこれらを整理し見やすくします。

motztvi

motztvi

これで少しは処理が読みやすくなったため、処理の内容を気合で解読します。今回は処理内容が短いためこのまま解読しましたが、長い場合は適宜コメントを付けたり、変数名を意味のある命名に置換するとより楽に解読できると思います。

処理を解読すると、以下のアナグラムのような手順で復号を行っている事が分かりました。

複号手法.png

3. 暗号文を復号する

復号手法は特定できましたが、コードのあちこちに暗号文と復号に必要な変数たちが残っており、まだ処理内容が見ずらい状態です。そこでコード内にある全ての暗号文を復号し置き換えます。

具体的には、以下のように暗号文と複号に必要な変数達を切り出して復号化関数を実行し、その結果を元の場所に戻し、不要になった変数達を削除します。

  1. 適当なプロシージャ(今回はhogeという名前)を作り、暗号文を複号している箇所を切り出してそのプロシージャに貼り付ける。 抜き出す.png

  2. 作成したプロシージャを実行し、結果を出力する。 result.png

  3. 出力された結果を元の場所に戻す。 置換.png

余談になりますが、Base64やシーザー暗号等の手法を用いて文字列が難読化されていた場合はCyberchefを使うと素早く解読できます。今回のケースでは複号にLong型の配列が必要であり、それをCyberchefで扱える形に加工するのが大変だったため、直接関数を実行しています。

4. 処理全体を解読する

暗号文を平文に置き換えて処理が見やすくなったため、いよいよ処理を解読します。

マクロ内には複数のプロシージャや関数が存在しておりどこから解読すれば良いか迷うと思います。基本的には、処理の頭から解読するのがオススメです。Emotetの場合、Wordファイルのマクロを有効化した瞬間に処理が走るため、マクロが有効化された時に自動的に実行するAutoOpenプロシージャに書かれている処理から解読すると内容が把握しやすいです。

最終的には気合で解読する事になります。しかしその前に、復号手法を特定した際に行ったように冗長な記述を整理し、適宜コメントを付けるとかなり解読しやすくなります。

autoopen.png

おわりに

今回はEmotetと呼ばれるマルウェアの調査を行い、Emotet内のマクロを解読しました。

Emotetのマクロは難読化が施されており、処理内容を解析するのは大変です。しかし暗号化された文字列を平文に置き換えたり、冗長な記述を整理したりする事で非常に解読しやすくなります。Emotetは検体によって実際のコードが異なるため、今回の手法が全ての検体に適用できるわけではありませんが、処理を見やすくしてから解読する方針はどの検体でも有効だと思います。

本記事が、難読化されたコードを解読する際に少しでも役立てば幸いです。

本情報を用いて悪用は絶対に行わないでください。