본문 바로가기
보안/보안공부

23년 실전형사이버훈련장 - 위협이벤트 식별훈련(1일차)

by 보안매크로 2023. 6. 19.
728x90

책과 같이 참고하면서 보세요.


회사들은, 보통 풀패킷을 덤프떠서 오탐 정탐 여부 판별 요구가 많다.
대용량의 데이터(로그)를 분석하는 기술을 길러야한다.
whireshark는 많은 패킷분석은 못함. 정밀분석시에 사용.

스플렁크, 아파치 스파크 등 대용량 패킷 분석

btlo1-webshell.pcap
4.35MB
SSH-BF-EtM.pcap
0.09MB


-Zeek
zeek는 Bro회사로부터 출발함
zeek는 IPS IDS의 기본적인 능력도 수행
스플렁크에서 데이터를 덤프떠와, 쿼리 분석 가능, 앱중 zeek 지원, 엘라스틱에도 넣어 작업 가능
무료 앱인 zed zui(주이)로 분석해보자.
zed(로그 가져옴)의 프론트엔드 역할, zed와 통신하며 데이터 분석 가능
zeek(로그 추출) -> zed(로그 저장) -> zui(패킷 분석)
zed대신 스플렁크 권장! 쿼리가능해서.

 

패킷파일을 zui에 올려 분석해보자.
각 패킷의 정보가 아닌 세션(통틀어)의 정보가 필드에 나타난다. 실제 통신할 때 단일패킷이 여러번 해서 한번의 세션이 만들어지는 것임.


http.log (책 참고)
링크 타고 들어오면 referrer 가 기록됨.
직접 입력시 안나옴
웹셀을 설치하고, 다이렉트로 입력하기에 referrer안뜸
user_agent가 없다는건 웹브라우저를 이용 안하는것. 파이썬 등 사용 시 안뜸, 해킹도구들이 여기에 이름 뜰 수 있다. 특정 악성코드들은 유명 웹브라우저들 오타내서 뜨기도 함.

GET / index.jsp HTTP/1.1
Host:www.naver.com

GET : Method
/index.jsp : URI
HTTP : Protocol
1.1 : Protocol version
Host: host

http://myname:mypw(인증이 필요한 경우 id, pw입력값, 보통 생략됨))@www.wow.com/index.jsp
ftp://user:passwd@192.168.1.1/pub/abc.zip - 바로 파일다운 가능, 이런경우 id,pw값 나타냄

 

 

로그인 인증 성공했는지 아는법? 암호화 되어있을탠데 어떻게 알까?

ssh 브루트포스 공격을 패킷만 보고 찾아봐라? - 대표적인 ssh 대상으로하는 공격임.

http - 웹쉘, 포트스캐닝 공격이 대표적이다.

 

 

위협 행위/이벤트 식별

- 알려진 시그니처/IoC와 매칭되는 무엇이 있는지

예) 고스트스크립트가 포함된 HWP 문서가 오픈되었음

  => gswin32c.exe가 실행됨

 

-IOC (침해지표) 는 전형적으로 시스템과 IP 주소, 도메인, URL, 해쉬, 이메일 주소 또는 파일이름과 관련된 네트워크 아티팩트로 구성되어 있습니다. 이 지표들은 특정시간에는 적대적인 행위랑 연관이 되어 있어, 지속적으로 변화를 합니다. 이 지표의 중요한 것은 개별 조직에 영향을 까치는 미치는 침입과 동일하지 않다는 것이 중요합니다. 중요한 침해지표에만 집중을 하면, 다양한 활동에 걸처서 발견되는 지표가 잠재적인 위협행동에 집중하게 도움을 줄 수 있습니다.

