A Practical guide for Sysmon : Bypassing response and detection

1. 개요

지난 12월 4일 하반기 침해사고 정보공유 세미나에서 'Sysmon을 이용한 호스트 기반의 사이버 위협 로깅 방안' 연구에 대해 소개하는 시간을 가졌다. 발표 후 질문받았던 내용 중에 Sysmon 프로세스 강제 중단을 방지하는 방법과 실행이 중단되었을 때 자동 실행 방안 등 Sysmon이 우회되는 것을 우려하는 질문이 많았다. 더 자세한 내용을 공유하기 위해 Sysmon 우회에 대해 대응 및 탐지하는 방안을 이야기해 보려고 한다.

공격자들은 시스템에 침투한 뒤 공격 행위에 방해가 되거나 흔적을 남길 수 있는 프로세스 및 서비스를 종료시키는 'T1562.001: Impair Defenses: Disable or Modify Tools' 기법을 주로 사용한다. 따라서, 호스트에서 동작하는 보안 솔루션들의 프로세스는 공격자 또는 사용자가 강제로 기능을 우회하는 것을 막으려고 노력하고 있다.

2023년 6월 27일에 Sysmon이 15.0 버전으로 업데이트되면서 Protected Process Light(이하, PPL) 기술이 적용되었고, 해당 기술로 인해 Sysmon이 강제로 종료(Kill 명령어, 작업 관리자에서 종료 등) 되는 것을 방지하고 있다. 자세한 내용은 이전에 작성한 'Sysmon v15.0 Update' 내용을 참고 바란다. 해당 업데이트로 프로세스를 강제 종료시켜 우회하는 것을 방지했지만, 여전히 Sysmon을 우회하는 방법이 많이 존재한다.

본 글에서는 시스템에서 Sysmon이 동작하는 것을 확인하고 공격자들이 수행할 수 있는 우회 기법과 해당 기법을 대응하고 탐지할 수 있는 방법에 대해 살펴본다.

2. Sysmon 동작 확인

시스템에서 Sysmon의 동작 상태는 아래와 같은 데이터에서 확인할 수 있다.

  • 동작 중인 프로세스 및 서비스 목록
  • 로드된 드라이버 목록
  • 레지스트리

2.1. 프로세스 및 서비스 동작 확인

기본적으로 Sysmon을 실행하게 되면 'Sysmon.exe'라는 프로세스로 동작하게 되고, 'Sysmon'이라는 이름으로 서비스가 등록된다.

[그림 1] Sysmon 프로세스 동작 확인
[그림 2] Sysmon 서비스 동작 확인

2.2. 로드된 드라이버 목록 확인

이전 'Sysmon 활용 가이드: 개념 및 설치 방법' 글의 Sysmon 동작 프로세스에서 설명한 것과 같이 Sysmon은 SysmonDrv.sys 드라이버로 모든 모니터링 기능을 수행한다.

fltMC.exe로 현재 로드 되어 있는 드라이버 목록을 출력했을 때, SysmonDrv 드라이버가 로드 되어 Sysmon이 동작 중인 것을 확인할 수 있다.

fltMC.exe
[그림 3] Sysmon 드라이버 동작 확인

2.3. 레지스트리 확인

Sysmon이 동작 중일 때, 아래 레지스트리 경로의 Enabled 키의 값이 '1'로 설정되면서 Sysmon을 통해 이벤트가 모니터링 된다.

✔️
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\Microsoft-Windows-Sysmon/Operational
[그림 4] 레지스트리를 통한 Sysmon 동작 확인

3. Sysmon 우회 방법

3.1. Sysmon 종료

Sysmon 15.0 버전 이상부터 Sysmon 프로세스가 PPL로 보호되고 있어, 관리자 권한임에도 PPL이 적용되지 않은 프로세스로는 종료 시킬 수 없다. 그러나, 기본적으로 Sysmon이 설치되면 C:\Windows 경로에 Sysmon.exe 파일이 생성되면서 서비스로 동작하기 때문에 해당 파일의 -u 옵션을 통해 Sysmon의 동작을 종료 시킬 수 있다.

C:\Windows\Sysmon.exe -u
[그림 5] Sysmon 동작 종료

3.2. Configure File 변경

기존에 적용되어 있는 Configure File을 아무런 이벤트도 기록하지 않는 Configure File로 변경하면 기존의 Rule들이 변경된 Configure의 Rule로 변경되면서 우회할 수 있다.

[그림 6] 아무런 이벤트도 기록하지 않는 Configure File(config.xml)

C:\Windows 경로의 Sysmon의 -c 옵션을 통해 다른 Configure File로 변경할 수 있다.

C:\Windows\Sysmon.exe -c config.xml
[그림 7] 아무런 이벤트도 기록하지 않게 설정된 상태

3.3. Configure 설정 삭제

