스노트에서 지원하는 pcre 옵션을 활용하면 정규표현식으로 시그니처를 표현할 수 있습니다. 정규표현식에 대한 이해는 필수 겠지만 pcre의 변경자(modifier) 옵션에 대한 이해까지 수반된다면 좀 더 손쉽게 다양한 표현식 작성이 가능해집니다.
이번 포스트에서는 pcre의 modifier 옵션에 대해 다루고자 합니다.
스노트에서 제공하는 pcre 문법입니다. 빨간색으로 칠한 부분에 대해 알아봅시다.
pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUBPHMCOIDKYS]";
- Perl과 호환되는 옵션들
- i (PCRE_CASELESS)
정규표현식에 설정한 패턴의 대문자와 소문자를 구별하지 않습니다. 가장 흔하게 쓰는 옵션이라고 할 수 있습니다.
문자열 |
aAaAa | |
시그니처 | 탐지 됨 | pcre:"/aaa/i"; |
탐지 안됨 | pcre:"/aaa/"; |
- s (PCRE_DOTALL)
기본적으로 점(.)은 어떤 한 문자를 표현할 때 사용하는 메타문자입니다. 하지만 줄바꿈은 점(.)에 의해 매치가 되지 않습니다.
s 옵션을 사용하면 점(.)으로 줄바꿈 까지도 매치가 가능합니다.
문자열 | aAaAa | hex값 61 41 61 41 61 0d 0a 62 42 62 42 62 |
시그니처 | 탐지 됨 | pcre:"/a..b/s"; |
탐지 안됨 | pcre:"/a..b/"; |
- m (PCRE_MULTILINE)
기본적으로 주어진 문자열을 한 줄로 취급합니다. 여러개의 줄바꿈이 존재하더라도 문자열의 처음과 끝 외에는 캐럿(^)과 달러($)에 의한 매치가 되지 않습니다.
m옵션을 사용하면 줄바꿈(newline)의 바로 앞은 달러($)로 바로 다음은 캐럿(^)으로 매치할 수 있습니다.
참고로, 캐럿(^)은 문자열의 처음, 달러($)는 문자열의 끝을 찾는 메타문자입니다.
문자열 | aAaAa bBbBb | |
시그니처 | 탐지 됨 | pcre:"/^bB/m"; |
탐지 안됨 | pcre:"/^bB/"; |
- x (PCRE_EXTENDED)
패턴(시그니처)에 있는 이스케이프 처리되지 않은 모든 공백 문자를 무시합니다. 거의 사용하지 않는 옵션입니다.
문자열 | aAaAa | |
시그니처 | 탐지 됨 | pcre:"/a A a/x"; |
탐지 안됨 | pcre:"/a A a/"; |
- PCRE와 호환되는 옵션들 (일부 옵션 명이 다를 수 있음)
- A (PCRE_ANCHORED)
문자열의 시작에 매치도록 합니다. 캐럿(^)과 동일한 기능을 합니다.
문자열 | aabcdeab | |
시그니처 | 탐지 됨 | pcre:"/ab/"; |
탐지 안됨 | pcre:"/ab/A"; |
- E (PCRE_DOLLAR_ENDONLY)
기본적으로 달러($)는 마지막 문자가 줄바꿈(뉴라인)일 경우에는 바로 직전의 문자에도 매칭합니다. (마지막이 아닌 줄바꿈은 제외)
하지만, 이 옵션을 사용하면 달러($)는 오직 주어진 문자열의 마지막에만 매치됩니다.
이 변경자는 변경자 m과 함께 사용되면 무시됩니다.
문자열 | aAaAa | |
시그니처 | 탐지 됨 | pcre:"/aAa/"; |
탐지 안됨 | pcre:"/aAa/E"; |
- G (PCRE_UNGREEDY)
기본적으로 PCRE는 greedy 하게 동작합니다. 이는 가능한 최대로 매치를 하게 됩니다.
하지만, 이 옵션을 사용하면 lazy하게 동작하게 됩니다. 이는 가능한 최소로 매치를 하게 됩니다.
greedy와 lazy는 아래 예시를 보면 쉽게 이해가 될겁니다.
-Greey 방식
표현식 <.*>
문자열 Regex <b>Greedy</b> Style
-Lazy방식
표현식 <.*?>
문자열 Regex <i>Lazy</i> Style
문자열 | <b>aaa</b> | |
시그니처 | greedy | pcre:"/<.*>/"; pcre:"/<.*?>/G"; |
lazy | pcre:"/<.*?>/"; pcre:"/<.*>/G"; |
- Snort에서만 사용하는 옵션들
- R
마지막에 패턴 매치된 부분부터 검사를 수행합니다.
즉, content 옵션과 함께 사용하는 distance:0 과 동일한 문자열 버퍼에 대해 패턴 매치를 시도합니다.
- U
URI 버퍼 값에 대해서 패턴 매치를 시도합니다.
즉, http_uri 혹은 uricontent와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- I
정규화 작업을 하지 않은 URI 버퍼에 대해 패턴 매치를 시도합니다.
즉, http_raw_uri 와 동일한 문자열 버퍼에 대해 패턴 매치를 시도합니다.
- P
정규화 되지 않은 HTTP request body 버퍼 값에 대해 패턴 매치를 시도합니다.
즉, http_client_body와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- H
정규화된 HTTP request나 response 헤더 버퍼 값에 대해서 패턴 매치를 시도합니다.
즉, http_header와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- D
정규화 되지 않은 HTTP request 나 response 헤더 버퍼값에 대해서 패턴 매치를 시도합니다.
즉, http_raw_header와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- M
정규화된 HTTP request method 버퍼값에 대해서 패턴 매치를 시도합니다.
즉, http_method와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- C
정규화된 HTTP request와 response cookie 버퍼값에 대해서 패턴 매치를 시도합니다.
즉, http_cookie 와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- K
정규화되지 않은 HTTP request와 response cookie 버퍼값에 대해서 패턴 매치를 시도합니다.
즉, http_cookie 와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- S
HTTP response status code 버퍼값에 대해서 패턴 매치를 시도합니다.
즉, http_stat_code 와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- Y
HTTP response status 메시지 버퍼값에 대해서 패턴 매치를 시도합니다.
즉, http_stat_msg 와 동일한 문자열 버퍼에 대해서 패턴 매치를 시도합니다.
- B
HTTTP 관련 버퍼를 사용하지 않고 원본 패킷에 대해서 패턴 매치를 시도합니다.
즉, rawbytes와 유사합니다.
- O
설정 파일(snort.conf)에서 지정한 pcre match limit 값을 무시하는 목적으로 사용합니다. match limit은 pcre에 의해 너무 오랜 시간 수행 되는것을 방지하는 목적으로 검사 횟수를 제한 하는 값입니다.
이 옵션을 사용하면, 해당 시그니처에 한해서 match recusion 횟수에 제한없이 탐지를 수행합니다.
위 내용을 정리해보면 다음과 같습니다.
순번 |
pcre |
유사한 content 옵션 | 주의 사항 |
1 |
R |
distance:0; | 'U,I,P,H,D,M,C,K,S,Y' 옵션과 함께 사용 못함 |
2 |
U |
http_uri; or uricontent; | 'I' 옵션과 함께 사용 못함 |
3 |
I |
http_raw_uri; | 'U' 옵션과 함께 사용 못함 |
4 |
P |
http_client_body; | |
5 |
H |
http_header; | 'D' 옵션과 함께 사용 못함 |
6 |
D |
http_raw_header; | 'H' 옵션과 함께 사용 못함 |
7 |
M |
http_method; | |
8 |
C |
http_cookie; | 'K' 옵션과 함께 사용 못함 |
9 |
K |
http_raw_cookie; | 'C' 옵션과 함께 사용 못함 |
10 | S | http_stat_code; | |
11 | Y | http_stat_msg; | |
12 | B | rawbytes; | 'U,I,P,H,D,M,C,K,S,Y' 옵션과 함께 사용 못함 |
▶ 정규표현식 관련 글 보기
[프로그래밍] 정규표현식 (Regular Expression) - 초급
'IT 생활 > IPS & Snort' 카테고리의 다른 글
[스노트/Snort] HTTP Inspection Preprocessor에 의한 URI normalization 처리 (3) | 2013.02.18 |
---|---|
[스노트/Snort] 시그니처 룰 테이블 구조와 패턴 매칭 순서 (16) | 2012.11.01 |
스노트(Snort)를 위협하는 IPS시장의 신 강자 수리카타(Suricata) (0) | 2012.10.23 |
[스노트-Snort] 시그니처 content 옵션 이해하기 (43) | 2012.08.22 |
[스노트-snort] HTTP Inspection 전처리기의 모든 것 (0) | 2012.08.16 |