分析官と攻撃者の解析回避を巡る終わりなき戦い: LODEINFO v0.6.6 - v0.7.3 の解析から

This post is also available in: English

LODEINFOマルウェアとは

LODEINFOは2019年12月以降に観測された標的型攻撃メールを起点としたキャンペーンで使用されているファイルレスマルウェアです。標的型攻撃メールに添付された悪性Wordファイル (以降 Maldoc) をユーザが開くことで感染することが知られています。(初期にはExcelファイルが悪用されたこともありました)
セキュリティベンダから公開された情報によると、LODEINFOを使用したAdvanced Persistent Threat (APT)キャンペーンは日本のメディアや外交、公共機関、防衛産業、シンクタンク等を標的としており、その手口やマルウェアの類似性によりAPT10と呼ばれる攻撃グループが関与している可能性についても言及されています。

2022年までのLODEINFOに関する公開情報例

LODEINFOを使った攻撃は、2023年においても複数のバージョンが見つかっており、2024年の1月現在も活発に開発されていることがそのバージョンの更新頻度からもうかがえます。

図1. LODEINFOの変遷

2022年9月以前のバージョン更新については以下の記事を参照ください。
APT10: Tracking down LODEINFO 2022, part II

我々は、収集した各バージョンについて、それぞれ解析を行いその変更点を洗い出しました。すると機能拡張はもちろんのこと、それ以上に耐解析 (解析避け) の手法が変更されたり、新たな機能が実装されたりしていることがわかりました。
これは、攻撃者がマルウェアを含む彼らの Tactics、Techniques、Procedures (TTPs) の隠ぺいに注力していることを示唆しています。
このような対策を講じることで検知情報は限られてくるため、LODEINFOの検知はより困難になりつつあると想定されます。
実際に、2023年に発見されたLODEINFOの検体は限定的だったことはその効果を示しています。新たな検体の発見がされないことは、新たな調査・分析の結果が少なくなることにも繋がり、その結果、さらに検知が困難になるというスパイラルに陥るため、より潜伏性が高まっていっていると言えます。

本記事の公開時点 (2024年1月24日) で、LODEINFOの新しいバージョンであるv0.7.3を観測しています。
今回の記事ではv0.7.3を含む2022年末から2024年1月までに観測されたLODEINFOがどのようにアップデートされたのか、その詳細を紐解いていきます。


LODEINFOの解析

感染フローの解析

以下に2023年に見つかったLODEINFOの感染フローを記載します。この感染フローには従来からの変化が見られます。

Downloader Shellcodeの更新

初期感染は以前のバージョンと変わらず、標的型攻撃メールに添付されたMaldocが起点となり、最終的にメモリ内にLODEINFOが展開され感染します。
2023年にはこのMaldoc内のVBAコードが更新されました。具体的には32bit版と64bit版の双方のDownloader Shellcodeが埋め込まれたVBAコードが追加され、標的の環境によってどちらを使うかが選択されるようになっています。
Windows OSにおける64bitアーキテクチャ採用への対応は各組織で課題になっていますが LODEINFOもまた64bitアーキテクチャに適応するべく変化をしたと考えられます。

図2. LODEINFO v0.6.8から実装された新たな感染フロー

この感染フローの変更は2023年に観測されたv0.6.8からv0.7.1のバージョンで実装されていました。

Remote Template Injection

LODEINFO v0.6.9では、前述の感染フローにRemote Template Injectionを使用する、更に複雑な事例も確認しています。

Remote Template Injectionとは

Microsoft Wordには他ユーザの作成したひな形を使用してファイルを作成できる「テンプレート」機能があります。テンプレートが挿入されたWordファイルが読み取られるとき、テンプレートはローカルまたはリモートのマシンからダウンロードされます。 上記の「テンプレート」機能を利用して、攻撃者はあらかじめ悪意のあるマクロを含むWordのテンプレートファイル (.dotm) を自分のサーバでホストし、被害者がそのテンプレートが挿入されたWordファイルを開くたびに、攻撃者のサーバから悪意のあるテンプレートが取得、実行されるようにできます。

