본문 바로가기

Program/토스뱅크 사이버보안 엔지니어 부트캠프(공격&방어 기술)

[System] svchost

1. svchost

1.1 svchost 개요

svchost.exe: Windows 서비스들을 실행하는 호스트 프로세스(Host Process for Windows Services)

많은 Windows 서비스는 실행 파일(.exe)이 아닌 DLL(Dynamic Link Library) 형태로 제공되는데, DLL은 독립적으로 실행될 수 없기 때문에 이를 대신 실행하고 관리하는 호스트 프로세스가 필요하다. svchost.exe는 이러한 DLL 기반 서비스들을 불러와 실행하는 역할을 한다.

 

*DDL

https://xsreem.tistory.com/211

 

[System] DLL

1. DLL 개요1.1 DLL+ 로드 라이브러리 1.2 IAT1.3 EAT1.4 DLL Injectioniat가 변조 대상, 공격 벡터여기를 변조하여 임의의 것을 올릴 수 있음 1.5 DLL Ejection 2. dll이 exe가 동작하는 방식 확인2.0 설명- 대상: loader.

xsreem.tistory.com

 

 

 

1.2 정상 동작 시나리오

1) svchost.exe 시작

2) 레지스트리에서 ServiceDll 경로 읽기

3) LoadLibrary()로 ServiceDLL.dll 로드 (메모리 매핑)

4) GetProcAddress()로 ServiceMain 찾기

5) ServiceMain 호출

6) 서비스 실행 중 - DLL은 메모리에 계속 로드됨

 

 

 

2. svchost 서비스 등록 및 생성

2.1 DLL권한 설정

1) SYSTEM 계정에 읽기 권한 부여

SYSTEM 계정이 ServiceDLL.dll을 읽을 수 있게 하기 위해 권한을 설정한다.

*icacls: Windows에서 파일·폴더의 접근 권한(ACL, Access Control List)을 조회하고 수정하는 명령어

icacls [파일경로] /grant "[사용자]:[권한]"

 

2) 권한 확인

 

 

2.2 서비스 등록

1) Svchost 그룹 등록

svchost.exe가 사용할 서비스 그룹 "MyServiceGroup"을 생성하고, 그 그룹에 “MyTestService”를 속하게 만든다.

reg add [레지스트리 키 경로] /v [이름] /t [타입] /d [데이터] /f
명령어 구성 해석
reg add 레지스트리 키/값을 추가하는 명령어
"HKLM\...\Svchost" Svchost 그룹을 관리하는 레지스트리 위치
/v MyServiceGroup 값 이름(Value Name) → 만들 그룹명
/t REG_MULTI_SZ 값 타입(Multi String)
/d MyTestService 실제 데이터(서비스 이름)
/f 강제로 덮어쓰기(Confirm 없이 적용)

 

 

2) 서비스 생성

svchost.exe를 이용한 DLL 기반 서비스 MyTestService 를 생성한다.

sc create [서비스이름] binPath= "[실행프로그램]" type= [own/share] start= [auto/demand /disabled]
명령어 구성 해석
sc create 새로운 Windows 서비스를 생성
MyTestService 서비스 이름(Service Name)
binPath= 서비스를 실행할 실제 실행 파일 경로 지정
"svchost.exe -k MyServiceGroup" svchost.exe를 실행하되, MyServiceGroup 그룹으로 동작
type= share 공유 서비스(SHARE PROCESS) → 여러 서비스가 한 svchost에서 동작 가능
start= demand 시작 유형: 수동 (SC START로 시작해야 함)

 

 

3) ServiceDll 경로 등록(Parameters 생성)

svchost가 MyTestService를 실행할 때 로드해야 하는 DLL이 C:\lab\ServiceDLL.dll 임을 지정한다.

reg query [레지스트리 경로]

 

명령어 구성 해석
reg add 레지스트리 값 추가
"HKLM\SYSTEM\...\Parameters" 서비스 설정 정보(Parameter) 저장 위치
/v ServiceDll Svchost가 로드할 DLL 이름(고정 키)
/t REG_EXPAND_SZ 문자열 타입(환경 변수 포함 가능)
/d "C:\lab\ServiceDLL.dll" DLL 실제 파일 경로
/f 강제 덮어쓰기

 

 

4) 등록 확인

등록해둔 DLL 경로(ServiceDll)가 제대로 반영되었는지 확인한다.

*reg query: 레지스트리 값을 조회하는 명령어

reg query [레지스트리 경로]

 

 

2.3 C:\Temp 디렉토리 생성 및 권한 설정

C:\Temp 아래의 모든 파일/폴더에 SYSTEM의 Full 권한(F)을 상속한다.

권한 해석
(OI) Object Inherit → 파일에 상속
(CI) Container Inherit → 하위 폴더에 상속

 

 

2.4 서비스 시작 및 확인

1) MyTestService 서비스 시작

