GoldMax、GoldFinder、および Sibot: NOBELIUM のレイヤード パーシスタンスの分析

news

更新 [2021 年 4 月 15 日] : マルウェア分析レポートMAR-10327841-1.v1 で Cybersecurity & Infrastructure Security Agency (CISA) によってリリースされた、 ファイルドメイン、およびC2 デコイ トラフィックを含む新しい侵害の指標でこのブログを更新しました。 – サンシャトル.

マイクロソフトは、SolarWinds のサプライ チェーンを侵害し、他の複数の組織に影響を与えた国家規模のサイバー攻撃の背後にある脅威アクターに関する知識を拡大するために、パートナーおよびお客様と協力し続けています。以前に共有したように、攻撃者がバックドアとその他のマルウェア インプラントの両方を使用して、影響を受けるネットワークへの持続的なアクセスを確立することを確認しました。防御側コミュニティでの透明性とインテリジェンス共有への取り組みの一環として、攻撃者が使用する新しい戦術と手法を発見するたびに、分析と調査のリソースを更新し続けます。

貴族の紹介

Microsoft Threat Intelligence Center (MSTIC) は、SolarWinds、SUNBURST バックドア、TEARDROP マルウェア、および関連コンポーネントに対する攻撃の背後にいる攻撃者を NOBELIUM と名付けています。

最近の調査で、NOBELIUM の後期段階の活動で使用されている 3 つの新しいマルウェアが特定されました。このブログでは、防御者がこの脅威を検出、保護、および対応するのに役立つ、これらのマルウェア株の詳細な分析を提供します。私たちは、これらの脅威を理解し、共通の顧客を保護するために、引き続き FireEye と提携しています。 NOBELIUM で使用されたマルウェアの FireEye による分析はこちらです。

Microsoft は、これらの新しい攻撃者のツールと機能が侵害された顧客ネットワークで発見され、2020 年 8 月から 9 月まで使用されていたことを確認しました。さらに分析した結果、これらは 2020 年 6 月には侵害されたシステムに存在していた可能性があることが明らかになりました。これらのツールはマルウェアの新しい部分です。この俳優に固有のものです。それらは特定のネットワークに合わせて作成されており、攻撃者が侵害された資格情報または SolarWinds バイナリを介してアクセスを取得し、TEARDROP やその他のキーボード操作による横方向の移動後に導入されると評価されます。

これらの機能は、これまでに知られている NOBELIUM ツールや攻撃パターンとは異なり、攻撃者の洗練度を繰り返します。攻撃のすべての段階で、攻撃者は、ネットワークで一般的なソフトウェア ツール、展開、セキュリティ ソフトウェアとシステム、およびインシデント対応チームが頻繁に使用する手法に関する深い知識を示しました。この知識は、コマンド アンド コントロール (C2) インフラストラクチャの選択から、永続性を維持するために使用されるスケジュールされたタスクの命名まで、攻撃者の運用上の決定に反映されます。

この攻撃者は、標的ごとに固有のインフラストラクチャとツールを使用するという確立されたパターンと、侵害されたネットワーク上で持続性を維持するという運用上の価値により、この脅威の攻撃者の行動に対する調査が進むにつれて、追加のコンポーネントが発見される可能性があります。

新しい NOBELIUM マルウェア

ネットワークへのアクセスを取得した後、持続性を維持することは、攻撃者にとって重要です。 NOBELIUM は、SolarWinds ソフトウェアのバックドアに加えて、盗んだ資格情報を使用して電子メールやストレージなどのクラウド サービスにアクセスしたり、ID を侵害して仮想プライベート ネットワーク (VPN) やリモート アクセス ツールを介してネットワークへのアクセスを取得および維持したりすることが確認されています。 Microsoft は、攻撃者が新たに発見されたマルウェアの断片を使用して持続性を維持し、侵害後に非常に特定のターゲットを絞ったネットワークでアクションを実行し、インシデント対応中の初期検出を回避したと評価しています。

ゴールドマックス

GoldMax マルウェアは、システム管理ソフトウェアを偽装するスケジュールされたタスクとしてネットワーク上に存在することが発見されました。発生した事例では、スケジュールされたタスクは、環境に存在するソフトウェアにちなんで名付けられ、そのソフトウェアにちなんで名付けられた ProgramData 内のサブフォルダーを、同様の実行可能ファイル名で指していました。ただし、実行可能ファイルは GoldMax インプラントでした。

Go で記述された GoldMax は、アクターのコマンド アンド コントロール バックドアとして機能します。いくつかの異なる手法を使用して、そのアクションを難読化し、検出を回避します。マルウェアは、暗号化された構成ファイルをディスクに書き込みます。このファイル名と AES-256 暗号キーは、インプラントごとに一意であり、環境変数と実行されているネットワークに関する情報に基づいています。

GoldMax はその C2 で安全なセッション キーを確立し、そのキーを使用して C2 と安全に通信し、GoldMax 以外で開始された接続が悪意のあるトラフィックを受信して特定するのを防ぎます。 C2 は、疑似ランダムに生成された Cookie を介して、ネイティブ OS コマンドを含むさまざまな操作のために起動するコマンドを送信できます。ハードコーディングされた Cookie は各インプラントに固有であり、ランダムな文字列のように見えますが、攻撃者側の被害者と操作にマッピングされます。

