IT 지식/IT 정보

스노트(Snort)

Security Engineer 2025. 6. 10. 22:00

스노트는 무엇인가?

스노트(Snort)

- 1998년 마틴 로쉬가 오픈소스로 개발

- 시그니처 기반 네트워크 침입 탐지 시스템

- 작동 방식: Sniffer Mode, Packet Logging Mode, NIDS Mode

 

 

스노트 동작

- 스니퍼: 네트워크 패킷 수집

- 패킷 디코더: 전처리기와 탐지 엔진이 파싱 할 수 있도록 정규화

- 전처리기: 특정 행위가 발견된 패킷을 탐지 엔진으로 전송

- 탐지엔진: 전달받은 패킷을 스노트 규칙에 매칭되는지 확인

- 경고/로깅: 스노트 규칙에 매칭된 경우 경고 출력 및 기록

 

 

수리카타는 무엇인가?

수리카타(Suricata)

- 오픈 소스 보안 재단(OISF)에서 개발한 시그니처 기반 네트워크 침입 탐지 시스템

- 멀티 코어 / 멀티 스레드 지원하여 대용량 트래픽 처리 가능

- LUA 언어로 시그니처 작성

- 스노트 기능 및 규칙 호환

 

 

수리카타 동작

 

 

스노트 관련 파일 경로

- 스노트 규칙 파일 경로: /etc/nsm/rules

- downloaded.rules: 기본으로 제공되는 스노트 규칙 파일

- local.rules: 사용자가 정의한 스노트 규칙 파일

 

 

- 스노트 설정 파일 경로: /etc/nsm/templates/snort

- snort.conf: 스노트 설정 파일

 

 

규칙 구조(Rule Signature)

- 스노트 시그니처는 규칙 헤더규칙 옵션 영역으로 구분한다.

 

 

- 샘플 규칙

 

 

규칙 헤더(Rule Header)

액션(Action)

종 류 내 용
Alert 패킷의 정보를 로그에 기록하고 사용자가 확인할 수 있도록 경고 발생
Log 패킷의 정보를 설정한 로그 파일에 기록
Pass 패킷 무시. 대부분 사용하지 않지만 특정 네트워크의 트래픽을 무시하고 싶을 때 사용
Drop 인라인(In-Line)방식으로 구성되어 있을 경우 IPS 역할이 가능. 규칙에 매칭되는 패킷을 차단하고 기록
Reject Drop과 같은 액션을 취함. TCP의 RESET 패킷을 출발지로 전송. ICMP 패킷은 Unreachable 로 반송.
Sdrop Drop과 동일하게 패킷을 차단하지만 로그 기록하지 않음.

 

프로토콜(Protocol)

- TCP / UDP / ICMP / IP / ANY 중 택 1

 

 

송신 / 수신 IP (Src/Dst IP)

종 류 내 용
! 부정 연산자로 특정 네트워크 대역 제외.
[ ] 비연속적인 IP 지정.
any 모든 IP를 의미.
192.168.100.100/32 특정 호스트 IP 지정.
192.168.100.0/24 특정 IP 대역대 지정.
!192.168.100.0/24 전체 IP에서 특정 IP 대역대 제외.
$EXTERNAL_NET 외부 IP 주소 변수. 설정 파일
Snort.conf

$HOME_NET 내부 IP 주소 변수.
$HTTP_SERVERS 웹 서버의 주소 변수.
$DNS_SERVERS DNS 서버의 IP 주소 변수.
$SMTP_SERVERS SMTP 메일 서버의 IP 주소 변수.
$SSH_SERVERS SSH 프로토콜을 사용하는 장비의 IP 주소 변수.

 

 

송신 / 수신 포트 (Src/Dst Port)

종 류 내 용
! 부정 연산자로 특정 포트를 제외.
: 연속적인 포트번호 지정.
Ex) 1:1000 1부터 1000까지 포트 지정
any 모든 포트 의미
!1:1000 1부터 1000까지를 제외한 포트 지정.

 

 

방향 연산자

종 류 내 용
-> 송신지에서 수신지 방향을 의미, 단방향
<> 송신지와 수신지의 오가는 패킷 의미, 양방향

 

 

규칙 옵션(Rule Option)

일반 옵션(General Options)

