-규칙 헤더
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, established; content: "|31c031db31c9b046cd8031c031db|"; reference:bugtraq,1387; reference:cve,CAN-2000-0573; reference arachnids,287; classtype:attempted-admin; sid:344; rev: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;)
|