-IOA (공격지표) 는 전형적으로 전략, 기술 그리고 절차로 구성되어 있으며, 이는 적이 그들의 타겟을 침해하는 것을 활용합니다. 그래서 궁극적으로 그들의 의도를 확인합니다. 악의적인 요소의 여러 단계가 그들의 인련의 목표에 달성하기 위해서 해야 하는 것을 상상해 보세요. 이러한 예시들은 코드 실행, 지속적인 메커니즘, 명령과 컨트롤 생성, 그리고 방어 침입기술들을 포함하고 있습니다. 공격의 지표가 사고 또는 침해가 완전히 일어나기 전에, 위협의 행동을 식별하고 방어하는 기회를 제공하는 것이 지표가 하는 역할입니다.

 

- outlier detection (이상치 탐지)

  정상적인 범주를 벗어난 어떤 값을 찾는 것. 

 예) LFO(Least Frequency Occurence) 분석 - 유저에이전트를 다 카운트 해봤는데 A는 만번, b는 5000번, c는 10번, 일반적이지 않은 케이스인 c가 이상하니 분석하는 것. / 스태킹(stacking)이라고도 함, 스택 = 쌓다, 쌓아서 개수 카운트 하겠다.

       Box Plot - 평균값 계산할 때 쓰는 것, 박스 범위 밖의 값이 이상한 수치인 것 확인 가능

 

- 알고있는 정상적인 상태와 다른 것이 무엇이 있는지

svchost.exe가 실행되었습니다. 정상인가요? 알수없다.

-parent process가 rund1132.exe입니다. 정상인가요? 비정상, 보통  services.exe여야함.

-커맨드라인 파라미터 없이 실행되었습니다. 정상인가요? 비정상, k파라미터와 함께 되어야하는데 없으면 비정상

정상 상태에 대해서 아는게 중요하다!

 

 

포트 스캐닝

오픈되있는 포트에 SYN(싱크, 처음에 보내는 패킷이라고 생각) 패킷을 보내면 응답이 오는걸 보고 열려있구나 알수있고, 리셋을 다시 보내 내정보를 없애는 특징을 가짐

포트가 열려있지않으면 리셋을 응답으로 받음.

단일 호스트 대상 멀티 포트 스캐닝, 다수 호스트 대상 소수 포트 스캐닝 두가지 유형 있음.

 

 

ZUI Qurry문

주석은 '//' 임

_path == "conn" # path값이 conn(connection) 인것만 보여줌, 

_path == "conn"  | count() by id.resp_p #집계함수, id_resp_p의 숫자를 센다, by(그룹화) 다음엔 필드명이 오면 해당 필드를 key값으로 해서 그룹을 만든다는 의미로 생각하자. |는 집계된 것을 어떻게 처리할지 뒤에 써주는 것.

_path == "conn"  | count() by id.resp_p | sort -r count  #count값을 바탕으로 내림차순으로 분류

#union(id.resp_p)은 ()내용을 합집합, every(5m)은 5분짜리 타임슬릇(타임버킷)을 계속 만들어 5분단위로 패킷들을 하나의 바구니에 담음, id.orig_h, id_resp_h로 집합화.

_path == "conn" | union(id.resp_p) by every(5m), id.orig_h, id.resp_h

_path == "conn" | union(id.resp_p) by every(5m), id.orig_h, id.resp_h | len(union) > 10 (5분 시간안에 10개포트에 시도하면 스캐닝으로 판단, )  len(union) # 유니온의 개수를 새라

그룹기준 : origin, respon, time 간격이 같아야 같은 그룹임. 하나라도 다르면 다른 그룹임!

 

말로 정확히 설명한 후에 쿼리문을 만들어야 한다.

짧은 시간(시간개념=by every(2m))동안 하나의 시스템(originator 값이 Key값이 된다=by id.orig_h)이 다수(집계함수, 개수를 세야겠네)의 호스트(responder)들과 통신(커넥션)을 시도한 유형을 찾아야 한다. count는 중복된것도 카운트되니 안됨. 포트 스캐닝으로 간주