옵 션 내 용 예 시
msg 경고 이벤트를 보여줄 때 나타나는 메시지 msg:"SQL Injection";
sid 규칙을 구별하는 식별자
모든 규칙은 식별 번호를 가짐.

0-2999999 : 이미 예약된 식별자
3000000 ~ : 사용 가능한 식별자 
sid:3000001;
sid:2016113003;
rev 해당 규칙에 대한 버전.
수정 할 때마다 숫자를 1씩 증가.
rev:1;
priority 우선 순위를 숫자로 지정. 1(높음)-10(낮음) priority:1;
calsstype 스노트 규칙을 분류하는 옵션.
정의 파일: /etc/nsm/센서명/classification.config
classtype:분류명;
reference 취약점의 참고가 되는 정보(URL 등)를 연결
정의 파일: /etc/nsm/센서명/reference.config
reference:url, www.security.com/123.html;

referecne:CVE, 2012-1823;

 

 

흐름 옵션(Flow Options)

옵 션 방 향 옵 션 내 용
flow to_server 클라이언트에서 서버로 향하는 트래픽
from_client
to_client 서버에서 클라이언트로 향하는 트래픽
from_server

- established: 세션이 연결된 상태의 트래픽만 매칭

- Stateless: 세션의 연결 유무와 상관 없이 매칭

EX) flow:to_server, established

 

 

페이로드(Payload)

옵 션 내 용 예 시
Content 탐지한 패턴을 설정하는 옵션 Content: "abc";
Content: "|61 62 63|"
→ | | 내의 값은 아스키 코드 Hex 값
Nocase 패턴 매칭 시 대소문자 구별하지 않고 매칭 Content: "abc"; nocase;
offset 해당 옵션에서 지정한 바이트만큼 떨어진 위치부터 탐색 시작
0바이트 부터 시작
offset:5;
Depth 패킷 데이터에서 찾을 내용의 범위를 지정하는 옵션.
예를 들어 5로 지정하면 처음부터 5바이트까지 문자열 탐색.
depth:5;
distance 이전 content 설정 값 매칭 후 탐색할 위치를 지정.
예시) abc가 매칭된 위치에서 32바이트 떨어진 위치부터 test 문자열을 탐색 시작.
Content: "abc"; nocase;
Content: "test"; distance:32;
within 이전 content 설정 값 매칭 후 매칭을 끝낼 상대 위치를 지정.
예시) abc가 매칭된 위치에서 10바이트 이내에 test 문자열 존재하는지 탐색.
Content:"abc"; nocase;
Content:"test"; within:10;
pcre 스노트 규칙에서 사용가능한 정규표현식.
특정 문자열의 집합을 표현할 때 효과적으로 사용 가능.
Pcre:"/Select\b.*FROM/Ui";

 

 

HTTP 관련 옵션

옵 션 내 용
http_method 페이로드 앞부분의 HTTP 메소드 부분의 패턴을 매칭.
메소드: GET, POST, PUT, HEAD, DELETE, TRACE...
http_uri 페이로드에서 HTTP URI 값을 패턴 매칭
http_cookie 페이로드에서 HTTP 쿠키 값을 패턴 매칭
http_header HTTP 요청 / 응답 헤더 값에서 패턴 매칭 시도
http_client_body HTTP 요청 / 응답 바디 값에서 패턴 매칭 시도
http_stat_code HTTP 응답 메시지의 상태코드에서 매칭 시도
ex) HTTP/1.1 200 OK
http_stat_message HTTP 응답 메시지의 상태 메시지 부분에서 매칭 시도
ex) HTTP/1.1 200 OK

 

 

Threshold 옵션

type 설명
limit 매 s초 동안 c번째 이벤트까지 action을 수행
ex) threshold type limit track by_src, count 2, seconds 10
→ 출발지 IP를 기준으로 매 10초마다 2번째 이벤트까지 action을 수행
threshold 매 s초 동안 c번째 이벤트마다 action을 수행
ex) threshold type threshold, track by_src, count 10, secnods 5
→ 출발지 IP를 기준으로 매 5초마다 10번째 이벤트마다 action을 수행
both 매 s초 동안 c번째 이벤트 시 한번 action을 수행
ex) threshold type both, track by_src, count 10, seconds 1
→ 출발지 IP를 기준으로 매 1초마다 10번째 이벤트 시 한번 action을 수행