前述の通り、Remote Template InjectionのWordファイルを開くと、攻撃者のC2 サーバからテンプレートをダウンロードして読み込みます。 読み込まれたテンプレートは前述したMaldocと同等のマルウェアで、Downloader Shellcodeが埋め込まれたVBAコードが含まれています。これにより最終的にLODEINFO本体が呼び込まれます。Remote Template Injectionが追加された感染フローのイメージを以下に記します。

図3. Remote Template Injectionが追加された感染フロー

添付されたWordファイル自身はテンプレートを読み込むだけのため、この技術は悪意のある動作として検知されにくいという特徴があり、セキュリティ製品の検知を回避することを目的としていると考えられます。

更にRemote Template Injectionを用いたWordファイルの構造を解析してみます。このWordファイル内の\word\_rels\settings.xml.relsの中身を確認することでhttps://45.76.222[.]130/template.dotmをテンプレートファイルとして読み込むよう仕組まれていることがわかります。

図4. Remote Template Injectionを用いたWordファイルの構造


Maldocの解析

続いてMaldocに含まれているVBAについて紹介します。

Maldocに埋め込まれたVBAコード

前述の通り、Maldocに埋め込まれたVBAのコード内には64bitおよび32bitのDownloader Shellcodeがそれぞれ埋め込まれています。

図5. Maldocに埋め込まれたVBAコードの一部

マクロにはまず標的端末のOSのアーキテクチャを確認し、そのアーキテクチャにあわせたDownloader Shellcodeを実行する仕組みが搭載されています。

各Downloader ShellcodeはBase64エンコードされたうえ、複数のパーツに分割されています。これは、セキュリティ製品の検知を回避する手法であると考えられます。 マクロ実行時には、分割されたパーツが再構成された後、Base64を使用してデコードされたShellcodeがメモリ内に注入されます。

図6. Base64 エンコードされ分割された Shellcode を再構成

Office製品の言語確認

Office 製品の言語設定を確認する為のコードがv0.7.0のMaldocに実装されていました。我々が確認した検体では、Office製品の設定が日本語か否かを確認しています。これは標的の言語環境でのみ動作するように作成されていると考えられます。

図7. VBAマクロに含まれるOffice製品の言語設定を確認するコード

興味深いことに、v0.7.1ではこの機能が攻撃者によって削除されていました。それだけでなく、Maldoc自体のファイル名も日本語から英語になっていました。このことから、v0.7.1 は日本語以外の言語環境を攻撃するために使用された可能性が高いと考えています。

Donwloader Shellcodeの解析

LODEINFO v0.7.1で用いられるDownloader ShellcodeはC2サーバからPEMファイルに偽装した (以降Fake PEM) ファイルをダウンロードし復号を行い、最終的にLODEINFOに感染させる為のファイルを作成し実行するマルウェアです。Shellcode自体は非常にシンプルなダウンローダのため、Fake PEMファイルからデータを復号する処理について解析結果を共有します。

PEMファイルとは

Privacy Enhanced Mailファイルの略称です。 公開鍵基盤 (Public Key Infrastructure: PKI) で使用される鍵と証明書のためのファイル形式の一つです。元々は電子メールのセキュリティ向上を目的として作られましたが、現在はインターネットセキュリティの標準となっています。 Webサーバや電子メールサーバ、セキュアな通信プロトコル (HTTPSなど) の設定でPEMファイルが使用されます。

Fake PEMファイルの復号方法

Downloader Shellcodeは、C2サーバからFake PEMファイルをダウンロードします。その後、Fake PEMファイルに対して以下の手順でデータの復号を行います。

