스노트에서 지원하는 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
 bBbBb 

 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 과 동일한 문자열 버퍼에 대해 패턴 매치를 시도합니다.  


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) - 초급

Posted by KT한
,