Windows サービス¶
サービス構成記録の内容¶
Windows サービスとカーネル ドライバーは、各 SYSTEM コントロール セットの下で構成されます。レコードには、実行可能ファイル/ドライバーまたはサービス DLL、開始モード、サービス タイプ、アカウント、ロード順序グループ、遅延開始、エラー動作、および失敗後に Windows が実行するアクションの名前が付けられます。
攻撃者は、永続化、権限昇格、ドライバーの読み込み、横方向の移動のためにサービスを作成または変更します。正規のソフトウェアはまったく同じメカニズムを使用するため、パス、アカウント、署名、作成コンテキスト、および実行時の証拠が重要になります。
この証拠から判断できること: 解析したコントロールセットには、表示されたサービスやドライバの設定がありました。設定だけでは、そのサービスが正常に開始したとは証明できません。
場所¶
SYSTEM とそのトランザクション ログを収集します。システム 7045 やセキュリティ 4697 などのイベント ID はインストールを記録できます。サービス制御イベントとプロセス イベントは、実際の開始/実行をサポートできます。
分析時の注意点¶
ImagePathには、環境変数、引用符、引数、デバイス パス、またはスペースを含む引用符で囲まれていないパスを含めることができます。正規化する前に正確に保存してください。ServiceDllは、svchost.exeがホストするサービスにとって重要です。ImagePath単独ではホストのみに名前を付けることができます。StartType=automaticは、サービスが開始されたか、有効なままであることを証明しません。ObjectNameは構成されたアカウントであり、サービスをインストールしたユーザーである必要はありません。- ドライバーとユーザー モード サービスは、異なる
ServiceTypeフラグとパス規則を使用します。 - 失敗アクションでは、失敗後にサービス アカウントとしてコマンドを実行できます。これは見落としがちな永続サーフェスです。
- 他の制御セットは以前の構成を保存する場合があります。
IsCurrentControlSetを使用してください。
Juntei で解析する¶
Usage: juntei parse-registry services <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SYSTEM hives
-f, --file <FILE> Parse one SYSTEM hive
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Filtering:
--service <NAME> Only this service name
--all-control-sets Parse every ControlSet00N
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry services -f SYSTEM -o services.csv
juntei parse-registry services -f SYSTEM --all-control-sets -t jsonl \
| jq 'select(.FailureCommand != null or (.ImagePath? | test("temp|public"; "i")))'
出力フィールド¶
| フィールド | 解釈 |
|---|---|
Host, SourcePath |
システム ID と入力ハイブ。コレクション間で保存します。 |
ControlSet, IsCurrentControlSet |
ソース管理セットと、Select\Current がそれに名前を付けるかどうか。アクティブ状態の主張には電流を優先します。 |
ServiceName |
レジストリ キー/内部サービス名。イベントと Service Control Manager コマンドへの強力なピボット。 |
DisplayName, Description |
ユーザー向けのテキスト。リソース参照または攻撃者によって制御される可能性があります。 |
ImagePath |
構成された実行可能ファイル/ドライバー コマンド。引用符、引数、環境変数、デバイス パスを解析します。 |
ServiceDLL |
DLL はホスト サービスによってロードされました。多くの場合、共有プロセス サービスの実際のペイロード。 |
StartType, StartValue |
フレンドリー/raw スタート モード: ブート (0)、システム (1)、自動 (2)、手動 (3)、無効 (4)。 |
DelayedAutostart |
自動サービスは初期ブートフェーズ後に開始されます。まだ永続化可能です。 |
ServiceType, TypeValue |
デコードされた/生のフラグ: カーネル ドライバー、ファイル システム ドライバー、独自/共有プロセス、ユーザー サービスなど。 |
ErrorControl |
ブート/スタートのエラー処理レベル。主に運用コンテキスト。 |
ObjectName |
構成されたサービス アカウントまたはドライバー オブジェクト名。設置者の ID ではありません。 |
Group |
ロード順序グループ。ブート/システム ドライバーにとって特に重要です。 |
FailureResetPeriod |
失敗カウントがリセットされるまでの秒数。 4294967295 は決してしないことを意味します。 |
FailureCommand |
run_command 失敗アクション用に設定されたコマンド。高価値の永続フィールド。 |
FailureActions |
完全にデコードされたアクション リスト (restart、reboot、run_command、none) と遅延。 |
FailureActionType, FailureActionDelayMs |
最初のアクションはフィルタリングのために平坦化されています。完全なリストも調べてください。 |
FailureActionsRaw |
デコードが不完全または破損している場合の元のバイト。 |
KeyLastWrittenUTC |
サービス キーへの最後の変更。必ずしもインストール/開始時刻ではありません。 |
TransactionLogStatus, LogsApplied |
レジストリ再生コンテキスト。 |
Problems |
型の不一致、不正な形式の障害構造、または欠落しているか読み取り不可能なフィールド。 |
調査戦略¶
- 標準以外のパス、書き込み可能なディレクトリ、異常なアカウント、新しいキーの時刻、および失敗したコマンドを確認します。
- アナリスト マシンではなく、影響を受けるホストの構成を使用して環境変数を展開します。
- 実際の実行可能ファイル、または収集された場合は DLL のハッシュ/署名をチェックします。
- サービス名/パスをイベント 7045/4697、プロセス作成、Prefetch、
$MFT、および USN に関連付けます。 - 現在のコントロール セットと非現行のコントロール セットを比較して、変更/削除された永続性を確認します。