출력 항목 출력값 해석
SERVICE_NAME MyTestService 시작한 서비스 이름
종류(Type) 30 WIN32 WIN32_SHARE_PROCESS (svchost 기반 DLL 서비스)
상태(Status) 2 START_PENDING 서비스가 실행 준비 중(초기화 단계)
상태 플래그 NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN 시작 과정에서는 중지/일시정지 불가, 종료 신호 무시
WIN32_EXIT_CODE 0 (0x0) Win32 계층에서 오류 없음
SERVICE_EXIT_CODE 0 (0x0) 서비스(ServiceMain) 내부 오류 없음
검사점(Checkpoint) 0x0 시작 초기 상태(아직 진행 단계 증가 전)
WAIT_HINT 0x7d0 서비스가 완전히 시작될 때까지 예상 대기 시간(2000ms)
PID 18548  8360
(이전에 캡쳐한거라 PID 다름)
이 서비스를 실행하는 svchost.exe의 프로세스 ID
플래그(Flags) 없음 특수 플래그 없음 (정상)

 

 

2) 상태 확인

서비스 시작 출력값과 위와 동일하다.

 

 

3) 로그 확인

ServiceDLL.dll 내부 코드가 기록한 로그 파일을 확인한다.

로그 내용 해석
ServiceMain called DLL이 svchost에 의해 성공적으로 시작됨
Worker started 서비스 작업 스레드 생성 완료
Service running Windows 서비스 상태 RUNNING 전환 성공
Service is running... 스레드 루프 정상 반복 중(서비스 계속 실행 중)

 

 

 

3. 프로세스 확인

3.1 cmd

ServiceDLL.dll을 로드하고 있는 프로세스를 출력한다.

출력 항목 출력값 해석
이미지 이름(Image Name) svchost.exe 해당 DLL을 로드한 프로세스 이름
PID 8360 ServiceDLL.dll을 로드한 svchost.exe의 프로세스 ID
모듈(Module) ServiceDLL.dll 해당 프로세스가 메모리에 로드한 DLL 이름

 

*tasklist: 전체 프로세스 목록을 출력하는 명령어

옵션 설명 추가
/m 각 프로세스가 로드한 모든/특정 모듈(DLL) 목록 표시 /m [ModuleName] : 특정 DLL(모듈)을 로드한 프로세스를 표시
/fi 필터 조건을 적용하여 목록을 제한하여 출력(PID, 이미지 이름, 세션 등 원하는 항목만 출력 가능) /fi "imagename eq [프로세스명]" : 특정 프로세스 이름만 조회
/fi "pid eq [PID]" : 특정 PID만 조회
/svc 프로세스가 호스팅하는 서비스 목록 표시 -
/v 자세한 정보(메모리, 상태 등) 표시(Verbose)  
/fo 출력 형식 지정(table, list, csv) -
/nh  헤더 라인 제거 -

 

 

3.2 ProcessExplorer

출력 항목 출력값 해석
Handle or DLL substring ServiceDLL.dll 이 문자열을 포함하는 핸들이나 DLL을 검색
Process svchost.exe ServiceDLL.dll을 로드한 프로세스
PID 8360 해당 svchost.exe 프로세스의 프로세스 ID
Type DLL 로드된 항목이 DLL이라는 의미
Name C:\lab\ServiceDLL.dll svchost.exe가 실제로 로드한 DLL의 전체 경로

 

 

3.3 powershell

출력 항목 출력값 해석
Handles 69 프로세스가 보유한 핸들 수
NPM(K) 6 Non-paged memory(KB)
PM(K) 1148 Paged memory(KB)
WS(K) 4988 Working Set(실제 메모리 상주량)
CPU(s) 0.00 CPU 사용 시간
Id 8360 프로세스 ID (PID)
SI 0 Session ID
ProcessName svchost 실행 중인 프로세스 이름

 

*Get-Process: 현재 실행 중인 모든 프로세스 출력하는 명령어

Get-Process | Where-Object { $_.Modules.ModuleName -contains "ServiceDLL.dll" }
명령어 구성 해석
Get-Process 현재 실행 중인 모든 프로세스를 가져옴
|(파이프) 앞 명령어의 출력을 다음 명령어의 입력으로 사용
Where-Object {...} 조건에 맞는 프로세스만 필터링
$_.Modules.ModuleName 해당 프로세스가 로드한 DLL(Module) 이름 목록

$_ = 현재 전달된 “프로세스 객체”
$_.Modules = 이 프로세스가 로드한 DLL 목록 (배열)
$_.Modules.ModuleName = DLL 이름들의 배열
-contains "ServiceDLL.dll" “ServiceDLL.dll”을 로드한 프로세스만 선택

 

 

4. 서비스 삭제

4.1  서비스 중지

출력 항목 출력값 해석
SERVICE_NAME MyTestService 중지 명령을 내린 서비스 이름
종류(Type) 30 WIN32 WIN32_SHARE_PROCESS → svchost.exe 기반 DLL 서비스
상태(Status) 1 STOPPED 서비스가 정상적으로 종료됨
WIN32_EXIT_CODE 0 (0x0) Windows 시스템 계층에서 오류 없음
SERVICE_EXIT_CODE 0 (0x0) ServiceMain → WorkerThread → 정상 종료됨 (Stop 처리 완료)
검사점(Checkpoint) 0x0 서비스가 정지된 상태에서 체크포인트 필요 없음
WAIT_HINT 0x0 대기 시간 필요 없음 (이미 종료 완료)

 

 

4.2 서비스 삭제

 

 

4.3 레지스트리 정리

 

 

 

4. 분석

4.1 EAT 분석

 

 

 

4.2 IAT 분석