snort rule

2023. 5. 6. 13:37기타/tools

# about snort

- 시그니처 기반의 NIDS 오픈소스

- n/w 패킷 수집 후 트래픽을 모니터링 해줌 

- 준비된 룰과 비교하여 일치하면 칩입탐지, 경로를 발생시킴 

 

# snort rule 

- 기본적으로 시그니쳐, 패턴을 비교, 검사하는 방식으로 탐지함 

- 정규표현식으로 탐지 룰을 규정할 수 있음 

ex)

[헤더] 

action protocol scr ip src port direction dst ip dst port
alrert tcp any any -> 192.123.1.0/24 80

[옵션]

(msg:"mounted access"; content:"|00 01 86 a5|") 

 

name descriptions
action alert
protocol tcp
source 룰 적용대상출발지(공격자)ip 주소, 포트는 전체
direction 특정 네트워크 인바운드
destination 192.123.1.0/24네트워크 80포트에 대한 접근
msg mounted access
parttern(content) TCP payload에서 Hexa ㅅ트링 0x00, 0x01, 0x86, 0xA5 패턴을 찾는다 

1.  action

alert -> 경고발생

log -> 패킷을 로그로 저장

pass -> 패킷무시

active -> 경고를 발생시킨 다음 다른 동적 규칙 활성화

dynamic -> acvice 옵션으로 활성화 

drop -> 패킷차단후 로그로 저장 

reject -> 차단 및 로그 저장후 세션을 리셋(rst전송)함[tcp인경우] 

               차단 및 로그 저장후 icmp port unreachable 메세지 전송[udp인경우]

sdrop -> 패킷을 차단하지만 로그는 남기지 않음 

 

2. protocol

tcp -> tcp프로토콜에적용

udp -> udp프로토콜에적용

icmp -> icmp프로토콜에적용

ip -> ip프로토콜에적용

 

3. ip, port

option role
ip any = 모든 ip 주소
1.1.1.1 = 특정 ip 주소
[1.1.1.1, 2.2.2.2] = 여려 ip 주소
[1.1.1.1/24] = 특정 ip 주소
port any = 모든 포트 번호
80 = 특정포트번호 
1 : 1024 = 1024번 이하 범위
80: = 80번 이상 범위
:1024 = 1024번 이하 범위
!80 = 80번을 뺀 나머지
-> 단방향
<> 양방향

 

4. 일반옵션 

- 규칙에 대한 정보를 제공하는 옵션 

- 검색하는 동안 영향x 

msg - 규칙이 탐지될 경우 출력되는 메시지
- 공격유형과 정보를 기록
sid - 규칙 식별자로 모든 규칙은 반드시 식별 번호를 가짐
- 예약된 식별자 = 0 - 2,999,999 
- local.rules에는 3,000,000 이상 부터 사용
rev - 규칙의 수정 버전을 나타냄
- 규칙이 수정 시 1씩 증가 
classtype - 규칙을 분류하는 옵션
- 클래스 명은 classfication.config 파일에 정의
priority - 규칙의 우선순위 지정 
- 1 - 10 까지의 수 사용, 숫자가 작을수록 높은 우선순위를 가짐 

5. payload옵션

- 악성패킷을 탐지하는 옵션

content - 매칭할 문자열 지정
- 문자열 지정 -> content :"text";
- 숫자지정 -> content:"|121212|";
- 정규표현식지정 -> pcre:"/^select/";

prce - 문자열로 표현하기 어려운 것들을 정규 표현식을 이용하여 정의할 경우 사용
nocase - 대소문자 구별하지 않고 매칭
offset - 매칭할 문자열의 위치 지정
ex) 
(content: “a”; offset:1) -> 1번지부터 a찾아 
depth - 문자열의 범위 지정 
ex) 
(content: “a”; offset:1 ; depth:1) -> 1번부터 a찾는데 1바이트까지 찾아 
distance - Content 옵션값 이후 탐색할 위치 지정
within - Content옵션값 이후의 탐색할 범위를 지정

 

# offset, depth example

|      0     |     1     |     2     |     3     |     4     |     5     |     6     |     7     |     8     |     9     | 

↓            ↓                                     ↓   

0byte   X byte                            Y byte

-> 3번째 바이트[offset:2]부터 2바이트 범위[depth:2]내에서 지정된 문자열 패턴이 있는지 검사

 

# distance, within example 

 

|      0     |     1     |     2     |     3     |     4     |     5     |     6     |     7     |     8     |     9     | 

↓            ↓                                     ↓                        ↓                                     ↓ 

0byte   X byte                            Y byte                         within[검색범위]     

 

-> 이전 패턴이 매치된 이후 3바이트 떨어진 위치에서 지정된 패턴의 문자를 3바이트 범위내에서 검사     

 

# dectection rule example 

alert tcp $EXTERNAL_NET any ⟶ $HOME_NET any (msg: “ TEST”; content: “S”; offset:2; depth:2; content: “R”; distance:3; within:2; sid:1000001;)

-> 3번째 byte 부터 2byte 범위에 S 패턴이 있는 지 검사, 패턴이 검사된 이 후 3byte 떨어진 위치에서 2byte 범위 내에서 R이라는 문자가 있는지 검색[=3whs에서 닫힌 포트 찾을때] 