観測された GoldMax C2 ドメインは評判が高く普及率が高く、多くの場合、ドメイン再販業者から取得されるため、Whois レコードは以前の登録からの作成日、または侵害された可能性のあるドメインを保持しています。この戦術は、NOBELIUM の運用上のセキュリティ戦略を補完します。これらのドメインは、認識された長期間のドメイン所有権に基づいて、セキュリティ製品やアナリストによって見落とされる可能性が高いためです。簡単に言えば、GoldMax C2 ドメインとして共有しているいくつかのドメインは、転売または侵害された後に初めて NOBELIUM に関連付けられます。

実行時に、GoldMax はシステムのネットワーク インターフェイスのリストを取得します。それができない場合、またはネットワーク インターフェイスが構成されていない場合、マルウェアは終了します。次に、ハードコードされた MAC アドレスc8:27:cc:c2:37:5aを持つネットワーク インターフェイスがあるかどうかを判断しようとします。その場合、終了します。

1 。 HardwareAddr.String() 呼び出し、ハードコードされた MAC アドレス、および os.Exit() 呼び出し

構成ファイル

GoldMax は、構成データをfeatures.dat.tmpという名前の暗号化ファイルに保存するように設計されています。ファイル名は GoldMax のバージョンによって異なりますが、観察されたすべての亜種で、構成ファイルは.tmpファイル拡張子を持ち、GoldMax と同じディレクトリに配置されています。 GoldMax を初めて実行すると、組み込みのデフォルト値のセットを使用して、ディスク上に構成ファイルが作成および設定されます。次に GoldMax を実行すると、埋め込まれた構成データを使用する代わりに、ファイル システムに保存されている構成ファイルから構成データが読み込まれます。

構成ファイルのデータは通常、GoldMax に埋め込まれたデフォルトの構成データと一致します。これは、埋め込まれたデータが最初に構成ファイルの作成に使用されたためです。ただし、GoldMax にはコマンド アンド コントロール機能が付属しており、オペレーターは構成データをその場で動的に更新できます。これが発生すると、GoldMax は構成ファイル内の既存のデータをオペレーターから受け取った新しい構成データで上書きするため、GoldMax が次に実行されるときは、構成データの最新バージョンを使用してランタイム設定を初期化します。 .

構成データは、AES-256 暗号化アルゴリズム、CFB 暗号化モード、および次の暗号鍵を使用して暗号化されます: 4naehrkz5alao2jd035zjh3j1v1dvyyc (鍵は GoldMax のバージョンによって異なります)。 AES で暗号化された構成データは、カスタム Base64 アルファベット「 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ 」を使用して Base64 エンコードされてから、ファイル システムの構成ファイルに格納されます。実行すると、GoldMax は構成データをデコード (Base64) および復号化 (AES-256) し、次の動的に生成されハードコードされた値 (「|」で区切られている) で構成されるカスタム データ構造を明らかにします。

2 。 GoldMax構成データのデータ構造

GoldMax は、上記のデータ構造の解析に進み、その中の値を使用して、ランタイム設定と、さまざまなコンポーネントで使用される変数を初期化します。

構成ファイルがシステムに存在しない場合 (つまり、初めて実行するとき)、GoldMax は動的に生成され、埋め込まれた値を使用して、上記のデータ構造を作成および設定します。次に、同じ AES 暗号化手法を使用してデータ構造を暗号化します。データ構造を暗号化した後、GoldMax は暗号化されたデータ構造を Base64 エンコードし、Base64 でエンコードされた文字列から「=」のすべてのインスタンスを削除します。次に、ファイル システム ( features.dat.tmpなど) に構成ファイルを作成し、Base64 でエンコードされたデータを構成ファイルに格納します。

有効化日

GoldMax の構成データには、上記の構成データ セクションに示されているように、ASCII Unix/エポック時間値として保存された実行のアクティブ化/トリガー日付が含まれています。構成データをロードした後、GoldMax は侵害されたシステムの現在の日付と時刻の値を、構成データのアクティブ化の日付と照合します。

3 。インライン Unix() 関数と、現在およびアクティベーションの日付/時刻の EPOCH 比較

構成データでアクティベーション日時の値が指定されている (つまり、「 0 」に設定されていない) 場合、アクティベーション日時が侵害されたシステムの現在の日時以前に発生すると、GoldMax は悪意のある活動を開始します。それ以外の場合、GoldMax は終了し、有効化日になるまで継続します。構成データでアクティベーション日が指定されていない場合 (つまり、フィールドが「 0 」に設定されている場合)、マルウェアはすぐに悪意のある活動を開始します。

調査中に分析した GoldMax のすべてのバージョンで、アクティベーション日は最初は「 0 」に設定されています。ただし、そのコマンド アンド コントロール機能により、オペレータは特定の C2 コマンドを使用してアクティベーション日を動的に更新できます。この場合、新しいアクティベーション日は構成ファイルに保存され、GoldMax が実行されるたびにチェックされます。

ネットワーク トラフィックのおとり

GoldMax には、おとりのネットワーク トラフィック生成機能が搭載されており、悪意のあるネットワーク トラフィックを一見無害なトラフィックで囲むことができます。この機能は、悪意のあるトラフィックと無害なトラフィックの区別をより困難にすることを目的としています。おとりネットワーク トラフィック機能が有効になっている場合 (構成データで「 1 」に設定)、GoldMax は、正当なドメイン名と C2 ドメイン名の混合を指す URL に対して、疑似乱数のおとり HTTP GET 要求 (最大 4 つ) を発行し、 /または IP アドレス。各リクエストの正確な URL は、ハードコードされた 14 の URL のリストから疑似ランダムに選択されます。 14 個の正当な URL と C2 URL で構成される URL リストの例を以下に示します。

