[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에도 저장된다.
이 파일들은 로그 데이터를 빠르게 검색하고 분석할 수 있도록 한다.
- 인덱스 생성 후, 데이터 추가 후의 변화를 확인해보자.
설정 > 서버 설정 > 일반 설정 > 인덱스 경로



❷ Index 만들기 (로그 저장소)
인덱스: Splunk Enterprise 내 데이터의 저장소
설정 > 인덱스 > 새로 만들기 인덱스


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

생성이 완료되었다.

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

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


이름: 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 |

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



선택 > 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

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="-"

❶ 접속 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

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 서버가 아닌 것을 추출한다

'SK shieldus Rookies > 클라우드 기반 시스템 운영ㆍ구축 실무' 카테고리의 다른 글
Splunk, Sysmon 실습 - End Point 로그 분석 (미완) (0) | 2024.01.12 |
---|---|
Splunk 실습 - HTTP Log 분석 (미완) (0) | 2024.01.11 |
SIEM - Splunk 실습(Splunk Enterprise) & 검색 명령어 (미완) (0) | 2024.01.10 |
[SK shieldus Rookies 16기] Zeek 환경 구성 (0) | 2024.01.09 |
Web 구조, HTTP 메시지 구조 (미완) (0) | 2024.01.09 |