본문 바로가기

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

클라우드기반 시스템 운영구축 실무 8일차

728x90

DNS(Domain Name System)

DNS의 구조 및 프로세스

• Local Name Server

‣ Recursive Name Server 또는 Cache Name Server

사용자 호스트부터 질의가 들어오면 자신의 캐시에 저장된 정보 또는 반복적 질의 통해 그 결과를 사용자 호스트에 응답

‣ 일반적으로 ISP업체가 제공 ex) KT(kns.kornet/168.126.63.1)

• Master Name Server

특정 도메인에 대한 정보를 관리하면서 해당 도메인에 대한 질의만 응답하는 네임서버

‣ 각 회사/사이트별로 자신의 도메인을 관리하는 DNS 서버

‣ 네임서버가 관리하는 도메인 영역을 존(zone)이라 함

‣ Zone file : 관리 도메인에 대한 정보를 담고 있는 파일

 

• DNS 로그 필드

필드명 필드 설명
ts 시간정보로 Unix시간으 로 표시
Uid 로그에 할당된 ID
Id.orig_h 송신지 IP주소
Id.orig_p 송신지 Port번호
Id.resp_h 수신지 IP 주소
Id.resp_p 수신지 Port 번호
Protocol 사용 프로토콜
trans_id 질의와 응답을 연결하는 ID
Rtt 응답시간
query 도메인질의내용
Qclass 질의클래스
Qclass_name 질의클래스 이름
Qtype 질의형식
Qtype_name 질의형식이름
rcode 답변코드
Rcode_name 답변코드이름
AA 인증서버답변여부
TC 전체질의가 잘렸는지 여부
RD 재귀질의 요청여부
RA 재귀질의 가능여부
Z 예약된 필드로 사용하지 않음
Answers DNS서버에서 반환한 답변내역
TTLs 반환한 도메인의 TTL
Reject 질의가 거부됐는지 판

 

• URL Toolbox 사용하기

더보기
index=dnslog sourcetype=dnslog domain!="-"
| eval list="mozilla"
| `ut_parse(domain,list)`
⇒ mozilla에서 지정한 형식을 따른다는 의미
| table ut_netloc, ut_domain, ut_subdomain, ut_domain, ut_domain_without_tld, ut_tld
| dedup ut_netloc
⇒ 중복을 제거

• URL Toolbox가 지원하는 메크로

‣ ut_netloc : 전체 도메인을 보여줌

‣ ut_domain : 서브 도메인을 제외한 도메인 명을 보여줌

‣ ut_subdomain : 서브 도메인만을 보여줌

‣ ut_domain_without_tld : 도메인에서 tld를 제외하고 보여줌

‣ ut_tld : 도메인에서 tld 값만을 보여줌

DNS 네트워크 현황 분석 항목

• Top 10도메인 항목

사용자가 가장 많이 접속한 도메인 10개를 보여줌

‣ 많이 접속한다는 것은 많은 사용자가 접속한다는 뜻이지만 소수의 클라이언트가 많이 접속할 수도 있다는 뜻이기도 함

ex) 동일한 도메인을 10분 동안 60번씩 요청할 경우, 자동화된 프로그램으로 동작한다고 추측 가능

‣ 네트워크 접속 행위를 분석 시 해당 트래픽이 사용자가 발생시킨 것인지, 자동 프로그램이 일으킨 행위인지를 분석의 기준으로 삼으면 좋음

※ 현황분석은 숫자를 보여주지만, 해당 숫자에서 이상 징후 유추 가능

더보기
index=dnslog sourcetype=dnslog dpt=53 domain!="*.arpa" domain!="-" 
⇒ dnslog 저장소에서 Reverse 도메인 또는 Domain필드가 없는 경우는 제외
| eval list="mozilla" 
| `ut_parse_extended(domain,list)` 
⇒ TLD 목록을 mozilla에서 지정한 형식을 따르고, Domain은 도메인 값이 지정한 필드명
| top showperc=f limit=10 ut_netloc
⇒ 상위 10개의 전체 도메인을 추출, 각 데이터가 점유하는 비율을 나타내지 않음