4 。 GoldMax が最大 4 つを選択して HTTP リクエストを発行するハードコーディングされた URL

上記のように、一部のおとり URL は実際の C2 のドメイン名を指しています ( onetechcompany[.]comなど)。ただし、上記の URL で参照されている特定の HTTP リソース ( style.cssscript.jsicon.icoなど) は、GoldMax とそのC2。

各おとり HTTP 要求の Referer 値も、4 つの正当なドメイン名のリストから疑似ランダムに選択されます。たとえば、4 つのドメインのリストを構成するために、さまざまな組み合わせで以下を確認しました: www[.]mail[.]comwww[.]bing[.]comwww[.]facebook[.]comwww [.]google[.]comwww[.]twitter[.]comwww[.]yahoo[.]comなど。デモンストレーションの目的で、おとりの HTTP GET リクエストの例を以下に示します (Connection と User-エージェント HTTP ヘッダーとその値は、GoldMax によって各リクエストに手動で追加され、宛先 URL に関係なく、すべてのおとり HTTP リクエストで同じままです)。

5 。サンプルのおとり HTTP GET リクエスト

RSA セッション キー

実行サイクルの次のステップでは、GoldMax とその C2 サーバーの間で安全なセッション キーを確立します。 GoldMax はまず、各インプラントに固有のカスタム HTTP Cookie 値を含む HTTP GET 要求を送信して、C2 サーバーからセッション キーを要求します。 Cookie 値は、次の動的に生成され、ハードコーディングされた値で構成されます。

6 。 HTTP GET リクエストの HTTP Cookie 値

カスタム Cookie 値を含むリクエストの例を以下に示します。

7 .カスタム Cookie 値を使用した HTTP GET 要求のサンプル

上記の User-Agent と Connection の値は、HTTP 要求でハードコーディングされています。 Referer 値は、 www[.]mail[.]comwww[.]bing[.]comwww[.]facebook[. ]comwww[.]google[.]comwww[.]twitter[.]comwww[.]yahoo[.]comなど

上記のリクエストに対する応答として、GoldMax は、非常に具体的でハードコードされた ASCII 文字列 (「 uFLa12nFmKkjrmjj 」など) を含む HTTP 200 応答を受信することを想定しています。一見ランダムに見える文字列は、通常 10 ~ 16 バイトの長さです (先頭と末尾の空白がすべて削除された後)。これは、C2 と個々のインプラントの間の「共有秘密」として最もよく説明できます (文字列は、GoldMax のバージョンによって異なります)。これは、C2 サーバーが新しいセッション キーに対する GoldMax の要求を受信したことの確認として機能します。 GoldMax が予想される文字列を受信しない場合、ランダムな時間スリープし、C2 サーバーから予想される文字列を取得するために上記のプロセスを (無期限に) 繰り返すか、GoldMax プロセスが終了するまで繰り返します。

期待される文字列を受信した後、GoldMax は処理を続行する前に最大 14 秒間スリープします。構成データでおとりトラフィック オプションが有効になっている場合、GoldMax は疑似乱数の HTTP GET 要求を発行します (上記のおとりネットワーク トラフィックのセクションで説明したとおり)。次に、GoldMax は、新しいハードコーディングされた Cookie 値のセットを含む新しい HTTP GET 要求を C2 サーバーに発行します。

8 .ハードコーディングされた Cookie 値を示す HTTP GET 要求のサンプル

最初の HTTP GET 要求と 2 番目の HTTP GET 要求の間で観察された唯一の違いは、上で強調表示されている 2 番目の Cookie の値です (値の例: 最初の要求のiC0Pf2a48と、上記の 2 番目の要求のJ4yeUYKyeuNa2 )。リクエストに応じて、GoldMax は暗号化された RSA セッション キー (Base64 エンコード) を受け取ります。 GoldMax の各バージョンには、GoldMax が ( pem.Decode() を使用して) デコードし、( x509.ParsePKCS1PrivateKey()使用して) 解析する RSA 秘密鍵が含まれています。 GoldMax は、 rsa.DecryptOAEP()と解析された秘密鍵を使用して、C2 サーバーから受信した RSA 暗号化セッション キーを (RSA-OAEP を使用して) 復号化します。この時点から、GoldMax とその C2 サーバー間で送信されるデータを暗号化するためにセッション キーが使用されます。

C2 コマンド

セッション キーを確立した後、GoldMax は C2 サーバーにアクセスして、コマンドの受信、復号化 (AES-256)、解析、および実行を行います。暗号化された C2 コマンドを C2 サーバーから取得するために、GoldMax は HTTP GET 要求を送信します。この HTTP GET 要求には、セッション キーの確立プロセス中に使用される Cookie 値と一致する 1 つの Cookie 値のみが含まれます (以前のように、User-Agent および Connection ヘッダーと値はハードコードされています)。

9 。単一の Cookie 値を含む HTTP GET 要求のサンプル

上記のリクエストに応じて、GoldMax は暗号化 (AES-256) およびエンコード (カスタム Base64 アルファベットを使用した Base64) された C2 コマンドを受信します。コマンドは、GoldMax とその C2 サーバー間で確立されたセッション キーを使用して暗号化されます。 C2 コマンドをデコードして解読した後、GoldMax は C2 コマンドの解析に進みます。