아래 레지스트리 경로에는 현재 설정되어 있는 Configure Rule에 대한 정보가 바이너리 형태로 저장되어 있다. 해당 Rule 데이터를 삭제해 오류를 발생시켜 우회할 수 있다.

✔️
HKLM\SYSTEM\CurrentControlSet\Services\SysmonDrv\Parameters
[그림 8] 정상적으로 저장되어 있는 Rule 데이터

PowerShell의 'Set-ItemProperty'를 통해 설정되어 있는 Configure Rule 정보를 임의의 값으로 변경한다.

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SysmonDrv\Parameters" -Name "Rules" -Value "@()"
[그림 9] 삭제된 Rule 데이터

Sysmon.exe -c 옵션을 통해 현재 적용되어 있는 Rule을 확인해 봤을 때 데이터가 삭제되어 에러가 뜨는 것을 확인할 수 있다.

Sysmon.exe -c
[그림 10] Rule 데이터가 삭제되어 에러 발생

3.4. Sysmon 드라이버 언로드

Sysmon 프로세스의 경우 PPL 기능으로 보호받지만 Sysmon 동작의 핵심적인 기능을 수행하는 드라이버는 별도의 보호가 되어 있지 않다. 따라서, Sysmon 드라이버인 SysmonDrv를 언로드해 우회할 수 있다.

fltMC.exe unload SysmonDrv
[그림 11] 시스템에서 언로드된 Sysmon 드라이버

3.5. Rule 분석을 통한 우회

앞서 설명한 우회 방법들은 시스템의 변경이 필요한 작업들이기 때문에 시스템 관리자가 공격을 쉽게 인지할 수 있다. 해당 방법은 시스템의 상태를 변경하지 않는다.

Sysmon의 -c 옵션을 통해 현재 설정 및 적용된 Rule에 대한 정보를 알 수 있다. 공격자는 현재 시스템에 설치된 Sysmon Rule을 파악해 Rule에 포함되지 않는 방식으로 공격해 탐지를 우회할 수 있다.

C:\Windows\Sysmon.exe -c
[그림 12] 현재 설정된 Rule 출력

예를 들어, Sysmon Rule로 Mimikatz 프로세스 명으로 프로세스 생성 이벤트를 탐지하고 있다면 공격자는 해당 Rule을 분석한 후 프로세스 이름을 변경해 탐지를 우회할 수 있다.

4. Sysmon 우회 대응 및 탐지

4.1. Sysmon 우회 대응

4.1.1. 프로세스 및 서비스 이름 변경

Sysmon에서는 Sysmon 실행 파일의 이름을 변경함으로써 동작하는 프로세스 및 서비스의 이름을 변경할 수 있다.

기존의 Sysmon 실행 파일인 Sysmon.exe 파일의 이름을 NotIsSysmon.exe로 변경한 뒤 설치했을 때 프로세스 및 서비스 이름이 NotIsSysmon으로 동작 되는 것을 볼 수 있다.

[그림 13] 변경된 Sysmon 프로세스 이름
[그림 14] 변경된 Sysmon 서비스 이름

그러나, 프로세스 설명의 ‘System activity monitor’와 서비스 설명의 ‘System Monitor service’는 변경되지 않아 이름이 변경되어도 Sysmon의 프로세스 및 서비스라는 것을 확인할 수 있어 확실한 은닉은 어렵다.

작업 관리자의 프로세스 탭의 경우 프로세스 이름을 프로세스 설명 기준으로 출력하기 때문에 다음 그림과 같이 프로세스 트리가 표시된다.

[그림 15] 프로세트 탭에서 보여지는 Sysmon 프로세스 트리

4.1.2. 드라이버 이름 변경

Sysmon을 설치할 때 -d 옵션을 통해 드라이버 이름을 변경할 수 있다. 이때, 드라이버 이름은 8글자 이하로 설정해야 한다.

Sysmon.exe -i -d NoSysDrv
[그림 16] 변경된 Sysmon 드라이버 이름

로드된 드라이버 목록을 보면 기존 Sysmon 드라이버인 'SysmonDrv'가 아닌 'NoSysDrv'로 이름이 변경된 것을 확인할 수 있다. 그러나, Sysmon 드라이버 고도가 '385201'로 고정되어 있어 이름을 변경해도 고도로 Sysmon 드라이버를 유추할 수 있다. Microsoft에서는 드라이버의 고도 변경 시 오류가 발생할 수 있어 권장하고 있지 않다.

4.2. Sysmon 우회 탐지

앞서 설명한 Sysmon 우회 대응 방안으로는 직접적으로 우회를 방지할 수 없고 시스템에서 Sysmon의 동작을 공격자에게 은닉할 수만 있다. Sysmon 자체 고유 기능을 통해 우회를 대응하기엔 부족함이 있어 모니터링을 통해 공격자의 우회 행위를 탐지하고 대응하는 것이 필요하다.

