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
'Security > Suricata' 카테고리의 다른 글
Ubuntu 20.04에 Suricata 설치 및 테스트, 사용 방법 정리 (0) | 2021.07.26 |
---|