_path == "conn" | union(id.resp_h) by every(2m), id.orig_h | len(union) >= 3 (3개 이상의 다른 시스템과 커넥션을 형성한 경우 포트스캐닝으로 간주함)

 

그렇다면, 포스스캐닝 중 오픈되어 있던 포트는 어떻게 알 수 있을까? history ShR 찾으면 됨.

_path == "conn" grep(/Sh*R/,history) id.orig_h == 10.251.96.4 id.resp_h == 10.251.96.5
| cut id.resp_h, id.resp_p

Sh*R이지만 중간에 *덕분에 포트스캐닝 아닌것도 탐색이 될 수 있으니 S와 R사이에 다른게 들어가면 패턴을 찾아서 검색해야한다.

 

닫혀있으면 reset반환을 보낼테니 이 호스트의 특성을 활용해 그 반환을 찾아 스캐닝 식별

_path=="conn" grep(/r/,history) | count() by every(5m), id.orig_h | count > 100

아래 결과, 10.251.96.4가 리셋을 받은 횟수가 1022다.

{"originWidth":3834,"originHeight":2010,"style":"alignCenter","caption":"_path==\"conn\" grep(/r/,history)

 

웹클라이언트 구분할 때 고유한  ip 주소와 user_agent 쌍으로 묶어 구분하는 것이다!!! (ip는 같지만 에이전트가 다를 수 있음)

웹로그 또는 웹트래픽 분석 시 User_agent를 왜 알아야 하는가?

1. 일부 해킹, 취약점 점검도구들은 user_agent 문자열에 소프트웨어명과 버전 정보 등을 기록

2. 분석시 잘 알려진 user_agent DB와 비교하여 스펠링이나 단어의 순서, 공백 유무 등의 차이점이 있는지 확인

3. user_agent 문자열의 값이 null인 경우 클라이언가 웹브라우저가 아님을 의미.

4. HTTP를 이용하여 C2와 통신하는 악성코드들은 user_agent 문자열을 정상적인 브라우저처럼 보이도록 설정

* user_agent 문자열이 특이항 경우 이를 시그니처로 활용하여 악성코드에 감염된 시스템을 찾아내기도 함

5. LFO분석을 통해 관찰되는 빈도수가 현저히 낮은 것들은 조사해볼 필요가 있

 

웹취약점 스캐너는 2종류가 있다

1. 여러 URl를 대상으로 요청을 전송한 후 응답을 확인

일반적인 사용자라면 사용하지 않을 리소스들에 접근 시도

짧은 시간안에 다수의 URI를 대상으로 요청이 전송되고

짧은 시간안에404 not found 응답이 많으면 스캐너 돌린거라고 생각할 수 있다.

_path == "http" status_code == 404 | count() by every(2m), id.orig_h, user_agent | count > 100

http 통신의 404 코드를 가지고, 2분 타임 슬릇, id orig host값, user_agent값으로 그룹화 하여 나타낸다. 100 이상만 나타냄.

{"originWidth":3831,"originHeight":2013,"style":"alignCenter","caption":"_path == \"http\" status_code == 404

 위 사진을 보면, 고버스터(gobuster)를 이용했는데, 검색해보면 취약점 스캐너이다.

만약 실제 접속된 것을 찾아보고 싶다면, status_code 를 >=200, <300 하면 된다.

_path == "http" status_code >=200 status_code < 300 grep(/gobuster/,user_agent) cut method uri referrer

 

2. 특정 URI를 대상으로 반복적으로 공격 문자열을 주입하여 반응을 확인

 

 

하나의 TCP 세션에서 대량의 HTTP 요청/응답을 주고 받은 크라이언트 식별

_path == "http" | max(trans_depth) by id.orig_h, user_agent | sort -r max

{"originWidth":3832,"originHeight":1993,"style":"alignCenter","caption":"_path&nbsp;==&nbsp;\"http\"

 

짧은 시간 동안 웹서버와 주고받은 요청/응답의 수가 많은 호스트 식별

_path == "http" | count() by every(2m), id.orig_h, id.resp_h, user_agent | sort -r count

{"originWidth":3820,"originHeight":1987,"style":"alignCenter","caption":"_path&nbsp;==&nbsp;\"http\"

_path == "http" grep(/gobuster/,user_agent) | cut uri

gobuster에 관해 uri 뭐 입력했는지 볼 수 있다. grep(단어 들어가는거 검색)

 

- SSH Bruteforcing 식별

일정 시간동안 로그인에 실패한 횟수가 임계치 이상인 경우

_path == "ssh" auth_success == false | sum(auth_attempts) by every(2m), id.orig_h, id.resp_h | sum >= 10

 

요청을 보냇는데 응답이 0이면 사일런트 드랍(호스트가 설정하는 것)이다. 조용히 버리는 것, 포트가 열렷는지 닫쳐있는지 상대방이 알수 없게함. 

누군가 접근이 허용되지 않은 서비스에 접근을 시도했다고 추론 가능,

 

보통 포트는 출발지와 목적지가 한쪽은 임시포트, 한쪽은 잘알려진 포트로 통신이 시도된다. 양쪽다 임시포트이면 대다수 정상이 아니다. 

주기적인 뭔가 벌어지면 위협행위랑 관련이 많다.

 

*네트워크 세션 분석 시 참고사항

대부분의 운영체제는 임시포트를 할당하기 위해 Positive Incremental(랜덤이 아닌, 서서히 증가하는 방식으로 임시포트 할당, 조금씩 증가함, 규칙은 없음) 방식을 사용함

예) 포트번호 할당 3233100 -> 323103 -> 323110 -> 323114 식으로 됨, 운영체제에서 할당해 주는것임, 네이버 접속시 3223100 -> 카카오톡 접속시 323103 -> 네이버 다시 접속시 323110 포트 받는것.

웹통신 후 임시포트로 계속 통신이 되면, 보통 바이러스에 감염된 것 or 스캐닝

 

 

스캐너는 한번에 a,b,c,d,e,...취약점 있어? 물어보고 응답을 한번에 받는다. (도구마다 다르지만 보통 이러함)

 

악성 한글문서 유형 - 김숙희, 나자루스 등 북한이 쓰는 고스트 스크립트를 이용한 악성 한글 파일 형식이 가장 많다

 

 

용어

Opensource IDS(탐지) IPS(차단)
TI(Threat Intelligence) 정보 - 위협 인텔리전스, 용어집 참조
엔터프라이즈 - 기업/사업 등의 뜻을 가진 영어 단어
PCR - Producer Consumer Ratio - 어떤 호스트가 많이 요청을 받았냐의 정도, -1~20 값사용
- 데이터가 빠져나가고 있는지 확인 가능. zeek에선 계산 안해줌, 

edr, xdr - 용어집 참조

스피어 피싱(악성스팸메일) - 메일 첨부파일로 온걸 바로 열거나(아웃룩.exe word.exe를 찾아보면 사용자가 연파일들을 알수있다.)

저장후 연다. 스피어 피싱은 조직의 특정 개인 또는 그룹을 대상으로 한 피싱 공격의 한 유형입니다. 스피어 피싱 공격자는 피해자가 알거나 신뢰하는 사람인 척 가장하고 피해자가 다음과 같은 행위를 하도록 조종합니다.

파이프라인 - 한 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조

렌더링엔진 - 렌더링 또는 이미지 합성(rendering 또는 image synthesis)은 컴퓨터 프로그램을 사용하여 모델 또는 이들을 모아놓은 장면인 씬 파일(scene file)로부터 영상을 만들어내는 과정

 

웹 운영시 킵어라이브 시간 설정해놓음. 몇초이상 요청 없어도 연결 유지 - 시스템 효율 업!, 

728x90