Windowsの永続化メカニズムについてのメモ。
Windowsの永続化メカニズムは多岐に渡るが、個人的に押さえておきたいものをまとめた。
Run / RunOnce キー
以下のレジストリ・キーを編集することによって任意のプログラムやコマンドをユーザーのログオン時に実行できる。
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLMのRun/RunOnceキーに登録された処理は、そのコンピュータを利用する全てのユーザーのログオン時に実行される。HKCUのRun/RunOnceキーに登録された処理は、特定のユーザーのログオン時のみ実行される。
Runキーと異なりRunOnceキーに登録された処理は一度実行されると削除されるが、スクリプトなどによってRunOnceキーの削除後に、再度同様のRunOnceキーを作成することによって処理を永続化させることが出来る。
Winlogon Shell / Winlogon Userinit キー
以下のレジストリ・キーを編集することによって任意のプログラムやコマンドをユーザーのログオン時に実行できる。
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
HKEY_USERS\< SID >\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
Active Setup キー
以下のレジストリ・キーを編集することによって任意のプログラムやコマンドをユーザーのログオン時またはシステム起動時に実行できる。
HKLM\Software\Microsoft\Active Setup\Installed Components\< GUID >\StubPath
HKEY_USERS\< SID >\Software\Microsoft\Active Setup\Installed Components\< GUID >\StubPath
スケジュールタスク
スケジュールタスクを作成して指定した日時や曜日に任意のプログラムやコマンドを実行できる。At.exe
やSchtasks.exe
によってスケジュールタスクを作成できる。
Windows サービス
Windows サービスを作成し起動条件をAutomaticにすることによって、システムの起動時に任意のプログラムやDLLやコマンドを実行できる。Sc.exe
によってWindows サービスを作成できる。サービスの設定は以下のレジストリ・キーに保存される。
HKLM\System\CurrentControlSet\services\<service name>
Startup フォルダ
\Start Menu\Programs\Startup
フォルダにファイルを配置することによって、任意のファイルをユーザーのログオン時に実行できる。
WMI イベント
WMI イベントを作成し、Event Filterにイベント発生の条件を、Event Consumerにイベント発生の条件が満たされたときに実行するアクションの内容を指定して、任意のファイルやペイロードを永続的に実行できる。詳しくはこちら。
COMオブジェクト・ハイジャック
既存のCOMオブジェクトをハイジャックすることによって任意のファイルを永続的に実行できる。COMオブジェクト・ハイジャックについてはこちら。
BITS ジョブ
Background Intelligent Transfer Service (BITS)のジョブを作成し、/SetNotifyCmdLine
スイッチに任意のファイルやコマンドを指定することによってBITS ジョブの完了後にそれらのファイルやコマンドを実行できる。
具体的には
- BITSジョブを作成する。その際、必ずジョブが失敗するような処理を記述する。例えば存在しないURLへのファイル・ダウンロード要求など。
/SetNotifyCmdLine
スイッチに任意のファイルやコマンドを指定する。
/SetNotifyCmdLine
はジョブの完了後に任意のコマンドを実行するためのスイッチである。ジョブが何のエラーもなく完了すれば/SetNotifyCmdLine
は一回実行されるだけだが、上記のジョブは存在しないURLへのファイル・ダウンロード要求を行うため、必ず失敗する。そのためシステムはファイルのダウンロードが成功するまで定期的にジョブを実行し、その都度/SetNotifyCmdLine
で指定されたコマンドが実行される (ドキュメントによるとジョブが失敗した場合、BITSは失敗したジョブを定期的に再実行する)。詳しくはこちら。
参考
McGraw-Hill Education発行 Incident Response & Computer Forensics Third Edition P.324 - 334