Security/Suricata

Suricata rule 구조 및 rule 작성 규칙 정리

daeunnniii 2021. 8. 2. 01:27
728x90
반응형

1. Suricata rule 구조

Suricata rule은 크게 action, header, rule 옵션으로 나눌 수 있다.

예를 들어 아래와 같은 rule이 있다고 할 때 빨간색이 action, 초록색이 header, 파란색이 rule 옵션에 해당한다.

drop tcp $HOME_NET any -> $EXTERNAL_NET any (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”; flow:established,to_server; flowbits:isset,is_proto_irc; content:”NICK “; pcre:”/NICK .*USA.*[0-9]{3,}/i”; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)

 

그리고 세부적으로 다음과 같이 구성된다.

룰 헤더 옵션
Action Protocol SrcIP SrcPort -> DstIP DstPort Option

 

2. Action 유형

alert - 경고 발생 및 로그 기록
pass - 패킷 무시
drop - 패킷 차단 및 로그 기록 (IPS 기능으로 사용됨. 단, 인라인 구조가 되어야함.)
reject - 패킷 차단 및 로그 기록 (TCP - TCP RST 응답, UDP - ICMP Unreachable 응답)
rejectsrc - reject와 동일
rejectdst - 일치하는 패킷의 수신자에게 RST/ICMP 오류 패킷을 보낸다.
rejectboth - 양쪽 모두에게 RST/ICMP 오류 패킷을 보낸다.

 

3. Protocol 유형

tcp: TCP 탐지
udp: UDP 탐지
icmp: ICMP 메세지 탐지
ip: IP 전체 탐지

any: 전체

 

4. SrcIP/DstIP 형식

192.168.20.50/32: 192.168.20.50 Host
192.168.20.0/24: 192.168.20.0/24 서브넷
[192.168.20.0/24, 172.20.0.0/16]: 192.168.20.0/24, 172.20.0.0/16 서브넷

![1.1.1.1, 1.1.1.2]: 1.1.1.1 및 1.1.1.2를 제외한 모든 IP 주소
!192.168.20.0/24: 192.168.20.0/24를 제외한 나머지 서브넷
$HOME_NET: 내부 IP 주소 변수
$EXTERNAL_NET: 외부 IP 주소 변수
$XXX_SERVERS: 특정 서버 IP 주소 변수

 

5. SrcPort/DstPort

80: 80번 포트
[1:500]: 1~500번 포트

[80, 81, 82]: 포트 80, 81 및 82
!80: 80번 포트를 제외한 나머지 포트
!1:500: 1~500번 포트를 제외한 나머지 포트
any: 모든 포트

 

6. 방향 지정

->: 요청 패켓 탐지 (응답패켓 탐지는 SrcIP/DstIP 반대로 설정)
<>: 요청/응답 패켓 둘다 탐지

 

7. 옵션

1) 일반 옵션

 명령어 내용  형식 
 msg  경고 이벤트 메세지  msg:"ICMP Ping test";
 sid  룰 식별자 (3000000번 이상 권장)  sid:3000001;
 rev  룰 버전, 수정될 경우 1씩 증가  rev:1;
 priority  우선 순위 (값이 작을수록 먼저 매칭) 범위 : 1~10)  priority:1;
 classtype  스노트 룰 분류  classtype:분류이름;
 reference  취약점 참고 배포 URL 정보  reference: 타입, reference 내용;

 

2) 흐름 옵션

 명령어  내용
 flow  흐름 옵션 명령어
 to_server 또는 from_client  클라이언트 -> 서버 패켓 룰 매칭
 to_client 또는 from_server  서버 -> 클라이언트 패켓 룰 매칭
 established   세션이 연결된 상태의 패켓 룰 매칭
 statless  세션 연결 유무와 상관 없이 룰 매칭
 flow:to_server,established  클라이언트 -> 서버 세션 연결 패켓 룰 매칭

 

3) 페이로드 탐색 옵션

명령어 내용  예제 
 content   문자/숫자 탐지  content: "xxx";
 content: "|16진수 16진수|";
 nocase   대소문자 구분 없이 탐지  content: "xxx"; nocase;
 offset   지정한 바이트번째 부터 탐지(0번째 부터 시작)  offset:3;
 depth   지정한 바이트까지 탐지(0번째 부터 시작)  depth:3;
 distance   content 매칭 후 지정 위치 이후 다른 content 탐색  content:"xxx"; content:"yyy"; distance:5;
 within   content 매칭 후 지정 위치 안에 다른 content 탐색  content:"xxx"; content:"yyy"; within:5;
 pcre   정규화 표기, '/'는 시작과 끝에 표기, 16진수는 앞에 \x  pcre:"/(http|ftp) Traffic/" 

 