1. Fake PEMファイルのヘッダーとフッターを削除する
2. 手順1のデータをBase64でデコードする
3. 手順2にてデコードされたデータから最初の3-byteを削除する
4. Download Shellcode内にハードコードされたパスワードから SHA1 ハッシュ アルゴリズムを使用してHMAC を生成する
5. 手順4で生成されたHMACをAESの鍵として使用し、手順3のデータをAESで復号する
6. 手順5で復号したデータを、さらに1-byte XORの鍵を用いてデコードする

HMAC (Hash-based Message Authentication Code) とは

一方向ハッシュ関数を使用してメッセージの整合性と認証を保証するためのコードおよび手法です。データの送信者やデータが途中で改ざんされていないことの確認が必要なセキュアな通信に広く使用されています。

今回調査した検体には以下のような形でパスワードがハードコードされていました。このパスワードが無い場合、たとえFake PEMファイルを運よく入手できたとしても後続のデータの復号は極めて難しいと言えます。

図8. Fake PEMファイル復号用のハードコードパスワード

LODEINFO Backdoor Shellcodeのメモリ内への展開

最終的に手順6で復号されたデータは以下のような独自のデータ構造で設計されていました。次のステップで使用される悪性のFrau.dll等のオブジェクトが埋め込まれています。構造の詳細について解説します。

図9. Fake PEMファイルから復元されたデータの構造

復元されたデータ内には以下のような複数のオブジェクトが埋め込まれています。

  • Elze.exe
  • Frau.dll
  • Elze.exe_bak

各オブジェクトはDownloader Shellcodeによってファイル化され、感染端末内に設置されたのちElze.exeが実行されます。Elze.exe自体は正規ファイルですが、DLL side-loadingを用いることで悪性のFrau.dllを読み込みます。Frau.dllは、LODEINFO Backdoor Shellcodeをペイロードとしてメモリ内にロードする為の非常にシンプルなマルウェアです。

しかし、v0.6.6、v0.6.8およびv0.6.9ではControl Flow Flattening (以降 CFF) とJunk codeを用いることで難読化が今まで以上に強化されています。下図、左側のプログラムフローは非常に複雑になっていることがわかります。また下図右は該当部分のコードとなりますが、コードのほとんどがCFF (黄色) とJunk code (灰色) で埋められてしまい、実際に使用される悪性コード (白色) が極わずかであることがわかります。このことからも攻撃者が解析の妨害に注力していると言えます。

図10. CFFとJunk codeによって難読化されているプログラムフローとコードの例

最後に、Elze.exe_bakファイルはLODEINFO Backdoor Shellcodeを1-byte XORエンコードしたデータで、Frau.dllによって読み込まれペイロードとしてデコードされます。

Control Flow Flattening とは

プログラムの構造をわかりにくくすることを目的とした手法です。 単純な処理を、条件分岐と繰り返し処理に置き換えるため、制御フローで見ると縦に連なる処理が条件分岐と繰り返し処理によって横に並ぶようになります。制御フローが平らになることで、プログラムの処理の流れが煩雑になり、解析がしにくくなります。

Attacking Emotet’s Control Flow Flattening – Sophos News

既知のダウンローダDOWNIISSAとの類似点

細かく分析を行うことで、今回見つかったDownloader Shellcodeと既知のダウンローダであるDOWNIISSAと3つの類似点があることを確認しました。 なお、DOWNIISSAと今回解析したDownloader Shellcodeはその構造上別のマルウェアファミリーであると判断しています。

類似点:

  1. 悪性コードを隠蔽する為のセルフパッチメカニズム
  2. C2サーバ情報のエンコード方式
  3. Fake PEMファイルから復号されたデータの構造

参考 APT10: Tracking down LODEINFO 2022, part I

類似点1: 悪性コードを隠蔽するためのセルフパッチメカニズム
一つ目の類似点として、Shellcode自身をデコードするためのパッチメカニズムがあげられます。 2022年に報告されているDOWNIISSAではShellcodeの実行時にShellcode自身をパッチングする処理が施されていました。今回新しく見つかったDownloader Shellcodeにおいても同様にセルフパッチメカニズムが実装されていました。

