2020年は、日本ではEmotetやIcedIDといったマルウェアが流行りました。
これらのマルウェアが感染する原因の一つとして、細工されたマクロコードが仕込まれたMicrosoft Officeファイルの利用があります。
このファイルをメール添付などでユーザに送り、開かせて実行させることでマクロコードが実行され、実行形式ファイルをダウンロードして実行することで感染する、という手法が多くみられます。
このMicrosoft Officeのファイルのうち、旧型式である2003以前のファイル形式を利用しているケースが見られます。
理由は、Microsoft Office 2007以降のマクロ入りファイルの場合、拡張子が違うため目立つことがあります。
例えば、Excelの場合通常のファイルが「.xlsx」、マクロ入りファイルが「.xlsm」Office
一方、旧型式のExcelファイルはマクロの有無に関わらず「.xls」となります。
また、ファイルの中身も、、Microsoft Office 2007以降はzip圧縮されているのに対し、旧型式は独自のフォーマットとなっています。
なお、現在のMicrosoft Officeはデフォルト設定ではマクロは許可しないと実行されません。
また、インターネットからダウンロードされたファイルは、編集自体も許可が必要です。
このため、攻撃者はこれらの許可をするよう促す文面を書いています。
今回は、2020年に見られた旧型式のMicrosoft Officeのファイルの分析と、直面した問題点に関するメモです。
なお、今回の内容は、実行されるマクロのソースコード自体は様々なコーディング方法がとられるため、マクロコードが実行される仕込み方と、分析のための抽出方法に焦点を当てています。
なぜ、新年に2020年の正月にこんな記事を書いているか?というと、単に作業が遅いだけですw
Microsoft Officeマクロコードの分析に使うツール
Microsoft Officeのコードの分析ツールとして、自分がよく使うのは以下のものです。
- OfficeMalScanner
- Microsft Office製品
OfficeMalScannerは、Officeファイルを分析して中にマクロファイルがあるかどうかを判定し、マクロコードを抽出までしてくれます。
OfficeMalScannerは以下からダウンロードできます。
ただし、アンチウィルスは何故かこのツールをマルウェアとして検知してしまいますのでその点は注意です。
www.reconstructer.org
(OfficeMalScanner.zipが対象)
Microsoft Offie製品は、製品の「開発」タブからVisual Basicの機能を使います。
ただし、実際に実行されるため、マルウェア解析専門の機材を用意する必要があります。
OfficeMalScannerによる一般的な旧型式Microsoft Officeファイルの分析
OfficeMalScannerは、解凍するだけで実行できます。
コマンドプロンプトで、以下のように実行します。
OfficeMalScanner.exe (対象ファイル) (オプション)
オプション:scan, info, infrate
scan, infoは旧型式、infrateは新形式の解析に使うオプションです。
実行例は以下のとおり。
マクロコードがあるファイルの場合、infoオプションを用いると、コマンドプロンプト中にマクロコードがあること、その抽出結果のファイルパスを表示します。
マクロコードが見つかった場合、ストリームごとにファイル出力します。
これらを用いて、どのような処理をするか分析することができます。
OfficeMalScannerで解析が失敗する旧型式Microsoft Officeファイル
2020年のマクロ入り旧型式Microsoft OfficeファイルをOfficeMalScannerで解析した際、ツールがクラッシュしてしまうケースが見られるようになりました。
このような場合、私はMicrosft Office製品を使って、製品の機能を用いてコードを確認しますが。
そのためには、編集許可、マクロ許可をしないといけないんですよね。
このため、マクロコードが実行されても問題ない環境を用いる必要があります。
これでは不便であること、そもそもOfficeMalScannerが何故クラッシュしてしまうのか、何等かのトリックがあるのか気になりました。
そこで、自分でテストコードを書いて分析してみました。
OfficeMalScannerで旧型式Microsoft Officeファイルの解析が失敗する原因
OfficeMalScannerがクラッシュする理由を調べるため、旧型式Microsoft Officeファイルを展開するプログラムをVisual C++で自作してみました。
コードはGithubにアップしています。
なお、コードは自身が検証用で作ったため、あまり凝った作りにはなっていません。
具体的には、OfficeMalScannerのようにマクロコードがあるかどうかはレポートしませんし、ヘッダを分析してファイル形式を確認することもしていません。
また、新形式Microsoft Officeの展開まではしません。
新形式Microsoft Officeは、自分は拡張子を「.zip」にして解凍して展開してしまうので、特に必要ないという事情があります。
ストレージを分解してストリームごとにデータをファイルに出力しますが、ストリーム名が同じだと上書きしてしまうのと、出力先がプログラム実行ディレクトリのため出力がちょっと煩雑、という点も問題です。
・・・が、まあ、今のところ困ってないのと時間があんまりないので、当面直す予定がないです。
あくまで、自作するためのサンプルソースくらいで使ってもらえればと思います。
さて、OfficeMalScannerでクラッシュしたコードを解析してみます。
結果は以下の通り。
解析してみると、サイズ0のストリームがありました。
おそらく、これがクラッシュの原因です。
理由は、このストリームの処理で用いるデータサイズの格納の型がDWORDだからではないかと考えられます。
DWORDは符号なし32ビット値です。
つまり、サイズ計算した際に負の値になったときのチェックができない、ということになります。
具体的には、オフセット値を計算する際、「サイズ - (特定の値)」をすると、サイズが0の場合マイナスになってしまいますが、それを検出できないということになります。
っていうか、自分で作ってた際、この理由でおそらく同じデータでクラッシュし、「サイズ < (特定の値)の場合エラー」というチェックをいれたらクラッシュしなくなったので、OfficeMalScannerもこのチェックが漏れているのではないかと思います。
おそらく、「普通に作った旧型式Microsoft Officeではありえない」のかもしれません。
アンチウィルス製品等の実装は知らないですが、旧型式Microsoft Officeを分析する各種ツールをクラッシュさせるトラップである可能性も考えられます。
なお、ダンプデータはそのまま出力しますが、マクロコードはLZNT1形式で圧縮されています。
このため、マクロコードは復号して出力するようにしてみました。
一応、劣化OfficeMalScannerぽくなっています。
旧型式Microsoft Officeファイルのマクロコードが見えないケース
2020年にみられた旧型式Microsoft Officeでは、OfficeMalScanner、自作ツールでともにマクロコードが抽出できないものがありました。
しかし、動的解析すると、確かにマクロが実行されている形跡がありました。
ダンプデータを見ると、Workbookのダンプデータの中に、「Kernel32」、「CreateDirectoryA」といった文字が見られました。
それ以外の文字は、APIの文字が一部化けていたりしていたため、おそらくこのデータもLZNT1形式で圧縮されているのではないかと思います。
ただし、このコードの開始位置をどのように判定して解凍するかが分からず、またどのようなトリガーでコードを起動させているのかがわかりませんでした。
ファイルのフォーマットは以下に公開されています。
[MS-XLS]: Excel Binary File Format (.xls) Structure(英文)
こちらをしっかり理解すれば解決できるんじゃないか・・・とは思いますが、今更今後消えゆく旧型式をしっかり勉強したくないというのも正直なところです。
既に詳しい人がいたら、情報が欲しいところです。
さいごに
2020年にマルウェア感染に用いられたMicrosoft Officeファイルでは、2003以前の旧型式の利用がみられました。
そのため、旧型式の分析も行うのですが、トラブルに遭遇したため、自作ツールを作ってみて原因を調べてみたりしたため、メモを作成した次第です。
Workbookストリーム内にコードが仕込まれるテクニックなど、旧来よりも手法が進化しているように見えます。
同様の解析をしている人の参考になれば幸いです。
同時に、うまく解析できていない点について情報がもらえれば幸いです。