스노트에서 지원하는 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한
,
정규표현식에 대해 생소한 분들은 초/중급 포스팅을 참고하세요. 
정규표현식 초급정규표현식 중급 


 여기서는 자주 사용되지는 않지만..
잘 알고 사용하면 여러가지로 유용한 내용들에 대해 다뤄보고자 합니다.

1. 단어 경계 - \b, \B 
 매칭하고자 하는 패턴의 단어 경계를 지정하는데 사용. 

단어의 경계를 찾는 '
\b'옵션을 사용하면
문자열 중 일부에만 매칭되는 경우는 제외하게 된다. 
====================================
  
표현식  \bart\b
  
문자열  The art of music part of artist
==================================== 

'
\B' 는  '\b'와 반대의 의미로 사용된다. 


2. 비 캡처 그룹 - (?: )
그룹화 기호를 사용해서 매칭을 시도할 경우 
매칭되는 내용은 캡처되어 추후에 재사용 할 수 있도록 한다. 

하지만, 재사용할 일이 없을 경우 
비 캡처 그룹으로 표현해주므로써 캡처 그룹에서 제외시키고,
적지만 성능 향상도 기대할 수 있다. 
====================================
  
표현식  (?:one|two|three)
==================================== 


3. 명명 재참조 - (?P<name>) , (?<name>)혹은 (?'name') 
특정한 패턴을 캡처한 후 이를 사용하기 편하도록 이름을 지어준 후
그 이름으로 캡처된 패턴을 불러다 사용.

캡처된 값들에 이름을 지정해주므로써 보는 사람 관점에서도 이해하기 쉽도록 도와주고, 
특정 위치의 값을 저장해두었다가 다른 위치에서 동일한 값이 나오는지 확인 하는데 유용함.

방식은 크게 세가지가 지원되며, 버전에 따라 지원되지 않는 것도 있을 수 있다. 
값을 캡처하고 명명 할 때와 이를 호출해서 사용 하는 방법은 다음과 같다. 

     명명              =>                 호출 
(?P<name>)        =>              (?P=name)     
(?<name>)
          =>             \k<name>
(?'name')            =>              \k'name'


 
====================================
  
표현식1  (?P<hour>\d\d):(?P<min>\d\d)-(?P=hour)-(?P=min)
  표현식2  (?<hour>\d\d):(?<min>\d\d)-\k<hour>-\k<min>
  표현식3  
(?'hour'\d\d):(?'min'\d\d)-\k'hour'-\k'min'

  
문자열  17:53-17-53
==================================== 