C2 コマンドは一見ランダムな英数字の ASCII 文字列 (「 KbwUQrcooAntqNMddu4XRj 」など) として表され、各インプラントに固有ですが、C2 サーバーには認識されています。 C2 コマンドを使用すると、オペレーターは侵害されたシステムでファイルをダウンロードして実行したり、侵害されたシステムから C2 サーバーにファイルをアップロードしたり、侵害されたシステムで OS コマンドを実行したり、コマンド シェルを生成したり、GoldMax の構成データを動的に更新したりできます。 Goldmax 構成データに対するこれらの動的更新により、新しいアクティベーション日の設定、既存の C2 URL およびユーザー エージェント値の置き換え、おとりネットワーク トラフィック機能の有効化/無効化、PRNG で使用される番号範囲の更新が可能になります。

観測された GoldMax のすべてのバージョンが Go コンパイラ バージョン 1.14.2 (2020 年 4 月にリリース) でコンパイルされたことは注目に値します。観測されたすべてのバージョンで、GoldMax のメインの Go ソース コード ファイルは次のディレクトリにありました: /var/www/html/builds/ 。 GoldMax のコンパイル プロセス中に使用される Go パッケージとライブラリは、ほとんどが/var/www/html/go/src/ディレクトリの下に配置されていました (例: /var/www/html/go/src/net/http/http.go )。

忙しい

Sibot は、 VBScriptで実装された二重目的のマルウェアです。感染したマシンで持続性を実現し、リモート C2 サーバーからペイロードをダウンロードして実行するように設計されています。 VBScript ファイルには、正当な Windows タスクを偽装する名前が付けられ、侵害されたシステムのレジストリに保存されるか、難読化された形式でディスクに保存されます。次に、スケジュールされたタスクを介して VBScript が実行されます。

Sibot は、正規の侵害された Web サイトにアクセスして、 System32の下のフォルダーに DLL をダウンロードします。観測されたインスタンスでは、DLL はC:windowssystem32driversにダウンロードされ、 .sys拡張子で名前が変更されてから、 rundll32によって実行されます。スケジュールされたタスクは、MSHTA アプリケーションを呼び出して、難読化されたスクリプトを介して Sibot を実行します。この単純な実装により、ホストされている DLL を更新するだけで侵害されたエンドポイントを変更することなく、新しいコードをダウンロードして実行できるため、攻撃者のフットプリントを小さくすることができます。 DLL をホストするために使用される侵害された Web サイトは、侵害されたネットワークごとに異なり、医療機器メーカーや IT サービス プロバイダーの Web サイトが含まれます。

私たちは、このマルウェアの 3 つの亜種を確認しており、それらはすべて難読化されています。

  • バリアント Aは、3 つの中で最も単純です。レジストリ キーHKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionsibotの下の既定のレジストリ値に、第 2 段階のスクリプトのみをインストールします。
  •  バリアント Bは、Sibot という名前のスケジュールされたタスクを登録し、毎日実行するようにプログラムされています。このタスクは、Windows によってファイルC:WindowsSystem32TasksMicrosoftWindowsWindowsUpdatesibotに保存され、次のコマンドラインを毎日実行します。

このコマンドラインで参照されているレジストリ キーには、第 2 段階のスクリプトが含まれています。

  • バリアント Cは、第 2 段階のスクリプトのスタンドアロン バージョンです。ただし、亜種 A の第 2 段階のスクリプトはレジストリから実行するように設計されていますが、この亜種はファイルから実行するように設計されています。

10 .槍の変種

第二段階のスクリプト

第 2 段階のスクリプトの目的は、リモート サーバーからペイロードをダウンロードして実行することです。スクリプトは、次のパラメーターを使用してカスタマイズできます。

  • ペイロードを実行するコマンドライン
  • ペイロードがインストールされるディレクトリ
  • ダウンロードするペイロードを含む C2 サーバーの URL
  • ダウンロードに使用する HTTP リクエスト (GET など)

スクリプトが実行されると、まず、WMI クラスRootMicrosoftHomenetHNet_Connectionによって提供されるインターフェイスを利用して、マシン上に存在する LAN 接続に関連付けられた GUID を取得します。 LAN 接続が利用できない場合、スクリプトはデフォルトでハードコードされた GUID になります。この GUID は、後で C2 に伝達されます。攻撃者がこの GUID を使用して、脅威が望ましい環境 (つまり、LAN 接続が利用可能な実際のマシン) で実行されていることを確認した可能性があります。第 2 段階のスクリプトの次のステップでは、マシンがプロキシを使用するように構成されているかどうかを確認し、構成されている場合はプロキシのアドレスを取得します。このスクリプトは、StdRegProv WMI クラスを使用して、レジストリ キーHKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsProxyServerから構成データを読み取り、有効なプロキシ サーバーを抽出します。

この時点で、スクリプトは C2 サーバーへの HTTP 接続を確立します。ユーザー エージェントと接続 GUID を HTTP ヘッダー変数として設定し、HTTP 要求を送信します。スクリプトの両方のバージョンで、要求は GET です。サーバーの応答が、マルウェアが送信したものと同じ GUID のみで構成されている場合、スクリプトはそれ自体を削除します。バリアント A の第 2 段階のスクリプトの場合、スクリプトは、スクリプトがインストールされているレジストリ キーを削除します。バリアント C の場合、スクリプトは実行中のファイルを削除します。代わりに、サーバーが GUID 以外のデータで応答した場合、第 2 段階のスクリプトはデータを復号化し、ファイルとして保存します。第 2 段階のスクリプトの両方のバリアントで、ペイロードは .SYS 拡張子を持つ DLL であり、 %windir%system32driversフォルダーに保存されます。最後に、スクリプトは Win32_Process WMI クラスを使用して、 rundll32.exeユーティリティを介してペイロード DLL を実行します。

