DNS(Domain Name System)
• 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 로그
인덱스가 있는 경로이다. sysmon 폴더 생성
indexes.conf 파일을 연다 음 sysmon 내용 추가
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 필드를 보여줌 |
'Rookies 9기 > 클라우드기반 시스템 운영구축 실무' 카테고리의 다른 글
클라우드기반 시스템 운영구축 실무 7일차 (0) | 2022.11.01 |
---|---|
클라우드기반 시스템 운영구축 실무 6일차 (0) | 2022.10.31 |
클라우드기반 시스템 운영구축 실무 5일차 (0) | 2022.10.28 |
클라우드기반 시스템 운영구축 실무 4일차 (0) | 2022.10.27 |
클라우드기반 시스템 운영구축 실무 3일차 (0) | 2022.10.26 |