Sysmon을 이용한 엔드포인트 포렌식

우리는 많은 비용과 노력을 들여 보안체계를 구축하지만, 임직원의 피싱 메일 첨부파일 실행과 같은 작은 부주의로도 공격자가 쉽게 내부로 침투할 수 있습니다.

방화벽이나 침입방지시스템 로그는 트래픽의 흐름과 알려진 네트워크 위협들을 가시적으로 보여주지만, 단지 방화벽 로그에 남아있는 IP와 포트만을 근거로 단말에서 어떤 프로세스가 어떻게 실행되어서 어떤 경로로 전파된 것인지 사후 추적하는 것은 불가능에 가깝습니다.

최근 몇 년 사이에 안티바이러스를 보완하는 EDR (Endpoint Detection & Response)이 빠르게 도입되고 있습니다. EDR은 단말에서 발생하는 모든 행위들을 중앙 서버에 기록하고 분석함으로써, 악성코드의 감염과 확산 경로를 효율적으로 탐지하고 추적할 수 있도록 지원합니다.

예전에는 수천 대의 단말마다 발생하는 수많은 프로세스의 실행, 네트워크 연결 기록들을 DB에서 관리하는게 불가능하다고 여겨졌지만, 발전된 빅데이터 기술이 이 모든 것을 가능하게 한 것입니다.

EDR 솔루션을 도입할 수 있는 여건이라면 좋겠지만, 그렇지 않은 경우에도 마이크로소프트에서 배포하는 Sysmon을 이용해서 엔드포인트 보안 체계를 강화할 수 있습니다.

Sysmon은 아래와 같은 시스템 행위들을 윈도우 이벤트 로그로 기록합니다.

  • 프로세스의 생성 및 종료
  • 드라이버 로드
  • 실행 이미지 로드
  • 파일 생성 시각 변조
  • 네트워크 연결
  • CreateRemoteThread API 사용
  • RawAccessRead API 사용
  • Sysmon 서비스 상태 변경

아래에서는 로그프레소 센트리를 통해 Sysmon 이벤트를 수집한 예제를 하나씩 살펴보고, 이를 어떻게 외부의 위협 인텔리전스와 연동하여 탐지 및 분석할 수 있는지 알아봅니다.

프로세스 실행 분석

table sysmon | fields _time, event_id, level, line

Process Create:
UtcTime: 2017-01-19 14:26:38.692
ProcessGuid: {9D15E6DA-CC9E-5880-0000-0010ECBA5E33}
ProcessId: 12644
Image: C:\Program Files\Git\mingw64\bin\git.exe
CommandLine: git.exe status -z -u
CurrentDirectory: 작업디렉터리
User: 사용자이름
LogonGuid: {9D15E6DA-****-****-****-************}
LogonId: 0xA2****
TerminalSessionId: 2
IntegrityLevel: Medium
Hashes: SHA256=B388344FEB34B1CB4E7566D846C85587B843181999C05BA00C82FE208CA4909B
ParentProcessGuid: {9D15E6DA-CC9E-5880-0000-001080B85E33}
ParentProcessId: 19180
ParentImage: C:\Program Files\Git\cmd\git.exe
ParentCommandLine: "C:\Program Files\Git\cmd\git.exe" status -z -u

위의 스크린샷은 프로세스 생성 및 종료 시 남겨진 이벤트 로그의 예시입니다. 아래와 같이 쿼리를 사용해서 간단히 이벤트 메시지를 파싱할 수 있습니다.

table sysmon 
| search line == "*Process Create*" 
| eval line = substr(line, indexof(line, ":") + 3), line = replace(line, "\n", "`") 
| parsekv overlay=t pairdelim="`" kvdelim=": "
| eval Hashes = substr(Hashes, indexof(Hashes, "SHA256=") + 7)  

많은 프로세스 실행 기록이 남아있지만, SHA256 해시를 기준으로 통계내면 400개의 실행 이미지로 요약됩니다.

table sysmon 
| search line == "*Process Create*" 
| eval line = substr(line, indexof(line, ":") + 3), line = replace(line, "\n", "`") 
| parsekv overlay=t pairdelim="`" kvdelim=": "
| eval Hashes = substr(Hashes, indexof(Hashes, "SHA256=") + 7)  
| stats count by Image, Hashes | sort -count

