본문 바로가기

Learning/└◆리눅스 서버 보안

08.4_PCRE(Perl Compatible Regular Expression)

PCRE(Perl Compatible Regular Expression)

 

Snort Rules -> pcre 지시자

(Kali Linux - IDS)

root@kali:/etc/snort/rules # find . -type f -name "*.rules" -exec fgrep -l pcre {} \;

./exploit.rules

./community-web-php.rules

./community-misc.rules

./oracle.rules

./community-imap.rules

./pop2.rules

./community-oracle.rules

./web-misc.rules

./community-bot.rules

./virus.rules

./web-php.rules

....(중략)....

alert tcp $HOME_NET any -> $EXTERNAL_NET 25 (msg:"VIRUS OUTBOUND bad file attachment"; flow:to_server,established; content:"Content-Disposition|3A|"; nocase; pcre:"/filename\s*=\s*.*?\.(?=[abcdehijlmnoprsvwx])(a(d[ep]|s[dfx])|c([ho]m|li|md|pp)|d(iz|ll|ot)|e(m[fl]|xe)|h(lp|sq|ta)|jse?|m(d[abew]|s[ip])|p(p[st]|if|[lm]|ot)|r(eg|tf)|s(cr|[hy]s|wf)|v(b[es]?|cf|xd)|w(m[dfsz]|p[dmsz]|s[cfh])|xl[tw]|bat|ini|lnk|nws|ocx)[\x27\x22\n\r\s]/iR"; classtype:suspicious-filename-detect; sid:721; rev:8;)

# fgrep 'pcre' ./virus.rules

 

 

1. 정규 표현식이란?

 

정규 표현식(Regular Expression) == # grep '^root' /etc/passwd

# dpkg -l | grep pcre (pcre는 패키지이다.)

 

정규표현식(Regular Expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어이다.

정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색 치환을 위해 지원된다.

 

 

 

2. 실습을 위한 준비(필요한 프로그램 - 윈도우용)

 

적당한 프로그램 다운로드 받고 설치한다.

- (유료) RegexBuddy(http://www.regexbuddy.com/)

or

- (무료) Rad.RegexDesigner(http://www.radsoftware.com.au/regexdesigner/)

-> 공유디렉토리 사용

 

 

3. 메타 문자(Metacharacter) 종류와 의미

 

메타문자: .

"\n"을 제외한 모든 단일 문자를 찾는다."\n"을 포함한 모든 문자를 찾으려면 '[.\n]' 패턴을 사용함

 

[실습] .

표현식 h.t

문자열 hat halt hit heat hot

 

 

 

메타문자: ?

? 문자 바로 앞에 있는 문자가 0 또는 1회 반복되는 것을 가리킨다.

 

[실습]

표현식 ha?t

문자열 ht hit hat hot haat hut haaaaat

 

 

메타문자: *

앞의 문자를 0회 이상을 반복한다.

 

[실습]

표현식 ha*t

문자열 ht hit hat hot haat hut haaaat

 

메타문자: +

앞의 문자를 1회 이상을 반복한다.

 

[실습]

표현식 ha+t

문자열 ht hit hat hot haat hut haaaaat

 

 

메타문자: ^

^은 줄의 제일 처음(시작위치)을 카리킨다.

입력 문자열의 시작 위치를 찾음. Multiline 속성이 설정되어 있으면 '\n' 또는 '\r' 앞의 위치를 찾는다.

 

[실습]

표현식 ^h.t

문자열 hat hit hot

메타문자: $

$는 줄의 제일 마지막(끝 위치)을 가리킨다.

입력 문자열의 끝 위치를 찾음. Multiline 속성이 설정되어 있으면 '\n' 또는 '\r' 뒤의 위치를 찾는다.

 

[실습]

표현식 h.t$

문자열 hat hit hot

 

 

메타문자: (pattern)

정규식 내에서 패턴을 그룹화 한다.

특정 패턴을 묶어서 반복 기호등과 함께 사용한다.

여러 문자 중 하나만 선택적으로 매칭하고자 할 때 사용

 

[실습]

표현식 ba(na)*

문자열 ba na bana banana nana bananana

 

표현식 ba(na)+

문자열 ba na bana banana nana bananana

 

 

메타문자: (|)

| 기호를 기준으로 앞뒤의 값들 중의 하나 선택

괄호로 묶인 그룹 내에서 | 으로 나뉘어진 여러개의 패턴 중 하나와 일치하는 것을 가리킨다.

 

[실습]

표현식 (eg|sa|be)g

문자열 egg eng sag sig beg bag

 

 

메타문자: {n}

바로 앞의 문자를 정확히 n번 반복한다.

 

[실습]

표현식 ha{2}t

문자열 ht hit hat hot haat hut haaaaat

 

 

메타문자: {n,}

바로 앞의 문자를 n번 이상 반복 한다.

{0,}는 별표(*)와 같은 의미이다.

{1,}는 더하기(+)와 같은 의미이다.

{0,1}는 물음표(?)와 같은 의미이다.

 

[실습]

표현식 ha{2,}t

문자열 ht hit hat hot haat hut haaaaat

 

 

메타문자: {n,m}

바로 앞의 문자를 n번 이상 m회 이하 반복 한다.

 

[실습]

표현식 ha{2,4}t

문자열 ht hat haat haaat haaaat haaaaat

 

 

 

 

문자 집합: []

괄호 안의 문자 중 하나를 찾는다.

[abc] a, b, c 중 하나

[a-z] 알파벳 소문자 중 하나

[0-9] 숫자 중 하나

[a-zA-Z] 알파벳 소문자나 대문자 중 하나

 

[실습]

표현식 h[aiu]t

문자열 hat het hit hot hut

 

 

메타문자: [^xyz]

[^]은 안에 있는 문자를 제외한 문자중 하나를 가리킨다.

[^abc] a,b,c 이외의 문자 중 하나

[^a-z] 알파벳 소문자 이외의 문자 중 하나

[^0-9] 숫자 이외의 문자 중 하나

[^a-zA-Z] 알파벳 소문자나 대문자 이외의 문자 중 하나

 

[실습]

표현식 h[^aiu]t

문자열 hat het hit hot hut