レジストリに保存されたPowerShellがメモリ内で暗号通貨マイニングを起動
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
多段階感染チェーンは高度な難読化技術を用いて、暗号通貨マイナーを展開します。この攻撃はペイロードをレジストリに格納し、ステガノグラフィを用いたPNGおよびWAVファイルとともにDNS TXTレコードを利用して次の段階を提供します。最終ペイロードは直接メモリに.NETアセンブリをロードし、XMRigエコシステムを通じて暗号通貨のマイニングを実行します。
調査
アナリストは繰り返されるPowerShell実行アラートを調査し、階層化されたペイロード隠蔽戦略を発見しました。感染チェーンは、画像のピクセルデータや音声ファイルのニブルなど、非伝統的なコンテナから悪意のあるコンテンツを再構築します。実行はレジストリに格納されたPowerShellスクリプトから複数の段階を経て進行し、最終的にはメモリに直接.NET暗号通貨マイナーをロードします。
緩和策
組織は厳格なPowerShell実行ポリシーを施行し、ペイロードストレージに関連する不審なレジストリ変更を監視すべきです。EDRソリューションはメモリ内.NETアセンブリの読み込みと異常なDNS TXTレコードクエリを検出すべきです。また、WinRing0.sysなどの無許可のカーネルモードドライバーを防ぐためにアプリケーション許可リストの実装が必要です。 WinRing0.sys の読み込みを防ぐ。
対応
悪意のある活動が検出された場合、影響を受けたホストは直ちに隔離し、さらなるC2通信と暗号通貨マイニングを停止すべきです。対策担当者は、無許可のスケジュールタスク、WMIサブスクリプション、およびMicrosoft Defenderの除外の法医学的チェックを行うべきです。また、ネットワークログは既知のC2ドメインや疑わしいDNS-over-HTTPSクエリに対してもレビューされるべきです。
攻撃の流れ
この部分はまだ更新中です。
検出
疑わしいPowerShell文字列 (via powershell)
PowerShellから疑わしい.NETメソッドを呼び出す (via powershell)
疑わしいプロセスによって作成されたイメージファイル (via file_event)
DoHとDNSコマンドとコントロールチャネル (via proxy)
IOC(HashMd5)を検出:レジストリ格納PowerShellからメモリ内暗号通貨マイニングへの多段階感染チェーン
IOC(SourceIP)を検出:レジストリ格納PowerShellからメモリ内暗号通貨マイニングへの多段階感染チェーン
IOC(DestinationIP)を検出:レジストリ格納PowerShellからメモリ内暗号通貨マイニングへの多段階感染チェーン
DNS-over-HTTPSとHTTP/HTTPS POST C2通信を検出 [Windowsネットワーク接続]
レジストリを基にしたPowerShell実行のためのWMI永続イベントサブスクリプション [Windowsレジストリエベント]
PowerShell難読化と秘密裏の実行 [Windows Powershell]
シミュレーション実行
-
攻撃の流れ&コマンド: 攻撃者は、侵害されたホストに長期的な持続性を確立しようとします。一般的な「Run」キーを使用する代わりに、より目立たないWMI永続イベントサブスクリプションを選択します。攻撃者はWMI
CommandLineEventConsumerを作成します。このコンシューマーはpowershell.exeを実行するように設定されています。コマンドラインの静的解析を回避するため、実際の悪意のあるペイロードや設定は非標準のレジストリパスに保存されます:HKLM:Softwareuf42a9660377vstdfehzr。WMIイベントがトリガーされると(ここではシステムイベントでシミュレーション)、PowerShellプロセスが起動し、その特定のレジストリキーを参照し、検出ルールをトリガーします。 -
リグレッションテストスクリプト:
# シミュレーションスクリプト: WMIレジストリを基にしたPowerShell実行 # このスクリプトはルールをトリガーするために必要な特定のレジストリキーとWMIサブスクリプションを作成します。 $regPath = "HKLM:Softwareuf42a9660377" $regValueName = "vstdfehzr" $regValueData = "Invoke-Expression (Get-ItemProperty -Path '$regPath$regValueName').Payload" # 1. 疑わしいレジストリキーと値を作成 if (-not (Test-Path $regPath)) { New-Item -Path $regPath -Force | Out-Null } New-ItemProperty -Path $regPath -Name $regValueName -Value "Write-Host '悪意のあるペイロードがトリガーされました!'" -PropertyType String -Force | Out-Null # 2. WMI永続イベントサブスクリプションを作成 # 一般的なイベント(例:システムの稼働時間/起動)にトリガーするフィルターを使用するか、コンシューマー作成によってシミュレーション $filterName = "Win32_LocalTimeFilter" $consumerName = "Win32_CommandLineConsumer" $subscriptionName = "WmiPersistenceSubscription" # フィルターを作成(シミュレーション目的で毎分トリガー) $filterArgs = @{ Name = $filterName QueryLanguage = "WQL" Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_LocalTime'" } $filter = Set-WmiInstance -Class __EventFilter -Arguments $filterArgs # コンシューマーを作成(特定のレジストリパスを参照するPowerShellコマンド) $commandLine = "powershell.exe -Command `"$regValueData`"" $consumerArgs = @{ Name = $consumerName CommandLineTemplate = $commandLine } $consumer = Set-WmiInstance -Class CommandLineEventConsumer -Arguments $consumerArgs # フィルターとコンシューマーをバインド Set-WmiInstance -Class __FilterToConsumerBinding -Arguments @{ Filter = $filter Consumer = $consumer } Write-Host "[+] シミュレーション: WMIサブスクリプションとレジストリキーが正常に作成されました。" Write-Host "[+] WMIイベントがPowerShell実行をトリガーするのを待っています…" # 注:実際の環境ではイベントを待ちます。 # テスト目的では、ルールはしばしば*作成*または*イベントトリガー*を探します。 -
クリーンアップコマンド:
# クリーンアップスクリプト Write-Host "[!] シミュレーションアーティファクトをクリーンアップ中…" # 1. WMIサブスクリプションを削除 Get-WmiObject -Namespace rootsubscription -Class __EventFilter -Filter "Name='Win32_LocalTimeFilter'" | Remove-WmiObject Get-WmiObject -Namespace rootsubscription -Class CommandLineEventConsumer -Filter "Name='Win32_CommandLineConsumer'" | Remove-WmiObject Get-WmiObject -Namespace rootsubscription -Class __FilterToConsumerBinding | Where-Object { $_.Filter -match "Win32_LocalTimeFilter" } | Remove-WmiObject # 2. レジストリキーを削除 Remove-Item -Path "HKLM:Softwareuf42a9660377" -Recurse -Force Write-Host "[+] クリーンアップ完了。"