본문 바로가기

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

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

728x90

• fields 

‣ 검색 결과에서  특정 필드를 포함시키거나 제거 시 사용

‣ +는 기본값이므로 반드시 명시할 필요는 없음

‣ 필드를 추출하기 전에 동작하므로 검색 결과에서 원하는 필드만 선택 시 전체 검색 성능을 높일 수 있음

 

 

• split(X,"Y")

‣ 구분자 Y를 이용해서 X를 분할해 다중 값 형식으로 변환

‣ 구분자로 분리한 문자열은 여러 개의 토큰이 발생하므로 주로 mvindex()에서 사용

이벤트에서 특정 값을 추출할 때 사용

 

 

• mvindex(X, Y, Z)

필드  X에 있는 Y번째 값은 반환(Z생략 가능)

‣ Y는 인덱스 번호( 0 : 첫 번째 값, -1 : 인덱스를 뒤에서 시작, -2 : 끝에서 두 번째)

‣ 세 번째 인자인 Z는 선택적으로 사용

⇒ Z값을 지정하면 함수는 Y부터 Z까지의 값을 반환

 

 

• substr(X, Y, Z)

세 번째 인자인 Z가 없다면 필드 X의 Y부터 시작해서 문자열 끝까지 반환

‣ Z가 주어지면 Y부터 Z개의 문자열을 반환

 

 

• round(X, Y)

‣ X를 Y 자리 수 기준으로 반올림

‣ 나누기 계산을 할 경우 소수점 자리가 급격히 늘어나는 것을 방지 30

 

 

• url decode(X)

‣ URL 인코딩이 있는 X를 디코딩해 반환

‣ 웹 주소에 한글이 사용되는 경우 대부분 URL인코딩이 되어 바로 확인이 힘듦

‣ 인코딩 문자열을 디코딩해서 한글이 있는 경우라도 바로 확인할 수 있음

 

 

HTTPLog 프로토콜

• HTTPLog 실습 환경(인덱스 및  Source Type 생성, 데이터 추가)

더보기
인덱스에 들어가 새로 만들기 인덱스 선택
HTTPLog 이름으로 저장
인덱스를 보면 생성한 인덱스가 보임
Source Type 페이지로 이동 후 '새로 만들기Source Type' 선택
HTTPLog 이름을 입력한후 필드 내용 삽입
HTTP 필드 : ts,uid,src,spt,dst,dpt,trans_depth,method,domain,uri,referrer,version,user_agent,request_body_len,response_body_len,status_code,status_msg,info_code,info_msg,tags,username,password,proxied,orig_fuids,orig_filenames,orig_mime_types,resp_fuids,resp_filenames,resp_mime_types

 

HTTPLog 생성 확인
http.zip 데이터 업로드
Source type 및 인덱스 위에서 만든 저장소로 설정
검색 시작

• URL Toolbox 설치

더보기
앱 관리 선택
파일에서 앱 설치 선택
url-toolbox_192.tgz 파일 업로드
앱에 URL Toolbox 확인

• HTTP 로그 필드

‣ method 

사용자가 사용한 접속 요청 방식

⇒ GET, POST가 대부분

⇒ 정상 사용이 아닌 메서드를 찾아서 이상 징후를 탐지 가능

‣ host 

사용자가 접속한 도메인명

⇒ 웹 서비스는 도메인 기반으로 이뤄지므로 이 값이 IP로 나타나는 것은 일반적인지 않음

‣ uri

도메인을 제외한 주소

⇒ 클라이언트가 서버의 어떤 리소스에 접속했는지 파악 가능

‣ referrer

도메인에 접속하기 전에 들렸던 주소

⇒ 사용자가 페이지에서 클릭해서 다른 도메인으로 이동하는 경우에 발생

‣ version

⇒ HTTP 버전 확인

‣ user_agent

사용자가 사용한 웹 브라우저 정보 확인

‣ request_body_len

⇒ 사용자가 host로 전송한 데이터 양으로 바이트가 단위

‣ response_body_len

⇒ host에서 사용자로 전송한 데이터 양

‣ status_code

⇒ 사용자 요청 내역에 대한 서버의 응답 코드

‣ status_msg 

⇒ 서버 응답 코드의 상세 설명

