Snort - 03. Snort Rule 구조
1. Snort Rule Signiture
- 스노트는 다음과 같은 룰 헤더와 옵션으로 구성된다.
Snort 룰 시그니처 구조
Action 유형
명령어 | 내용 |
alert | 경고 발생 및 로그 기록 |
log | 로그 기록 |
pass | 패켓 무시 |
drop | 패켓 차단 및 로그 기록 (IPS 기능으로 사용됨, 단 인라인 구조가 되어야 한다.) |
reject | 패켓 차단 및 로그 기록(TCP - TCP RST 응답, UDP - ICMP Unreachable 응답) |
sdrop | 패켓 차단 및 로그 기록 없음 |
Protocol 유형
유형 | 내용 |
tcp | TCP 탐지 |
udp | UDP 탐지 |
ip | IP 전체 탐지 |
icmp | ICMP 메세지 탐지 |
any | 전체 |
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 서브넷 |
!192.168.20.0/24 | 192.168.20.0/24를 제외한 나머지 서브넷 |
$HOME_NET | 내부 IP 주소 변수 |
$EXTERNAL_NET | 외부 IP 주소 변수 |
$XXX_SERVERS | 특정 서버 IP 주소 변수 |
SrcPort/DstPort
형식 | 내용 |
80 | 80번 포트 |
1:500 | 1~500번 포트 |
!80 | 80번 포트를 제외한 나머지 포트 |
!1:500 | 1~500번 포트를 제외한 나머지 포트 |
any | 모든 포트 |
방향 지정
형식 | 내용 |
-> | 요청 패켓 탐지 (응답패켓 탐지는 SrcIP/DstIP 반대로 설정) |
<> | 요청/응답 패켓 둘다 탐지 |
일반 옵션
명령어 | 내용 | 형식 |
msg | 경고 이벤트 메세지 | msg:"ICMP Ping test"; |
sid | 룰 식별자 (3000000번 이상 권장) | sid:3000001; |
rev | 룰 버전, 수정될 경우 1씩 증가 | rev:1; |
priority | 우선 순위 (값이 작을수록 먼저 매칭) 범위 : 1~10) | priority:1; |
classtype | 스노트 룰 분류 | classtype:분류이름; |
reference | 취약점 참고 배포 URL 정보 | reference: 이름 http://~; |
root@Snort:~# cd /etc/snort
root@Snort:/etc/snort# ls
classification.config reference.config snort.debian.conf
community-sid-msg.map rules threshold.conf
gen-msg.map snort.conf unicode.map
root@Snort:/etc/snort# cat classification.config
root@Snort:/etc/snort# cat reference.config
흐름 옵션
명령어 | 내용 |
flow | 흐름 옵션 명령어 |
to_server 또는 from_client | 클라이언트 -> 서버 패켓 룰 매칭 |
to_client 또는 from_server | 서버 -> 클라이언트 패켓 룰 매칭 |
established | 세션이 연결된 상태의 패켓 룰 매칭 |
statless | 세션 연결 유무와 상관 없이 룰 매칭 |
flow:to_server,established | 클라이언트 -> 서버 세션 연결 패켓 룰 매칭 |
페이로드 탐색 옵션
명령어 | 내용 | 예제 |
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/" |
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 응답 상태 메세지 패턴 매칭 |
2. Snort Rule 설정
3-0. SQL injection Snort Rule 설정.txt
root@Snort:~# ls -l /etc/snort/rules/local.rules
-rw-r--r-- 1 root root 199 6월 30 2015 /etc/snort/rules/local.rules
root@Snort:~# vi /etc/snort/rules/local.rules
# $Id: local.rules,v 1.11 2004/07/23 20:15:44 bmc Exp $
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"SQL Injection"; content:"1' and '1'='1'"; nocase; sid:3000001; rev:1;)
:q! |
3. PCRE(Perl Comaptible Regular Expression)
- Snort 룰 매칭시 content 정보를 세밀하게 검색할 때 사용한다.
- PCRE 구성 요소 : 메타 문자, 수량자, 클래스, 서브패턴, 옵션
- 사용 방법 : pcre:"/레직스/옵션";
메타 문자
문자 | 내용 | 예제 | 설명 |
? | 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 | 커서를 다음 줄로 이동 |
| 라인피드 |
수량자
수량자 | 내용 | 예제 | 설명 |
{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 |
탐욕적 수량자
<a>.*</a>
<a>test</a>abc<a>test</a>
게으른 수량자
<a>.*?</a>
<a>test</a>abc<a>test</a>
클래스
클래스 | 내용 |
[3579] | 3, 5, 7, 9 |
[2-9] | 2, 3, 4, 5, 6, 7, 8, 9 |
[^2-9] | 0, 1 |
[0-9a-zA-Z] | 모든 숫자/문자 |
[\f\r\t\n\v] | 모든 공백 |
옵션
옵션 | 내용 | 예제 |
i | 대소문자 구분 없이 검색 | pcre:"/select/i" |
s | 줄이 넘어가도 문자열을 1줄로 인식하여 . 기능 동작 | pcre:"/select/s" |
x | 패턴에 존재하는 모든 공백 무시 | pcre:"/seletc/x" |
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" |
[유튜브] 동영상 강의 링크 (구독! 좋아요!!!)
Snort - 3. Snort Rule 구조 https://youtu.be/kVnHpmXGi_g
[출처] https://net123.tistory.com/579
'리눅스 > Security' 카테고리의 다른 글
CentOS 8 Http 2.4 에 mod_security 설치하기 (YUM) (0) | 2020.11.12 |
---|---|
Snort 규칙 (공격 분류, 우선 순위 정보 포함) (0) | 2020.10.06 |
httpd (apache2) 설정을 이용한 웹취약점 보완 (0) | 2020.03.17 |
웹취약점 점검 도구 OWASP ZAP 설치 및 실행방법 (0) | 2020.03.06 |
httpd 2.4.41 에 mod_security 2.9.1 + OWASP 설치 (0) | 2019.12.17 |