図11. Downloader Shellcodeのセルフパッチ 処理

Shellcode内でセルフパッチを行う点ではDOWNIISSAと似ていますが、明確な差分もあります。DOWNIISSAではBase64が使用されていましたが、今回のDownloader ShellcodeではXORデコードが使用されていました。XORの鍵は0x00から0xFFまで1つずつ増分されながら使われます。

類似点2: C2サーバ情報のエンコード方式
2つ目の類似点として、Shellcode内に埋め込まれたC2サーバのエンコード方式が同じことがあげられます。Downloader Shellcode内には2つのC2サーバの通信先が埋め込まれていますが、この通信先が1-byte XORエンコードされています。また、エンコード方式だけでなく、埋め込み方についても非常に似ています。

図12. Downloader Shellcodeに埋め込まれたC2サーバ情報とFake PEMファイル

類似点3: Fake PEMファイルから復号されたデータの構造
Fake PEMファイルから復号されたデータの構造は前述したとおり独自構造となっており、DOWNIISSAによって復号されたデータ構造と完全に同じデータ構造を採用していることを確認しています。

LODEINFO Backdoor Shellcode

LODEINFO Backdoor Shellcodeは感染したホストに攻撃者がリモートアクセスし操作するためのファイルレスマルウェアです。以下の特徴は公開情報と同じでした。

  • 通信先が独自のデータ構造を使用している
  • 埋め込まれているデータのアドレスを参照するメカニズムが特徴的
  • 2-bytes XORを用いてBackdoor Command IDを隠蔽する
  • C2サーバとの通信データの構造および暗号化が下図のように非常に複雑である
  • 上記の暗号化にてVigenere 暗号を複数回使用する
    図13. C2サーバとの通信時に使用する独自のデータ構造と暗号の概略図

2023年に見つかった複数のLODEINFO を解析した結果、過去の公開情報と以下の差分があることがわかりました。

  1. API関数名を求めるハッシュ計算アルゴリズムの変更
  2. Backdoor commandの追加

変更点1: API関数名を求めるハッシュ計算アルゴリズムの変更
v0.7.0 では、v0.6.9 と比較して新しいハッシュ計算アルゴリズムに変更されています。このアルゴリズムの変更によって、過去の検体と同じルールでのシグネチャマッチングができなくなっています。
ハッシュ計算アルゴリズムは、マルウェアによってAPI関数名のハッシュを計算し、関数アドレスを解決するために使用されます。公開情報と同様、ハッシュ計算のロジックにはサンプルごとに異なるハードコードされたXORキーが含まれており、これを用いてXORデコードを行うため、サンプルごとに埋め込まれているハッシュ値が異なります。

図14. ハッシュ計算アルゴリズムの変更

変更点2: Backdoor commandの追加
LODEINFOは、感染したホストを制御するために、以下のようなBackdoor commandが実装されています。 Backdoor commandはv0.6.5では11個にまで減っていましたが、v0.7.1では6つのコマンドが復元、runasコマンドが新たに追加されたことで18個に増えていました。更に、v0.7.2およびv0.7.3では削除されたコマンド群が復活したうえに、v0.7.1まで”Not Available.”と表示されるだけだったconfigコマンドの中身が実装されていました。

