Windows 서비스¶
서비스 구성이 기록하는 내용¶
Windows 서비스와 커널 드라이버는 각 SYSTEM 제어 집합(control set) 아래에 구성됩니다. 레코드에는
실행 파일/드라이버 또는 서비스 DLL, 시작 모드, 서비스 유형, 계정, 로드 순서 그룹, 지연된 시작,
오류 처리 방식, 그리고 실패 후 Windows가 수행하는 동작이 기록됩니다.
공격자는 지속성 확보, 권한 상승, 드라이버 로드 및 측면 이동을 위해 서비스를 생성하거나 수정합니다. 정상 소프트웨어도 완전히 동일한 메커니즘을 사용하므로 경로, 계정, 서명, 생성 컨텍스트 및 런타임 증거가 중요합니다.
가장 타당한 결론: 분석한 제어 집합에 서비스/드라이버가 표시된 대로 구성되어 있었습니다. 구성만으로는 서비스가 성공적으로 시작되었음을 증명하지 못합니다.
위치¶
SYSTEM을 트랜잭션 로그와 함께 수집하십시오. System 7045 및 Security 4697 같은 이벤트 ID는 설치를
기록할 수 있으며, 서비스 제어 및 프로세스 이벤트는 실제 시작/실행을 뒷받침할 수 있습니다.
분석 시 주의 사항¶
ImagePath에는 환경 변수, 따옴표, 인수, 장치 경로 또는 공백이 포함된 따옴표 없는 경로가 들어 있을 수 있습니다. 정규화하기 전에 원래 값을 그대로 보존하십시오.svchost.exe에서 호스팅되는 서비스에서는ServiceDll이 매우 중요합니다.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 |
시스템 식별 정보와 입력 하이브입니다. 여러 수집본에 걸쳐 보존하십시오. |
ControlSet, IsCurrentControlSet |
원본 제어 집합과 Select\Current가 이를 가리키는지 여부입니다. 활성 상태를 주장할 때는 현재 제어 집합을 우선하십시오. |
ServiceName |
레지스트리 키/내부 서비스 이름입니다. 이벤트 및 서비스 제어 관리자(Service Control Manager) 명령으로 피벗하기 좋은 강력한 기준입니다. |
DisplayName, Description |
사용자에게 표시되는 텍스트입니다. 리소스 참조이거나 공격자가 제어하는 값일 수 있습니다. |
ImagePath |
구성된 그대로의 실행 파일/드라이버 명령입니다. 따옴표, 인수, 환경 변수 및 장치 경로를 분석하십시오. |
ServiceDLL |
호스트 서비스가 로드하는 DLL입니다. 공유 프로세스 서비스에서는 이것이 실제 페이로드인 경우가 많습니다. |
StartType, StartValue |
사람이 읽기 쉬운 형태/원시 값의 시작 모드입니다: boot (0), system (1), automatic (2), manual (3), disabled (4). |
DelayedAutostart |
초기 부팅 단계 이후에 시작되는 자동 서비스입니다. 여전히 지속성에 이용될 수 있습니다. |
ServiceType, TypeValue |
디코딩된/원시 플래그입니다: 커널 드라이버, 파일 시스템 드라이버, 단독/공유 프로세스, 사용자 서비스 등. |
ErrorControl |
부팅/시작 시 오류 처리 수준입니다. 주로 운영상의 컨텍스트입니다. |
ObjectName |
구성된 서비스 계정 또는 드라이버 개체 이름입니다. 설치자의 신원이 아닙니다. |
Group |
로드 순서 그룹으로, 특히 boot/system 드라이버에서 중요합니다. |
FailureResetPeriod |
실패 횟수가 초기화되기까지의 초 단위 시간입니다. 4294967295는 초기화되지 않음을 의미합니다. |
FailureCommand |
run_command 실패 동작에 구성된 명령입니다. 지속성 분석에서 가치가 높은 필드입니다. |
FailureActions |
디코딩된 전체 동작 목록(restart, reboot, run_command, none)과 지연 시간입니다. |
FailureActionType, FailureActionDelayMs |
필터링을 위해 평탄화한 첫 번째 동작입니다. 전체 목록도 확인하십시오. |
FailureActionsRaw |
디코딩이 불완전하거나 손상된 경우의 원본 바이트입니다. |
KeyLastWrittenUTC |
서비스 키의 마지막 변경 시간이며, 반드시 설치/시작 시간인 것은 아닙니다. |
TransactionLogStatus, LogsApplied |
레지스트리 재생(replay) 컨텍스트입니다. |
Problems |
형식 불일치, 잘못된 실패 구조, 누락되었거나 읽을 수 없는 필드입니다. |
조사 전략¶
- 비표준 경로, 쓰기 가능한 디렉터리, 비정상적인 계정, 새로운 키 시간 및 실패 명령을 검토하십시오.
- 환경 변수는 분석가의 머신이 아니라 대상 호스트의 구성을 기준으로 확장하십시오.
- 실제 실행 파일이나 DLL이 수집되었다면 해시와 서명을 확인하십시오.
- 서비스 이름/경로를 이벤트 7045/4697, 프로세스 생성, Prefetch,
$MFT및 USN과 상관 분석하십시오. - 현재 제어 집합과 현재가 아닌 제어 집합을 비교하여 변경/삭제된 지속성을 찾으십시오.