Security/Network

Suricata rule 구조

2er0127 2023. 6. 1. 22:36

Suricata rule은 크게 action, header, rule 옵션으로 나눈다.

 

rule header option
Action Protocol Src IP Src Port ->/<> Dst IP Dst Port Option

 

 

ex) 

alert tcp any any -> any 80 (msg:"tistory.com access"; content:"GET /"; content:"Host"; content:"tistory.com"; sid:100001; rev:1;)

 

=> tcp 로 접속하는 모든 주소로부터 모든 80번 포트에 도달하는 접속을 경고 발생 및 로그 기록한다. 옵션은 "GET /", "Host", "tistory.com" 내용이 포함될 때 "tistory.com access" 메세지를 남긴다.

 

 

 

✨ Action 유형

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

 

 

 

✨ Protocol 유형

tcp/udp/icmp/ip

any - 전체

 

 

 

✨ Src IP/Dst IP 형식

192.168.45.166 192.168.45.166 Host
192.168.45.0/24 192.168.45.0/24 Subnet
![1.1.1.1, 1.1.1.2] 1.1.1.1과 1.1.1.2를 제외한 모든 IP 주소
$HOME_NET 내부 IP 주소 변수
$EXTERNAL_NAT 외부 IP 주소 변수
$XXX_SERVERS 특정 서버 IP 주소 변수
any 모든 IP 주소

-> 두 개 이상 묶을 때는 [ ], 제외는 !

 

 

 

✨ Src Port/Dst Port 형식

80 80번 포트
[1:500] 1~500번 포트
[80, 81, 82] 80, 81, 82번 포트
!1:500 1~500번을 제외한 포트
any 모든 포트

 

 

 

✨ 방향 지정

-> 요청 패킷 탐지(응답 패킷을 탐지하려면 Src IP/Dst IP를 반대로 설정한다.)
<-> 요청/응답 패킷 탐지

 

 

 

✨ 일반 옵션

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

-> ;로 구분한다.

 

 

 

✨ 흐름 옵션

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

 

 

 

✨ 페이로드 탐색 옵션

명령어 내용 예제
content 문자/숫자 탐지 content:"xxx";
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/"

 content만 쓰면 모든 문자열을 보고 탐지하기 때문에 부하가 걸릴 가능성이 높다. 그래서 offset/depth를 잘 활용하는 것이 중요하다.

 

 

 

✨ 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 응답 상태 메세지 패턴 매칭

 

 

 

✨ 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"

 

 

 

pcre 정규식

^: 제일 첫글자

$: 제일 마지막 글자

?: 한 글자

.: =*

 

 

 

ex) ICMP 탐지 rule

alert icmp any any → $HOME_NET any (msg:”ICMP test”, sid:1000002; rev:1;)

alert icmp any any <> $HOME_NET any (msg:”ICMP test”, sid:1000002; rev:1;)

 

 

 

728x90