메뉴 건너뛰기

Hello :0

Snort 규칙

2014.04.05 13:40

Leekyu 조회 수:5388

posted by 초식사자 2010/11/30 13:58

-규칙 헤더

alert tcp $EXTERNAL_NET any -> $HOME_NET 21

 

헤더

내용

alert

alert, log, pass, dynamic, activate

출력 포맷을 의미한다. 이 출력 포맷은 연결리스트 트리 헤더의 맨 상위 부분과 비교된다.

tcp

TCP, UDP, IP,

ICMP

사용되는 프로토콜을 의미하며 연결리스트의 상위 부분과 비교된다.

$EXTERNAL_NET

·

출발지 IP 주소를 가리킨다. (기본 설정은 any)

any

any, 포트 번호

출발지 포트를 의미한다.

->

·

패킷의 방향을 가리킨다.

$HOME_NET

·

Snort 규칙에서는 $Variables를 이용한다. 변수는 snort.conf파일의 맨 앞부분에서 정의되며 나머지 부분에서 그 변수를 사용한다. Snort가 실행될 때 Snort 규칙 파서는 $HOME_NET 변수의 값을 snort.conf에 설정된 값으로 치환한다.

21

any, 포트 번호

공격의 목적지 포트이다. 해당 포트에 대한 모든 잠재적 공격을 모니터링 한다.

 

 

-규칙 옵션

(msg : "FTP EXPLOIT wu-ftpd 2.6.0 site exec format string overflow Linux"flow:to_server, establishedcontent: "|31c031db31c9b046cd8031c031db|"reference:bugtraq,1387reference:cve,CAN-2000-0573reference arachnids,287; classtype:attempted-admin; sid:344rev:4;)

 

규칙

내용

msg

경고에서 출력할 메세지이다.

flow

규칙 옵션은 탐지 플러그인과 연결되는 키워드를 포함하고 있는데 flow 옵션은 연결 리스트의 세 번째 축이며 clientserver 탐지 플러그인을 가리킨다.

clientserver 플러그인은 특정 패킷이 기존에 수립된 세션의 일부인지를 검사하기 위해 stream4 전처리기를 이용한다.

content

"|31c031db31c9b046cd8031c031db|" 패킷이 Rule Tree 노드와 일치한다는 것은 기존에 세션이 맺어졌다는 것을 의미한다. Snort는 content 옵션에 나온 문자열을 Boyer-Moore 검색 알고리즘으로 패킷과 비교한다.

Reference

이 키워드는 서드 파티 공격 정보에 대한 참조 정보를 제공한다. 예를 들어 이 부분에는 Bugtraq, McAfee, 각 벤더의 공격 정보에 대한 URL이 들어갈 수 있다.

Classtype

Snort는 사용자가 공격을 쉽게 이해하고 우선 순위를 결정할 수 있도록 공격을 몇가지 종류로 분류해 놓았다. 각 분류는 기본 우선 순위를 가지고 있기 때문에 사용자는 자신이 관찰한 이벤트의 우선 순위를 쉽게 결정할 수 있다. (1: 높음, 2: 중간, 3: 낮음)

Sid

