SK shieldus Rookies/클라우드 기반 시스템 운영ㆍ구축 실무

[SK shieldus Rookies 16기] Splunk 실습 - DNS Log 분석

su. 2024. 1. 11. 12:01
[SK shieldus Rookies 16기] 클라우드 기반 스마트 융합보안 과정
클라우드기반 시스템 운영 구축 실무 #07

 

[ DNS 패킷 구조 포스팅 삽입 ]

 

가상환경의 경우 시나리오

 

 

 

DNS 네트워크 현황분석과 이상징후 분석

1)  DNS Log 실습환경 구성
2)  DNS 네트워크 현황분석
3)  DNS 이상징후

 

 

 

1)  DNS Log 실습환경 구성

  ❶  내 pc의 인덱스 경로 확인

  ❷  Index 만들기 (로그 저장소)

  ❸  SourceType 지정 (로그 필드명 지정)

  ❹  데이터 추가 (로그 저장)

  ❺  URL Toolbox 설치

 

 

 

❶  내 pc의 인덱스 경로 확인

:  Splunk가 로그 데이터를 처리하고 인덱싱하는 과정에서 생성된 파일들이 내 pc에도 저장된다.

  이 파일들은 로그 데이터를 빠르게 검색하고 분석할 수 있도록 한다.

-  인덱스 생성 후, 데이터 추가 후의 변화를 확인해보자.

 

설정 > 서버 설정 > 일반 설정 > 인덱스 경로

 

설정 > 서버 설정
일반 설정
인덱스 경로: C:\Program Files\Splunk\var\lib\splunk

 

 

 

 Index 만들기 (로그 저장소)

인덱스: Splunk Enterprise 내 데이터의 저장소

 

설정 > 인덱스 > 새로 만들기 인덱스

 

설정 > 인덱스
새로 만들기 인덱스

 

인덱스 이름만 설정한 후 저장한다

 

인덱스 이름: dnslog

생성이 완료되었다.

 

인덱스 경로로 가보면, dnslog 폴더가 생성되었다.

 

 

 

 

❸  SourceType 지정 (로그 필드명 지정)

 

설정 > Source Type
새로 만들기 Source Type

 

이름: dnslog

인덱스 추출: tsv

(필드 > 사용자 지정 > 쉼표로 구분된 필드 이름)에 다음 내용을 넣는다

ts,uid,src,spt,dst,dpt,proto,trans_id,rtt,domain,qclass,qclass_name,qtype,qtype_name,rcode,rcode_name,AA,TC,RD,RA,Z,answers,TTLs,rejected

 

 

 

 

❹  데이터 추가 (로그 저장)

 

설정 > 데이터 추가
업로드
파일 선택: dns.zip

 

선택 > Source Type 선택 > 사용자 지정 > dnslog

 

 

host 필드 값: ZeekDNS

인덱스: dnslog

> 검토

 

제출
검색 시작

 

검색 시작 초기 검색어

source="dns.zip:*" host="ZeekDNS" index="dnslog" sourcetype="dnslog"

왼쪽 필드 목록에 우리가 입력한 필드명보다 많은 것이 보인다

-  splunk에서 자동으로 인식한 필드도 추가되어 있다

 

 

설정 > 인덱스를 확인해보면, 현재 크기(용량)과 이벤트 수가 증가했다

 

 

인덱스 경로로 가보면, 인덱스 생성 후 생기고 비어있던 dnslog > db 폴더가 채워졌다.

 

 

 

 

❺  URL Toolbox 설치

https://splunkbase.splunk.com/app/2734/#/overview

url-toolbox_192.tgz

 

Splunk Enterprise 메인화면 왼쪽 상단 톱니바퀴 클릭 > 파일에서 앱 설치

 

파일에서 앱 설치

다운받은 url-toolbox_192.tgz 파일을 업로드한다

 

 

url로 검색해보면, URL Toolbox 앱이 등록되었다.

메인화면에 나타나도록 속성을 편집해본다.

 

속성 편집
표시 여부 > 예

 

 

 

DNS 로그 분석

• DNS 로그는 사용자의 네트워크 접속 행위를 분석하는데 가장 좋은 데이터 소스
• 내부망 DNS 로그 분석
    - 내부 사용자가 인터넷 또는 내부 업무망을 접속 시 발생하는 로그이기 때문
    - 공격자의 악성코드에 감염된 내부망 PC가 내부 데이터 획득을 목표로 활동하는 상황을 파악할 수 있기 때문
• DNS 로그 주요 정보는 사용자가 조회하는 도메인 이름

 

# 전체 dns 로그 보기

index=dnslog sourcetype=dnslog

 

 

 

2)  DNS로그를 이용한 네트워크 현황 분석

  ❶  접속 Top 10 도메인 현황
  ❷  Top 10 도메인 요청 IP 현황
  ❸  도메인 응답코드 현황

 

 