|      F     |     A     |     L     |     S     |     E     |     &     |     T     |     R     |     U     |     E     | 

↓            ↓                                     ↓                                      ↓                          ↓

0byte   X byte                            Y byte                                    within[검색범위]

    | offset |            | depth | 

 

alert tcp $EXTERNAL_NET any ⟶ $HOME_NET any (msg: “ TEST”; content:|FFFF|; offset:9; depth:2; sid:1000001;)

- > 10번째 byte 부터 2byte 범위에 FFFF 바이너리 패턴이 있는지 검사 

 

alert tcp any any ⟶ any 80 (msg: “ Web Scan Detected”; content: “/administrator”;) 

-> 전송되는 패킷의 내용을 검사하여 “/administrator”란 문자열이 포함 된 경우 “Web Scan Detected”란 메시지로 로깅 

 

alert tcp any any ⟶ any 80 (content: “root”; nocase;) 

-> 목적지 포트가 80인 모든 TCP 패킷에 대하여 대/소문자 구분없이 페이로드에 root문자열이 포함한 경우 alert 발생 

 

alert tcp any any ⟶ any 22 (content: “login”; depth:10;) 

-> 목적지 포트가 22인 모두 TCP 패킷에 대하여 페이로드의 첫번째 byte부터 10byte 범위 내에 소문자 login 문자열이 포함한 경우 alert 발생 

 

alert tcp any any ⟶ any any (msg: “Get Flooding”; content:“Get / HTTP1.”; nocase; depth:13; threshold:type threshold, track by_dst, count 10, seconds 1; sid:1000999)

-> HTTP Flooding 공격 특징은 대부분 웹서버 공격 트래픽에서 최초 웹페이지에 대해 웹 접속 요청을 폭주시켜 세션자원을 소진검색 탐지 룰 

- 첫 번째 바이트부터 13번째 바이트 범위 내에서 검색 (offset을 명시하지 않으면 첫번째 byte부터 검색)

- Get : http request line, / : 호스트의 default page , HTTP1. : HTTP 버전

- 목적지 IP주소를 기준으로 1초마다 10번째 이벤트마다 alert action을 수행시켜 과도하게 많은 alert event가 발생하는 것을 방지

 

drop tcp any any ⟶ any any (msg: “ SYN/FIN Drop”; flags:SF;) 

- 제어 플래그 중 SYN와 FIN이 동시에 설정되어 있는 TCP 패킷 차단함

- SYN은 연결 요청, FIN는 연결 종료를 위한 플래그이므로 동시에 설정될 수 없는 비정상 패킷임. 비정상 패킷은 IDS/IPS의 탐지를 우회하여 공격 또는 스캐닝 을 위한 목적으로 사용되므로 이를 탐지 및 차단해야 함 

 

alert tcp any any ⟶ any any (pcre: “ /POST.*Content\x2dLength\x3a\x20evilstring/”;) 

- 목적지 주소 및 포트가 모두 any로 설정으로 모든 패킷을 검사함. 장비에 많은 부하를 발생시킴

- HTTP 서비스를 제공하는 IP주소 및 PORT 정보를 파악해서 목적지 IP주소와 Port에 대한 검사만 검사룰을 적용시켜 장비의 부하를 줄일 수 있음 

 

alert tcp any any ⟶ any 80 ( msg:“XSS Detect”; content:“GET”; offset:0; depth:3; content:“/login.php?id=%3Cscript%3E”; distance:1; sid:1000500 ); 

- 첫바이트~ 세번째 바이트 내에서 GET이라는 문자 검색

- 첫번째 매치된 문자열에서 1바이트 떨어진 곳에서부터 해당 문자 검색 

 

alert tcp any any <> any [443,465,563] (msg:“SSLv3 Malicious Heartbleed Request V2”; content: “|18 03 00|”; depth:3; content: “|01|”; distance:2, within:1; content:! “|00|”; within:1; sid:100300;) 

- 첫 바이트부터 3바이트 범위 내에서 패턴 감사[a] 

- 첫 번째 content가 매치 된 이후 2바이트 떨어진 위치에서 1바이트 내에서 지정된 패턴 검사[b] 

- 두 번째 content가 매치된 이후 1바이트 떨어진 위치에서 지정된 패턴 검사[c]  

                            

                                     [b]distance : 2                   [c] within : 1

                          <--------------------->             <--------->

|           | 180300 |            |             |              |             |              |              |             |              |

            depth : 3[a]                                [c] within : 1

 첫번째 바이트로부터 3바이트 내        1바이트내에서

 

# test 

간단한 테스트를 위해 rules디렉토리에 local.rules을 나노로 편집하여 alert tcp 192.168.10.20 23 -> any any(msg:"Password Cracking";sid:"30000001";content:"login incorrect";nocase;) 

 

telnet으로 메타에 접근해서 비밀번호 틀리게 하여 incorrect문구가 나오게 시도

그리고 sguil로 들어가면 snort룰에서 생성한 메시지가 보임 

'기타 > tools' 카테고리의 다른 글

Security Onion & Snort  (0) 2023.03.22
Postman  (0) 2022.05.18
about Wireshark  (0) 2022.04.11
about Burp suite  (0) 2022.04.11