스노트

2021. 3. 8. 02:45정보보안

(악성코드 패킷 탐지 게시물과 연관)

스노트란

- 시그니처 기반의 NIDS

- 멀티쓰레드이 안된다는 단점

→ 수리카타의 등장 (멀티 스레드 지원, 스노트의 룰셋 지원)

- 스노트의 동작 순서

Sniffer → Preprocessor → Detection Engine → Alert / Log

 

Sniffer : 네트워크 패킷을 수집

Preprocessor(전처리기) : 특정 행위를 수행하는 패킷을 탐지해 Dectection Engine으로 보냄

Detection Engine : 해당 패킷이 스노트 규칙에 매칭되는지 확인

Alert / Log : 해당 패킷이 스노트 규칙에 매칭된다면 경고창을 띄우고 Log를 남김

 

Security Onion에 내장되어있는 Snort의 설정 파일

 

 

룰셋 확인

local.rules 파일이 사용자가 직접 규칙을 설정할 수 있는 룰셋파일이다.

 

스노트 규칙 업데이트 명령어

rule-update

이 명령어 사용 시 다음과 같이 PulledPork 를 통해 최신 규칙으로 업데이트 된다.

 

 

만약 문법오류로 인해 rule-update 명령어가 정상적으로 먹히지 않을 때

nsm --sensor --restart --only-snort-alert 명령어를 통해 스노트를 재실행하자.

 

 

 

스노트 룰 작성

 

스노트 규칙 헤더 Body
Action Protocol Src IP Src Port  방향 지시자 Dst IP Dst Port Option

 

 

Action : 패킷이 탐지되엇을 때(룰에 매치되었을 때)의 처리방식으로 총 8개가지의 유형이 존재함.

 

액션의 종류

Action 설명
alert 선택한 alert 방식을 이용해서 alert를 발생시키고 패킷을 로그에 남긴다.
log 패킷을 로그에 남긴다.
pass 패킷을 무시한다.
activate alert를 발생시키고, 대응하는 dynamic rule을 활성화한다.
dynamic activate rule에 의해 활성화 되며, log rule과 동일하게 작동한다.
drop 패킷을 차단하고 로그를 남긴다.
rejction 패킷을 차단하고 로그를 남긴 후 TCP 일 경우 TCP Reset 전송, UDP 일 경우 ICMP Port Unreachable 전송
sdrop 패킷을 차단하지만 로그를 남기지 않는다.(slient)

 

Protocols : 탐지할 프로토콜을 나타내며 총 4가지 프로토콜을 지원(TCP, UDP, ICMP, IP)

 

IP Address : 출발지/목적지 IP

ex1) !192.168.149.148 : 192.168.149.148 을 제외한 모든 ip

ex2) [192.168.149.148, 192.168.149.149] : 192.168.149.148 ip와 192.168.149.149 ip 두 개

ex3) any

 

※ Snort.conf에 정의되어있는 IP 변수

■ $EXTERNAL_NET : 외부 IP 변수

■ $HOME_NET : 내부 IP 변수

$HTTP_SERVERS : 웹 서버 IP 변수

$DNS_SERVERS : DNS 서버 IP 변수

$SMTP_SERVERS : SMTP 메일 서버 IP 변수

$SSH_SERVERS : SSH 프로토콜을 사용하는 장비 IP 변수

 

Port Numbers : 출발지/목적지 Port

ex1) 1:1023   : 1부터 1023 사이의 포트

ex2) :1023     : 1023 이하의 포트(1023 포함)

ex3) 1:          : 1 이상의 포트(1 포함)

ex4) [1,2,3,4]    : 1,2,3,4 포트

ex5) any

 

 

Direction Operator : 방향 지시자

-> 단방향

<> 양방향

 

 

 

룰 바디 : 기본 옵션

