PureLogs、PawsRunnerステガノグラフィーを通じて配信
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
このキャンペーンは、環境変数を設定し起動するJavaScriptローダーを運ぶTXZアーカイブを含むフィッシングメールに依存しています。 conhost.exe をヘッドレスモードで。ローダーはPawsRunnerとして知られる.NETアセンブリを復号し、ステガノグラフィ技術を使用して隠された暗号化コンテンツを含むPNG画像を取得します。これらの画像から、マルウェアは最終ペイロードであるPureLogs.NETインフォスティーラーを抽出します。動作を開始すると、PureLogsはHTTPSを介してリモートのコマンド&コントロールサーバーに接続し、ブラウザの認証情報とシステム情報を流出させます。
調査
分析により、JavaScriptローダーがプロセスの環境変数からコマンドを取得し、隠しウィンドウフラグを使用してPowerShellを起動し、AESで暗号化されたペイロードを復号して.NETリフレクションを通じて実行することが示されました。PawsRunnerはネットワークAPIとユーザーエージェント文字列を3つずつ切り替えてPNGファイルを取得し、次に iTXt and IEND チャンクを解析して隠されたデータを見つけ、RC4で次の段階を復号します。PureLogsは次にTripleDESとGzipを使用してダウンローダーDLLをロードし、特定のエンドポイントにTLS保護されたHTTPリクエストを行い、被害者システムからブラウザ関連のデータを広範に収集します。
緩和策
組織はメールゲートウェイでTXZファイルをブロックし、 conhost.exe 見えないウィンドウで実行されているインスタンスを監視し、-w hidden フラグで起動されたPowerShellを検出するべきです。また、セキュリティチームはPawsRunnerとPureLogsの署名を展開し、特定されたコマンド&コントロールドメインとIPアドレスへのアウトバウンドトラフィックを制限し、未署名の.NETアセンブリの実行を制限するべきです。可能であれば、疑わしい受信画像ファイルに対してステガノグラフィー検出を適用するべきです。 flag. Security teams should also deploy signatures for both PawsRunner and PureLogs, restrict outbound traffic to the identified command-and-control domain and IP address, and limit execution of unsigned .NET assemblies. Where possible, steganography detection should be applied to suspicious inbound image files.
対応
この活動が検出された場合、影響を受けたエンドポイントを隔離し、怪しい conhost.exe およびPowerShellのプロセスを終了し、システムからドロップされた.NETバイナリを削除します。妥協された認証情報は無効化し、多要素認証を強制し、保存されたブラウザのパスワードをリセットします。調査担当者はさらに、追加のコマンド&コントロール通信が発生していないことを確認するためにネットワークフォレンジックスを実行し、再感染を防ぐために対策を適用するべきです。
"graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#cccccc classDef process fill:#ffdd99 classDef malware fill:#ff9999 %% Nodes initial_phishing["<b>行動</b> – <b>T1566.001 スピアフィッシング添付ファイル</b><br/>攻撃者が悪意のあるペイロードを含むTXZアーカイブ添付ファイルをつけたフィッシングメールを送信します。"] class initial_phishing action malicious_archive["<b>マルウェア</b> – <b>名前</b>: 悪意のあるTXZアーカイブ<br/><b>説明</b>: 初期のJavaScriptペイロードを配信するために使用されるアーカイブ。"] class malicious_archive malware user_execution["<b>行動</b> – <b>T1204.004 ユーザー実行</b><br/>被害者がアーカイブを抽出し、JavaScriptが隠されモードでPowerShellを実行し、環境変数からコマンドを読み取ります。"] class user_execution action powershell_loader["<b>プロセス</b> – <b>名前</b>: PowerShellローダー<br/><b>説明</b>: ディスクに書き込まずに反射を介して復号された.NETアセンブリを実行します。"] class powershell_loader process defense_compile["<b>行動</b> – <b>T1027.004 配送後にコンパイル</b><br/>復号された.NETアセンブリが反射を介してメモリにロードされます。"] class defense_compile action defense_compress["<b>行動</b> – <b>T1027.015 圧縮</b><br/>ペイロードはAESで復号され、Gzipで解凍されます。"] class defense_compress action defense_stego["<b>行動</b> – <b>T1027.003 ステガノグラフィー</b><br/>ローダーはPNG画像をダウンロードし、iTXt/IENDチャンクから隠された暗号化データを抽出します。"] class defense_stego action masquerade_icon["<b>行動</b> – <b>T1036.008 偽装</b><br/>バイナリは猫の画像をアプリケーションアイコンとして使用して無害に見せかけます。"] class masquerade_icon action c2_encrypted["<b>行動</b> – <b>T1573 暗号化されたチャネル</b><br/>さらなるC2通信はAES-256で暗号化されたペイロードと共にHTTPS経由で行われます。"] class c2_encrypted action credential_access["<b>行動</b> – <b>T1555.003 ウェブブラウザからの資格情報</b><br/>PureLogsはブラウザを列挙し、保存されたパスワード、クッキー、仮想通貨ウォレットファイルを抽出します。"] class credential_access action purelogs_tool["<b>ツール</b> – <b>名前</b>: PureLogs<br/><b>説明</b>: ブラウザデータを収集する資格情報ダンプユーティリティ。"] class purelogs_tool tool collection_archive["<b>行動</b> – <b>T1560.003 収集データのアーカイブ</b><br/>収集されたデータは、Gzipで圧縮され、エクスフィルトできるようにAESで暗号化されます。"] class collection_archive action exfiltration_http["<b>行動</b> – <b>T1048.003 暗号化されていない非C2プロトコルでのエクスフィルト</b><br/>データは複数の外部エンドポイントにHTTP POSTリクエストを通じて送信されます。"] class exfiltration_http action %% Connections initial_phishing –>|配信する| malicious_archive malicious_archive –>|トリガーする| user_execution user_execution –>|実行する| powershell_loader powershell_loader –>|実行する| defense_compile defense_compile –>|使う| defense_compress defense_compress –>|使う| defense_stego defense_stego –>|可能にする| masquerade_icon masquerade_icon –>|設立する| c2_encrypted c2_encrypted –>|可能にする| credential_access credential_access –>|使う| purelogs_tool credential_access –>|収集する| collection_archive collection_archive –>|エクスフィルトされる方法| exfiltration_http %% Class Assignments class initial_phishing action class malicious_archive malware class user_execution action class powershell_loader process class defense_compile action class defense_compress action class defense_stego action class masquerade_icon action class c2_encrypted action class credential_access action class purelogs_tool tool class collection_archive action class exfiltration_http action "
攻撃フロー
検出
隠されたPowerShellコマンドラインでの実行の可能性 (cmdline経由)
表示
LOLBAS WScript / CScript (プロセス生成経由)
表示
疑わしい.NETメソッドのPowerShellからの呼び出し (powershell経由)
表示
PowerShell難読化インジケータの可能性 (powershell経由)
表示
LOLBAS Conhost (cmdline経由)
表示
PureLogsを検出するためのIOC (HashSha256): PawsRunnerステガノグラフィーによる配信
表示
PureLogsを検出するためのIOC (SourceIP): PawsRunnerステガノグラフィーによる配信
表示
PureLogsを検出するためのIOC (DestinationIP): PawsRunnerステガノグラフィーによる配信
表示
環境変数からのPowerShell AES復号化 [Windows PowerShell]
表示
隠されたConhostとPowerShell経由での悪意のあるプロセス実行の検出 [Windowsプロセス作成]
表示
シミュレーション実行
前提条件: テレメトリー&ベースラインの事前チェックが合格している必要があります。
-
攻撃のシナリオとコマンド
- ステージ1 – 暗号化されたペイロードの準備
- 攻撃者は小さなダミーペイロード (
「秘密」) を作成し、既知のキーを使用してAES-256で暗号化し、Base64エンコードした暗号文を環境変数に保存します。ENC_PAYLOAD.
- 攻撃者は小さなダミーペイロード (
- ステージ2 – PowerShell復号ローダーの実行
- 1行で
ENC_PAYLOADを読み込み、Base64文字列をデコードし、.NETのAesCryptoServiceProviderを構築し、キー/IVを導入、データを復号し、オプションでプレーンテキストを実行します。
- 1行で
- ステージ3 – 検出テレメトリーの生成
- PowerShellコマンドに「AES」という語が含まれており (例:
New-Object System.Security.Cryptography.AesCryptoServiceProvider), detection ruleを満たすEventID 4104としてログに記録されます。
- PowerShellコマンドに「AES」という語が含まれており (例:
- ステージ1 – 暗号化されたペイロードの準備
-
回帰テストスクリプト
# ------------------------------------------------- # PowerShell AES Decryption Simulation (検出をトリガー) # ------------------------------------------------- # 1. 固定された256ビットキーとIVの定義 (デモ目的) $key = [byte[]](0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20) $iv = [byte[]](0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0) # 2. プレーンテキストペイロード (例) $plain = [System.Text.Encoding]::UTF8.GetBytes("秘密のデータ") # 3. AESを使用してペイロードを暗号化 (CBC, PKCS7) $aes = [System.Security.Cryptography.AesCryptoServiceProvider]::new() $aes.Key = $key $aes.IV = $iv $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 $encryptor = $aes.CreateEncryptor() $cipherBytes = $encryptor.TransformFinalBlock($plain,0,$plain.Length) $cipherB64 = [Convert]::ToBase64String($cipherBytes) # 4. 暗号文を環境変数に保存 # 5. 復号ローダー - ログに記録される正確な行 ("AES"を含む) $loader = @" `$enc = [System.Environment]::GetEnvironmentVariable('ENC_PAYLOAD') `$bytes = [Convert]::FromBase64String(`$enc) `$aes = New-Object System.Security.Cryptography.AesCryptoServiceProvider `$aes.Key = $($key -join ',') `$aes.IV = $($iv -join ',') `$decryptor = `$aes.CreateDecryptor() `$plain = `$decryptor.TransformFinalBlock(`$bytes,0,`$bytes.Length) `$result = [System.Text.Encoding]::UTF8.GetString(`$plain) Write-Output `"Decrypted: `$result`" "@ # ローダーを実行 (EventID 4104としてキャプチャされます) Invoke-Expression $loader -
クリーンアップコマンド
# 環境変数を削除 # セッションから一時変数をクリア Remove-Variable -Name key,iv,plain,cipherBytes,cipherB64,loader -ErrorAction SilentlyContinue
シミュレーション後の検証
- 実行 検証クエリ (上記のKQL例) ただしフィルタリングは必要です
ScriptBlockTextに"AES"を含むもの検出が発動したことを確認します。 - SIEMでアラートの詳細を確認し、アラート名がルールと一致していること (もし定義されている場合) および深刻度が 高.
として報告されていることを確認します
- 終結の言葉
- このルールは、単純な「AES」使用シナリオを成功裏に検出します。
対抗者は単語を分割することで回避できます (例えば、対抗者は単語を分割することで回避できます (例えば、 - , .NETクラスを反射を経由してロードする、または復号化をコンパイルされたバイナリ内で行う)。 行動インジケータの 強化によって、
AesCryptoServiceProvider環境変数の暗号文としての使用、高エントロピーの文字列、オブジェクトの生成、およびその後のオブジェクトの生成、およびその後の