PowerShell Version and Logging
(2) 파워셸 버전에 따른 로깅 차이
Last updated
Was this helpful?
(2) 파워셸 버전에 따른 로깅 차이
Last updated
Was this helpful?
파워셸에 입력한 명령어 로그는 기본적으로 Windows 7 운영체제에서는 남지 않으며, Windows 10 운영체제에서는 다음 경로에 기록하고 있다.
ConsoleHost_history.txt 파일의 내용을 보면 위와 같이 입력한 명령어를 그대로 저장하고 있다.
또한 파워셸 실행 시 이벤트 뷰어 -> 응용 프로그램 및 서비스 로그 -> Windows PowerShell 경로에 이벤트 로그가 남는다. Windows 7, Windows 10 운영체제 모두 해당 경로에 이벤트 로그를 남기지만 파워셸에 입력한 명령어에 대한 로그는 확인할 수 없다. 다만 이벤트 로그에 기록된 시간을 토대로 파워셸이 실행된 시간 정도는 파악할 수 있다.
파워셸은 다음 5가지 파일에서 로그를 확인할 수 있다.
1) 로컬 혹은 원격에서 파워셸 명령이나 스크립트가 실행되는 경우
Windows PowerShell.evtx
Microsoft-Windows-PowerShell/Operational.evtx
Microsoft-Windows-PowerShell/Analytic.etl
2) 원격 파워셸 활동에 대한 경우 (파워셸은 WinRM을 통해 원격 처리를 구현)
Microsoft-Windows-WinRM/Operational.evtx
Microsoft-Windows-WinRM/Analytic.etl
Analytic 로그는 이벤트 뷰어 -> View -> Show Analytics and Debug Logs -> Microsoft-Windows-WinRemote Management/Analytic에서 로그 활성화를 선택하거나 wevutil Set-Log 명령을 실행하여 로깅 기능을 활성화해야 확인할 수 있다.
파워셸은 버전에 따라 로그로 확인할 수 있는 데이터가 다르다. 다음 표는 파워셸 버전에 따른 로깅 정보이다.
파워셸 버전 2에서 HostName 필드는 400, 403 이벤트 ID에 해당하는 로그에 기록된다. 로컬 활동의 경우 ConsoleHost(HostName=ConsoleHost), 원격 활동의 경우 ServerRemoteHost(HostName=ServerRemoteHost)로 기록된다. 따라서 분석 시 해당 값을 통해 파워셸 세션의 지속 기간을 비롯하여 원격인지 로컬인지 파악 가능하다. 아쉬운 점으로는 어떤 명령어를 입력했는지 파악할 수 없다는 점이다.
파워셸 버전 3, 4는 이전 버전에 비해 포괄적인 로깅 기능을 지원한다. 로컬 그룹 정책 편집기에서 로컬 컴퓨터 정책 -> 컴퓨터 구성 -> 관리 템플릿 -> Windows 구성 요소 -> Windows PowerShell -> Turn on Module Logging(모듈 로깅 사용) 을 활성화하면 명령 및 모듈에 대한 로깅을 남긴다.
또는 로컬 컴퓨터 정책 -> 사용자 구성 -> 관리 템플릿 -> Windows 구성 요소 -> Windows PowerShell -> Turn on Module Logging(모듈 로깅 사용) 을 활성화할 수 있는데 사용자 구성 정책이 컴퓨터 구성 정책보다 우선 순위이다.
다음 레지스트리 값을 설정하면 동일한 결과를 얻을 수 있다.
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ModuleLogging → EnableModuleLogging = 1
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ModuleLogging\ModuleNames → * = *
로깅 모듈 사용을 활성화하면 파워셸 모듈 사용 시 4103 이벤트 ID 로 로그를 남긴다. 위 그림과 같이 입력한 명령어를 확인할 수 있지만 난독화가 되어 있는 경우에는 확인할 수 없다. 파워셸 버전2에 비하면 입력한 명령어의 로그가 남기 때문에 로그 분석에 있어 조금 더 정확한 결과를 얻을 수 있다. 하지만 공격자가 명령문을 난독화한 경우에는 분석이 쉽지 않기 때문에 아쉬운 부분이 존재한다.
파워셸 버전5에서는 난독화를 복호화할 수 있는 로깅 기능이 존재한다. 로컬 그룹 정책 편집기의 같은 경로에서 PowerShell 스크립트 블록 로깅 켜기를 활성화하면 된다.
다음 레지스트리 키 값을 설정하면 같은 결과를 얻을 수 있다.
HKLM\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging → EnableScriptBlockLogging = 1
스크립트 블록 로깅을 활성화하면 4104 이벤트 ID로 난독화 된 명령문 1개, 복호화 된 명령문 1개가 로깅된다. 스크립트 코드를 실행하기 전에 난독화를 해제하는 과정에서 복호화된 코드를 로깅한다.
공격자가 명령문을 난독화하더라도 스크립트 블록 로깅을 활성화한 상태라면 로그를 쉽게 분석할 수 있을 것이다. 공격자의 행위를 신속하게 파악하는 것은 시스템이 입은 피해를 파악하는 것과 이어진다. 따라서 사용하는 시스템의 파워셸 버전을 5 이상으로 유지하고, 스크립트 블록 로깅을 활성화하는 것이 중요하다. 다음 글에서는 스크립트 블록 로깅이 활성화된 환경에서 vbs, ps1, cmd 등 다양한 방법으로 파워셸 명령어를 실행했을 때 남는 로그의 차이점에 대해 비교해보겠다.