エグゼクティブ サマリー
Cisco Talos は、高度な情報窃取型トロイの木馬「Agent Tesla」や情報窃取ツール「Loki」などのマルウェアをドロップする、新しいマルウェア キャンペーンを発見しました。事の発端は、Talos のテレメトリ システムによる、非常に不審なドキュメントの検出です。このドキュメントは、一般的なウイルス対策ソリューションでは検出されませんでしたが、シスコのマルウェア分析/脅威インテリジェンス統合プラットフォームである Threat Grid は、この未知のファイルをマルウェアと識別しました。本マルウェアで使用されているエクスプロイト チェーンはよく知られているものですが、ウイルス対策ソリューションによる検出を回避する目的で変更が施されていました。この記事では、攻撃者が使用する検出回避手段と、この種の攻撃の追跡には高度なソフトウェアの使用が重要である理由について、概要を説明していきます。Agent Tesla は、検出を免れると Google Chrome、Mozilla Firefox、Microsoft Outlook など数多くの重要なソフトウェアからユーザのログイン情報を盗むことができます。また、スクリーン ショットのキャプチャや Web カメラの記録、攻撃者による感染システムへのマルウェアの追加インストールにも使用できます。
技術的な詳細
攻撃の第 1 ステージは、ほとんどの事例において、FormBook マルウェア キャンペーンの場合と類似していました(そのキャンペーンについては、今年前半のブログ記事で解説しています)。かつての FormBook キャンペーンでは、CVE-2017-0199(複数のバージョンの Microsoft Office に影響する、リモートでコードが実行される脆弱性)を悪用して、悪意のある DOCX ファイル内部から RTF ドキュメントをダウンロードして開いていました。Talos では、CVE-2017-11882 を利用して Agent Tesla と Loki を配布する新しいキャンペーンも確認しました。マルウェア配布に使用された URL の一例を、下記のスクリーンショットに示します。このインフラストラクチャは、Agent Tesla と Loki のほかにも、Gamarue など、ユーザのマシンを全面的に乗っ取ることができ、一般的な情報窃取ツールと同じ機能を持つ多くのマルウェア ファミリを配布しています。
前述の FormBook ブログには、このステージに関する詳しい情報が記載されています。多くのユーザが、最新の Microsoft Word ドキュメントの危険性は RTF ファイルや DOC ファイルよりも低いと想定しています。これは部分的には真実ですが、この新しいファイル形式でも、攻撃者にさまざまな脆弱性の悪用方法を探究される余地は残っています。
図 1:第 1 ステージのエクスプロイト
しかし、シスコの Threat Grid が下した判定は異なるもので、そのファイルをマルウェアとして識別しました。Agent Tesla の場合、ダウンロードされたファイルは、SHA256 ハッシュが cf193637626e85b34a7ccaed9e4459b75605af46cedc95325583b879990e0e61 の RTF ファイルでした。ファイルを分析した時点では、マルチエンジン ウイルス スキャン Web サイトの VirusTotal でこれを検出した例は、ほとんどありませんでした。不審なものを検出したのは、58 のウイルス対策プログラムのうち 2 つだけでした。このサンプルに注意を示したプログラムでは、RTF ファイルの形式誤りに関する警告しか提示されませんでした。AhnLab-V3 は「RTF/Malform-A.Gen」と示し、Zoner は、「RTFBadVersion」の可能性が高いと示しました。
図 2:ThreatGrid の侵入兆候(BI)
上記の図 2 には、トリガーされた侵入兆候(BI)のサブセットのみを示しています。また、下記のプロセス ツリーの一部には、不審度の高い実行チェーンが示されています。
図 3:ThreatGrid のプロセス ツリー
次に示す Threat Grid のプロセス タイムラインから、このファイルが一般的なマルウェアと同様の動作をしていることが確認されます。図 3 を見ると、まず Winword.exe が起動し、その少し後で svchost プロセスが Microsoft Equation Editor(EQNEDT32.exe)を実行し、それによって「scvhost.exe」と呼ばれるプロセスが起動しているのがわかります。Equation Editor は、ドキュメントに数式を埋め込むためのヘルパー アプリケーションとして Microsoft Office で使用されているツールです。たとえば Word では、OLE/COM 関数を使用して Equation Editor を起動します。これは図 3 の内容と合致しています。図 3 に示されるようなその他の実行可能ファイルを Equation Editor アプリケーションが起動するのは、非常にまれなことです。システム ファイル「svchost.exe」のような、類似の名前を使用する実行可能ファイルは、言うまでもなく、それ自体が不審です。ファイル名がほとんど変更されていないという事実を、ユーザは簡単に見過ごしてしまう可能性があります。
図 4:ThreatGrid のプロセス タイムライン
図 4 のポイント 1 および 2 では、Equation Editor が「xyz [1].123」というファイルをダウンロードしてから scvhost.exe プロセスを作成し、少し経ってからその別インスタンス [scvhost.exe(26)] が作成された(青い長方形部分を参照)ことを確認できます。その後、ポイント 4 で、一般的なコマンド & コントロール(C2)トラフィックが続きます。Talos は、この時点で、これがマルウェアであることを確信しました。ここで疑問となるのが、なぜこれがどのウイルス対策システムでも検出されなかったのかということです。どのようにして監視の目をかいくぐったのでしょうか。
悪意のある RTF ファイル
RTF 標準は、クロスプラットフォームのドキュメント インターチェンジとして Microsoft が開発した、独自のドキュメント ファイル形式です。シンプルな標準 RTF ファイルの例を、図 5 に示します。このファイルはテキストと制御語(文字列)から成っています。上の部分はソース コードです。下の部分は、このファイルを Microsoft Word で開いたときに表示される内容を示しています。
図 5:シンプルな RTF ドキュメント
RTF ファイルは、マクロ言語をサポートしていませんが、Microsoft Object Linking and Embedding(OLE)オブジェクトと Macintosh Edition Manager サブスクライバ オブジェクトは「\object」制御語を通してサポートしています。ユーザは、さまざまな形式のオブジェクトを RTF ドキュメントにリンクしたり埋め込んだりすることができます。たとえば、Microsoft Equation Editor で作成した数式を RTF ドキュメントに埋め込むことができます。数式は、シンプルに、16 進数のデータ ストリームとしてオブジェクトのデータ内に保存されます。ユーザがこの RTF ファイルを Word で開くと、オブジェクト データが OLE 関数を介して Equation Editor アプリケーションに渡され、Word で表示可能な形式として返されます。言い換えると、外部アプリケーションがなければ Word で数式を処理できない場合でも、数式がドキュメントに埋め込まれて表示されます。ファイル「3027748749.rtf」でも、このような処理が行われています。唯一違う点は、図 6 からわかるように、さまざまな難読化が追加されていることです。RTF 標準には、非常に多くの制御語が含まれるという大きなデメリットがあります。一般的な RTF パーサーでは、未知の制御語は無視されると想定されます。そのため、攻撃者にとって、RTF ファイルの内容を難読化するための選択肢は豊富に存在します。
図 6:3027748749.rtf
RTF ファイルは厳重に難読化されていましたが、Talos では、rtfdump/rtfobj ツールを使用して構造を検証し、実際のオブジェクト データ ペイロードを抽出することができました。図 8 は、ファイルが Microsoft Equation Editor(class name: EQuATioN.3)を起動しようとしているところを示しています。
図 7:rtfdump
図 8:rtfobj
上記の objdata コンテンツを 16 進数のバイナリ ストリームに変換したものを見てみましょう。ヘッダーに関する詳細は、こちらをご覧ください。図 6 からは、\objupdate のトリックが使用されていることも確認できます。これにより、埋め込みオブジェクトは、表示前に強制的に更新されます。言い換えると、オブジェクトがロードされなければ、ユーザがそれをクリックすることはありません。「通常」のオブジェクトでは、そうなります。しかし、ファイルを強制的に開くことにより、エクスプロイトがすぐに始まるのです。
図 9:ヘッダー
FormBook の記事に書かれていたものと類似する MTEF ヘッダーを見つけることができました。しかし、検出を回避するため、ヘッダーの値は変更されていました。唯一の違いは、MTEF バージョンフィールド以外のヘッダー フィールドにランダム値が入力されている点です。エクスプロイトを機能させるためには、MTEF バージョン フィールドを 2 または 3 にする必要があります。
図 10:MTEF V2 ヘッダー
MTEF ヘッダーの後に、2 バイトの未知の MTEF バイト ストリーム タグ(F1 01)があり、フォント タグ(08 E0 7B ~)がそれに続きます。フォント タグ(B9 C3 ~)に続くバイトは、通常のフォント名のようには見えません。これは、この観察対象がエクスプロイトであることを示す十分な兆候となります。これらのバイトは、前述の調査で見られたものとはかなり異なりますが、復号してみることにします。
図 11:シェルコード(新しいキャンペーン)
すると、以前のコードとかなり似たものになりました。図 12 に、以前の調査で得られたシェルコードを復号したものを示します。
図 12:シェルコード(以前のキャンペーン)
変更されているのは、レジスタとその他いくつかの細かな部分のみでした。Talos はこの時点ですでに、これが CVE-2017-11882 であることをかなり確信していましたが、それを証明してみることにします。
PyREBox
悪意のある RTF ファイルで CVE-2017-11882 がエクスプロイトされていることを検証するために、Talos が開発した動的分析エンジン、PyREBox を使用しました。このツールでは、システム全体の実行のインストルメント化や、命令実行、メモリの読み書き、オペレーティング システム イベントなどさまざまなイベントの監視が可能です。また、エミュレートされたシステムの状態をいつでも検査できるインタラクティブ分析機能も提供されます。ツールに関する詳細については、ツールの公開について述べたブログ記事と、Hack in the Box 2018 コンファレンスで紹介されたマルウェア監視スクリプトを参照してください。
この分析には、シャドウ スタック プラグインを活用しました。このプラグインは、今年前半に開催された EuskalHack Security Congress III で、他のエクスプロイト分析スクリプト(シェルコード検出とスタック ピボット検出)とともに公開されたものです(スライドを参照可能)。このスクリプトは、所定のプロセス(この例では、数式エディタ プロセス)のコンテキスト下で実行されるすべての呼び出し命令と RET 命令を監視し、有効な戻りアドレス(実行されたそれぞれの呼び出し命令の後に続くもの)をすべて追跡するシャドウ スタックを維持します。
私たちが行うべきことは、数式エディタ プロセスを監視するようプラグインを設定して(プラグインは、プロセスが作成するまで待機します)、エミュレートされたゲスト内で RTF ドキュメントを開くことだけです。呼び出し命令が前に付いていないアドレスに RET 命令が割り込むと、PyREBox はその都度システムの実行を停止します。この方法により、スタックに保存されている戻りアドレスを上書きするスタック オーバーフロー バグのエクスプロイトを検出することができます。実行が停止されると、PyREBox はインタラクティブな IPython シェルを生成します。これにより、システムを検査したり数式エディタ プロセス実行のデバッグやトレースを行ったりできます。
図13:無効なアドレス(0x44fd22)への最初の戻りを検出した瞬間に PyREBox は実行を停止
PyREBox は、0x00411874 の戻りアドレスを検出すると実行を停止します。このアドレスは、CVE-2017-11882 で報告された脆弱な機能に属しています。この例では、この脆弱性を利用することで、戻りアドレスが、Equation Editor のメイン実行可能モジュールに含まれるアドレス(0x0044fd22)に上書きされています。このアドレス(図 13 参照)を調べると、そこからもう 1 つの RET 命令にポイントされ、それによってスタックから別のアドレスが現れて、そこに割り込んでいるのがわかりました。シャドウ スタック プラグインは、このような状況を再度検出すると、エクスプロイト中の次の段階で実行を停止します。
図 14:シェルコードの第 1 ステージ
図 14 は、2 番目の RET の直後に実行される、シェルコードの第 1 ステージを示しています。このシェルコードは、GlobalLock 関数(0x18f36e)を呼び出し、その後、シェルコードの第 2 ステージを含む 2 番目のバッファに割り込みます。
図 15:シェルコードの第 2 ステージ冒頭
シェルコードの第 2 ステージは、jmp/call 命令とその後に続く復号ループから成るシーケンスで構成されています。
図 16:シェルコードの第 2 ステージの復号ループ
この復号ループは、シェルコードの最終ペイロードを解凍し、最後にこの復号化バッファに割り込みます。PyREBox では、実行中の任意の時点で、シェルコードを含むメモリ バッファをダンプすることができます。これを実現するにはいくつかの方法ありますが、1 つの可能性として、揮発性フレームワーク(PyREBox シェルから入手可能)を使用してプロセス内の VAD リージョンをリストし、興味深いコードを含むバッファをダンプするというやり方があります。その後、このバッファを IDA Pro にインポートして、さらに詳しく分析することができます。
図 17:第 2 ステージ(シェルコードの最終ステージ)の復号後のバッファ
シェルコードの最終ステージはとてもシンプルです。PEB で入手できるロード済みモジュールのリンク リストの中から標準的な手法によって kernel32.dll モジュールを探し、その後、そのエクスポート テーブルを解析して LoadLibrary 関数と GetProcAddress 関数を検索します。Threat Grid の分析ですでにわかっているように、スクリプトは、これらの関数を使用することで、いくつかの API 関数(ExpandEnvironmentStrings、URLDownloadToFileA、ShellExecute)を解決して URL から xyz.123 バイナリをダウンロードし実行します。やはり Threat Grid のレポートで示されているように、シェルコードは「scvhost.exe」という名前のこの実行可能ファイルを起動します。
このほかにも、まったく同じ感染チェーンを使用するキャンペーンがいくつか観察されています。ただし、最終ペイロードとして配信されていたのは Loki でした。これらについては IOC のセクションにリストアップしています。
ペイロードの詳細
最終ペイロード ファイル「xyz.123」(a8ac66acd22d1e194a05c09a3dc3d98a78ebcc2914312cdd647bc209498564d8)、あるいは上記のプロセス名で言うと「scvhost.exe」を、詳しく見てみましょう。
$ ファイル xyz123.exe
xyz123.exe:PE32 実行可能ファイル(GUI)Intel 80386 Mono/.Net アセンブリ、MS Windows 向け
ファイルを dnSpy(.NET アセンブリ エディタ、デコンパイラ、デバッガ)にロードすると、厳重に難読化された .NET 実行可能ファイルであると確認できます。
図 18:xyz123.exe
下記のメソッドを実行するクラス コンストラクタ(cctor)から、
< Module>.ҭъЩӂӬҀУ\u0486\u0489їҒреӱҤЫѝйҹП()
実行が始まります。大きなアレイがメモリにロードされ、デコードされます。cctor の残りの部分によって、xs.dll およびその他のコードがアレイから再構築され、エントリ ポイントで追加ルーチンが続けて実行されます。最後に、xs.dll に P.M() メソッドを呼び出すことによってジャンプします。
図 19:P.M() メソッド
これは注目に値します。なぜなら、アセンブリが Agile.Net 難読化ツールで難読化されたことを示す、よく知られたアーティファクトが提示されているからです。
図 20:Agile.Net 難読化ツールのアーティファクト
カスタムの難読化ではないので、単純にファイルを実行し、しばらく待ってからそれを Megadumper(.NET 実行可能ファイルをメモリから直接ダンプするツール)経由でダンプすることができます。これだけですでに、かなり読みやすくなったように見えます。
図 21:難読化解除コード ステップ 1
残念ながら、難読化ツールによりすべての文字列が H.G() メソッドで暗号化されており、これらの文字列の内容を見ることはできません。
図 22:H.G() メソッド
幸い、de4dot .NET 難読化解除ツールが、1 つのコマンドでこれを解決します。必要なのは、ランタイム時にサンプル内のどのメソッドを使用して文字列を復号するか指示することだけです。これを行うには、該当するメソッド(この場合は 0x06000001)からトークンを渡します。De4dot は Agile .NETobfuscator の自動検出に関して問題があります。そのため、この関数は「-p」オプション経由で渡す必要があります。
図 23:de4dot .NET 難読化解除ツール
操作が失敗したように見えますが、下記に示すように、難読化文字列はすべて正常に置き換えられ、回復されています。
図 24:復号後の文字列
ソース コードを調べたところ、この攻撃者が使用している情報窃盗/RAT は、Agent Tesla というグレーウェア製品の販売会社によって販売されたものとわかりました。Agent Tesla には、パスワード窃取、画面キャプチャ、追加マルウェアのダウンロードなど、問題のある機能が多数含まれています。しかし、この製品の販売者は、パスワードの回復とチャイルド モニタリングのために使用する製品だと言っています。
図 25:パスワード窃取メソッドのサンプル
このマルウェアには、25 を超える一般的なアプリケーションのパスワードを盗むルーチンと、キーロギング、クリップボード窃取、スクリーンショット、Web カメラ アクセスなどその他のルートキット機能が付属しています。パスワード窃取対象となるアプリケーションの例を下記に示します。
- Chrome
- Firefox
- Internet Explorer
- Yandex
- Opera
- Outlook
- Thunderbird
- IncrediMail
- Eudora
- FileZilla
- WinSCP
- FTP navigator
- Paltalk
- Internet Download Manager
- JDownloader
- Apple Keychain
- SeaMonkey
- Comodo Dragon
- Flock
- DynDNS
このバージョンには SMTP、FTP、HTTP 漏洩のルーチンが付属していますが、使用されているのは、下記の図 26 に示されているように HTTP POST 漏洩のみです。使用する漏洩メソッドの選択に関する決定は、設定に保存されている変数にハードコードされています。これについては、ほぼすべてのメソッドにおいて、次のようにしてチェックされます。
if (Operators.CompareString(_P.Exfil, “webpanel”, false) == 0)
…
else if (Operators.CompareString(_P.Exfil, “smtp”, false) == 0)
…
else if (Operators.CompareString(_P.Exfil, “ftp”, false) == 0)
図 26:HTTP 漏洩ルーチン
たとえば、図 27 のように、POST 要求文字列を作成します。
図 27:POST 要求
そして、3DES で暗号化してから送信します(図 28)。図 26 の _P.Y(“0295A…1618C”)メソッドは、文字列の MD5 ハッシュを作成しています。このハッシュは、3DES 暗号化の秘密として使用されます。
図 28:3DES 暗号化メソッド
まとめ
これは、ほとんどのウイルス対策アプリケーションの検出を回避できる、非常に効果の高いマルウェア キャンペーンです。そのため、この種の脅威から組織を守るためには、Threat Grid などの追加ツールが必要になります。
このマルウェアの背後にいる攻撃者は、RTF 標準の複雑さを突いて、Microsoft Office 脆弱性のエクスプロイトに変更を加えて利用し、Agent Tesla などのマルウェアをダウンロードします。エクスプロイトの変更は攻撃者が手動で行っているのか、あるいはツールを使ってシェルコードを生成しているのか、完全に解明されてはいません。いずれにせよ、攻撃者またはツールには、アセンブラ コードに変更を加えることで、変更後のオペコード バイトをまったく異なるものに見せながらも同じ脆弱性を悪用できるようにする能力があることになります。将来、他のマルウェアでも、このような手法を使用してステルス的な展開を図る事例がかなり多くなる可能性が予想されます。
IOC
Maldoc
cf193637626e85b34a7ccaed9e4459b75605af46cedc95325583b879990e0e61 – 3027748749.rtf
A8ac66acd22d1e194a05c09a3dc3d98a78ebcc2914312cdd647bc209498564d8 – xyz.123
38fa057674b5577e33cee537a0add3e4e26f83bc0806ace1d1021d5d110c8bb2 – Proforma_Invoice_AMC18.docx
4fa7299ba750e4db0a18001679b4a23abb210d4d8e6faf05ce2cbe2586aff23f – Proforma_Invoice_AMC19.docx
1dd34c9e89e5ce7a3740eedf05e74ef9aad1cd6ce7206365f5de78a150aa9398 – HSBC8117695310_doc
配布ドメイン
avast[.]dongguanmolds[.]com
avast[.]aandagroupbd[.]website
hxxp://avast[.]dongguanmolds[.]com からの Loki 関連サンプル
a8ac66acd22d1e194a05c09a3dc3d98a78ebcc2914312cdd647bc209498564d8 – xyz.123
5efab642326ea8f738fe1ea3ae129921ecb302ecce81237c44bf7266bc178bff – xyz.123
55607c427c329612e4a3407fca35483b949fc3647f60d083389996d533a77bc7 – xyz.123
992e8aca9966c1d42ff66ecabacde5299566e74ecb9d146c746acc39454af9ae – xyz.123
1dd34c9e89e5ce7a3740eedf05e74ef9aad1cd6ce7206365f5de78a150aa9398 – HSBC8117695310.doc
d9f1d308addfdebaa7183ca180019075c04cd51a96b1693a4ebf6ce98aadf678 – plugin.wbk
Loki 関連 URL
hxxp://46[.]166[.]133[.]164/0x22/fre.php
hxxp://alphastand[.]top/alien/fre.php
hxxp://alphastand[.]trade/alien/fre.php
hxxp://alphastand[.]win/alien/fre.php
hxxp://kbfvzoboss[.]bid/alien/fre.php
hxxp://logs[.]biznetviigator[.]com/0x22/fre.php
その他の関連サンプル
1dd34c9e89e5ce7a3740eedf05e74ef9aad1cd6ce7206365f5de78a150aa9398
7c9f8316e52edf16dde86083ee978a929f4c94e3e055eeaef0ad4edc03f4a625
8b779294705a84a34938de7b8041f42b92c2d9bcc6134e5efed567295f57baf9
996c88f99575ab5d784ad3b9fa3fcc75c7450ea4f9de582ce9c7b3d147f7c6d5
dcab4a46f6e62cfaad2b8e7b9d1d8964caaadeca15790c6e19b9a18bc3996e18
本稿は 2018年10月15日に Talos Group のブログに投稿された「Old dog, new tricks – Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox」の抄訳です。