金融機関を狙うAPT-Q-27に関連する疑わしいマルウェアの分析
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
このキャンペーンは、画像ダウンロードとして偽装されたフィッシングリンクから始まる多段階感染チェーンを特徴としており、実際には .pif ドロッパーを配信します。最初のペイロードは、後に取り消された正当な証明書で署名された重度に難読化された.NET実行可能ファイルで、初期段階では評判ベースのコントロールをすり抜けるのを助けます。実行後、Windows Updateキャッシュに似たディレクトリ内にコンポーネントを配置し、その後、メモリのみの実行に移行してディスク上の証拠を減らします。最終的な結果は、ステルス性と回避を優先するモジュール式バックドアであり、サービスベースの永続性を通じてアクセスを維持しながら、一般的な署名検出を避けようとします。
調査
CyStackアナリストは、初期の配信URLをstorage.googleapis.comのインフラにたどり、隠しキャッシュのようなフォルダからステージングされたアーティファクト—updat.exe、crashreport.dll、updat.logを回収しました。ドロッパーは、Runレジストリ値を介した基本的な永続性を確立し、その後長期実行を保持するためにWindowsサービス「Windows Eventn」を登録します。バックドアは、解析防止チェックの実装、特権昇格の試み、UAC関連の設定を変更してユーザープロンプトを減らします。コマンドアンドコントロールのトラフィックはポート15628で観測され、調査者はファイル名、レジストリパス、サービス識別子、特徴的なユーザーエージェントストリングを含む検出準備のインジケーターを抽出しました。
軽減策
.pifファイルをブロックする厳格なダウンロード管理を適用し、「イメージ」リンクが静かに実行可能ファイルを配信できないようにコンテンツタイプの検証を強制します。実行時に証明書の取り消し状態とタイムスタンプを検証することでコードサイニングの施行を強化します。隠された「Windows Update風」のキャッシュディレクトリを監視し、予想外のRunキーの追加や疑わしいサービス作成イベントに対して警告を行います。UACポリシー設定をロックダウンし、関連するレジストリポリシーキーへの変更を定期的に監査します。
対応
活動が検出された場合は、即座にエンドポイントを隔離し、フォレンジックアーティファクト(メモリイメージ、レジストリハイブ、ファイルシステム証拠)を収集してから修復へ進みます。悪意あるWindows Eventnサービスを終了および削除し、特に隠されたステージングファイル、潜在的なミューテックスの使用、DLLのサイドローディングの痕跡について、回収したインジケーターを環境内でスキャンします。潜在的に暴露された資格情報をリセットし、悪用の特権アカウント活動をレビューし、抽出されたIOCでEDR/SIEMの検出を更新します。
"graph TB %% クラス定義セクション classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef malware fill:#ff9999 classDef process fill:#ccccff classDef operator fill:#ff9900 %% ノード定義 action_phishing["<b>アクション</b> – <b>T1566.002 フィッシング:スピアフィッシングリンク</b><br/><b>説明</b>:攻撃者が画像を指しているように見えるURLを送信し、悪意のある.pifファイルを配信します。<br/><b>アーティファクト</b>:画像リンクとして配信される悪意のある.pif"] class action_phishing action action_user_exec["<b>アクション</b> – <b>T1204.002 ユーザー実行:悪意のあるファイル</b><br/><b>説明</b>:被害者がリンクをクリックして.pifファイルを実行します。<br/><b>アーティファクト</b>:実行された.pif"] class action_user_exec action malware_dropper["<b>マルウェア</b> – ドロッパー(署名付き)<br/><b>テクニック</b>:T1553.002 コードサイニング<br/><b>説明</b>:ドロッパーと付随するDLLは、有効な証明書で署名されて評判のチェックを回避"] class malware_dropper malware tool_masq_filetype["<b>ツール</b> – 偽装された.pifファイル<br/><b>テクニック</b>:T1036.008 ファイルタイプの偽装<br/><b>説明</b>:.pifは.jpg拡張子に改名されて画像として見えるように"] class tool_masq_filetype tool tool_masq_location["<b>ツール</b> – フェイクアップデートキャッシュフォルダー<br/><b>テクニック</b>:T1036.005 正当なリソース名または位置の一致<br/><b>説明</b>:Windows Updateキャッシュを模した隠しフォルダーにペイロードを配置"] class tool_masq_location tool process_proxy["<b>プロセス</b> – 署名されたシステムバイナリ<br/><b>テクニック</b>:T1218 システムバイナリプロキシの実行<br/><b>説明</b>:正当な署名されたバイナリがドロッパーをアラームなしで起動"] class process_proxy process malware_obfusc["<b>マルウェア</b> – 難読化されたドロッパー<br/><b>テクニック</b>:T1027.007 動的API解決<br/><b>説明</b>:複数レイヤーのBase64とランタイムストリングデコーディングを使用してURLとコマンドを隠す"] class malware_obfusc malware tool_hide_dir["<b>ツール</b> – 隠されたステージングディレクトリ<br/><b>テクニック</b>:T1564.001 隠されたファイルとディレクトリ<br/><b>説明</b>:ディレクトリが隠され、インデックスが付けられていないようにマークされる"] class tool_hide_dir tool action_persistence["<b>アクション</b> – T1547.014 アクティブセットアップ永続性<br/><b>説明</b>:SystemOptimizerという名前のログオン永続性のためのRunレジストリキーを生成する"] class action_persistence action malware_injection["<b>マルウェア</b> – CrashReport DLL<br/><b>テクニック</b>:T1055.001 DLLインジェクション(サイドローディング)<br/><b>説明</b>:updat.exeが悪意のあるcrashreport.dllをサイドローディングで読み込む"] class malware_injection malware process_appcert["<b>プロセス</b> – AppCert DLLの読み込み<br/><b>テクニック</b>:T1546.009 AppCert DLLs<br/><b>説明</b>:ステージングされたパスからのcrashreport.dllの読み込みが正規のプロセスで悪意のあるコードをトリガーします"] class process_appcert process action_uac_bypass["<b>アクション</b> – T1548.002 ユーザーアカウント制御のバイパス<br/><b>説明</b>:バックドアがUACレジストリキーを変更し、高権限で再実行する"] class action_uac_bypass action action_clear_logs["<b>アクション</b> – T1070.001 Windowsイベントログのクリア<br/><b>説明</b>:バックドアがアクティビティを隠すためにWindowsイベントログを削除する"] class action_clear_logs action %% フローを示す接続 action_phishing –>|に導く| action_user_exec action_user_exec –>|実行する| malware_dropper malware_dropper –>|使用する| tool_masq_filetype malware_dropper –>|使用する| tool_masq_location malware_dropper –>|により起動| process_proxy malware_dropper –>|含む| malware_obfusc malware_obfusc –>|に保存| tool_hide_dir tool_hide_dir –>|有効にする| action_persistence action_persistence –>|作成する| process_proxy malware_dropper –>|をロード| malware_injection malware_injection –>|に注入| process_appcert process_appcert –>|トリガーする| action_uac_bypass action_uac_bypass –>|クリアする| action_clear_logs %% スタイリング class action_phishing,action_user_exec,action_persistence,action_uac_bypass,action_clear_logs action class malware_dropper,malware_obfusc,malware_injection malware class tool_masq_filetype,tool_masq_location,tool_hide_dir tool class process_proxy,process_appcert process "
攻撃の流れ
検出
安全なデスクトッププロンプトの無効化試行(via registry_event)
表示
可能性のある永続化ポイント[ASEPs – ソフトウェア/NTUSERハイブ] (via registry_event)
表示
UAC無効化試行(via registry_event)
表示
実行可能バイナリの異常な拡張子(via process_creation)
表示
同意管理者の無効化(via registry_event)
表示
APT-Q-27に関連する金融機関を標的とした疑惑のあるマルウェアの分析: パート1用のIOC(SourceIP)を検出
表示
APT-Q-27に関連する金融機関を標的とした疑惑のあるマルウェアの分析: IOC(HashMd5)を検出
表示
APT-Q-27に関連する金融機関を標的とした疑惑のあるマルウェアの分析: パート2用のIOC(SourceIP)を検出
表示
APT-Q-27に関連する金融機関を標的とした疑惑のあるマルウェアの分析: パート1用のIOC(DestinationIP)を検出
表示
APT-Q-27に関連する金融機関を標的とした疑惑のあるマルウェアの分析: パート2用のIOC(DestinationIP)を検出
表示
.pifファイルを介した悪質なドロッパーの実行とローダーステージ [Windowsプロセス作成]
表示
wk.goldeyeuu.ioとポート15628を使用したC2通信の検出 [Windowsネットワーク接続]
表示
シミュレーション実行
前提条件: テレメトリーおよびベースラインのプリフライトチェックが成功している必要があります。
理由: このセクションは、検出ルールをトリガーするよう設計された敵の手法(TTP)の正確な実行を詳述します。コマンドとナラティブは、特定されたTTPを直接反映し、検出ロジックが期待する正確なテレメトリーを生成することを目的としています。抽象的または無関係な例は誤診につながります。
-
攻撃のナラティブとコマンド:
Windowsホストに初期の足がかりを得た攻撃者は、APT‑Q‑27インフラストラクチャへの隠密なC2トンネルを確立したいと考えています。カスタムPowerShellバックドアを使用して、オペレーターはハードコーディングされたドメイン wk.goldeyeuu.io を解決し、ポート 15628でTCP接続を開きます。トラフィックはファイアウォールによってアウトバウンドで許可され、この接続は非標準ポートを使用しているため、ファイアウォールログに際立って表示されます。攻撃者はこのチャネルを介してエンコードされたコマンドをストリーミングし、さらなるペイロードを実行します(T1059)。ステップバイステップ:
- C2ドメインを解決してDNSが動作することを確認します。
- 解決されたIPへのポート15628の生のTCPソケットを開きます。
- 接続性を確認するためにシンプルな「ping」ペイロードを送信します(ビーコンのシミュレーション)。
-
リグレッションテストスクリプト:
# ----------------------------------------------------------------------------------------------------------------- # ポート15628でのwk.goldeyeuu.ioへのC2通信をシミュレート # ----------------------------------------------------------------------------------------------------------------- # 悪意のあるドメインを解決(Red Teamにより制御されるIPを返すことが期待されます) $c2Domain = "wk.goldeyeuu.io" try { $c2IP = [System.Net.Dns]::GetHostAddresses($c2Domain) | Where-Object { $_.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork } | Select-Object -First 1 } catch { Write-Error "DNS resolution failed for $c2Domain" exit 1 } # 非標準ポート15628でのTCP接続を確立 $c2Port = 15628 $client = New-Object System.Net.Sockets.TcpClient try { $client.Connect($c2IP.IPAddressToString, $c2Port) Write-Host "Connected to $c2Domain ($($c2IP.IPAddressToString)):`$c2Port" } catch { Write-Error "Failed to connect to $c2Domain on port $c2Port" exit 1 } # シンプルなビーコンペイロード(ASCII "PING")を送信し、接続を終了 $stream = $client.GetStream() $payload = [System.Text.Encoding]::ASCII.GetBytes("PING") $stream.Write($payload, 0, $payload.Length) $stream.Flush() Write-Host "Beacon payload sent." # クリーンアップ $stream.Close() $client.Close() # ----------------------------------------------------------------------------------------------------------------- -
クリーンアップコマンド:
# テスト環境の防御策として残存するTCP接続を確実に閉じる Get-NetTCPConnection -RemotePort 15628 -State Established | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force }