초기 화이트리스팅 작업을 통해 정상 이미지는 배제하고, 바이러스토탈 등 외부 인텔리전스 서비스를 연동하면 효율적으로 악성코드를 진단할 수 있습니다. 만약 특정 바이너리가 악성코드로 진단된 경우, 원본 이벤트 로그에 아래와 같이 부모 프로세스에 대한 정보가 남아있으므로 충분히 감염 경로를 역추적 할 수 있습니다.

ParentProcessGuid: {9D15E6DA-CC9E-5880-0000-001080B85E33}
ParentProcessId: 19180
ParentImage: C:\Program Files\Git\cmd\git.exe
ParentCommandLine: "C:\Program Files\Git\cmd\git.exe" status -z -u

같은 악성코드 해시가 여러 대의 시스템에서 발견된다면, 이벤트 로그를 시간순으로 정렬하여 어느 호스트로부터 악성코드가 전파되기 시작했는지 분석할 수 있습니다.

네트워크 연결 분석

네트워크 연결 이벤트는 프로세스 ID와 이미지 경로를 포함하여 정확하게 어느 프로세스가 어떤 호스트와 통신했는지 보여줍니다.

Network connection detected:
UtcTime: 2017-01-19 14:54:26.027
ProcessGuid: {9D15E6DA-483F-5876-0000-00105E39B000}
ProcessId: 10336
Image: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
User: 사용자명
Protocol: tcp
Initiated: true
SourceIsIpv6: false
SourceIp: 172.20.XXX.XXX
SourceHostname: 출발지호스트명
SourcePort: 53563
SourcePortName: 
DestinationIsIpv6: false
DestinationIp: XXX.XXX.XXX.XXX
DestinationHostname: 
DestinationPort: 80
DestinationPortName: http

마찬가지로 아래와 같이 쿼리를 사용해서 간단히 이벤트 메시지를 파싱할 수 있습니다.

table sysmon | search line == "*Network connection detected*" 
| eval line = substr(line, indexof(line, ":") + 3), line = replace(line, "\n", "`") 
| parsekv overlay=t pairdelim="`" kvdelim=": " 
| fields _time, ProcessId, Image, Protocol, SourceIp, SourcePort, SourcePortName, DestinationIp, DestinationPort

이번에는 맬웨어도메인리스트와 연계하여 분석해보도록 하겠습니다. 데모를 위해 맬웨어도메인리스트에 등록된 악성 IP 중 하나에 일부러 접속해서 이벤트를 발생시켰습니다.

table sysmon 
| search line == "*Network connection detected*" 
| eval line = substr(line, indexof(line, ":") + 3), line = replace(line, "\n", "`") 
| parsekv overlay=t pairdelim="`" kvdelim=": " 
| join DestinationIp [ 
    wget url="http://www.malwaredomainlist.com/hostslist/ip.txt"
    | eval ip = split(line, "\r\n")
    | fields ip
    | explode ip
    | rename ip as DestinationIp 
]
| fields _time, ProcessId, Image, Protocol, SourceIp, SourcePort, DestinationIp, DestinationPort

위의 쿼리는 wget 커맨드를 사용해서 맬웨어도메인리스트의 IP 목록을 다운로드한 후 개행문자로 분리하여 즉석에서 IP 블랙리스트 데이터셋을 생성하고 이를 로컬의 윈도우 이벤트와 조인합니다. 위의 쿼리를 로그프레소의 스트림 쿼리로 설정하면, 외부 위협 인텔리전스를 이용하여 밀리초 단위의 실시간으로 탐지 및 경보할 수 있습니다.

위에 설명한 항목들 외에도 Sysmon은 유용한 이벤트 로그들을 생성하므로, 엔드포인트에 일괄 배포하여 이벤트 로그를 실시간으로 수집하고 탐지하면 엔터프라이즈 보안 및 분석 역량을 한단계 끌어올릴 수 있습니다.

둘러보기

더보기

NTFS 포렌식

NTFS 파일시스템의 핵심 구조와 함께 코드게이트 컨퍼런스 포렌식 문제 풀이를 설명합니다.

2020-09-12

바이러스토탈 API 연동

바이러스토탈 API를 사용하여 악성 파일 분석을 자동화하는 방법을 소개합니다.

2017-01-15