⦁  ut_parse(domain,list)`: 도메인 분할

 

index=dnslog sourcetype=dnslog domain!="-"
| eval list = "mozila"
| `ut_parse(domain,list)`
| table ut_netloc, ut_domain, ut_subdomain, ut_domain_without_tld, ut_tld
| dedup ut_netloc

 

`ut_parse(domain,list)`: 도메인 분할

index=dnslog sourcetype=dnslog domain!="-"

-  "-" : 값이 설정되어 있지 않음 = 도메인명이 없는 경우를 제외

 

| eval list = "mozila"

-  list 변수에 mozila 값 부여

 

| `ut_parse(domain,list)`

-  URL Toolbox 매크로를 이용해 mozila 주소 형식을 기준으로 도메인 분할

   (TLD 목록은 mozila에서 지정한 형식을 따른다)

 

| table ut_netloc, ut_domain, ut_subdomain, ut_domain_without_tld, ut_tld

 

ut_netloc www.naver.com 전체 도메인
ut_domain naver.com 서브도메인 제외
ut_subdomain www 서브도메인: 도메인 소유자가 생성
ut_domain_without_tld naver 서브도메인, TLD 제외
ut_tld com 최상위 도메인: Top-level domain, TLD
일반(com) / 국가(kr)

| dedup ut_netloc

-  ut_netloc 필드를 기준으로 중복 제거

 

 

 

+)  도메인명이 없는 "-" 경우를 검색해 보았다

  : 정상적인 전송이 아니다

 

"-" 클릭

index=dnslog sourcetype=dnslog domain="-"

 

NXDomain

 

 

 

❶  접속 Top 10 도메인 현황

 

⦁  사용자들이 가장 많이 접속한 도메인 10개를 보여준다
⦁  많이 접속한다는 것은 많은 사용자가 접속한다는 뜻이지만, 소수의 클라이언트가 많이 접속할 수도 있다는 뜻이기도 함
   (예) 동일한 도메인을 10분 동안 60번씩 요청할 경우, 자동화된 프로그램(매크로)으로 동작한다고 추측 가능

         - 공격자이거나, 악성코드에 감염
•  네트워크 접속 행위를 분석 시 해당 트래픽이 사용자가 발생시킨 것인지, 자동 프로그램이 일으킨 행위인지를 분석의 기준으로 삼으면 좋다

*  현황분석은 숫자를 보여주고, 우리는 이 숫자에서 이상 징후를 유추해야 한다

 

index=dnslog sourcetype=dnslog dpt=53 domain!="*.arpa" domain!="-"
| eval list="mozilla"

| `ut_parse(domain, list)`
top showperc=f limit=10 ut_netloc

 

접속 Top 10 도메인 현황

index=dnslog sourcetype=dnslog dpt=53 domain!="*.arpa" domain!="-"

-  목적지 포트 53번

-  역방향 도메인(PTR record) 제외

     .arpa: 역방향 조회의 TLD(최상위도메인) 이다.

-  domain 없는 경우 제외

 

| eval list="mozilla"

| `ut_parse(domain, list)`

-  mozila 주소 형식 기준으로 도메인 분할

 

| top showperc=f limit=10 ut_netloc

-  퍼센트 표기x

-  limit 10개 기본설정이라 생략 가능

-  ut_netloc 필드를 기준으로 top 선정

 

 

+)  역방향 도메인(PTR record) ".arpa"를 검색해 보았다

index=dnslog sourcetype=dnslog domain="*.arpa"

 

PTR record: (IP 주소).in-addr.arpa로 구성된다

 

 

 

❷  Top 10 도메인 요청 IP 현황

 

⦁  도메인과 해당 도메인을 접속한 송신지 IP주소를 동시에 검색

여러 명이 조회해서 조회 숫자가 많은 도메인과 한 명이 집중해서 조회한 도메인을 구분해 현황 분석과 이상 징후 판단을 동시에 가능
index=dnslog sourcetype=dnslog dpt=53 domain!="*.arpa" domain!="-" 
| eval list="mozilla" 
| `ut_parse(domain,list)` 
| top showperc=f src, ut_netloc

 

 

 

 

❸  도메인 응답코드 현황

 

•  도메인 응답코드(reply code): 사용자가 요청한 도메인을 DNS서버가 응답한 결과 값
•  Zeek의 응답코드 필드:  rcode, rcode_name

rcode rcode_name 설명
0 NoError 오류 없음
1 FormErr Query 형식 오류
2 SevFail DNS 서버 자체 문제로 실패
3 NXDomain 사용자가 질의한 도메인명이 존재하지 않음
(Non-eXistent Domain)
4 Notlmp DNS 서버가 해당 질의를 지원하지 않음
5 Refused 정책적인 이유로 질의를 거절

 

•  NXDomain이 빈번하게 발생하는 도메인과 해당 질의를 발생하는 송신지를 모니터링 한다

 

index=dnslog sourcetype=dnslog domain!="-" rcode_name= "NXDomain"
| top showperc=f src, domain

 

•  NXDomain 또는 Refused는 사용자가 질의한 도메인이 없다는 것이다

 

•  도메인명을 잘못 입력한 경우나 해당 도메인이 등록되지 않은 경우 오류가 발생한다
    -  지속적인 NXDomain 응답은 점검 대상이 된다

 

•  NXDomain이 지속적으로 발생하는 경우
    - 감염된 PC가 사라진 도메인의 접속을 시도
    - DGA로 생성된 도메인이 인터넷에 아직 등록되지 않은 경우
    * DGA (Domain Generation Algorithms)
       - 도메인 이름을 주기적으로 동적으로 생성하는 알고리즘

 

 

 

3) DNS 이상징후

  ❶  비정상적인 서브 도메인 길이
  ❷  비허가 DNS 사용/DNS 터널링

 

 

❶  비정상적인 서브 도메인 길이

 

•  한국인터넷진흥원의 도메인 관리 원칙 : 도메인명 2~63자로 구성
•  서브도메인은 도메인 소유자가 생성하는 도메인명이다
•  비정상적인 도메인 길이는 주로 서브도메인을 의미
•  최근 클라우드서비스(CDN, Contents Delivery Network)는 도메인 포워딩 기술을 이용하므로 서브도메인이 길어 질 수 있다
•  해당 도메인을 화이트 리스트 등재 또는 예외처리를 하면 비정상적으로 길이가 긴 서브 도메인을 쉽게 찾을 수 있다

 

index=dnslog sourcetype=dnslog domain!="-"
| where NOT cidrmatch(domain, "0.0.0.0/0")
| eval list="Mozilla"
| `ut_parse(domain, list)`
| where NOT match(domain,"(microsoft.com|akamaized.net|amazonaws.com)$")
| eval sub_len=len(ut_subdomain)
| search sub_len > 20
| table ut_domain, ut_subdomain, sub_len, ut_netloc

 

 

< 한 줄 씩 보기 >

| where NOT cidrmatch(domain, "0.0.0.0/0")

-  도메인 필드 값이 IP 주소가 아닌 이벤트 검색 (IP이면 False)

 

| eval list="Mozilla"
| `ut_parse(domain, list)`

-  URL Toolbox 매크로를 이용해서 도메인 분할

 

| where NOT match(domain,"(microsoft.com|akamaized.net|amazonaws.com)$") 

-  match: 두 번째 인자로 여러 값을 한번에 비교

-  도메인이 microsoft.com, akamaized.net, amazonaws.com로 ($)끝나는 이벤트 제외

-  가상화를 지원해주는 사이트로, 클라우드 또는 CDN 서비스를 시행하면서 서브도메인 길이가 길다

 

| eval sub_len=len(ut_subdomain)

-  ut_subdomain 필드값의 길이를 구한다

 

| search sub_len > 20

-  서브 도메인 필드 값의 길이가 20이상인 이벤트를 검색한다

 

| table ut_domain, ut_subdomain, sub_len, ut_netloc

-  도메인, 서브 도메인, 서브도메인 길이, 전체 도메인을 나열

 

 

 

❷  비허가 DNS 서버 사용/DNS 터널링

 

•  직접 공격보다는 비정상적인 네트워크 탐지가 목적
•  호스트가 내부망에서 지정한 DNS 서버가 아닌 임의의 DNS 서버에 질의를 전송하는 증상
•  정책 수집의 선행 조건
    - 기업 내부망에 전용 DNS 서버를 구축하고 운영
    - 내부 클라이언트나 서버반드시 내부 DNS 서버를 사용하도록 IP 환경을 설정한다
    * 내부망 모든 호스트가 DNS 서비스를 요청하는 현황을 모니터리 가능
•  DNS 싱크홀과 같은 보안 기법 적용
    - DNS 싱크홀 : DNS 서버에 악성 도메인을 등록해서 접속을 차단

•  내부 호스트의 도메인 요청 질의를 분석하면 악성 도메인 접속을 시도하거나 접속했는지를 알 수 있음
•  출발지가 내부 지정 DNS 서버가 아니고 도메인 질의 대상이 내부망 호스트인 경우 비정상 접속을 시도한 것으로 판별

 

index=dnslog sourcetype=dnslog (dst!="172.16.142.11" AND dst!="172.16.142.12") 
(src!="172.16.142.11" AND src!="172.16.142.12") 
| stats count by dst 
| sort - count

-  DNS 서버 주소 : 172.16.142.11, 172.16.142.12

송수신지가 DNS 서버가 아닌 것을 추출한다