4) HTTP 탐색 옵션

 명령어 내용 
 http_method   페이로드 앞부분 HTTP 메소드 패턴 매칭 
 http_uri   페이로드의 HTTP URI 패턴 매칭
 http_cookie  페이로드의 HTTP 쿠키 패턴 매칭 
 http_header  HTTP 요청/응답 Header 내용 패턴 매칭
 http_client_body  HTTP 요청/응답 Body 내용 패턴 매칭
 http_stat_code  HTTP 응답 상태 코드 패턴 매칭
 http_stat_message  HTTP 응답 상태 메세지 패턴 매칭

 

8. pcre

- content 정보를 세밀하게 검색할 때 사용한다.

- pcre는 메타 문자, 수량자, 클래스, 서브패턴, 옵션으로 구성

- 사용 방법: pcre: "/레직스/옵션";

1) 메타 문자

여기서 주의해야할 점은, ?의 성질이 바로 앞 내용에 적용된다는 것이다. 예를 들어, 850?는 ?가 앞에 있는 0에 적용되어 85, 850, 851, ..., 859가 가능하다.

 문자 내용  예제  설명
 ?   0 글자, 또는 1 글자  850?   85, 850
 +   1 글자 이상  850+   850, 8500, 85000
 *   0 글자 이상  850*   85, 850, 8500, 85000
 .   1 글자 모든거  85.   85 , 850~859, 85a~z, 85A~85Z
 ^   문자 시작  ^850   850으로 시작
 $   문자 끝  850$   850으로 끝
 _   공백  100_200   100 200
 ( )   서브패턴(문자열를 하나로 묶음)  (850)*   없음, 850, 850850, 850850850
 |   OR  (100|200)   100 or 200
 \   이스케이프 문자(특정 기호 표기)  \(65013_65005\)   (65013 65505)
 \b   문자의 시작과 끝 (\bxyz\b) \b850\b   123 850 456
 \t   Tab    
 \r   커서를 현재 줄 처음으로 이동
 캐리지 리턴
 \n   커서를 다음 줄로 이동
 라인피드

 

2) 클래스

 클래스 내용 
 [1234]   1, 2, 3, 4
 [1-9]   1, 2, 3, 4, 5, 6, 7, 8, 9
 [^2-9]   0, 1
 [0-9a-zA-Z]   모든 숫자/문자
 [\f\r\t\n\v]   모든 공백

 

3) 수량자

 수량자 내용  예제 설명 
 {3}   3개 존재하는 문자 검색  [A-Z]{3} 대문자 A~Z 중 3글자 
{4,}  4개 이상 존재하는 문자 검색  [A-Z]{4,} 대문자 A~Z 중 4글자 이상 
 {2,4}  2개 이상 4이하 존재하는 문자 검색  cis{2,4}co  cissco, cisssco, cissssco

 

4) 옵션

옵션   내용 예제
 i   대소문자 구분 없이 검색   pcre:"/select/i"
 s   줄이 넘어가도 문자열을 1줄로 인식하여 . 기능 동작   pcre:"/select/s"
 x   패턴에 존재하는 모든 공백 무시   pcre:"/seletc/x"

 

5) HTTP 옵션

옵션   내용  예제
  M (http_method)  HTTP 메소드 패턴 매칭   pcre:"/get/Mi"
  U (http_uri)  정규화된 URL 디코딩 문자열 패턴 매칭   pcre:"/cisco/Ui"
  H (http_header)  정규화된 HTTP 요청 메세지 Header 내용 패턴 매칭   pcre:"/select/Hi"
  P (http_client_body)  HTTP 요청 메세지 Body 내용 패턴 매칭   pcre:"/select/Pi"
  S (http_stat_code)  HTTP 응답 코드 패턴 매칭   pcre:"/200/S"
  Y (http_stat_message)  HTTP 응답 상태 메세지 패턴 매칭   pcre:"/OK/Y"

 

 

추가적인 옵션들은 아래 링크를 참고하면 매우 자세히 나와있다.

https://suricata.readthedocs.io/en/suricata-6.0.3/rules/intro.html

 

 

 

 

참고: https://net123.tistory.com/579

728x90
반응형