スクリプトがスクリプト ホスト プロセス ( wscript.exeなど) のコンテキストで実行されている間、WMI インターフェイスを介して実行されるアクションは、WMI ホスト プロセス ( WmiPrvSe.exe ) から発生します。これにより、アクションの起点 (スクリプト ホスト) とその実行 (WMI ホスト) の間のプロセス チェーンが事実上断ち切られ、イベントを実際の起点まで追跡することがより困難になります。また、フォレンジック分析は、第 2 段階のスクリプトの実行と WMI を介して実行されるイベントとの間に相関関係がないことによって妨げられます。

次の Python スクリプトを使用して、このレポートで分析した Sibot サンプルで観察されたエンコードされた文字列をデコードできます。

パイソン
エンコードされた = '<エンコードされた文字列'
デコード済み = ''

私は= 0
while i < len(encoded):
a = int(chr(ord(encoded[i]) - 17))
私は += 1
b = int(chr(ord(encoded[i]) - 17))
a * 10 + b < 32 の場合:
私は += 1
c = int(chr(ord(エンコードされた[i]) - 17))
デコードされた += chr(a * 100 + b * 10 + c)

そうしないと:
デコードされた += chr(a * 10 + b)
私は += 1

印刷(デコード)

ゴールドファインダー

Go で記述された別のツールである GoldFinder は、パケットがハードコーディングされた C2 サーバーに到達するために必要なルートまたはホップをログに記録するカスタム HTTP トレーサ ツールとして使用された可能性が最も高いです。起動されると、マルウェアはハードコーディングされた IP アドレス (例: hxxps://185[.]225[.]69[.]69/ ) に対して HTTP 要求を発行し、HTTP 応答を平文のログ ファイル (例: loglog ) に記録します。 .txtが現在の作業ディレクトリに作成されます)。 GoldFinder は、次のハードコードされたラベルを使用して、リクエストとレスポンスの情報をログ ファイルに保存します。

  • ターゲット: C2 URL
  • StatusCode: HTTP レスポンス/ステータス コード
  • ヘッダー: HTTP 応答ヘッダーとその値
  • データ: C2 から受信した HTTP 応答からのデータ

サンプルの日付を使用したログ エントリの例を以下に示します。

11 。サンプル ログ エントリ

応答が HTTP 200 (OK) 応答ではなく、HTTP Location フィールド (リダイレクトを示す) が含まれている場合、GoldFinder は、HTTP 200 応答を受信するまでリダイレクトを再帰的にたどってログに記録し、HTTP 200 応答を受信した時点で終了します。応答に Location ヘッダーがあり、Location 値が文字列「http」で始まる場合、GoldFinder は Location URL (つまり、リダイレクト URL) を抽出し、リダイレクト URL に対して新しい HTTP GET 要求を発行します。リクエストとそのレスポンスをプレーンテキストのログ ファイルに再度記録します。

12 .サンプル ログ ファイル

GoldFinder が上記のリクエストに応答して HTTP 200 ステータス コードを受信すると、これ以上リダイレクトされないことを示し、終了します。それ以外の場合は、99 回まで、または HTTP 200 応答を受信するまでのいずれか早い方で、リダイレクトを再帰的にたどります。

起動すると、GoldFinder は、すべての HTTP プロキシ サーバーと、HTTP 要求がネットワークの内外を通過して目的の C2 サーバーに到達するネットワーク セキュリティ デバイスなどの他のリダイレクタを識別できます。侵害されたデバイスで使用すると、GoldFinder を使用して攻撃者に発見の潜在的なポイントを通知したり、GoldMax との C2 通信などの他のアクションをログに記録したりできます。

GoldFinder は、2020 年 4 月にリリースされた Go 1.14.2 を使用して、次のパスを持つfinder.goという名前の Go ファイルからコンパイルされました: /tmp/finder.go 。 GoldFinder のコンパイル プロセス中に使用される Go パッケージとライブラリは、ほとんどが/var/www/html/go/src/ディレクトリの下に配置されていました (例: /var/www/html/go/src/net/http/http.go )。

永続的な技術に対する包括的な保護

高度な NOBELIUM 攻撃には、特定、調査、および対応するための包括的なインシデント対応が必要です。 https://aka.ms/nobeliumで Microsoft から最新の情報とガイダンスを入手してください。

Microsoft Defender ウイルス対策は、このブログで説明されている新しい NOBELIUM コンポーネントを次のマルウェアとして検出します。

  • トロイの木馬:Win64/GoldMax.A!dha
  • TrojanDownloader:VBS/Sibot.A!dha
  • トロイの木馬:VBS/Sibot.B!dha
  • トロイの木馬:Win64/GoldFinder.A!dha
  • 動作:Win32/Sibot.C

Microsoft Defender ウイルス対策でクラウドによる保護と自動サンプル送信を有効にすると、人工知能と機械学習が新しい未知の脅威を迅速に特定して阻止できるようになります。 改ざん防止機能により、攻撃者がセキュリティ サービスを停止するのを防ぎます。 Attack surface reduction ルール、具体的には、 Block executable files from running until they meet a prevalence, age, or trusted list criteriaルールは、脅威アクターによって導入された新しいマルウェアや攻撃ツールをブロックするのに役立ちます。

13 .脅威と脆弱性の管理におけるセキュリティの推奨事項

Microsoft Defender ウイルス対策による新しいマルウェアの検出は、Microsoft Defender セキュリティ センターでアラートとして報告されます。さらに、Microsoft Defender for Endpoint のエンドポイント検出および応答機能は、これらの NOBELIUM コンポーネントに関連する悪意のある動作を検出し、次のタイトルのアラートとして表示されます。

  • GoldMax マルウェア
  • Sibot マルウェア
  • GoldFinder マルウェア

これらの NOBELIUM コンポーネントでは、さまざまな攻撃に関連する動作の検出を示す次のアラートも生成されます。

  • リモート サービスへの不審な接続
  • 疑わしい Rundll32 プロセスの実行
  • 疑わしい PowerShell コマンドライン
  • 疑わしいファイルまたはスクリプトが悪意のあるレジストリ キーにアクセスした

これらの新しく表面化されたコンポーネントに関するインテリジェンスは、Microsoft 365 Defender が統合する NOBELIUM に関する情報に基づいています。 Microsoft 365 Defender の豊富な調査ツールにより、セキュリティ運用チームはこの攻撃に包括的に対応できます。 Microsoft 365 Defender を使用して NOBELIUM 攻撃を特定、調査、対応するための包括的なガイダンスを入手してください

 

 

侵害の痕跡 (IOC)

この攻撃の性質上、ほとんどのサンプルは発見された各ネットワークに固有のものですが、Microsoft はパブリック リポジトリで入手可能なこれらのサンプルがこの脅威に関連していることを確認しています。

タイプ 脅威名 インジケータ
SHA-256 ゴールドマックス 70d93035b0693b0e4ef65eb7f8529e6385d698759cc5b8666a394b2136cc06eb
SHA-256 ゴールドマックス 0e1f9d4d0884c68ec25dec355140ea1bab434f5ea0f86f2aade34178ff3a7d91
SHA-256 ゴールドマックス 247a733048b6d5361162957f53910ad6653cdef128eb5c87c46f14e7e3e46983
SHA-256 ゴールドマックス f28491b367375f01fb9337ffc137225f4f232df4e074775dd2cc7e667394651c
SHA-256 ゴールドマックス 611458206837560511cb007ab5eeb57047025c2edc0643184561a6bf451e8c2c
SHA-256 ゴールドマックス b9a2c986b6ad1eb4cfb0303baede906936fe96396f3cf490b0984a4798d741d8
SHA-256 ゴールドマックス bbd16685917b9b35c7480d5711193c1cd0e4e7ccb0f2bf1fd584c0aebca5ae4c
SHA-256 ゴールドファインダー 0affab34d950321e3031864ec2b6c00e4edafb54f4b327717cb5b042c38a33c9
SHA-256 シボット 7e05ff08e32a64da75ec48b5e738181afb3e24a9f1da7f5514c5a11bb067cbfb
SHA-256 シボット acc74c920d19ea0a5e6007f929ef30b079eb2836b5b28e5ffcc20e68fa707e66
IPアドレス ゴールドマックスとゴールドファインダー 185[.]225[.]69[.]69/
ドメイン ゴールドマックスとゴールドファインダー srfnetwork[.]org
ドメイン ゴールドマックス レイウェブ[.]com
ドメイン ゴールドマックス ワンテックカンパニー [.]com

2021 年 4 月 15 日に追加された追加の IOC:

タイプ 脅威名 インジケータ
SHA-256 ゴールドマックス 4e8f24fb50a08c12636f3d50c94772f355d5229e58110cccb3b4835cb2371aec
SHA-256 ゴールドマックス ec5f07c169267dec875fdd135c1d97186b494a6f1214fb6b40036fd4ce725def
SHA-256 ゴールドマックス 478b04c20bbf6717d10ee978b99339b7c4664febc8bcfdaf86c3f0fbfc83a5c5
SHA-256 ゴールドファインダー f2a8bdf135caca0d7359a7163a4343701a5bdfbc8007e71424649e45901ab7e2
SHA-256 ゴールドファインダー 4dec3eeefcec013f142386d5c54099d3daa2b48d559434db1d4f2078d704da1b
SHA-256 ゴールドファインダー 6b01eeef147d9e0cd6445f90e55e467b930df2de5d74e3d2f7610e80f2c5a2cd
SHA-256 ゴールドファインダー 0f04f199327d0d076815190dc024f4a6b0f27899d50d28e94662820ab9c945d2
SHA-256 シボット e9ddf486e5aeac02fc279659b72a1bec97103f413e089d8fabc30175f4cdbf15
SHA-256 シボット cb80a074e5fde8d297c2c74a0377e612b4030cc756baf4fff3cc2452ebc04a9c
ドメイン ゴールドマックス メガツールキット[.]com
ドメイン ゴールドマックスとゴールドファインダー Nikeoutletinc[.]org

GoldMax C2 おとりトラフィック

上記で詳述したように、GoldMax はおとりトラフィックを使用して、通常のネットワーク トラフィックに溶け込みます。以下は、正当なトラフィックと C2 クエリを混合するために GoldMax が使用するパターンを示すいくつかの例です。

185[.]225[.]69[.]69 C2のおとり 「onetechcompany」の C2 おとり 「reyweb」C2おとり
hxxps[:]//cdn[.]mxpnl[.]com/ hxxps[:]//コード[.]jquery[.]com/ hxxps[:]//コード[.]jquery[.]com/
hxxps[:]//コード[.]jquery[.]com/ hxxps[:]//play[.]google[.]com/log?」 hxxps[:]//cdn[.]cloudflare[.]com/
hxxps[:]//cdn[.]google[.]com/ hxxps[:]//fonts[.]gstatic[.]com/s/font.woff2″ hxxps[:]//cdn[.]google[.]com/
hxxps[:]//fonts[.]gstatic[.]com/s/font.woff2 hxxps[:]//cdn[.]google[.]com/ hxxps[:]//cdn[.]jquery[.]com/
hxxps[:]//ssl[.]gstatic[.]com/ui/v3/icons hxxps[:]//www.gstatic[.]com/images/? hxxps[:]//cdn[.]mxpnl[.]com/
hxxps[:]//www.gstatic[.]com/images/? hxxps[:]//onetechcompany [.]com/style.css hxxps[:]//ssl[.]gstatic[.]com/ui/v3/icons
hxxps[:]//185[.]225[.]69[.]69/style.css hxxps[:]//onetechcompany [.]com/script.js hxxps[:]//reyweb[.]com/style.css
hxxps[:]//185[.]225[.]69[.]69/script.js hxxps[:]//onetechcompany [.]com/icon.ico hxxps[:]//reyweb[.]com/script.js
hxxps[:]//185[.]225[.]69[.]69/icon.ico hxxps[:]//onetechcompany [.]com/icon.png hxxps[:]//reyweb[.]com/icon.ico
hxxps[:]//185[.]225[.]69[.]69/icon.png hxxps[:]//onetechcompany [.]com/scripts/jquery.js hxxps[:]//reyweb[.]com/icon.png
hxxps[:]//185[.]225[.]69[.]69/scripts/jquery.js hxxps[:]//onetechcompany [.]com/scripts/bootstrap.js hxxps[:]//reyweb[.]com/scripts/jquery.js
hxxps[:]//185[.]225[.]69[.]69/scripts/bootstrap.js hxxps[:]//onetechcompany [.]com/css/style.css hxxps[:]//reyweb[.]com/scripts/bootstrap.js
hxxps[:]//185[.]225[.]69[.]69/css/style.css hxxps[:]//onetechcompany [.]com/css/bootstrap.css hxxps[:]//reyweb[.]com/css/style.css
hxxps[:]//185[.]225[.]69[.]69/css/bootstrap.css hxxps[:]//reyweb[.]com/css/bootstrap.css

2021 年 4 月 15 日に追加された C2 おとりトラフィック:

「megatoolkit」C2 おとり 「nikeoutletinc」C2のおとり
https://cdn.mxpnl.com/ https://cdn.mxpnl.com/
https://www.google-analytics.com/ https://cdn.bootstrap.com/
https://cdn.jquery.com/ https://www.google-analytics.com/
https://cdn.cloudflare.com/ https://play.google.com/log?
https://code.jquery.com/ https://cdn.jquery.com/
https://play.google.com/log? https://code.jquery.com/
https://megatoolkit.com/style.css https://nikeoutletinc.org/style.css
https://megatoolkit.com/script.js https://nikeoutletinc.org/script.js
https://megatoolkit.com/icon.ico https://nikeoutletinc.org/icon.ico
https://megatoolkit.com/icon.png https://nikeoutletinc.org/icon.png
https://megatoolkit.com/scripts/jquery.js https://nikeoutletinc.org/scripts/jquery.js
https://megatoolkit.com/scripts/bootstrap.js https://nikeoutletinc.org/scripts/bootstrap.js
https://megatoolkit.com/css/style.css https://nikeoutletinc.org/css/style.css
https://megatoolkit.com/css/bootstrap.css https://nikeoutletinc.org/css/bootstrap.css

高度なハンティング クエリ

Rundll32.exe .sys イメージが参照によって読み込まれる

名前で明示的に .sys ファイルをロードしている rundll32.exe を探します。

Microsoft 365 セキュリティ センターでクエリを実行します

DeviceImageLoadEvents
| where InitiatingProcessFileName =~ 'rundll32.exe'
| where InitiatingProcessCommandLine has_any('.sys,','.sys ')
| where FileName endswith '.sys'
| project Timestamp, DeviceId, InitiatingProcessParentFileName, InitiatingProcessFolderPath, InitiatingProcessFileName, InitiatingProcessCommandLine, FolderPath, FileName

インライン VBScript を実行する Rundll32.exe

特定のインライン VBScript コマンドを実行する rundll32.exe を探します。

Microsoft 365 セキュリティ センターでクエリを実行します

DeviceProcessEvents
| where FileName =~ 'rundll32.exe'
| where ProcessCommandLine has 'Execute'
and ProcessCommandLine has 'RegRead'
and ProcessCommandLine has 'window.close'
| project Timestamp, DeviceId, InitiatingProcessParentFileName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, ProcessCommandLine

Azure Sentinel でクエリを実行します ( Github リンク):

SecurityEvent
| where EventID == 4688
| where Process =~ 'rundll32.exe'
| where CommandLine has_all ('Execute','RegRead','window.close')
| project TimeGenerated, Computer, Account, Process, NewProcessName, CommandLine, ParentProcessName, _ResourceId

レジストリに格納された VBScript ペイロード

レジストリに格納されている VBScript ペイロードを検索します。具体的には、CurrentVersion レジストリ パスのサブキー内に格納され、Run および RunOnce レジストリ キーなどの一般的な AutoRun 永続化場所を除外します。

Microsoft 365 セキュリティ センターでクエリを実行する

DeviceRegistryEvents
| where RegistryKey endswith @'MicrosoftWindowsCurrentVersion'
| where RegistryValueType == 'String'
| where strlen(RegistryValueData) >= 200
| where RegistryValueData has_any('vbscript','jscript','mshtml,','mshtml ','RunHTMLApplication','Execute(','CreateObject','RegRead','window.close')
| where RegistryKey !endswith @'SoftwareMicrosoftWindowsCurrentVersionRun'
and RegistryKey !endswith @'SoftwareMicrosoftWindowsCurrentVersionRunOnce'
| project Timestamp, DeviceId, InitiatingProcessFileName, InitiatingProcessCommandLine, RegistryKey, RegistryValueName, RegistryValueData

Azure Sentinel でクエリを実行します ( Github リンク):

let cmdTokens0 = dynamic(['vbscript','jscript']);
let cmdTokens1 = dynamic(['mshtml','RunHTMLApplication']);
let cmdTokens2 = dynamic(['Execute','CreateObject','RegRead','window.close']);
SecurityEvent
| where TimeGenerated >= ago(14d)
| where EventID == 4688
| where CommandLine has @'MicrosoftWindowsCurrentVersion'
| where not(CommandLine has_any (@'SoftwareMicrosoftWindowsCurrentVersionRun', @'SoftwareMicrosoftWindowsCurrentVersionRunOnce'))
// If you are receiving false positives, then it may help to make the query more strict by uncommenting the lines below to refine the matches
//| where CommandLine has_any (cmdTokens0)
//| where CommandLine has_all (cmdTokens1)
| where CommandLine has_all (cmdTokens2)
| project TimeGenerated, Computer, Account, Process, NewProcessName, CommandLine, ParentProcessName, _ResourceId

ドメイン IOC ルックアップ

識別された C2 ドメインを探します。

Azure Sentinel でクエリを実行する ( GitHub リンク)

let DomainNames = dynamic(['onetechcompany.com', 'reyweb.com', 'srfnetwork.org']);
let IPList = dynamic(['185.225.69.69']);
let IPRegex = '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1 ,3}';
(ユニオンはファジー=真です
(共通セキュリティログ
| |ここで、SourceIP in (IPList) または DestinationIP in (IPList) または DestinationHostName in~ (DomainNames) または RequestURL has_any (DomainNames) または Message has_any (IPList)
| |メッセージを * '(' DNSName ')' で解析 *
| |拡張 MessageIP = 抽出 (IPRegex, 0, メッセージ)
| | extends IPMatch = case(SourceIP in (IPList), "SourceIP", DestinationIP in (IPList), "DestinationIP", MessageIP in (IPList), "Message", RequestURL in (DomainNames), "RequestUrl", "NoMatch")
| |タイムスタンプを拡張 = TimeGenerated、IPCustomEntity = case(IPMatch == "SourceIP"、SourceIP、IPMatch == "DestinationIP"、DestinationIP、IPMatch == "Message"、MessageIP、"NoMatch")、AccountCustomEntity = SourceUserID
)、
(DnsEvents
| | IPAddresses in (IPList) または Name in~ (DomainNames)
| | extend DestinationIPAddress = IPAddresses、DNSName = Name、Host = Computer
| |タイムスタンプを拡張 = TimeGenerated、IPCustomEntity = DestinationIPAddress、HostCustomEntity = Host
)、
(VMコネクション
| | SourceIp in (IPList) または DestinationIp in (IPList) または RemoteDnsCanonicalNames has_any (DomainNames)
| | RemoteDnsCanonicalNames を * '["' DNSName '"]' で解析します *
| | extends IPMatch = case( SourceIp in (IPList), "SourceIP", DestinationIp in (IPList), "DestinationIP", "None")
| |タイムスタンプを拡張 = TimeGenerated、IPCustomEntity = case(IPMatch == "SourceIP"、SourceIp、IPMatch == "DestinationIP"、DestinationIp、"NoMatch")、HostCustomEntity = コンピューター
)、
(オフィス活動
| |どこで ClientIP in (IPList)
| |タイムスタンプを拡張 = TimeGenerated、IPCustomEntity = ClientIP、AccountCustomEntity = UserId
)、
(DeviceNetworkEvents
| | RemoteUrl has_any (DomainNames) または RemoteIP in (IPList)
| |タイムスタンプを拡張 = TimeGenerated、DNSName = RemoteUrl、IPCustomEntity = RemoteIP、HostCustomEntity = DeviceName
)、
(AzureDiagnostics
| |ここで、ResourceType == "AZUREFIREWALLS"
| |ここで、カテゴリ == "AzureFirewallDnsProxy"
| | msg_s を "DNS Request: " ClientIP ":" ClientPort " - " QueryID " " Request_Type " " Request_Class " " Request_Name ". " Request_Protocol " " Request_Size " " EDNSO_DO " " EDNS0_Buffersize " " Responce_Code " " Responce_Flags " " Responce_Size " " で解析しますResponse_Duration
| |ここで、Request_Name has_any (DomainNames)
| |タイムスタンプを拡張 = TimeGenerated、DNSName = Request_Name、IPCustomEntity = ClientIP
)、
(AzureDiagnostics
| |ここで、ResourceType == "AZUREFIREWALLS"
| |ここで、カテゴリ == "AzureFirewallApplicationRule"
| | msg_s を Protocol 'request from ' SourceHost ':' SourcePort ' to ' DestinationHost ':' DestinationPort ' で解析します。アクション:' アクション
| | where isnotempty(宛先ホスト)
| |どこで DestinationHost has_any (DomainNames)
| |タイムスタンプを拡張 = TimeGenerated、DNSName = DestinationHost、IPCustomEntity = SourceHost
)
)

参考: https ://www.microsoft.com/en-us/security/blog/2021/03/04/goldmax-goldfinder-sibot-analyzing-nobelium-malware/

Comments

Copied title and URL