- track

1. by_src: 출발지 IP를 기준으로 추적

2. by_dst: 목적지 IP를 기준으로 추적

 

 

 

규칙 업데이트 명령어

스노트 규칙 업데이트 명령어

- rule -update

→ PulledPork 도구로 Emerging Threats의 최신 규칙 다운로드 후 적용

 

잘못된 스노트 규칙 수정 후 업데이트 명령어

- nsm --sensor --restart --only-snort-alert

 

 

정규표현식(PCRE)

기본 특징

- 펄 호환 정규표현식(Perl Compatible Regular Expression)

- 스노트 패턴 탐지 옵션 Content를 보완하고 정확도를 높이는 데 사용

- PCRE의 시작과 끝은 구분자(/)로 결정 → pcre:"/표현식/옵션";

- 테스터 사이트: https://www.debuggex.com

 

Debuggex: Online visual regex tester. JavaScript, Python, and PCRE.

View Cheatsheet Visual ModeText Mode {{nfaModel.error.msg}}   Result: Matches Does not match starting at the black triangle slider

www.debuggex.com

 

정규표현식 테스트 사이트

https://regexr.com/

 

 

이스케이프 기호

기호 의미 예제
\\ 역슬래쉬 문자 자체 \
\n 줄바꿈(Line feed), 커서를 다음 줄로 이동  
\r 캐리지 리턴(Carrage Return), 커서를 맨 앞줄로 이동  
\t 탭(Tab)  
\v 수직 탭(Vertical Tab)  
\f 폼 피드(Form Feed), 다음 페이지로 넘어 가기  
\' 작은 따옴표(Single Quote) '
\" 큰 따옴표(Double Quote) "
\d 모든 숫자 == [0-9]
\D 숫자가 아닌 문자 [^0-9] == [^0-9]
\s 공백 == [\t\n\r\f\v]
\S 공백이 아닌 문자 == [^\t\n\r\f\v]
\w _ 를 포함한 숫자 또는 문자 == [A-Za-z0-9_]
\W 숫자 또는 문자가 아닌 것 == [^A-Za-z0-9_]
\b 단어와 공백 사이를 찾음 ab\b --> nnnab (O) / nnnabn (X)
[\b] back space, \b와 혼동하면 안됨  
\B 단어의 경계가 아님 ab\B --> nnnab (X) / nnnabn (O)

 

 

 

 

메타문자

- 기능(의미)를 가지는 문자 \t \n \r \b

- 클래스 [ ] : 괄호 안의 문자 중 하나를 찾는다. [abc] : a, b, c 중 하나, [a-z] : 알파벳 소문자 중 하나

- 서브 패턴 ( ) : 문자열을 하나로 묶음(특정 패턴을 묶어서 반복 기호등과 함께 사용)

- 수량자 { } : 앞 문자가 몇 번 반복되는지, \d{1,3}: 1자리, 2자리, 3자리 숫자 의미

문자 의미 문자 의미
\ 이스케이프 문자 + 1번 이상
^ 문자열 시작 [ 클래스 시작
$ 문자열 끝 ] 클래스 끝
. 임의의 문자 하나 ( 서브 패턴 시작
| OR 연산 ) 서브 패턴 끝
? 0번 또는 1번만 { 수량자 시작
* 0번 또는 1번 이상 } 수량자 끝

 

 

문제 풀이 - 메타 문자

예제1) pcre:"/a.a/" 가 탐지 할 수 있는 경우를 찾으시오.

1. Aaa 

2. aTa 

3. aTat

 

예제2) pcre:"/(one|two) apple/" 가 탐지 할 수 있는 경우를 찾으시오.

1. one apple

2. onetwo apple

3. apple

 

예제3) pcre:"/boan?/"가 탐지 할 수 있는 경우를 찾으시오.

1. boan

2. boaan

3. boa

 

예제4) pcre:"/pro*ject/"가 탐지 할 수 있는 경우를 찾으시오.

1. project

2. prject

3. projject

 

예제5) pcre:"/boan+project/"가 탐지 할 수 있는 경우를 찾으시오.

1. boanproject

