출처 : Medium

Snort

Snort는 Open Source형 IPS (Intrusion Prevention System)이자, IDS (Intrusion Detection System)이다.

악성 네트워크 활동을 정의하는 규칙 기반 언어 (rule-based language)로, 1) 일치하는 네트워크 패킷을 탐지하고 2) 사용자에게 경고를 전송한다.

 

주요 기능

Snort의 주된 사용처는 세 가지이다.

  1. tcpdump 같은 packet sniffer
  2. 네트워크 트래픽 디버깅에 유용한 packet logger
  3. Fully-developed IDS, IPS

 

동작 구조

 

  1. Sniffer
    • Snort IDS를 통과한 패킷을 수집한다.
  2. Preprocessor
    • 효율적인 공격 탐지를 위해 plugin을 거쳐 매칭을 확인한다.
  3. Detection Engine
    • Snort Rule과 매칭 여부를 확인한다.
  4. Alert / Log
    • Snort Rule 매칭 결과에 따라 경고나 로그 등 동작을 수행한다.

Snort Rule Signature

Snort rule은 공격과 악성 활동을 탐지하는 데 사용되며, alert, log 등 특별 규칙을 작성할 수 있다.

이들은 간단한 구문으로 이뤄져 있으며, 모든 규칙을 단일 config 파일에 작성할 수 있다.

 

Snort Rule 구조

Snort Rule은 1) rule header와 2) rule options로 구성되어 있다.

Rule Headers Rule Options
Actions Protocol Source
IP
Source
Port
Direction Destination
IP
Destination
Port
1) Option
Keyword
2) Option
Argument
3) Option
Separator

 

Rule Syntax (출처: Medium)

 

Rule Header

1. Actions : 매핑되는 규칙에 대해 수행할 동작 정의

종류 내용
Alert 탐지 후, 경고 메시지를 생성한다.
Log 특정 IP 패킷을 로깅한다.
Pass 특정 IP 패킷을 무시한다.
Activate 경고 메시지 전송 후, Dynamic rule을 활성화한다.
Dynamic Activate rule에 의해 활성화되며, log rule처럼 동작한다.
Drop 규칙에 매칭되는 패킷을 차단한다.
Reject Drop과 동일하게 동작한다. (TCP RESET 패킷을 출발지로 전송 등.)
Sdrop Drop과 동일하게 동작하지만 로그를 기록하지 않는다.

2. Protocol : 탐지할 프로토콜 종류

  • tcp / udp/ icmp / ip
  • 기타. arp, rarp, gre ... etc 

3. Source / Destination IP : 송수신자 IP 주소

종류 내용 예시
! 특정 IP 제외 !192.168.10.50
[ ] 괄호 내 IP 주소 포함 [ 192.168.10.0/24, 10.0.0.0/24 ]
any 모든 IP 주소  
$ 지정한 변수를 참조 $EXTERNAL_NET, $HOME_NET

4. Source / Destination Port : 송수신자 Port 번호

종류 내용 예시
임의 정수 정해진 port 번호 22(SSH), 25(SMTP), 80(HTTP) etc.
! 특정 port 제외 !80
: 허용할 port 범위 지정 20:80 (20 ~ 80), 20: (20 이상), :80 (80 이하)
any 모든 port 번호  

5. Direction : 패킷의 방향 표시

종류 내용
-> 좌측(source)에서 우측(destination)으로 전달. 기본 설정
<> 송수신자 구별 없이 두 주소 사이에 오간 모든 패킷 대상. 권장하지 않음.

Rule Options

Rule Options는 규칙 헤더에 해당하는 패킷 중 특정 패턴(문자열)과 매칭하는 영역으로, 이를 활용하면 탐지의 정확도를 향상시킬 수 있다. 옵션 구분 시, ';' (semi-colon)을 사용한다.

 

1. 일반(General) 옵션

옵션 내용 예시
msg * 필수. 경고 이벤트를 표시할 때 출력할 메시지 msg : "SQL Injection";
sid * 필수. 규칙을 구분하는 식별 번호. sid : 3000001;
(0~2,999,999 : 예약됨, 3,000,000~ : 사용 가능함)
rev * 필수. 해당 규칙에 대한 버전 rev : 1;
(수정 시마다 숫자가 1씩 증가함)
priority 우선순위를 지정 priority : 1; { 1(높음) ~ 10(낮음) }
classtype 규칙을 분류 classtype : <분류명>;
reference 취약점에 대한 참고사항(URL 등)을 연결 reference:url,www.example.com/test.html ;

2. 흐름(Flow) 옵션

옵션 내용 예시
flow `server ~> client` 방향 패킷 매칭 flow : from_server; or flow : to_client'
`client ~> server` 방향 패킷 매칭 flow : from_client; or flow : to_server'
세션이 연결된 상태의 트래픽만 매칭 flow : established;
세션 성립 여부와 상관 없이 매칭 flow : stateless;

3. Payload(전송 데이터) 탐색 옵션

옵션 내용 예시
content (**) 탐지 패턴 설정 Content : "abc"; Content : "|61 62 63|";
nocase 패턴 매칭 시 대소문자 구별 없이 매칭 Content : "abce";nocase;
offset 해당 옵션에서 지정한 byte 만큼 떨어진 위치부터 탐색 시작 offset : 5;
depth 패킷 데이터에서 찾을 내용의 범위 지정 depth : 5;
(처음에서 5 byte 떨어진 범위 내 문자열 탐색)
distance 이전 content 설정 값 매칭 후, 탐색할 위치 지정 content : "xxx"; content : "yyy"; distance : 10
(xxx가 매칭된 위치에서 10 byte 떨어진 위치부터 yyy 문자열 탐색 시도)
within 이전 content 설정 값 매칭 후, 끝낼 위치 지정 content : "xxx", content : "yyy"; within : 10
(xxx가 매칭된 위치에서 10 byte 이내에 yyy 문자열 탐색 시도)
pcre 정규식. '/'는 시작과 끝에 표기. 16진수는 앞에 \x pcre : "/(http|tcp) Traffic/"

4. HTTP 관련 옵션

옵션 내용
http_method Payload 전면부의 HTTP method 패턴 매칭
http_uri Payload 에서 HTTP URI 값 패턴 매칭
http_cookie Payload 에서 HTTP cookie 값 패턴 매칭
http_header HTTP 요청/응답 header 값 패턴 매칭
http_client_body HTTP 요청/응답 body 값 패턴 매칭
http_stat_code HTTP 응답 message의 상태 코드 값 패턴 매칭
http_stat_message HTTP 응답 message의 상태 메시지 부분 값 패턴 매칭

참고 출처

 - What is Snort?

 - What is Snort? | Medium

 - What is a signature?

 - 08.5_Snort Architecture & Snort Rules