4.2.1. Sysmon 우회 탐지 모니터링

공격자들이 수행할 수 있는 Sysmon 우회 방법을 탐지할 수 있는 이벤트들은 아래와 같으며, 해당 이벤트들이 발생하는지 지속적인 모니터링으로 Sysmon 우회를 탐지할 수 있다.

  • Sysmon 종료 모니터링

Sysmon을 우회하기 위해 Sysmon을 종료시켰다면, 'Event ID 4. Sysmon service state changed' 이벤트가 발생된다. 여기서 State 값이 'Stopped'로 되어 있다면 Sysmon 동작이 종료되었으므로 확인이 필요하다.

[그림 17] Sysmon 종료 시 발생되는 이벤트
  • Configure File 변경 모니터링

Sysmon을 우회하기 위해 Configure File 자체를 변경했다면, 'Event ID 16. Sysmon config state changed' 이벤트가 발생된다. 관리자가 Configure File을 변경하지 않았는데 해당 이벤트가 발생했다면 반드시 변경된 Configure File의 확인이 필요하다.

[그림 18] Sysmon Configure File 변경 시 발생되는 이벤트
  • Configure 설정 삭제 모니터링

Sysmon을 우회하기 위해 Configure 설정을 삭제했다면, 'Event ID 255. Error report: RuleEngine' 이벤트가 발생된다. 이후 Sysmon에서 Configure 설정을 읽지 못해 동작하지 않게 되면 'Event ID 255. Error report: ServiceThread' 이벤트가 추가적으로 발생한다. 해당 이벤트들이 발생하면 Sysmon 동작에 문제가 있어 확인이 필요하다.

[그림 19] Sysmon Configure 설정 삭제 시 발생되는 이벤트(RuleEngine Error)
[그림 20] Sysmon Configure 설정 삭제 시 발생되는 이벤트(ServiceThread Error)
  • Sysmon 드라이버 언로드 모니터링

Sysmon을 우회하기 위해 드라이버를 언로드했다면, 'Event ID 255. Error report: DriverCommunication' 이벤트가 발생한다. 해당 이벤트들이 발생하면 Sysmon 드라이버에 문제가 있어 확인이 필요하다.

[그림 21] Sysmon 드라이버 언로드 시 발생되는 이벤트

4.2.2. Sysmon 우회 탐지 Rule 적용

Configure Rule에 공격자의 우회 행위를 탐지할 수 있는 Rule을 적용해 추가적인 탐지 이벤트를 발생시킬 수 있다. 특히 공격자가 -c 옵션을 통해 시스템에 적용된 Rule 설정을 파악하는 것은 기본적으로 이벤트가 남지 않아, 해당 행위를 탐지할 수 있도록 아래 Rule에 적용하였다.

<EventFiltering>
	<ProcessCreate onmatch="include">
		<Rule name="Sysmon Driver Unloaded" groupRelation="and">
			<OriginalFileName condition="is">fltMC.exe</OriginalFileName>
			<CommandLine condition="contains">unload SysmonDrv</CommandLine>
		</Rule>
		<Rule name="Sysmon Rule Discovery" groupRelation="and">
			<OriginalFileName condition="is">Sysmon.exe</OriginalFileName>
			<CommandLine condition="end with">-c</CommandLine>
		</Rule>
	</ProcessCreate>
	<RegistryEvent onmatch="include">
		<Rule name="Sysmon Rule Modified" groupRelation="and">
			<EventType condition="is">SetValue</EventType>
			<TargetObject condition="end with">SysmonDrv\Parameters</TargetObject>
		</Rule>
	</RegistryEvent>
</EventFiltering>

5. 결론

Sysmon 자체의 기능으로 동작하는 프로세스 및 서비스, 드라이버 이름을 변경해 공격자의 눈을 속일 수 있지만, 조금만 자세히 들여다보면 쉽게 파악될 수 있고 우회가 가능했다. 따라서, 탐지를 우회하는 것을 방지할 순 없어도 우회를 시도할 때 발생하는 이벤트를 특정하고 해당 이벤트들을 주기적으로 모니터링하는 것을 권장한다.

우회를 시도할 때 발생하는 이벤트들은 일반적인 상황에서 발생하지 않기 때문에 모니터링을 통해 탐지됐다면 빠른 대응을 통해 단순 오류인지 공격자의 행위인지 판단해야 한다.

운영하는 인프라에 ESM, SIEM 등 로그 모니터링 시스템이 존재한다면 해당 이벤트 발생 시 관리자에게 알람을 전달해 즉각적으로 대응하고, 해당 시스템이 존재하지 않더라도 ELK Stack 같은 오픈소스 로그 수집 모듈로 EDR 플랫폼을 구축해 모니터링하고 탐지할 수 있을 것이다.


Reference

You've successfully subscribed to PLAINBIT
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
Welcome back! You've successfully signed in.
Error! Could not sign in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.