Command Descriptions v0.6.5 v0.7.1 v0.7.2, v0.7.3
command 埋め込まれたBackdoor commandの一覧を表示 Enable Enable Enable
ls ファイル一覧の取得 Removed Enable Enable
rm ファイルの削除 Removed Enable Enable
mv ファイルの移動 Removed Enable Enable
cp ファイルのコピー Removed Enable Enable
cat ファイルのC2へのアップロード Removed Enable Enable
mkdir ディレクトリの作成 Removed Enable Enable
send C2からのファイルのダウンロード Enable Enable Enable
recv C2へのファイルアップロード Enable Enable Enable
memory メモリへのShellcodeの注入 Enable Enable Enable
kill プロセスIDを用いたプロセス終了 Enable Enable Enable
cd ディレクトリの変更 Enable Enable Enable
ver マルウェアとシステム情報を送信
これには、現在のOSバージョン、マルウェアバージョン、
プロセスID、実行ファイルのパス、システムユーザ名、
現在のディレクトリ、C2およびMutexの名前が含まれる
Enable Enable Enable
print デスクトップのスクリーンショットの撮影 Enable Enable Enable
ransom 生成されたAES鍵を使用してファイルを暗号化し、
同時にハードコードされたRSA鍵を使用してそのAES鍵を暗号化する
Enable Enable Enable
comc WMIを使用したコマンドの実行 Enable Enable Enable
config マルウェアの設定をレジストリに書き込む。
(v0.7.2よりコマンドの中身が実装。v0.7.1以前は"Not Available."を返すだけの機能).
Not Available Not Available Enable
runas 特定のユーザとしてコマンドを実行する(v0.7.1より実装). N/A Enable Enable
keylog 被疑端末のキーストローク、日時、および
アクティブなウィンドウの名前を保存
1バイトのXOR暗号化を使用し、ファイルは %temp%%hostname%.tmp
Removed Removed Enable
ps プロセスの一覧を表示 Removed Removed Enable
pkill プロセスの終了 Removed Removed Enable
autorun 永続性の設定と削除 Removed Removed Enable



攻撃者のインフラ

ここまで紹介したLODEINFOの解析結果を踏まえ、それぞれの検体から得られた通信先の特徴について紹介します。
2023年我々が観測した攻撃者のインフラストラクチャの傾向はバージョン間で一致しており、攻撃者がAS-CHOOPAを好んで使用する傾向は継続しています。

図15. LODEINFOの攻撃者インフラ

まとめ

2023年もLODEINFOは複数のバージョンが観測されており、2024年1月にはv0.7.3が観測されました。今後も様々な機能追加や検知回避の手法が取り入れられる可能性が高く、引き続き注意が必要です。

対策としては、LODEINFOはDownloader ShellcodeとBackdoor Shellcodeの双方ともファイルレスマルウェアであることから、検知を行う場合にはメモリ内のマルウェアをスキャンし検知できる製品の導入が必要不可欠です。当社では、これまでの調査結果を踏まえメモリ内のスキャンができる製品の導入だけでなく、LODEINFOに特化した様々な対策を行っており、今後も調査や対策の拡充を継続していく方針です。LODEINFOの脅威にさらされ、解析を必要とされている組織のCERTの皆様と引き続き情報交換ができますと幸いです。

最後に、JSAC2024ではLODEINFOに関する講演が2つ予定されています。 参加申請は終了しておりますが、一部資料は後日公開されますので最新情報の取得にぜひご活用ください。

IoCs

MD5 of samples:
69dd7fd355d79db0325816569ae2129a - Maldoc
E82d98bae599cd172bb194adbdc76873 – zip file of above maldoc
D1a925ddb6d0defc94afb5996ed148bd - Maldoc
9598b2af9dd1493dd213dbca56912af4 - Maldoc
2a9012499d15145b5f63700c05adc426 - Loader module
508aed3687c146c68ad16326568431ab - Loader module
60dea5b5f889f37f5a9196e040bce0eb – BLOB:encrypted LODEINFO v0.6.9
3d910e8ab29362ae36de73c6b70a7e09 – BLOB:encrypted LODEINFO v0.7.1
290c5f33a4f4735e386b8193b1abdcf9 – Artifact:unique data structure for malware set

C2s:
167.179.106[.]224
167.179.77[.]72
172.104.112[.]218
202.182.116[.]25
45.76.197[.]236
45.76.222[.]130
45.77.183[.]161