This post is also available in: English (英語)
概要
悪名高い攻撃者グループ Sofacy (別名APT28、Fancy Bear、STRONTIUM、Sednit、Tsar Team、Pawn Storm)は、2018年もきわめて活発に活動しています。Unit 42は、全産業にまたがりグローバルかつ持続的に活動する同グループを積極的に監視しています。最近私たちは、様々な国の外務関連の省庁に対して開始されたキャンペーンを発見しました。興味深いことに、同キャンペーンでは2つの取り組みが並行して行われており、それぞれの取り組みが完全に異なるツールセットを攻撃に使用しているようです。このブログではこの取り組みの1つについて説明します。この取り組みでは、Sofacyグループと関係があることがわかっているツールが利用されていました。
攻撃の詳細
2018年2月初旬、私たちは外務に関連する2つの政府機関を標的にした攻撃を発見しました。これらの機関が存在している地域は一致しておらず、共通点は組織の機能のみです。具体的には、一方の組織はヨーロッパにあり、他方は北米にあります。最初の攻撃ベクターは、フィッシング メール(図1参照)を利用していました。件名は「Upcoming Defense events February 2018」で、送信元アドレスは「Jane's 360 defense events <events@ihsmarkit.com>」を名乗っていました。IHSMarkitの子会社 Jane’sは、とくに防衛・政府セクター関連の情報分析に強い有名セキュリティ会社です。メールヘッダのデータを分析した結果、送信元アドレスは偽装されたもので、IHSMarkitからのメールではなかったことがわかっています。フィッシング メールの誘い文句には、添付ファイルが標的組織の関連イベントのカレンダーであることや、「ドキュメントをうまく表示できない」場合の特別な指示内容が含まれています。
添付ファイル自体は、悪意のあるマクロ スクリプトが含まれたMicrosoft Excel XLSドキュメントです。このドキュメントは、標準的なマクロ ドキュメントに見せかけていますが、マクロを有効にするまでテキストは見えません。ただしマクロが有効になる前でも全テキストにアクセスできる点には注目すべきでしょう。というのも、テキストのフォント色として白が適用されていて、内容を読むにはマクロを有効にする必要があると見せかけるようになっているからです。マクロが有効になると以下のコードが実行されテキストが見えるようになります。
ActiveSheet.Range("a1:c54").Font.Color = vbBlack
上記コードは、指定されたセル範囲内のフォント色を黒に変更し、テキストを表示します。パッと見ると正当であり得る内容のように見えますが、よく読むと正当なドキュメントであれば存在するはずのない異常な点がいくつも確認できます。下記の図2では、配信ドキュメントのマクロ有効化前の表示内容とマクロ有効後の表示内容を示しています。
配信ドキュメント
最近のISCダイアリー エントリで述べたように、このマクロは行2227から2248、列170のセル内容から base64エンコードされたペイロードを取得します。これを以下のスクリーンショットに示します。
このマクロは、文字列「-----BEGIN CERTIFICATE-----」をbase64エンコードしたペイロード先頭に付加し、「-----END CERTIFICATE-----」をデータ末尾に付加します。次に、このデータをテキスト ファイルに書き込み、C:\Programdataフォルダに、ランダムなファイル名に拡張子.txtを付けた名前で保存します。さらに、コマンドcertutil -decodeを使用して保存したテキスト ファイルの内容をデコードし、デコードした内容をランダムなファイル名に拡張子.exeを付けたファイルとして出力し、C:\Programdataフォルダに保存します。その後2秒スリープしてから新たにドロップしたEXEファイルを実行します。
新たにドロップされた実行ファイルはローダー型のトロイの木馬で、本攻撃のペイロードをインストール・実行します。私たちは、このローダーについてさらに詳細に分析しました。分析結果は本レポートの付録から確認できます。実行時に、ローダーはカスタム アルゴリズムを使用して埋め込まれたペイロード(DLL)を復号化し、これを解凍して以下のファイルに保存します。
%LOCALAPPDATA%\cdnver.dll
次にバッチ ファイル%LOCALAPPDATA%\cdnver.batを作成し、以下を書き込みます。
start rundll32.exe "C:\Users\user\AppData\Local\cdnver.dll",#1
さらに、このバッチ ファイルを使用して埋め込まれたDLLペイロードを実行します。その後、永続化のためこのバッチ ファイルへのパスを以下のレジストリ キーに書き込みます。このレジストリ キーにより、ユーザーがシステムにログインするたびにこのバッチ ファイルが実行されます。
HKCU\Environment\UserInitMprLogonScript
ローダーがインストールしたcdnver.dllペイロードはSofacyCarberpペイロードの亜種で、Sofacy脅威グループによって広く使用されています。概してSofacyCarberpは、追加のツールをシステムにダウンロードする前に、システム情報を収集してC2サーバに送信することで初期偵察を行います。このSofacyCarberpの亜種は、C2サーバとして以下のドメインを使用するよう構成されていました。
cdnverify[.]net
この攻撃で配信されたローダーおよびSofacyCarberpのサンプルは、過去に分析したサンプルと似ていますが、大きな違いもあります。たとえばAPI関数を解決し、挿入対象となる実行中のブラウザ プロセスを検索する新しいハッシュ アルゴリズムや、C2通信メカニズムの変更(付録で詳細に説明)などです。
オープン ソースの配信ドキュメント ジェネレータ
SofacyはLuckystrikeというオープン ソース ツールを使用して、この攻撃で使用された配信ドキュメントおよびマクロを生成していたようです。Luckystrikeは2016年9月開催のDerbyCon 6で公開されたMicrosoft PowerShellベースのツールで、ユーザーがマクロをExcelまたはWordドキュメントに追加し、埋め込まれたペイロードを実行できるようにすることにより、悪意のある配信ドキュメントを生成します。私たちは、Sofacyの配信ドキュメントがLuckystrike内で見つかったマクロに非常によく似ていることから、Sofacyがこのツールを使用したと確信しています。
この疑惑の検証のため、Luckystrikeで悪意のあるExcelファイルを生成し、そのマクロをSofacyの配信ドキュメント内で見つかったマクロと比較しました。作成したペイロードそれぞれに対してLuckystrikeツールが生成するランダムな関数名およびランダムなセル値を除いて、前記の2つのマクロ間には違いが1つしかないことがわかりました。この1つのランダムでない文字列の相違点は、コマンド"certutil -decode"内の".txt"ファイルおよび".exe"ファイルへのパスでした。Sofacyのドキュメントはパスに"C:\Programdata\"を使用しており、LuckystrikeのドキュメントはApplication.UserLibraryPath環境変数に格納されていたパスを使用していました。以下の図3は、LuckyStrikeのマクロを左に、Sofacyのマクロを右に表示し、相違点を示しています。ファイルのパスとマクロでランダムに生成された値以外、連結を使用して文字列を作成する難読化の試みも含め、すべてがまったく同じです。
発見と関連性
たいていの調査では、それまでに観測された振舞いのルールセットや関連性を組み合わせることで初期の方向性を決め、新たな脅威の発見につなげています。今回の場合も、過去1年にわたる観測により、SofacyグループのC2インフラの奇妙な「癖」が浮かび上がってきました。たとえば以前使ったWHOISのアーティファクトやIPを再利用するときの癖、ドメイン命名上の癖などです。これらの癖を使うことで、特定の攻撃がどのキャンペーンからのものかをグループ化できます。今回は、Sofacyグループが新規ドメインの登録後、デフォルト ランディング ページをその後一年ずっと繰り返し使用している様子を観測しました。これらのドメインに共通するC2インフラの他の部分には、重複するアーティファクトは含まれていません。そのかわり、Webサイトの本文内の実際のコンテンツが各インスタンスで完全に一致しました。特に、文字列866-593-54352 (1桁多い)、403-965-2341、または住所522 Clematis.Suite 3000は、各インスタンスで繰り返し確認されました。ThreatConnectは、2017年9月にこの癖に関する同様の観察結果を報告しています。
Hotfixmsupload[.]comは、Sofacy C2ドメインとして繰り返し特定され、ここで文書化されているようにSTRONTIUM (Sofacy)に対する訴状でMicrosoftによっても明言されていることから、特に興味深いと言えます。
私たちは、この知識を活用することで、最終的にSofacyグループによって使用される潜在的なC2ドメインを予測し始めることができました。このシナリオでは、ドメインcdnverify[.]netが2018年1月30日に登録され、ほんの2日後にはこのドメインをC2として使用した攻撃が開始されました。
結論
現段階のSofacyグループはもはや目新しい脅威とは言えません。当該グループについては、詳細な攻撃の手口を含め、十分な文書化・調査が行われてはいるものの、変わることなく自らの攻撃キャンペーンを継続し、過去に使用したものと同様のツールを使用し続けています。このことから、たとえ潤沢な公開済み脅威インテリジェンスがあっても、攻撃試行が今後も引き続き行われるものと私たちは確信しています。こうしたデータの活用はとても難しいですが、次のプレイブックとしてこの攻撃キャンペーンをデータセットに追加することで、今後もこの攻撃者グループのプレイブックを明確にすることに努めます。
Palo Alto Networksのお客様は、以下の製品によってこの脅威から保護されています。
- WildFireはSofacyCarberpについて、悪意があると判断したペイロードすべてを検出します。
- AutoFocusをご使用のお客様は、Sofacy、SofacyMacroおよびSofacyCarberpタグで、これらのツールについて調べることができます。
- Trapsは、Sofacyによる配信文書やSofacyCarberpのペイロードをブロックします。
IOC
SHA256
- ff808d0a12676bfac88fd26f955154f8884f2bb7c534b9936510fd6296c543e8
- 12e6642cf6413bdf5388bee663080fa299591b2ba023d069286f3be9647547c8
- cb85072e6ca66a29cb0b73659a0fe5ba2456d9ba0b52e3a4c89e86549bc6e2c7
- 23411bb30042c9357ac4928dc6fca6955390361e660fec7ac238bbdcc8b83701
ドメイン
- Cdnverify[.]net
電子メールの件名
- Upcoming Defense events February 2018
ファイル名
- Upcoming Events February 2018.xls
付録
ローダー型トロイの木馬
マクロによってシステムにドロップされるペイロードは、ダイナミック リンク ライブラリ(DLL)のシステムへのインストールと実行を担う実行ファイルです。この実行ファイルには、2016年後半にDealersChoice攻撃で分析したローダーと同じ復号化アルゴリズムが含まれています。
ローダーは、自身を興味深いものにしているいくつかのコーディング機能を備えています。たとえば、ローダーは実行時にライブラリapi-ms-win-core-synch-l1-2-0.dllのロードを試みます。このDLLは、Windows 10向けのユニバーサルWindowsプラットフォーム アプリの一部です。通常、開発者はこのアプリに直接リンクせず、下位APIへのアクセスを提供するWindowsApp.libにリンクします。ローダーには、直接呼び出すことができないWindows API機能のラッパーの定義が含まれているようです。それらがすべてのオペレーティング システムではサポートされていないためでしょう。
実行時に、ローダーはカスタム アルゴリズムを使用して埋め込まれたペイロード(DLL)を復号し、その後、RtlDecompressBuffer APIを使用して解凍します。このAPIは通常、Windowsドライバにより使用されるものですが、ユーザープロセスによる使用はとくに制限されていません。パラメータはMSDNで文書化されています。使用される圧縮アルゴリズムは、最大圧縮レベルのLZNT1です。ペイロードは、以下の先頭10バイトのXORキー0x3950BE2CD37B2C7CCBF8を使用して復号化されます。復号後、データは解凍ルーチンに渡されます。ペイロードは、ローダー内のファイルオフセット 0x19880 から 0x1F23C の位置(このサイズが0x59BD)に存在します。ペイロードは、以下のPythonスクリプトで復号・解凍できます。
ローダーは以下のファイルを%LOCALAPPDATA%ファイル パスにドロップします。
- Cdnver.dll
- Cdnver.bat
Windowsエクスプローラーからの目に見える検出を回避するため、ファイル属性は非表示に設定されます。%LOCALAPPDATA%は、実行ファイルを起動したユーザーのパスです。つまり、ユーザーが自分のログオン アカウントを含めているC:\Users\user\AppData\Localです。
ドロップされたDLLを実行するため、ローダーは最初に実行中のプロセスの整合性レベルをチェックします。必要な権限がない場合、ローダーはシステムのプロセスを列挙してexplorer.exeを検索します。おそらくこのプロセスが選ばれた理由は、通常管理者権限で実行されるためでしょう。ローダーは、explorer.exeの権限を使用し、CreateProcessAsUserを介してドロップされたDLLの実行を試みます。ローダーを実行したユーザーが管理者であるか、十分な権限を持っている場合は、このステップは省略されます。実行はWindows rundll32.exeプログラムを使用して処理され「#1」を使ってDLLのエクスポートを呼び出します。例:
start rundll32.exe "C:\Users\user\AppData\Local\cdnver.dll",#1
永続化のため、ローダーは次のレジストリ キーUserInitMprLogonScriptを以下の値でHKCU \Environmentに追加します。
C:\Users\user\AppData\Local\cdnver.bat
このエントリによって、ユーザーがログオンすると常に、バッチ ファイルが実行されます。バッチ ファイルには、以下の情報が含まれています。
start rundll32.exe "C:\Users\user\AppData\Local\cdnver.dll",#1
UserInitMprLogonScriptの使用はSofacyにとって新しい手法ではなく、MitreのATT&CKフレームワークで、Sofacyのこのレジストリ キーの使用法がログオン スクリプトを永続化させるための手法の例として示されています。
SofacyCarberpペイロード
これらの攻撃で配信されたDLLは、SofacyCarberpペイロードの亜種で、Sofacy脅威グループによって広く使用されています。
APIの解決
このトロイの木馬の以前のバージョンでは、主にAPI機能を解決するために使用されるCarberpのコードに関連する、漏洩されたCarberpソース コードから取得されたコードが使用されていました。ただし、このバージョンのSofacyCarberpは、手動でAPI関数をロードするために、ハッシュ アルゴリズムを使用して、BaseDLLNameに基づいて正しくロードされたDLLを検索しています。PEBをロードしてそれを実行してから、_PEB_LDR_DATA構造にアクセスし、InLoadOrderModuleList内のBaseDllNameのUnicode文字列を取得します。1つおきにバイトをスキップすることで、このUnicode文字列をASCII文字列として扱い、文字列の小文字バージョンを取得します。その後、小文字からなる結果の文字列をハッシュ アルゴリズムの対象として、結果のハッシュをハードコードされた値と比較してチェックします。以下のPythonスクリプトは、ハッシュされた値を判別するために使用されたアルゴリズムを示しています。
ロードされた正しいDLLを見つけるために使用されるハードコード値は、以下のとおりです。
- 0x98853A78 - kernel32.dll
- 0xA4137E37 - ntdll.dll
具体的には、ハッシュに基づいて以下のAPIを検索します。
- 0x77b826b3 - ? (コード コンテキストに基づくと、おそらくntdll.ZwProtectVirtualMemory)
- 0x2e33c8ac – ntdll.ZwWriteVirtualMemory
- 0xb9016a44 – ntdll.ZwFreeVirtualMemory
- 0xa2ea8afa – ntdll.ZwQuerySystemInformation
- 0x99885504 – ntdll.ZwClose
- 0x46264019 – ntdll.ZwOpenProcess
- 0x3B66D24C – kernel32.?
- 0x79F5D836 – kernel32.?
ブラウザへの挿入
このトロイの木馬は、同じハッシュ アルゴリズムをAPI解決に使用して、システムで実行中のブラウザ プロセスを見つけます。コードをブラウザに挿入してC2サーバと通信するのが狙いです。このハッシュ アルゴリズムの使用は、ESETが以前報告した、SofacyCarberpの以前の亜種とは異なる点です。
コード挿入の開始のため、トロイの木馬は、ZwQuerySystemInformation関数を呼び出します。これによって、SystemProcessInformationに関連したデータを要求します。結果、SYSTEM_PROCESS_INFORMATIONという名前の構造を取得します。ここで、トロイの木馬は、ImageNameフィールド(オフセット0x3c)内のUnicode文字列にアクセスします。次にこのトロイの木馬は、このUnicode文字列をASCIIフォーマットでハッシュ アルゴリズムに送信して、以下を検索します。
- 0xCDCB4E50 - iexplore.exe
- 0x70297938 - firefox.exe
- 0x723F0158 - chrome.exe
トロイの木馬は、これらのブラウザにコードを挿入して、C2通信の実行を試みます。リモート プロセスで挿入されたコードを介してC2通信を実施するため、挿入されたコードはC2サーバに到達し、SNFIRNWという名前のメモリ マップ ファイルに応答を保存します。トロイの木馬は、このマップ ファイル内のカスタム通信プロトコルを使用しますが、高レベルでは、トロイの木馬はマップされたSNFIRNWファイル内のデータを継続的に検索し、あたかも自身のプロセス内でC2サーバと通信しているかのようにデータを処理します。
C2通信
Webブラウザ内に挿入されたコードからC2サーバとの通信が可能になるだけでなく、トロイの木馬は、自身のプロセス内でも同じ通信プロセスを実施できます。C2通信ではHTTPSが使用され、具体的には以下のフラグを設定して、無効な証明書を許可するようにします。
SECURITY_FLAG_IGNORE_CERT_DATE_INVALID|SECURITY_FLAG_IGNORE_CERT_CN_INVALID|SECURITY_FLAG_IGNORE_UNKNOWN_CA|SECURITY_FLAG_IGNORE_REVOCATION
トロイの木馬からgoogle.comに送信される最初のリクエスト(おそらくインターネット接続確認が目的)は、以下のとおりです。
前述の活動に見られるとおり、このトロイの木馬は、ランダム サイズの、ランダムに生成された文字列を含むURLにPOSTリクエストを発行します。このURLには、以下のリストからランダムに選択された文字列も含まれます。
- .vnd.wmc
- .3gpp2
- .ktx
- .rfc822
- .vnd.flatland.3dml
- .report
- .vnd.radisys.msml-basic-layout
- .3gpp
この文字列のリストは、以前に分析したSofacyCarberpサンプルとは異なります。例えば、当社の2016年6月のブログ「米国政府機関に対する新たなSofacy攻撃」で議論した亜種は、.xml、.pdf、.htm、.zipの文字列のリストから選択していました。
1つのパラメータの値、具体的にWrLqG1kMJXpgID1rODM=の値は、base64エンコードの暗号テキストであり、トロイの木馬内でハードコードされたUihklEpz4Vという文字列に復号されます。URLのデータを暗号化するために使用されるアルゴリズムは、当社が分析した以前のsamplesSofacyCarberpで使用されたアルゴリズムと同じです。POSTリクエスト内のデータは、要求内にあるbase64エンコード化されたユーザー エージェントです。
システムによるインターネット アクセスが確立されると、トロイの木馬は、詳細なシステム情報を収集して、C2サーバに送信します。収集した情報には、ストレージ ボリュームのシリアル番号に基づいた固有ID(idフィールド)、実行中プロセスのリスト、ネットワーク インターフェイス カード情報、ストレージ デバイス名(diskフィールド)、トロイの木馬のビルドID(buildフィールド、具体的には0x9104f000)があり、その後にシステムのスクリーンショットが続きます(imgフィールド)。このトロイの木馬のスクリーンショット機能は興味深く、スクリーンショットをとるのにWindows APIを使用しません。ユーザーがキーボードの「Take Screenshot(スクリーンショットをとる)」キー(VK_SCREENSHOT)を押下してスクリーンショットをクリップボードに保存する動作を、トロイの木馬のコードでシミュレートしています。そしてトロイの木馬は、クリップボード内のデータにアクセスして、このHTTPリクエストに含めるJPGイメージに変換します。このデータはすべて暗号化され、base64エンコード化されて、URLに対するHTTP POSTでC2サーバに送信されます。これは最初のインターネット接続確認と同じ構造です。
SofacyCarberpトロイの木馬は、リクエストに対するC2サーバのレスポンスを構文解析しデータを見つけ、トロイの木馬はこれを使用して、システムに対して2次的なペイロードをダウンロードします。トロイの木馬は、応答データ内の、[file]タグと[/file]タグ、および[settings]タグと[/settings]タグで囲まれたセクションを見つけます。これらは、当社が分析した他のSofacyCarberpサンプルで確認済みのセクションです。しかし、この亜種には、[shell]タグと[/shell]タグで囲まれた新しいセクションも含まれています。このトロイの木馬は、これらのセクションを構文解析して、トロイの木馬の動作を記述した特定のフィールドを見つけます。そこには、例えば、トロイの木馬がダウンロードされたファイルを保存する場所、トロイの木馬が2次ペイロードを実行する方法、トロイの木馬の通信先となるC2の場所などが記述されています。以下のフィールドがトロイの木馬によって構文解析されます。
- FileName: 指定されたファイル名
- PathToSave: 指定されたファイルへのパス
- Execute: 指定されたファイルによるプロセスの作成
- Delete: 指定されたファイルの削除
- LoadLib: 指定されたDLLの現行プロセスへのロード
- ReadFile: 指定されたファイルの読み取り
- Rundll: 指定されたエクスポート済み関数による指定されたDLLの実行
- IP: C2ロケーションの設定
- shell: 新しく作成されたスレッドでの追加コードの実行
shellフィールドに指定されたシェル セクションのデータは、base64エンコード化データで、生のアセンブリにデコードされます。このトロイの木馬がbase64デコードしたデータを使用してローカル スレッドを作成します。このことから当社は、提供されたデータは位置に依存しないコードまたはシェルコードである可能性が高いと推測しています。