4. 주석 처리 - (?# ) 혹은 (?#>     <)

정규표현식에 설명을 추가하고 싶을 때 사용.
자칫 잘못 사용하면 복잡도가 증가하여 오히려 역효과를 불러 일이킬 수 있다. 

 
====================================
  
표현식  (?#year)\d{4}-(?#mon)\d{2}-(?#day)\d{2}
 

====================================
Posted by KT한
,

 정규표현식이란?
특수한 텍스트 패턴에 일치하는지 여부를 검사하거나, 텍스트 내에서 특정 패턴과 일치하는 텍스트를 찾기 위해 사용하는 표현식
요즘은 어지간한 어플리케이션에서 모두 지원하고 있다.

정규표현식 툴
물론 돈을 주고 산다면 다양한 기능과 화려한 인터페이스를 자랑하는 툴도 많다. (RegexBuddy)
하지만.. 우리는 공짜를 좋아하기 때문에..
공짜인 "Rad RegexDesigner"를 추천한다

1. 바로 다운받아 사용하고 싶다면  (첨부파일 클릭)Rad.RegexDesigner.Setup.1.4.exe
2. 사이트에가서 설명을 보고 받고 싶다면..  (홈페이지 주소 클릭)

사용법은  "Input Text"에 문자열을 넣고 "Regular Expression"에 정규표현식을 넣은 후
상단에 있는 녹색 재생 버튼을 클릭하면 된다.
매칭 여부는 우측에 있는 "Match Results"에서 확인 가능하다"

예제의 경우 전체 문자열에서 정규표현식에 의해 매칭된 문자열이 네 개로 나온다.



그럼 중급 정규표현식에 대해 알아보자


1. Group ( ) 
특정 패턴을 묶어서 반복 기호등과 함께 사용
 

여러 문자 중 하나만 선택적으로 매칭하고자 할 때 사용.
====================================
  
표현식   ba(na)*
  
문자열  ba na bana banana nana bananana
====================================
====================================
  
표현식   ba(na)+

  문자열  ba na bana banana nana bananana
 ====================================


2. 선택 지정 ( | ) 
괄호로 묶인 그룹 내에서 | 으로 나뉘어진 여러 개의 패턴  하나와 일치하는 것을 가리킨다
====================================
  
표현식   (eg|sa|be)g
  
문자열  egg eng sag sig beg bag
====================================
 

3. Group 참조  \숫자  (backreference)
 Group
으로 지정된 내용을 뒤에 \숫자의 형식으로 재 사용하는데 사용.
 ====================================
  
표현식   (h.t)\1
  
문자열  hathat hitbit hothot hutcut

  표현식   \d\d(\d\d)-\1-\1
  
문자열  2011-11-11
====================================


4.
반복 문자 탐지  Greedy, Lazy
 
반복 문자 개수를 지정하는 방법은 크게 Greedy방식과 Lazy방식으로 나뉘어진다.
 Greedy
 방식은 가능한 최대의 것을 선택하고,  Lazy방식은 가능한 최소의 것을 선택한다.
 Greedy
 방식뒤에 ? 붙이면 Lazy방식이 된다.

-Greedy 방식
====================================
  
표현식   <.*>
  
문자열  Regex <b>Greedy</b> Style
====================================
-Lazy
방식

====================================
  
표현식   <.*?>
  
문자열   Regex <i>Lazy</i> Style
====================================
-
사용

==================
 Greedy  |   Lazy 
==================
  *         |     *?
  +         |    +?
  ?         |     ??
 \d+       |   \d+?
 {n,m}    |   {n,m}?
==================

5.주요 Escape 문자 목록
 \t      
 문자, Tab, \u0009 
 \r     
 바꿈 문자, Carriage Return, \u000D 
 \n     
 바꿈 문자, Line Feed, \u000A 
 \b     [ ] 안에서 사용될 때는 백스페이스 문자, Backspace, \u0008
         [ ]
 밖에서 사용될 때는  단어 경계(Word Boundary), 즉 단어의 시작과 끝 빈문자에 매칭( \bhit => hit 과 매칭)
       
 Pattern에서 사용될 때는 항상 백스페이스 문자
 \\     \
 문자 자체를 가리킬  사용
       
비슷한 사용법 \.   \*   \+   \?   \^   \$   \(   \)   \{   \}   \[   \] 


6. 주요 특수문자 목록 

 특수문자  문자 클래스  설명
  \w [0-9a-zA-Z_]   영문자, 숫자, 언더바(_) 
  \W [^0-9a-zA-Z_]  영문자, 숫자, 언더바(_) 이외 
  \s [\t\n\r\f]  공백( 반각 스페이스, 탭, 개행) 
  \S [^\t\n\r\f] 공백 이외 
  \d [0-9]  숫자 
  \D [^0-9] 숫자 이외

 


참고 사이트 Joinc Wiki     <= 클릭

Posted by KT한
,
정규표현식이란?

특수한 텍스트 패턴에 일치하는지 여부를 검사하거나, 텍스트 내에서 특정 패턴과 일치하는 텍스트를 찾기 위해 사용하는 표현식
요즘은 어지간한 어플리케이션에서 모두 지원하고 있다.

정규표현식 툴
물론 돈을 주고 산다면 다양한 기능과 화려한 인터페이스를 자랑하는 툴도 많다. (RegexBuddy)
하지만.. 우리는 공짜를 좋아하기 때문에..
공짜인 "Rad RegexDesigner"를 추천한다

1. 바로 다운받아 사용하고 싶다면  (첨부 파일 클릭)
Rad.RegexDesigner.Setup.1.4.exe
2. 사이트에가서 설명을 보고 받고 싶다면..  (홈페이지 주소 클릭)

사용법은  "Input Text"에 문자열을 넣고 "Regular Expression"에 정규표현식을 넣은 후
상단에 있는 녹색 재생 버튼을 클릭하면 된다.
매칭 여부는 우측에 있는 "Match Results"에서 확인 가능하다"

예제의 경우 전체 문자열에서 정규표현식에 의해 매칭된 문자열이 네 개로 나온다.



그럼 초급 정규표현식에 대해 알아보자

1. 점( . )
 .
 임의의 한 문자 가리킨다. ( "줄바꿈 문자(\n)" 제외)
====================================
  
표현식  h.t
  
문자열  hat halt hit heat hot
====================================
  
표현식   h..t
  
문자열  hat halt hit heat hot
====================================

2. 대괄호 [ ]
 [ ]
안에 있는 문자중 하나를 가리킨다.
 [abc]    a,b,c
하나
 [a-z]    
알파벳 소문자 하나
 [0-9]    
숫자 하나
 [a-zA-Z]   
알파벳 소문자나 대문자 하나
====================================
  
표현식   h[aiu]t
 
문자열  hat het hit hot hut
====================================

3. 대괄호와 캐럿 [^ ]
 [^ ]
안에 있는 문자를 제외한 문자중 하나를 가리킨다.
 [^abc]    a,b,c
이외의 문자 하나
 [^a-z]    
알파벳 소문자 이외의 문자 하나
 [^0-9]    
숫자 이외의 문자 하나
 [^a-zA-Z]  
알파벳 소문자나 대문자 이외의 문자 하나
====================================
  
표현식   h[^aiu]t
  
문자열  hat het hit hot hut
====================================

4. 별표( * )
 *
바로 앞에 있는 문자가 0회 이상 반복되는 것을 가리킨다.
====================================
  
표현식   ha*t
  
문자열  ht hit hat hot haat hut haaaaat
====================================

5. 플러스(+)
 +
바로 앞에 있는 문자가 1회 이상 반복되는 것을 가리킨다.
====================================
  
표현식   ha+t
  
문자열  ht hit hat hot haat hut haaaaat
====================================

6. 물음표( ?)
 ?
바로 앞에 있는 문자가 0또는 1회 반복되는 것을 가리킨다.
====================================
  
표현식   ha?t
  
문자열  ht hit hat hot haat hut haaaaat
====================================

7. {n}
 {n}
바로 앞에 있는 문자가 n회 반복되는 것을 가리킨다.
====================================
  
표현식   ha{2}t
  
문자열  ht hit hat hot haat hut haaaaat
====================================

8. {n,}
 {n,}
바로 앞에 있는 문자가 n회 이 반복되는 것을 가리킨다.
 
{0,} 별표(*) 같은 의미이다.
 {1,} 더하기(+) 같은 의미이다
 {0,1} 물음표(?) 같은 의미이다
 
====================================
 
  표현식   ha{2,}t
 
  문자열  ht hit hat hot haat hut haaaaat
 
====================================
 

9. {n,m}
 {n,m}
바로 앞에 있는 문자가 n회 이상, m회 이하 반복되는 것을 가리킨다.
====================================
  
표현식   ha{2,4}t
  
문자열  ht hat haat haaat haaaat haaaaat
====================================

10. 캐럿( ^)
 ^
줄의 제일 처음(시작위치) 가리킨다.
====================================
  
표현식   ^h.t
  
문자열  hat hit hot
====================================

11. 달러( $)
 $
줄의 제일 마지막( 위치) 가리킨다.
====================================
  
표현식    h.t$
  
문자열  hat hit hot
====================================

 


Posted by KT한
,