정구리의 우주정복

스노트 규칙 작성법, 규칙 읽는법 (Snort Rule example) 본문

STUDY/RECORD

스노트 규칙 작성법, 규칙 읽는법 (Snort Rule example)

Jungry_ 2021. 9. 8. 23:39
반응형

*공부 기록용임 !*

 

스노트(Snort)


 

스노트는 자유-오픈 소스 네트워크 침입 탐지 차단 시스템이자, 네트워크 침입 탐지 시스템으로서 1998년 개발되었다.

스노트엔 총 3가지 작동 방식이 있다. 1) 스니퍼 모드 2) 패킹 로깅 모드 3) 네트워크 IDS 모드이다.(Sniffer Mode, Packet Logging Mode, NIDS Mode)

 

동작 과정

스니퍼 -> 패킷 디코더 -> 전처리기 -> 탐지엔진 -> 경고/로깅 

스니퍼 : 네트워크 패킷 수집

패킷 디코더 : 전처리기와 탐지 엔진이 파싱 할 수 있도록 정규화

전처리기 : 특정 행위가 발견된 패킷을 탐지 엔진으로 전송

경고/로깅 : 스노트 규칙에 매칭된 경우 경고 출력 및 기록

 

수리카타는 스노트의 상위호환(?) 으로서 스노트의 기능 및 규칙이 호환된다는 특징이 있다.

 

 

How to write snort rules 스노트 룰 작성


룰셋 정의 파일 : /etc/nsm/rules   에 들어있다

local.rules : 사용자 정의로 세팅하는 룰들

downloaded.rules : 기본적으로 제공되는 스노트 규칙 파일

 

Rule Header (룰 헤더 작성하기)

1. Action  : 룰을 통해 탐지된 의심 트래픽들 처리 하기

2. Protocol : 어떤 프로토콜 대상으로

3. Source IP : 출발지 IP

4. Source Port : 출발지 Port

->

5. Destination IP : 도착지 IP

6. Destination Port : 도착지 Port

 

S.IP S.Port -> D.IP D.Port   이런 방향 연산자를 사용해서 작성하게 된다

 

ex) 

Alert TCP $EXTERNAL_NET any -> 10.20.30.160 any

Local IP 대역이 아닌 External 에서 유입 , 10.20.30.160 의 어떤 포트에 들어오든 Alert 를 띄워주세요

 

Alert TCP $EXTERNAL_NET any -> $HOME_NET any

외부에서 내부 네트워크에 접속했을때 Alert 를 띄워주세용가리

 

Rule Option (관리용도로 사용한다 7계층 어플리케이션 프로토콜의 페이로드 규칙)

1. msg  : 의심행위가 발견되었을때 그 트래픽에 대한 메시지 (우리가 탐지하게 될 룰이 어떤건지 알려주는 메세지)

2. gid : 패턴이나 시그니처를 그룹으로 관리하기 위해 아이디를 주는 것

3. sid : 규칙을 식별하는 식별자 보통 1000001 부터 사용하는 경우가 많다 ! 작성하는 버릇을 들이도록 해야지

4. rev : 시그니처 관리 용도로 버전을 나타낸다

 

사용자에게 정보를 주는 용도

1. priority : 우선순위(위험도가 높다 !)

2. reference : 참고 정보들

3. classtype : 어떤 악성코드인지

 

유입되는 패턴을 검사하는 용도 

1. content : 탐지하고자 하는 문자열을 작성하면 문자열을 포함하는 트래픽을 히트 ("ABC" <- 문자열 "|41 42 43|" <- 16진수로 ABC)

2. nocase : 대소문자 구분을 하지 않는다 "|41 42 43|";nocase => ABC,abc Abc .. 모두 히트가 된다

3. depth : depth:5; 시작부터 5바이트까지 검사를 하겠다

4. offset : offset:5; 시작부터 5 떨어진 부분부터 검사 해주세요

5. distance :  정의한 패턴이 있는 곳부터(시작점) 몇 바이트 떨어진 지점까지 정의하기 패턴 시작 상대위치
"123";distance:10; 123으로부터 10바이트 떨어진곳까지 검사해주세요

6. pcre : 정규표현식을 기록할수있는 옵션 

 

How to read snort rules 스노트 규칙 해석하기


1. pass tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS(flow:to_server,established; content:"|2e2e5c2e2e|";)

pass tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

외부 네트워크의 모든 포트에서 웹 서버에 웹 서비스 포트로 유입되는 tcp 트래픽을 패스한다
flow:to_server,established;

flow = 네트워크 상태정보

서버로 가는 패킷중 세션 연결리 완료 된 상태의 패킷

content:"|2e2e5c2e2e|";

0x2e2e5c2e2e 라는 문자열을 탐지해주세요

 

2. alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS(msg:"WEB-IIS..\.. access"; flow:to_server,established; content : "|2e2e5c2e2e|";

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

외부 네트워크의 모든 포트에서 웹 서버에 웹 서비스 포트로 유입되는 TCP가 있으면 Alert

(msg:"WEB-IIS..\.. access"; Alert message 는 이렇게 해주세요

 flow:to_server,established; 서버로 가는 패킷 중 세션 연결이 완료된 패킷

 content : "|2e2e5c2e2e|"; 탐지하고자 하는 문자열

 

3.다음 내용을 포함하는 룰을 작성하라.
» 웹 서버에서 외부로 가는 패킷
» 메시지 : Directory Browsing Vuln
» 탐지 문자열 : index of /
» 대소문자 무시
» 클래스 타입 : web-application-attack

 

 Alert TCP $HTTP_SERVERS any -> $EXTERNAL_NET any (msg:"Directory Browsing Vuln"; content:"index of /";nocase;classtype:web-application-attack;)

 

4. 다음 내용을 포함하는 룰을 작성하라.
» 외부에서 웹 서버로 가는 패킷
» 메시지 : Persistent XSS in POST
» 탐지 문자열 : script%3e
» 대소문자 무시
» 클라이언트 바디에서 탐지
» 클래스 타입 : web-application-attack

 

Alert TCP $EXTERNAL_NET any -> $HTTP_SERVERS any (msg:"persistent XSS in POST"; flow:to_server,established; Content:"="; http_client_body; content:"script%3e"; nocase; distence:0; classtype:web-application-attack; sid:2020202;rev:001;)

 

script 라고하는 문자열을 = 로 준다 
3e 는 url 로 된거 

 

어렵지만 ! 많이 보면 알거같다 

 

 

반응형
Comments