옵션 설명
msg · msg 옵션에 기록된 내용이 alert 발생 시 이벤트 이름으로 사용된다.
reference · rule과 관련된 외부 취약점 정보 참조 시 사용한다.
sid · snort rule id로 사용되는 범위는 다음과 같음
99 이하 : 시스템 예약 sid
100 ~ 1000000 : snort에서 배포하는 룰셋에 사용되는 sid
1000000 이상 : 사용자 정의 rule sid
classtype · snort는 사용자가 어떤 유형의 공격인지 쉽게 이해하고 우선순위를 결정할 수 있도록 공격 유형이랑 기본 우선순위(위험도)를 정의해둠
· 우선순위  : 1(높음), 2(중간), 3(낮음)
priority · rule의 우선순위(위험도)를 숫자로 표기
· priority를 지정 시 classtype의 기본 우선순위(위험도)를 덮어쓴다
rev · rule 버전번호로 수정(revision) 횟수를 표기한다.
· 수정 시 1씩 증가시켜주어야함

 

CLASSTYPE 기본 설정 파일

 

룰 바디 : 페이로드/범위 관련 옵션

옵션 설명
content · 페이로드에서 검사할 문자열을 지정함
· content는 text 형식일 수도 있고 binary 형식일 수도 있고 두개가 복합된 형식일 수 있다.

· text 형식 : content:"pattern", 해당 pattern 검사
· binary 형식 : content:"|FF FF|", 파이프 기호 사이에 헥사값으로 표현
· ! 사용 : ! 문자는 부정연산자임 content:!"pattern", 해당 pattern 문자열이 없는지 검사
· ; \ " 3가지 특수문자는 escape 처리해서 사용
uricontent · content 문자열을 전체 패킷과 비교하는 대신 HTTP 클라이언트 요청 URI 정보를 검사할
문자열을 지정함
offset · 페이로드에서 CONTENT 패턴을 검사할 시작 위치
· 페이로드의 첫 번째 바이트 위치가 0부터 시작
depth · offset 부터 몇 바이트까지 검사할 것인지를 지정
distance · 이전 content 패턴에 매치된 경우, 매치된 이후 바이트부터 몇 바이트 떨어진 위치에서 다음 content를 검사할 것인지를 지정
within · 이전 content 패턴에 매치된 경우 distance 부터 몇 바이트 범위 내에서 다음 content를 
검사할 것인지를 지정
nocase · 페이로드 검사 시 대소문자를 구분하지 않음(바이너리 형식 또한 대소문자를 구분하지 않음)
pcre · 스노트는 펄 호환 정규표현식인 PCRE를 지원

 

 

 

룰 바디 : 페이로드/HTTP 관련 옵션

옵션 설명
http_method · HTTP method 부분을 검사
http_uri · HTTP URI 부분을 검사
http_header · HTTP Header 부분을 검사
· 요청(Request)/응답(Response) 헤더에 모두 사용
http_cookie · HTTP Cookie 부분을 검사
http_client_body · HTTP 클라이언트 요청의 Body 부분을 검사(Post 요청에 대한 검사)
http_stat_code · HTTP 응답의 status_code 부분을 검사
ex) HTTP/1.1 200 OK
http_stat_msg · HTTP 응답의 status_message 부분을 검사
ex) HTTP/1.1 200 OK

룰 바디 : 흐름 옵션

옵션 설명
to_server 또는 from_client · 클라이언트 -> 서버 패킷 룰 매칭
to_client 또는 from_server · 서버 -> 클라이언트 패킷 룰 매칭
established  · 세션이 연결된 상태의 패킷 룰 매칭
stateless · 세션 연결 유무와 상관 없이 룰 매칭

예시) flow:to_client, established;

 

 

룰 바디 : Event Threshold(이벤트 제한) 관련 옵션

threshold type <limit|threshold|both>, track <by_src|by_dst>, count <c>, seconds <s>

 

 

type

1. limit : 매 s초 동안 c번째 이벤트까지 action을 수행

(예시 : threshold type limit, track by_src, count 2, seconds 10

출발지 ip를 기준으로 매 10초마다 2번째 이벤트까지 action을 수행)

 

2. threshold : 매 s초 동안 c번째 이벤트마다 action을 수행

(예시 : threshold type threshold, track by_src, count 10, seconds 5

출발지 ip를 기준으로 매 5초마다 10번째 이벤트마다 action을 수행)

 

