이전 포스트에 이어서 작성하였습니다.
[시스템 보안 및 실무/시스템 운영·구축 실무] - DNS 로그분석(현황분석/이상징후)
DNS 로그분석
● DNS 로그는 사용자의 네트워크 접속 행위를 분석하는데 가장 좋은 데이터 소스
● 내부망 DNS 로그 분석
- 직원들의 접속 패턴을 확인할 때 사용
- 공격자의 악성코드에 감염된 내부 PC가 내부 데이터 획득을 목표로 활동하는 상황을 파악할 수 있음
=> 좀비 PC는 악성코드에 감염된 PC로, 이걸 조종하는 컴퓨터를 C&C라고 함.
=> 사내망에 있는 컴퓨터를 감염시켰다면 공격자는 주기적으로 패치를 시키는 경우도 있고 또는 공격을 지시하는 경우도 있음. 이 감염된 PC를 통해 이 회사의 사내망의 상황을 파악함(거점 마련). 보통 공격자들은 자신을 숨기고 C&C를 통해 좀비 PC를 조종함. 보통 좀비PC는 C&C 주소를 도메인명으로 아는 경우가 많음. 그래서 감염된 PC의 특정 행위를 파악하다보면 C&C의 주소를 알아낼 수 있음
● DNS 주요 정보는 사용자가 조회하는 도메인 이름
DNS 로그를 이용한 네트워크 현황 분석
수집한 DNS 로그를 통해
1. Top 10 도메인 현황 (우리 직원들은 어느 사이트에 많이 접속하는지)
2. Top 10 도메인 요청 IP 현황 (접속할 때 어떤 형식으로 데이터를 요청하는지)
3. 도메인 응답코드 현황 (요청에 대한 응답이 정상적인지 확인)
=> 전반적인 통계치를 내기 위한 것! 이상징후 분석 X
1. Top 10 도메인 현황
● 사용자들이 가장 많이 접속한 도메인 10개
● 많이 접속한다는 것은 많은 사용자가 사용 또는 특정 사용자가 많이 사용할 수도 있다는 뜻
=> 동일한 도메인을 10분동안 60번 요청하는 경우, 매크로를 사용함을 추측
=> 공격자 또는 악성코드에 감염되었을 수도 있음을 추측
● 네트워크 접속 행위를 분석 시 해당 트래픽이 사용자가 발생시킨 것인지, 매크로가 일으킨 것인지를 분석의 기준으로 삼으면 좋음
● 현황 분석은 숫자를 보여주지만 해당 숫자에서 이상징후를 유추해야함
(0)
index=dnslog sourcetype=dnslog
=> dnslog 저장소에서 sourcetype이 dnslog 구조/구성인 것들만 보여줘
(1)
index=dnslog sourcetype=dnslog domain!="-"
| eval list = "mozilla"
| `ut_parse(domain,list)`
| table ut_netloc, ut_domain, ut_subdomain, ut_domain_without_tld, ut_tld
| dedup ut_netloc
=> dnslog 저장소에서 저장되어 있는 로그를 분석하는데, sourcetype이 dnslog(이전에 설정해놓음)이면서 검색 대상에서 domain이 명시되어 있지 않은 경우는 제외함. 즉, 도메인명이 명시되어 있는 경우만 검색
** - : 값이 설정되어 있지 않음
=> list에 mozilla 저장
=> 도메인명을 mozilla 형식에 따라 파싱을 진행
=> dnslog에 수많은 domain들이 있을텐데 그것을 새롭게 분할하여 결과를 테이블로 표시
=> 같은 사이트에 대해서는 중복하지 말고 하나만 파싱작업
(2) 사용자들이 가장 많이 접속한 도메인 10개를 검색
index=dnslog sourcetype=dnslog dpt=53 domain!="*.arpa" domain!="-"
| eval list="mozilla"
| `ut_parse(domain, list)`
| top showperc=f limit=10 ut_netloc
=> dnslog 저장소에서 저장되어 있는 로그를 분석하는데, sourcetype이 dnslog(이전에 설정해놓음)이면서 destination port가 53번인 것을 검색 또한 검색 대상에서 domain이 명시되어 있지 않은 경우와 domain이 .arpa로 끝나는 것은 검색에서 제외함(PTR record는 제외하겠어)
** .arpa : 역방향조회(PTR record), reverse domain
=> list 변수에 mozilla 저장
=> 도메인명을 mozilla 형식에 따라 파싱을 진행
=> 비율은 X, 결과는 상위 10개를 반환. ut_netloc(전체주소 출력)
** ut_netloc : 분할하지 않고 도메인명을 통째로 출력
ex) teredo.ipv6.microsoft.com에서
subdomain : teredo.ipv6
domain : microsoft.com
tld : com
netloc : teredo.ipv6.microsoft.com
[추가]
Reverse DNS(Reverse Domain)
- 역방향 조회로 IP 주소에 대응하는 도메인 이름을 조회하는 것
- PTR reocrd는 IP주소에 해당하는 숫자와 특수문자열 in-addr.arpa로 구성
- 역방향 조회의 TLD는 arp
최상위 도메인(Top-Level Domain, TLD)
- 도메인 네임의 가장 마지막 부분 ex) www.naver.com의 TLD는 com
- TLD는 일반 최상위 도메인(com)과 국가코드 최상위 도메인(kr)으로 나뉨
=> 빨간 네모는 domain
2. Top 10 도메인 요청 IP 현황
● 여러 명이 조회해서 조회 숫자가 많은 도메인과 한 명이 집중해서 조회한 도메인 구분
● 도메인과 해당 도메인을 접속한 송신지 IP주소를 동시에 검색
(1) 도메인과 해당 도메인을 접속한 송신지 IP주소를 동시에 검색
index=dnslog sourcetype=dnslog dpt=53 domain!="*.arpa" domain!="-"
| eval list="mozilla"
| `ut_parse(domain,list)`
| top showperc=f src, ut_netloc
=> dnslog저장소에 dnslog 필드를 구성하고 있는 것 중 destination port가 53번 인 것을 검색 또한 질의 도메인명이 명시되지 않은 것과 역방향 DNS는 제외
=> list 변수에 mozilla 저장
=> 도메인명을 mozilla 형식에 따라 파싱을 진행
=> 이 질의를 받은 건 DNS(수신지), src는 질의를 누가 요청한 것인지(송신지) 출력
=> 한 사용자가 한 사이트를 이렇게 많이 요청한 건 문제가 있음
=> 매크로를 사용함을 추측
=> 172.16.1346.107 주소를 사용하는 것들을 조사할 필요가 있음
=> 현황분석과 동시에 이상징후 파악
3. 도메인 응답코드 현황
● 도메인 응답코드(reply code)는 사용자가 요청한 도메인을 DNS서버가 응답한 결과
● Zeek의 응답코드 필드는 rcode와 rcode_name
(1) NXDomain이 빈번하게 발생하는 도메인과 해당 질의를 발생하는 송신지 모니터링
index=dnslog sourcetype=dnslog domain!="-" rcode_name= "NXDomain"
| top showperc=f src, domain
=> 위와 동일 + rcode_name이 NXDomain인 것을 검색(사용자가 질의한 도메인명이 존재하지 않음. 즉, 사용자 잘못)
어떤 도메인명에 대해 오류가 계속 발생하는지, 그것이 여러 명이 접속한 건지 한 명이 접속한건지 파악
** 응답코드는 DNS 포스팅 참고
** NXDomain을 검색한다는 것은
- 감염된 PC가 사라진 도메인의 접속을 시도
- DGA(도메인 이름을 주기적으로 동적으로 생성하는 알고리즘)로 생성된 도메인이 인터넷에 등록되지 않은 경우
www.nver.com이라고 입력하면 오류 => 1~2건이면 실수일 것 => NXDomain
만약 이것이 여러 건이 발생한다면 사용자가 매크로를 사용함을 추측
주소가 이전되었다면 사람의 경우 다른 곳으로 이동하지만, 존재하지 않는 같은 주소로 지속적으로 요청을 보낸다면 점검 대상