Snort의 규칙을 구분하는 식별자이다. Snort의 모든 규칙은 식별 번호를 가지고 있으며, 리포팅 프로그램에서 규칙을 구분하는데 사용 되기도 한다. (규칙 정보 :http://www.snort.org/snort-db )

 

설명

~99

예약되어 있음

100~1,000,000

www.snort.org에서 배포하는 규칙

1,000,001~

커스텀 규칙

 

rev

규칙의 버전 번호를 가리킨다. 오픈 소스 커뮤니티에서 만든 Snort 규칙은 false-positive를 줄이기 위해 개정 절차를 거치게 됨에 따라 rev의 값이 변한다.

 

-기타 규칙 옵션

 

규칙

내용

depth

패턴을 찾기 위해 검사할 바이트 수를 지정한다.

offset

검색을 시작할 패킷의 특정 위치를 지정한다.

nocase

대소문자를 구별하지 않는다.

session

프로토콜 세션의 평문 데이터를 화면에 출력한다. 값으로 all 또는 printable을 사용한다.

uricontent

content 문자열을 전체 패킷과 비교하는 대신 URI 부분과 비교하게 한다.

priority

classtype에서 설정된 우선순위를 수동으로 덮어쓴다.

logto

해당 규칙의 로그를 특정 파일에 남긴다.

tag

특정 규칙과 관련된 추가 패킷을 로그로 저장한다.

tag:<HOST/SESSION>,<HOW MANY>,<SECONDS/PACKETS>,<SRC/DES>;

dsize

패킷 페이로드의 길이 또는 길이 범위를 명시한다.

rpc

원격지에서 접근 가능한 RPC 서비스를 식별한다. 이 규칙을 제대로 사용하기 위해서는 UDP 프로토콜의 목적지 포트 111를 사용하는 규칙에 포함해야한다.

rpc:<APPLICATION>,<PROCEDURE>,<VERSION>;

resp

능동적으로 프로토콜 연결을 끊는다.

 

TCP 옵션

설명

rst_all

양측 연결을 끊는다.

rst_rcv

수신측 연결을 끊는다.

rst_send

송신측 연결을 끊는다.

 

 

ICMP 옵션

설명

strings:icmp_all

양측 연결을 끊는다.

icmp_host

ICMP host unreachable 메시지를 전송한다.

icmp_net

ICMP network unreachable 메시지를 전송한다.

icmp_port

ICMP port unreachable 메시지를 전송한다.

 

 


공격 우선 순위

 

심각한 공격 (우선 순위 1)

공격 분류

내용

attempted-admin

관리자 권한 획득 시도

attempted-user

일반 사용자 권한 획득 시도

shellcode-detect

실행 가능한 코드 탐지

successful-admin

관리자 권한 획득 성공

successful-user

일반 사용자 권한 획득 성공

trojan-activity

네트워크 트로이 목마 탐지

unsuccessful-user

일반 사용자 권한 획득 실패

web-application-attack

웹 애플리케이션 공격

 

 

중간 수준의 공격 (우선 순위 2)

공격 분류

내용

attempted-dos

DoS 시도

attempted-recon

정보 유출 시도

bad-unknown

잠재적인 악성 트래픽

denial-of-service

DoS 탐지

misc-attack

사소한(miscellaneous) 공격

non-standard-protocol

비표준 프로토콜 또는 이벤트

rpc-portmap-decode

RPC 쿼리 디코드

successful-dos

DoS 공격

successful-recon-largescale

대규모 정보 유출

successful-recon-limited

정보 유출

suspicious-filename-detect

수상한 파일 이름 탐지

suspicious-login

수상한 사용자 로그인 탐지

system-call-detect

시스템 콜 탐지

unusual-client-port-connection

클라이언트가 비정상적인 포트를 사용함

web-application-activity

잠재적으로 취약한 웹 애플리케이션 접근

 

 

위험도가 낮은 공격 (우선 순위 3)

공격 분류

내용

icmp-event

일반 ICMP 이벤트

misc-activity

사소한 행위

network-scan

네트워크 스캔

not-suspicious

의심스러운 트래픽이 아님

protocol-command-decode

일반적인 프로토콜 명령 디코드

string-detect

수상한 문자열 탐지

unknown

알 수 없음

 

 

Flow Control

-Flow Control 옵션은 패킷의 방향을 클라이언트 서버 통신 스트림과 관련해서 정의 할 수 있도록 한다. 이 옵션은 Snort의 TCP 재조합 모듈과 함께 동작하며 패킷 content와 방향을 클라이언트 서버 구조와 관련해서 파악할 수 있도록 한다.

 -Flow Control 옵션

 

옵션

내용

to_server

서버로 전송된 패킷에 대해 true를 리턴한다.

from_server

서버로부터 받은 패킷에 대해 true를 리턴한다.

to_client

클라이언트로 전송된 패킷에 대해 true를 리턴한다.

from_client

클라이언트로부터 받은 패킷에 대해 true를 리턴한다.

only_stream

재구성된 패킷 또는 연결이 맺어진 스트림에 속한 패킷에 의해서만 활성화된다.

no_stream

only_stream과 반대의 의미를 가진다.

established

연결이 수립된 TCP 연결 또는 세션에 속한패킷에 의해서만 활성화 된다.

stateless

상태와 관계없이 규칙을 활성화할 때 사용된다. stateless 옵션을 사용할 때는 “flow:” 접두사를 붙이지 않는다.

 

 

IP옵션

 

옵션

내용

sameip

출발지와 목적지 ip주소가 동일한 패킷을 찾는다.

fragbits

IP 헤더의 분할 비트와 예약 비트를 분석한다.

 

설명

D

분할하지 않음 (Don't Fragment)

M

분할 패킷이 남아있음 (More Fagments)

R

예약 비트 (Reserved Bit)

 

ipopts

패킷을 비교하기위해 IP옵션을 지정한다. 한 규칙에서 한 가지 IP옵션만 적용 가능하다.

 

설명

eol

IP목록의 마지막을 지정한다.

lsrr

느슨한 소스 라우팅 (loose source routing)

ssrr

엄격한 소스 라우팅 (strict source routing)

rr

라우트 기록 (Record route)

satid

IP 스트림 식별자

sec

IPSec

ts

타임스탬프

nop

옵션이 없음

 

ID

패킷의 정적 IP ID값을 검사한다.

tos

TOS (Type of Service) 값을 검사한다.

TTL

TTL(Time to Live) 값을 검사한다. >, <, = 연산자도 지원한다.

 

 

TCP옵션

 

옵션

내용

seq

패킷의 정적 TCP 순서번호를 검사한다.

flags

특정 플래그가 설정되어 있는지 설정되어 있지 않은지, 다른 플래그와 함께 사용되는지를 판단한다.

 

설명

A

ACK 플래그

F

FIN 플래그

P

PSH 플래그

R

RST 플래그

S

SYN 플래그

U

URG 플래그

0

아무 플래그도 설정 되어 있지 않음

1

예약 비트1

2

예약 비트2

+

특정 플래그가 켜져있고 그 밖에 다른 플래그도 켜져 있는지 검사한다. ex:) A+

*

명시된 플래그 중 하나의 플래그라도 일치하는지 검사한다. ex:) *AS