• Top 10 도메인 요청 IP 현황

여러 명이 조회해서 조회 숫자가 많은 도메인과 한 명이 집중해서 조회한 도메인 구분

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

더보기
index=dnslog sourcetype=dnslog dpt=53 domain!="*.arpa" domain!="-"
⇒ Reverse 도메인 또는 Domain 필드가 없는 경우는 제외
| eval list="mozilla"
| `ut_parse(domain,list)`
⇒ TLD 목록을 mozilla에서 지정한 형식을 따르고, Domain은 도메인 값이 지정한 필드명
| top showperc=f src, ut_netloc
⇒ 사용자가 조회한 전체 도메인의 빈도를 상위 10개를 보여줌

※ 내부 서버 도메인을 조회하는 현황 파악

더보기

• 내부망 DNS 서버 로그 분석

 

인터넷으로 향하는 도메인과 내부망으로 향하는 도메인을 구분해서 분석해야 함

‣ 내부망 도메인은 기업이나 조직에서 사용하는 도메인

‣ 내부용 DNS서버는 내부 사용자가 인터넷 또는 내부 업무망을 접속 사용

 

 • 내부 도메인의 집중 질의 

‣ 공격자가 내부는 탬색하는 lateral movement 공격일 수 있음

‣ 감염된 PC가 인터넷이 위치하는 C2서버 접속을 위한 준비일 수도 있음

• 보안 담당자는 인터넷으로 향하는 도메인과 내부망으로 향하는 도메인을 구분해서 분석해 네트워크 접속 유형을 파악

Lateral movement
• 내부망 공격이라 부름
• 조직 내부로 침투한 위협이 최종 타깃 시스템을 찾기 위해 내부망에서 이동하는것
• 횡적이동: Client to Client 또는 Server to Server 이동
• 종적이동: Clietn to Server 또는 Server to Client
• 주위 시스템을 감염시키는 것이 목표

 ※ 내부 서버 도메인을 조회하는 현황 파악 로그

index=dnslog sourcetype=dnslog dpt=53 domain!="*.arpa" domain!="-" 
| eval list="mozilla" 
| `ut_parse(domain,list)` 
| where math(ut_domain, "도메인주소$")
| top showperc=f ut_netloc

• 도메인 응답 코드 현황

‣ 도메인 응답코드(reply code)는 사용자가 요청한 도메인을 DNS 서버가 응답한 결과 값

‣ Zeek의 응답코드 필드는 rcode와 recode_name

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

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

• 도메인명을 잘못 입력한 경우 해당 도메인이 등록되지 않은 경우 오류가 발생

‣ 지속적인 NXDomain 응답은 점검 대상

• NXDomain이 지속적으로 발생하는 경우

‣ 감염된 PC가 사라진 도메인의 접속을 시도

‣ DGA로 생성된 도메인이 인터넷에 아직 등록되지 않은 경우

※ DGA(Domain Generation Algorithms)

⇒ 도메인 이름을 주기적으로 동적으로 생성하는 알고리즘

더보기
index=dnslog sourcetype=dnslog domain!="-" rcode_name= "NXDomain" 
| top showperc=f src, domain
⇒ NXDomain이 빈번하게 발생하는 도메인과 해당 질의를 발생하는 송신지 모니터링

DNS 이상징후

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

‣ 서브 도메인은 도메인 소유자가 생성하는 도메인명

더보기
index=dnslog sourcetype=dnslog domain!="-"
| where NOT cidrmatch(domain, "0.0.0.0/0")
⇒ 도메인 필드 값이 IP주소가 아닌 이벤트를 찾는다
| eval list="mozilla" 
| `ut_parse(domain,list)` 
⇒ URL Toolbox 매크로를 이용해서 도메인을 분석
| where not match(ut_domain, "(microsoft.com|akamaized.net|amazonaws.com)$")
⇒ 도메인이 저장된 새 필드인 ut_domain 값을 비교, $가 포함된 이유는 비교 도메인이 비교 대상의 마지막 문자열인지 검사 즉, ut_domain 필드 값이 microsoft.com 또는 akamaized.net, amazonaws.com으로 끝나지 않는 이벤트를 찾는다
| eval sub_len =len(ut_subdomain)
⇒ ut_subdomain 필드 값의 길이를 구한다
| search sub_len > 20
⇒ 서브 도메인 필드 값의 길이가 20이상인 이벤트를 구한다

 

