Snort Rule 본문
- 헤더
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 )
| ||||||||
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 | 능동적으로 프로토콜 연결을 끊는다.
|
공격 우선 순위
심각한 공격 (우선 순위 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 헤더의 분할 비트와 예약 비트를 분석한다.
| ||||||||||||||||||
ipopts | 패킷을 비교하기위해 IP옵션을 지정한다. 한 규칙에서 한 가지 IP옵션만 적용 가능하다.
| ||||||||||||||||||
ID | 패킷의 정적 IP ID값을 검사한다. | ||||||||||||||||||
tos | TOS (Type of Service) 값을 검사한다. | ||||||||||||||||||
TTL | TTL(Time to Live) 값을 검사한다. >, <, = 연산자도 지원한다. |
TCP옵션
옵션 | 내용 | ||||||||||||||||||||||||||
seq | 패킷의 정적 TCP 순서번호를 검사한다. | ||||||||||||||||||||||||||
flags | 특정 플래그가 설정되어 있는지 설정되어 있지 않은지, 다른 플래그와 함께 사용되는지를 판단한다.
| ||||||||||||||||||||||||||
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;) |
'Study > Etc' 카테고리의 다른 글
코딩 연습 사이트 CodinGame.com (0) | 2018.09.10 |
---|---|
SecurityOnion 설치 (0) | 2018.09.08 |
Suninatas System + Binary 11 (0) | 2018.09.06 |
스푸핑(Spoofing) 정리 (0) | 2018.08.28 |
스턱스넷 (Stuxnet) 요약 (0) | 2018.08.28 |