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;)
'Security > Network' 카테고리의 다른 글
2014-11-16 TRAFFIC ANALYSIS EXERCISE ANSWERS (0) | 2023.06.05 |
---|---|
Modsecurity 설치 및 차단 테스트 (1) | 2023.06.04 |
OSSEC 설치 및 설정하기(시나리오) (0) | 2023.06.03 |
Suricata 설치 및 설정 (0) | 2023.06.01 |
VirtualBox NAT Network 원리와 설정하기 (0) | 2023.05.26 |