• 검색 결과를 table로 보기

index=dnslog sourcetype=dnslog domain!="-" 
| where NOT cidrmatch(domain, "0.0.0.0/0") 
| eval list="mozilla" 
| `ut_parse(domain,list)` 
| where not match(ut_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

• 비허가 DNS 사용 /DNS 터널링

‣ 직접 공격보다는 비정상적인 네트워크 행위를 탐지

‣ 호스트가 내부망에서 지정한 DNS 서버가 아닌 임의의 DNS서버에 질의를 전송하는 증상

‣ 전제 조건

⇒ 기업 내부망에 전용 DNS 서버 구축

⇒ 내부 클라이언트나 서버가 반드시 내부망 DNS 서버를 사용하도록 강제

더보기
ndex=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 서버가 아닌 것과 출발지가 DNS 서버가 아닌것을 추출

‣ 출발지가 내부 DNS 서버가 아니도 도메인 질의 대상이 내부 지정 DNS서버가 아닌 내부망 호스트는 비정상 접속 시 판별

• 도메인 엔트로피 값을 이용한 탐지

‣ 엔트로피는 정보의 양을 측정하는 방식

⇒ 자주 발생하지 않은 사건은 정보량이 많다는 것을 기반

‣ 확률 계산 결과 값이 크면 정보량이 많은 것이고 작으면 적은 것

⇒ 자주 발생하지 않은 사건은 정보량이 많음

⇒ 자주 발생하는 일은 정보량이 적음

‣ 익숙한 단어들로 만들어진 도메인은 정보량이 적음(엔트로피 값이 작다)

‣ URL toolbox의 ut_Shannon() 매크로를 이용해서 엔트로피 계산

더보기
index=dnslog sourcetype=dnslog domain!="-"
|where NOT match(domain, "(microsoft.com|akamaized.net|amazonaws.com|addr.|qoo19.jp)$")
| eval list="mozilla"
| `ut_parse(domain,list)`
| `ut_shannon(ut_netloc)`
⇒ ut_shannon 매크로는 도메인을 입력 받아서 엔트로피 값을 계산
| eval shannon =round (ut_shannon,2)
⇒ ut_shannon 값을 소수점 두 자리에서 정리하고 shannon 필드에 저장
| where shannon > 3.9
| eval shannon_str = ut_netloc."/".shannon
| stats count by ut_domain, shannon_str
|stats list(shannon_str) by ut_domain
⇒ 도메인별로 엔트로피 목록을 만들어거 보여줌

엔드포인트 로그

PC Server
• 네트워크 출발지로 동작
• 많은 네트워크 접속 행위를 발생
• 프로그램 설치/삭제가 빈번 발생
• 프로세스 생성/삭제 빈번 발생
• 파일 생성/ 수정/ 소멸도 많이 발생
• 도착지의 임무를 수행
• 프로그램의 설치/삭제 등이 많이 발생하지 않음

‣ 엔드포인트 로그는 엔드포인트에서 발생하는 이벤트를 보여줌

⇒ 호스트의 동작만 보여주는 것이 아님

⇒ 악성코드에 감염된 호스트 검색 가능

⇒ 위협 사냥의 기본 자료로 사용

※ 위협사냥 : 숨어있는 위협을 탐지해 공격 기법과 공격자를 식별하고 제거하는 행위

• 엔드포인트 로그의 관리 어려움

‣ 엔드포인트 수량이 많아서 대용량 로그 생성

‣ PC 호스트별, 사용별 로그를 수집하고 분류

 

 

• sysmon

‣ Microsoft의 Sysinternal suite에 포함된 시스템 모니터링 툴

‣ 기본 윈도우 이벤트 로그로는 한계가 있는 프로세스 생성, 네트워크 연결, 파일 생성 시간 변경 등의 정보를 추출한 후 윈도우 이벤트 저장소에 저장

※ 이벤트 기반 정보가 아닌 '행동 기반 정보'를 수집해서 이벤트 저장소에 저장

 

• Sysmon 기능

‣ 실행 프로세스와 부모 프로세스의 전체 명령 줄을 로그로 저장

‣ MD5, Sha1, Sha256 알고리즘으로 실행 프로그램의 해시 값을 기록

‣ 여러 종류의 해시 값을 동시에 기록

‣ 네트워크 연결에서 IP주소, 포트번호, 호스트명, 포트명 등을 기록

‣ 레지스트리에서 환경 설정이 변경된 경우 자동으로 다시 읽어 들임

 

• Sysmon 생성 이벤트 목록

ID 이벤트 이름 활용 방안
1 Process creation 프로세스가 새로 생성되면 생성 되는 로그 
프로세스가 실행됐을 때 사용된 명령어의 전체 줄을 이벤트로 기록
2 A process changed a file creation time 프로세스가 파일 생성 시간을 수정시 기록
공격자가 백도어 파일을 설치하면서 운영체제 파일을 위장하 는것을 탐지 할 수 있음
3 Network Connection 호스트에서 TCP/UDP 연결기록을 이벤트로 생성
어느 프로세스가 네트워크 접속을 시도했는지 파악할 수 있으 며 호스트명, IP주소, 포트번호 등 정보 제공
5 Process terminated 프로세스가 종료되면 이벤트를 생성
더보기

Sysmon 로그 

C:\Program Files\Splunk\var\lib\splunk

인덱스가 있는 경로이다. sysmon 폴더 생성

sysmon.tgz 파일을 옮긴 후 압축 풀기
C:\Program Files\Splunk\etc\apps\search\local

indexes.conf 파일을 연다 음 sysmon 내용 추가

Splunk 다시 시작

PC 이상 징후 분석

• 비정상 폴더에서 exe파일 실행

‣ 윈도우 실행 파일(시스템폴더) 위치

⇒ C:\Program Files, C:\Program Files(x86)

⇒ C:\Windows, C:\Window\system32

‣ 악성코드는 단일 실행 파일로 윈도우 실행파일 폴더에서 설치되지 않음

※ 프로그램의 실행 경로를 판단한다면 이상 징후를 판별 가능

⇒ 백도어 프로그램은 윈도우 정상 파일의 대체로 C:\Windows\System32에 설치되기도 함

⇒ 실행 파일의 최초 실행 폴더를 기반으로 탐지

⇒ 인터넷으로 다운로드한 악성코드가 처음부터 시스템 폴더에 복사되지는 않기 때문

‣ 실행된 프로세스 로그를 기반으로 탐지

더보기
index=sysmon sourcetype="WinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1
 ⇒ EventCode = 1 : 프로세스 생성/삭제 관련 로그
(CurrentDirectory!="*Program Files*" AND CurrentDirectory!="*system32*")(Image!="system32*" AND Image!="*Program Files*" AND Image!="*SysWOW64*") 
⇒ CurrentDirectory : 실행 파일이 들어있는 디렉터리 /  Image 필드 : 실행경로와 파일명
⇒ Program Files, System32, SYsWOW64 등은 검색에서 제외
    [ search index=sysmon sourcetype="WinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1 
    | rare CurrentDirectory limit=10 showperc=f showcount=f] 
⇒ [search] : 하위 검색을 나타냄(하위 검색을 사용하는 이유-> 검색범위 줄이기 위해)
⇒ 시스템 폴더 외에서 실행되고 있는 파일들을 검색
⇒ 악성코드는 소수만이 감염되므로 rare를 이용(rare빈도가 낮은 것들을 최상위에 배치(top반대))
showperc(점유율)과 showcount(점유개수)는 보지 않음(false)

| table Image

C:\RECYCLE\2.exe -> 휴지통에서 파일을 실행, 백신과 같은 보안 제품을 위회 하기 위해 공격자들이 자주 사용

• 파일 실행 후 원본 파일 삭제

‣ 하드 디스크에 저장된 악성코드는 실행이 되어 메모리에 적재되면 프로세스 상태가 되어 PC들을 감염

‣ 악성코드 파일 실행 후 원본 파일을 삭제

⇒ 파일 본체의 획득이나 분석을 회피하기 위함

프로그램을 실행 후 원본 파일을 디스크에서 삭제하는 행위는 정상 행위 아님

더보기
index=sysmon sourcetype="WinEventLog:Microsoft-Windows-Sysmon/Operational"
 EventCode=1 ParentImage="c:\\windows\\explorer.exe"
⇒ EventCode = 1 : 프로세스 생성/삭제 관련 로그
⇒ ParentImage="c:\\windows\\explorer.exe“ 지정 ( 검색 위치를 윈도우 탐색기로 지정, 변수정의)
    [ search index=sysmon sourcetype="WinEventLog:Microsoft-Windows-Sysmon/Operational" 
    | where NOT isnull(Image) AND NOT isnull(ParentImage) 
    | search CommandLine="* del *" 
⇒ 실행 경로상 또는 윈도우 탐색기에서 실행된 파일들만 검색
⇒ NOT isnull(Image) : 실행 경로상의 실행파일이 
⇒ NOT isnull(ParentImage) : 윈도우 탐색기에서 실행시키 것이 아님
    | table ParentImage 
    | rename ParentImage AS Image
        ] 
| table Image

• 실행 후 네트워크 접속 다수 발생

‣ 몇몇 악성코드는 실행한 후 C&C 서버에 접속을 시도하거나 특정 사이트에 접속해서 코드를 추가로 다운로드하거나 내부망을 취약한 스캔한 기도함

‣ 과다 접속을 유발하는 프로그램명과 해시 값을 찾아줌

더보기
index=sysmon sourcetype="WinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1 
(Image!="C:\\windows*" AND Image!="*Program Files*") 
⇒ 다른 과다 접속들을 유발하는 트래픽 프로그램 검색
 [ search index=sysmon sourcetype="WinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=3
   (DestinationIp!="10.0.0.0/8" AND  DestinationIp!="172.16.0.0/12" AND DestinationIp!="192.168.0.0/16")
⇒ 실행 결로가 아닌 곳에서 실행되는 프로세스들을 EventCode=3에 대해 검색
  | stats count(DestinationIp) AS total_count dc(DestinationIp) AS uniq_count by Image
⇒ EventCOde=3에서(네트워크 정보를 가진 로그) 인터넷 접속만을 대상으로 검색한다면 목적지 주소가 사설주고가 아닌 결과만 검색
  | where total_count > 50 OR uniq_count > 20
  | table Image]
⇒ 전체 목적지 접속 수가 50번 이상이거나 유일한 목적지 IP개수가 20개 이상을 일으킨 파일을 찾아서 반환
|table Image

• 네트워크 Shell 실행

‣ netsh.exe

- 현재 실행 중인 컴퓨터의 네트워크 구성을 표시하거나 수정할 수 있는 명령줄 스크립팅 유틸리티

- 관리자는 netsh을 이용하여 자동 스크립트를 구성하고 배포

더보기
index=sysmon sourcetype="WinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1 
⇒ 인덱스와 소스 타입을 지정 후 프로세스 실행 이벤트 코드를 찾음
| where match(Image, "netsh.exe$")
Image 필드 값이 netsh.exe로 끝나는 결과를 찾음
| where NOT isnull(ParentImage)
⇒ ParentImage필드가 null이 아닌것을 찾음
| table ParentImage, Image, CommandLine
⇒ ParentImage, Image CommandLine 필드를 보여줌