DNS 로그 분석을 통한 악성코드 추적

사건의 발단

평소처럼 구글에 접속하던 어느날, 사내 컴퓨터마다 아래와 같은 경고 창이 뜨면서 CAPTCHA 입력을 요구하는 일이 벌어졌습니다.

Google CAPTCHA

모든 PC마다 안티바이러스를 추가로 설치해서 스캔해봤지만, 딱히 발견되는 악성코드도 없어서 난감한 상황이었습니다. 네트워크 관리자는 기존에 설치되어 있던 차세대 방화벽 로그를 분석하기 시작했습니다.

차세대 방화벽 로그

아래는 Cisco FirePower의 로그 예시입니다. 차세대 방화벽은 전통적인 방화벽과 다르게 응용 프로토콜 (L7) 수준에서 트래픽을 분석하고 메타데이터를 추출하는 기능을 제공합니다. 로그 예시에서 DNS 요청 도메인, URL 분류 및 평판 정보 등이 포함되어 있음을 확인할 수 있습니다.

Oct 18 14:56:54 FP60 SFIMS: Protocol: UDP, SrcIP: X.X.X.X, DstIP: 17.151.0.151, SrcPort: 45148, DstPort: 53, TCPFlags: 0x0, IngressInterface: eth1, IngressZone: Passive, DE: Primary Detection Engine (96f4547e-d715-11e5-b0f4-bdee139db4d8), Policy: FP_IDS_FILE_POLICY, ConnectType: End, AccessControlRuleName: IDS-FILE-RULE, AccessControlRuleAction: Allow, UserName: No Authentication Required, Client: DNS, ApplicationProtocol: DNS, InitiatorPackets: 1, ResponderPackets: 1, InitiatorBytes: 97, ResponderBytes: 146, NAPPolicy: Balanced Security and Connectivity, DNSQuery: gspe35-kr-ssl.ls.apple.com, DNSRecordType: a host address, DNSResponseType: No Error, DNS_TTL: 3600, Sinkhole: Unknown, URLCategory: Unknown, URLReputation: Risk unknown

로그프레소에 많은 파서들이 내장되어 있지만, 쿼리만으로도 간단히 데이터를 아래와 같이 파싱할 수 있습니다.

table from=20161016 to=20161017 FP 
| eval line = substr(line, indexof(line, "Protocol:")) 
| parsekv pairdelim="," kvdelim=": " 

FirePower Log Parsing

일반적으로는 분석의 편의성을 위해 스트림 쿼리를 이용해서 실시간으로 정규화한 데이터를 컬럼지향 레이아웃의 테이블에 넣어놓고 고속으로 드릴다운 분석을 실행합니다.

구글이 감지할 정도의 이상 트래픽이라면, 방화벽 로그에서도 특별한 징후를 찾을 수 있을 것이라 예상할 수 있습니다. DNS 요청 추이를 시각화했을 때, 아래와 같은 양상을 보입니다.

table from=20161014 to=20161015 firepower 
| search SrcIP != ip("X.X.X.X") and SrcIP != ip("X.X.X.X") 
| search isnotnull(DNSQuery) 
| timechart span=10m count by SrcIP

DNS Chart

사내 DNS 서버는 역할 상 많은 DNS 요청을 할 수 밖에 없으므로 배제하고, 나머지 호스트들은 업무시간대에 맞춰서 DNS 요청이 증가하는 현상을 볼 수 있습니다. 그런데 새벽시간 대에도 아주 일정하게, 다수의 DNS 요청을 전송하는 내부 PC가 보입니다.

좀 더 확실하게 보기 위해서, 해당 호스트의 DNS 요청에 대한 통계를 내봤습니다.

table from=20161014 to=20161015 firepower 
| search SrcIP == ip("Y.Y.Y.Y") 
| search isnotnull(DNSQuery) 
| stats count by DNSQuery, DNSResponseType 
| sort -count

Domain Stats

최상단에 다수의 DNS 응답 실패를 유발한 도메인이 보입니다. 이 도메인으로 위협 정보를 검색했을 때 아래와 같은 내용을 확인할 수 있었습니다.

  • Remove PUP.Optional.NextLive.A (Virus Removal Guide)
  • Microsoft Forum: Remove newnext.me virus

애드웨어 확인

실제 감염된 것으로 의심되는 윈도우 PC를 조사했을 때, 아래와 같이 nengine.dll 파일과 레지스트리에 등록된 흔적을 확인할 수 있었습니다.

DLL 파일

Nengine DLL

레지스트리

Nextlive

안티바이러스의 미탐지

네트워크에 남겨진 다수의 DNS 흔적, 실제 PC의 악성 파일 및 레지스트리를 확인했음에도 불구하고, 여전히 대부분의 안티바이러스는 이 애드웨어를 진단하지 않았습니다. 악성코드를 이용해서 돈을 버는 이런 류의 회사들은 안티바이러스에 악성코드로 등록되면 소송을 걸기도 하는데, 이 때문에 안티바이러스 벤더는 눈에 띄일 정도의 피해가 없으면 애드웨어를 탐지하지 않도록 처리하기도 합니다.

한편, 차세대 방화벽을 가지고 있지 않더라도 DNS 로그를 분석함으로써 우리는 네트워크에서 어떤 일이 일어나고 있는지 상당 부분 가시성을 확보할 수 있으며, 이러한 시계열 통계 데이터를 기존 추이와 비교하여 자동화된 이상징후 탐지를 시도할 수도 있습니다.

최근의 악성코드들은 DGA (Domain Generation Algorithm) 기법을 이용하여, IP 기반의 차단을 회피하고 C2 서버와 통신하는 경우가 흔합니다. 일반적으로 악성코드의 통신 자체는 암호화되지만 이와 같이 외부의 제어서버와 통신하기 위한 DNS 요청 자체는 숨기기 어려우며, 평상시 접속하는 도메인에 대한 프로파일링을 통해 좀 더 견고한 탐지 체계를 갖출 수 있습니다.

둘러보기

더보기

바이러스토탈 API 연동

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

2017-01-15

DHCP를 통한 자산 프로파일링

DHCP를 모니터링하면 NAC처럼 내부 네트워크의 호스트 정보를 자동으로 수집하여 자산 DB를 구축할 수 있습니다

2017-01-14