더보기
ts
UNIX 시간 형식
uid
로그에 할당한 유일한 ID
id.orig_h
송신지IP주소
id.orig_p
송신지 port번호
id.resp_h
수신지IP주소
id.resp_p
수신지 port번호
method
서비스 요청 방식
host
접근 도메인
uri
접근 상세주소 (도메인제외)
referrer
Host 접속시 경유주소
version
HTTP 버전
user-agent
웹브라우저 정보
request_body_len
서버에게 전송하는 정보길이
response_body_len
사용자에게 전송하는 정보길이
status_code
상태코드
status_msg
상태 메시지
tags Proxied
프록시 접속 여부
resp_fuids
연결된 파일 ID
resp_mime_types 전송 파일 mime type

• HTTP 네트워크 현황 분석

‣ 내부 인트라넷 서비스/인터넷 기반 서비스도 대부분 HTTP로 동작

‣ HTTP를 분석 시 목적지가 인터넷인지 인트라넷 서비스인지 구분 필요

‣ 공격자가 내부망에 침투했다면 중요 데이터의 외부 유출을 시도함

⇒ 따라서 목적지가 인터넷으로 향하는 HTTP인지 아니면 기업 내부망으로 향하는지가 중요한 기준이 될 수 있음

 

HTTP 네트워크 현황 분석 항목

❶ Top 10 접속 도메인, 국가별 접속

사용자들이 가장 많이 접속하는 도메인을 추출해서 접속 현황 분석

‣ 특정 도메인과 국가로 많은 데이터가 전송되거나 낯선 국가명 등을 모니터링

‣ 접속 국가 정보를 이상 징후의 주요 항목으로 사용

더보기
index=httplog sourcetype=httplog domain!="(empty)" 
⇒ 인덱스와 소스 타입을 지정하고 domain 값이 (empty)가 아닌 결과를 찾는다
| iplocation dst 
⇒ 목적지 IP인 dst의 지역정보를 iplocation 명령어로 찾는다
| where NOT cidrmatch("0.0.0.0/0", domain) 
⇒ 도메인이 IP주소가 아닌 것을 찾는다
| stats sum(request_body_len) as "Outbound", sum(response_body_len) as "Inbound" by domain, Country 
⇒ 도메인, 국가명 기준으로 외부행, 내부행 전송량을 모두 더해서 Outbound와 Inbound 필드명으로 저장한다
| eval Outbound=round(Outbound/(1024*1024),2) 
⇒ Round 함수를 이용해서 소수점 2자리까지만 보여준다
| eval Inbound=round(Inbound/(1024*1024),2) 
Round 함수를 이용해서 소수점 2자리까지만 보여준다
| sort Outbound desc 
⇒ Outbound 필드를 역순으로 정렬한다
| head 10
⇒ 총 10개를 보여준다

 

❷ Top 10 클라이언트 오류

HTTP의 상태 코드는 클라이언트가 요청한 내용을 서버에서 처리한 결과

더보기
index=httplog sourcetype=httplog uri!="-" uri!="/" (status_code >=400 AND status_code < 500)
⇒ status_code가 400 이상이거나 500미만인 이벤트를 찾는다
| top domain, status_code limit=10 showperc=f
⇒ 상위 10개의 도메인과 상태코드를 보여준다

403 : 접속 권한이 없는 사용자 접속 요청    404 : 요청한 자료가 없음

❸ Top 10 서버 오류

클라이언트의 요청에 서버가 정상적으로 응답하지 못함

‣ 웹 응용프로그램이 비정상적으로 종료(공격자가 SQL 인젝션 같은 공격 등을 수행할 때 발생)

더보기
index=httplog sourcetype=httplog uri!="-" status_code >= 500
⇒ 상태코드가 500이상인 이벤트를 찾는다
| top domain, status_code limit=10 showperc=f
⇒ 상위 10개의 도메인과 상태코드를 보여준다

500 : 서버가 클라이언트 요청 처리 방법을 모를 때 또는 서버 프로그램이 비정상적으로 동작할 때                          503 : 서버가 요청을 처리할 준비가 되지 않음(서버 과부하 등으로 서비스 이용)

❹ HTTP 상태 코드

‣ 전체 상태 코드의 현황