!

특정 플래그가 꺼져 있는지 검사한다.

 

ack

ack 값이 0인지 검사한다.

 

 

ICMP 옵션

 

옵션

내용

icmp_id

ICMP ID 값을 검사한다.

icmp_seq

ICMP Sequence 값을 검사한다.

icode

ICMP Code 값을 검사한다.

itype

ICMP type 값을 검사한다.

 

 

Snort 규칙 트리 구성 요소

-규칙 사슬 집합

 

규칙

설명

Activation

경고를 발생시키고 또 다른 dynamic 규칙을 활성화한다.

Dynamic

Activation 규칙에 의해 활성화 되며 트래픽을 로그로 저장한다.

Alert

경고를 발생시키고 패킷을 로그로 남긴다.

Pass

패킷을 무시한다.

Log

트래픽을 로그로 저장한다. (경고를 발생시키지 않는다. )

 

 

-Rule Tree Nodes(RTN)

규칙 사슬 각각에 대하여 프로토콜별 연결리스트가 존재하는데 프로토콜별 연결 리스트의 맨 상당 노드를 RTN이라고 부른다.

 

규칙

설명

TCP

TCP 프로토콜

UDP

UDP 프로토콜

ICMP

ICMP 프로토콜

IP

IP 프로토콜

 

 

-Option Tree Nodes(OTN)

프로토콜 연결리스트 안에는 OTN이라고 불리는 규칙 옵션이 존재한다.

 

규칙

설명

Content

Boyer-Moore 패턴 비교 알고리즘에서 검사하는 컨텐츠

Flow

탐지 플러그인으로의 링크

 

 