3. both : 매 s초 동안 c번째 이벤트 시 한번 action을 수행

(예시 : threshold type ㅠㅐ소, track by_src, count 10, seconds 1

출발지 ip를 기준으로 매 1초마다 10번째 이벤트 시 한번 action을 수행)

 

track

1. by_src : 출발지 IP를 기준으로 추적

2. by_dst : 목적지 IP를 기준으로 추적

 

 

 

■ 정규표현식

스노트에서는 바디 옵션에서 pcre옵션를 이용해 정규표현식을 이용할 수 있음

 

메타문자

문자 의미
\ · 이스케이프 문자로 따옴표, 느낌표, 역슬래시, 슬래시 등 특수문자나 특정 기능을 하는 문자를 문자 그대로 탐지하고자 할 때 사용
^ · ^ 다음에 오는 문자가 문자열의 시작읨을 의미
$ · $ 바로 앞에 있는 문자가 문자열의 끝을 의미
. · 임의의 문자 1개를 의미
| · | 앞에 오는 문자열과 뒤에 오는 문자열 중 하나와 일치
예시)  (one|two|three) : one, two, three 문자열 중 하나
? · ? 앞에 오는 문자가 0회 또는 1회 나타남을 의미
* · * 앞에 오는 문자가 0회 이상 나타남 (안나타나도 된다는것)
+ · + 앞에 오는 문자가 1회 이상 나타남

 

수량자/클래스

수량자는 중괄호 {} 안에 값을 설정하며

클래스는 대괄호 [] 안에 값을 설정한다.

수량자/클래스 의미
{n} 해당 표현 앞에 문자나 클래스가 n개 존재하는 문자열 검색
{n,} 해당 표현 앞에 문자나 클래스가 n개 이상 존재하는 문자열 검색
{n,m} 해당 표현 앞에 문자나 클래스가 n개 이상 m개 이하 존재하는 문자열을 검색
[abc] a,b,c 문자 중 1개 문자
[a-z] 소문자 알파벳 a부터 z까지 중 1개의 문자
[0-9] 0부터 9까지 숫자 중 1개의 숫자
[A-Z] 대문자 알파벳 A부터 Z까지 중 1개의 문자
[A-Za-z0-9] 모든 단어 중 1개 문자
[^0-9] 숫자가 아닌 모든 문자 중 1개(클래스에서 ^ 는 부정을 의미)
[^A-Z] 대문자 알파벳이 아닌 모든 문자 중 1개

 

정규표현식 옵션(PCRE 자체 옵션)

옵션 의미
i · 패턴의 대문자와 소문자를 구별하지 않게 해주는 옵션
s · 개행되더라도 문자열을 1줄로 인식하여 메타문자 .기능이 동작하는 옵션
m · 메타문자 ^와 $가 행마다 동작하게 하는 옵션
x · 패턴에 존재하는 모든 공백을 무시하는 옵션

 

정규표현식 옵션(스노트 지원 PCRE 옵션)

옵션 의미
B · 정규화되지 않은 원본 패킷과 패턴 매치
· HTTP 메소드와 패턴 매치
H · 정규화된 HTTP 요청 메시지 헤더 정보와 패턴 매치
D · 정규화 되지 않은 HTTP 요청 메시지 헤더 정보와 패턴 매치
P · HTTP 요청 메시지 바디와 패턴 매치
U · 정규화된 URL 디코딩 문자열과 패턴 매치
I · 정규화되지 않은 URL 디코딩 문자열과 패턴 매치
C · 정규화된 HTTP 요청과 응답(Response)의 쿠키 값과 패턴 매치
K · 정규화되지 않은 HTTP 요청과 응답의 쿠키 값과 패턴 매치
S · HTTP 응답 코드와 패턴 매치
Y · HTTP 응답 상태 메시지와 패턴 매치

 

'정보보안' 카테고리의 다른 글

소켓 통신  (0) 2021.03.11
Format Characters  (0) 2021.03.09
스카피(Scapy)와 네트워크 헤더  (0) 2021.03.08
Sguil (스구일)  (0) 2021.03.07
가상환경 구성  (0) 2021.03.01