더보기
index=httplog sourcetype=httplog domain!="(empty)" status_code!="-"
| top limit=10 showperc=f status_code
⇒ 상태코드 필드에서 상위 10개를 추출한다

❺ HTTP 메서드

‣ 클라이언트가 서버에 자원을 요청하는 방식

‣ 클라이언트는 서버에서 Get 또는 Post를 이용해서 자원 요청

‣ HTTP 표준에서는 많은 메서드를 지원하지만 사용자가 많이 사용하지 않는 메서드는 공격자의 정보 수집 행위 등 정상적인 사용 범위가 아닐 수 있음

더보기
시각화
index=httplog sourcetype=httplog uri!="-"
⇒ uri!="-"는 Uri 필드 값이 " - " 이 아닌 이벤트 검색
| top method limit=10 showperc=f
⇒ 상위 10개의 메소드 검색, 각 값이 차지하는 비율 검색하지 않음
각 값이 차지하는 비율 검색

HTTP 이상 징후

❶ 비정상 메서드 사용

‣ HTTP에서 메서드는 클라이언트가 서버에 데이터를 요청하는 방식

Head, Delete, Trace, Option과 같은 메서드가 네트워크에서 지속적으로 보인다는 것은 정상적인 사용자의 활동이라 보기 어려움

더보기
index=httplog sourcetype=httplog
| stats count(method) by src
⇒ 송신지를 기준으로 접속에 사용한 메소드의 종류별 개수 검색

 

index=httplog sourcetype=httplog
| stats count(eval(method=“OPTIONS”)) AS option_count by src
⇒ AS 키워드를 사용해서 count()함수 필드명을 option_count로 변경
| where option_count > 10
| sort option_count desc

 

index=httplog sourcetype=httplog
| where NOT match(method, "(GET|POST|-)")
⇒ 메서드가 GET, POST 그리고 " - "가 아닌 결과
| stats count(src) as src_count by method
메서드 별로 출발지 숫자를 세서 결과를 반환
| sort - src_count
⇒ 반환 결과를 역순으로 추출

❷ 외부행 데이터 전송

‣ 업로드 데이터 총량이 크면 분모가 분자보다 크므로 계산 결과는 1보다 큰 값을 결과로 가짐

결과 값이 1보다 큰 값이 나오는 출발지 주소와 목적지 주소를 조사

더보기
index=httplog sourcetype=httplog (request_body_len!=0 OR response_body_len!="0") domain!="-" 
⇒ 전송량이 0인 이벤트와 domain이 명확하지 않은 이벤트를 제거한다
| stats sum(request_body_len) as outTotal sum(response_body_len) as inTotal by src, dst 
⇒ 출발지 목적지 별로 업로드 전송향 과 다운로드 전송량의 총합을 구한다
| eval oMB=round(outTotal/(1024*1024),2) 
⇒ 총합 단위를 메가 바이트로 변환, round함수를 이용해서 소수점 두 자리로 변환
| eval iMB=round(inTotal/(1024*1024),2) 
⇒ 총합 단위를 메가 바이트로 변환, round함수를 이용해서 소수점 두 자리로 변환
| search oMB!=0 AND iMB!=0 
⇒ 메가 바이트 변환과정에서 너무 적은 값은 결과에서 제외
| iplocation dst 
⇒Splunk가 지원하는 내부 명령어로서 IP를 인자로 받아서 지리 정보를 반환
| eval isUp=if((oMB/iMB)>1, "Yes","No") 
⇒ 외부 전송향을 내부 전송량으로 나눈 값이 1보다 크면 isUP필드에 Yes를, 그렇지 않으면 No를 할당
| where isUp="Yes" 
⇒ isUP 필드가 Yes인 이벤트만 추출
| table src,dst, iMB, oMB, Country, City

❸ Mime-type과 파일 확장자 불일치

전송 파일이 그림 파일인지, 문서 파일인지 등을 바로 파악 가능

‣ 실행파일이라는 정보를 보여주는데 확장자가 실행파일이 아닌 것을 찾아낸다면 공격자가 위장하는 정보라고 판별 가능