패킷 비교

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(msg:"WEB-IIS..\.. access"; flow:to_server,established; content : "|2e2e5c2e2e|"; reference: bugtraq,2218; reference:cve, CAN-199-0299; classtype:web-application-attack; sid:974; rev:6;)

 
 

 

 

 

과정

설명

규칙 헤더 검색

패킷이 탐지 엔진에 도착하면 Snort는 Activation, Dynamic, Alert, Pass, Log 순으로 규칙 헤더를 검색한다. 위 규칙의 출력 포맷은 Alert이기 때문에 Snort는 Activation과 Dynamic에서는 이 규칙을 찾지 못한다.

RTN 검색

그 다음에 Alert 사슬로 이동하는데 패킷을 비교하는 방법은 패킷의 프로토콜에 따라 다르다. TCP 노드 리스트에서는 IP와 Port 정보가 일치하는 규칙을 찾는다.

OTN 검사

일치하는 규칙을 찾았으면 그 RTN의 열을 따라가면서 각 OTN을 검사하여 일치하는 규칙을 찾는다.

옵션노드에는 탐지 플러그인을 가리키는 포인터와 문자열 검색 알고리즘을 사용하여 검사할 패턴이 존재한다.

※flow 플러그인은 패킷이 기존에 연결된 세션에 일치하는지를 검사한다.

패킷 내용 검색

규칙이 content 옵션을 포함하고 있을 경우 문자열 검색 알고리즘을 이용하여 패킷의 내용을 검색한다. content 옵션에는 2진, 텍스트, 그리고 2가지를 혼합한 형식의 데이터가 들어올 수 있다.

※Snort 2.0은 Aho-corasick, Wu-Manber, Boyer-Moore 세가지 패턴 매칭 알고리즘이 사용가능하다.

경고 발생

일치하는 규칙을 찾았으면 트리 구조를 빠져 나온 뒤 Alert 트리의 맨 꼭대기로 돌아와서 명시된 출력 포맷을 상용하여 경고를 발생시키고 모든 과정이 종료된다.

 

 

Pass 규칙

-특정 트래픽을 무시하고 싶은 경우 BPF 필터 언어를 사용하거나 Pass 규칙을 사용한다.

-Pass 규칙을 활성화 하려면 Snort 규칙 처리 순서를 변경해야하기 때문에 -o 옵션을 사용하여 규칙 처리 순서를 Pass, Activation, Dynamic, Alert, Log 순으로 바꾸어주어야 한다.

-Pass 규칙을 사용하는 경우 서명과 일치하는 모든 패킷은 무시한다.

※Pass 규칙은 모든 패킷을 통과시킬 우려가 있기 때문에 조심하여 사용해야 한다.

 

pass tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(flow:to_server,established; content:"|2e2e5c2e2e|";)

 

Log 규칙

-Log 규칙은 규칙과 일치하는 모든 패킷을 경고를 발생시키지 않고 단지 정의된 출력 포맷으로 로그로 저장하기 위해 사용된다.

※Log 규칙은 2진 모드로 실행된 Snort에서 제대로 동작하지 않는다.

 

log tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(flow:to_server,established; content:"|2e2e5c2e2e|";)

 

Dynamic, Activation 규칙

dynamic, Activation 규칙을 사용하면 패킷에 대한 경고를 발생시킨 뒤, 그 후에 따라오는 패킷들을 로그로 저장할 수 있다.

-activate 규칙의 activates 값과 dynamic 규칙의 activated_by 값이 두 규칙을 이어주는 역할을 한다.

 

EXTERNAL_NET에서 HTTP 서버로 향하는 트래픽 128개를 로그로 저장

activate tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(msg:"WEB-IIS ..\.. aceess";flow:to_server,established; activates:25;content : "|2e2e5c2e2e|"; reference:bugtraq,2218;reference:cve,CAN-199-0229;classtype:web-application-attack;sid:974;rev:6;)

dynamic tcp $EXTERNAL_NET any -< $HTTP_SERVERS $HTTP_PORTS

(activated_by:25; count:128;)