2. boanpproject

3. boannproject

 

 

수량자 및 클래스 사용

- 수량자는 설정한 패턴이나 클래스의 반복 횟수를 결정

- 수량자는 { } 안에 값을 설정

- 클래스는 탐지할 패턴을 결정하며 [ ] 안에 값을 결정

수량자/클래스 의미
{n} 앞선 문자나 클래스가 n개 존재하는 문자열 검색
{n,} 앞선 문자나 클래스가 n개 이상 존재하는 문자열 검색
{n,m} 앞선 문자나 클래스가 n개 이상 m개 이하 만큼 존재하는 문자열 검색
[abc] a,b,c 중 하나라도 속한 문자열 검색
[a-z] 소문자 a부터 z까지 하나라도 속한 문자열 검색
[A-Z] 대문자 A부터 Z까지 하나라도 속한 문자열 검색
[0-9] 숫자 0부터 9까지 하나라도 속한 문자열 검색
[A-Za-z0-9] 모든 단어 검색
[\f\r\t\n\v] 모든 공백 검색
[^0-9] 숫자가 아닌 모든 문자 검색(클래스 내의 ^는 부정을 의미)

 

 

문제 풀이 - 수량자 및 클래스 사용

예제1) pcre:"/[A-Z]{3}/" 가 탐지 할 수 있는 경우를 찾으시오.

1. aaA

2. ABC

3. A-Z3

 

예제2) 클래스를 사용하여 숫자 9가 4개 이상 포함된 문자열을 찾는 정규식을 만드시오.

pcre:"/9{4,}/"

 

예제3) pcre:"/bo{2,4}an/" 가 탐지 할 수 있는 경우를 찾으시오.

1. booan

2. boan

3. booooan

 

 

PCRE 옵션

- 메타 문자 이외에 추가적인 기능을 하는 옵션

- 구분자 뒤에 사용 /abc/iU

옵션 의미
i 패턴의 대문자와 소문자를 구별하지 않고 검색하는 옵션
s 개행이 되더라도 문자열을 1줄로 인식하여 메타문자 . 기능이 동작하는 옵션
m 메타문자 ^와 $가 행마다 동작하게 하는 옵션
x 패턴에 존재하는 모든 공백을 무시하는 옵션

 

 

스노트 지원 PCRE 옵션

- HTTP 관련 옵션과 동일한 기능

옵션 의미 유사 스노트 옵션
B 정규화 되지 않은 원본 패킷과 패턴 매치 rawbytes
M HTTP 메소드(Method)와 패턴 매치 http_method
H 정규화된 HTTP 요청(Request) 메시지 헤더 정보와 패턴 매치 http_header
D 정규화 되지 않은 HTTP 요청 메시지 헤더 정보와 패턴 매치 http_raw_header
P HTTP 요청 메시지 바디와 패턴 매치 http_client_body
U 정규화된 URL 디코딩한 문자열과 패턴 매치 http_uri, uricontent
I 정규화 되지 않은 URL 디코딩한 문자열과 패턴 매치 http_raw_uri
C 정규화된 HTTP 요청과 응답(response)의 쿠키 값과 패턴 매치 http_cookie
K 정규화 되지 않은 HTTP 요청과 응답의 쿠키 값과 패턴 매치 http_raw_cookie
S HTTP 응답 코드와 패턴 매치 http_stat_code
Y HTTP 응답 상태 메시지와 패턴 매치 http_stat_msg

 

 

문제 풀이 - 정규표현식 옵션

예제1) pcre:"/union/Ui" 가 탐지 할 수 있는 경우를 찾으시오.

1. UniON

2. union

3. UnioN

 

예제2) 200 응답 코드나 404 응답 코드를 찾는 정규식을 만드시오

pcre:"/(200|404)/S"

 

예제3) 요청 메시지 헤더에서 select 문자열을 찾는 정규식을 만드시오

pcre:"/select/Hi"

 

 

아스키 코드 참고

 

 

 

 

 

 

 

참고

https://www.inflearn.com/course/%EC%9B%B9-%ED%95%B4%ED%82%B9-%EC%8A%A4%EB%85%B8%ED%8A%B8-%EB%B6%84%EC%84%9D%EC%B9%A8%ED%95%B4/dashboard