더보기
index=httplog sourcetype=httplog resp_mime_types="application/x-dosexec" uri!="-“
| eval filename1=mvindex(split(uri,"/"),-1)
⇒ split() 함수를 이용해서 uri필드를 '/'로 분할
| eval filename=if(like(filename1,"%?%"), mvindex(split(filename1,"?"),0),filename1)
⇒ 추출한 uri에 '?' 가 있는지 like 함수를 이용하여 검색, 있다면 '?'를 기준으로 mvindex() 함수 적용
| eval filetype=if(match(filename,"(.exe|.bat|.ps1|.dll|.ocx)$"), "PE", "Not_PE")
⇒ filename의 문자열이 .exe, .bat, .psl, .dll, .ocx 중의 하나로 끝나면 PE를 반환하고 아니면 Not_PE를 반환
| table domain, uri, filename, filetype, resp_mime_types
⇒ domain, uri, filename, filetype, resp_mime_types를 테이블 형태로 보여줌
| where filetype=="Not_PE"
⇒ filetype이 Not_PE인 항목만 출력한 결과 화면에 출력
| dedup filename
⇒ filename 필드의 중복 제거

❹ 사이트 이동 후 실행파일 다운로드

유포지로 유도하는 코드를 가진 웹 사이트를 악성코드 경유지라고 함

‣ 악성코드가 해당 웹 서버에 있는 경우도 있고, 다른 웹 페이지로 사용자의 접속을 유도하는 코드가 있을 수도 있음

더보기
index=httplog sourcetype=httplog referrer!="-" status_code=200 
⇒ referrer 필드 값이 "-"이 아니고 특정 값이 존재한다는 의미, 상태코드가 200이라는 것은 해당 접속이 성공적으로 동작했다는 의미
| eval filename1=mvindex(split(uri,"/"),-1) 
| eval filename=if(like(filename1,"%?%"), mvindex(split(filename1,"?"),0),filename1) 
⇒ split 함수를 이용하여 uri 필드를 ' / '로 분할 후 -1 인덱스에 저장, like 함수를 활용하여 '?' 가 있는지 확인, 있다면 '?' 를 기준으로 mvindex() 함수 적용
| where cidrmatch("0.0.0.0/0",domain) 
⇒ 도메인이 IP주소라는 것을 의미
| where match(resp_mime_types,"application/x-dosexec") OR match(filename,"(exe|dll|com|src)$") 
⇒ 파일의 mime-types가 x-dosexce 형식이면서 파일의 확장자가 exe, dll, com, src인 경우를 찾는다
| eval URL=domain+" :: " + filename 
⇒ 도메인 필드와 filename 필드를 연결해서 URL이라는 필드에 할당
| stats count by src, URL 
⇒ 출발지와 URL을 기준으로 숫자를 센다
| stats list(URL) as Target list(count) as Source by src
⇒ 출발지 별로 접속한 URL의 개별적인 접속 수를 보여줌

❺ 프락시 서버 접속

‣ 인터넷의 웹 서버를 접속할 때 사용하는 프락시는 불특정 다수에게 웹 사이트 접속을 빠르게 하는 캐시의 목적으로 사용하는 경우

‣ 기업 업무망에서 인터넷으로 향하는 네트워크에서 사용하는 프록시는 사용자 인증, 사용자 접속 제어 용도로도 사용

‣ 로그에서 메서드가 connect를 사용하면 목적지 서버는 프록시 서버라는 의미

더보기
index=httplog sourcetype=httplog (uri="http://*" OR method="connect")
⇒ uri필드 값이 http://로 시작하거나 method가 connect이 로그를 찾으면서 프록시서버 접속을 검색
| table src, domain, uri

DNS

• 내부망 DNS 서버 로그 분석

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

‣ 공격자의 악성코드에 감염된 내부망 PC가 내부 데이터 획득을 목표로 활동하는 상황을 파악할 수 있음

⇒ 내부망 도메인의 집중 질의는 공격자가 내부는 탐색하는 내부망 이동 공격일 수 있음

⇒ 감염된 PC가 인터넷에 위치한 C2(Command&Control) 서버에 접속할 수 있음

 

 

• DNS 실습 환경

더보기
DNSLog 이름으로 인덱스 생성
생성된 인덱스 확인
DNSLog 이름으로 Source Type 생성
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 확인
dns.zip 데이터 파일 업로드
생성한 Source type 및 인덱스 저장소로 수정
검색 시작