Snort
Snort는 Open Source형 IPS (Intrusion Prevention System)이자, IDS (Intrusion Detection System)이다.
악성 네트워크 활동을 정의하는 규칙 기반 언어 (rule-based language)로, 1) 일치하는 네트워크 패킷을 탐지하고 2) 사용자에게 경고를 전송한다.
Snort는 또한 해당 패킷들을 정지하기 위해 3) 그때마다 처리하도록 배포("deployed inline")될 수 있다.
주요 기능
Snort의 주된 사용처는 세 가지이다.
- tcpdump 같은 packet sniffer
- 네트워크 트래픽 디버깅에 유용한 packet logger
- 완전히 발달된 IDS, IPS
동작 구조
- Sniffer
- Snort IDS를 통과한 패킷을 수집한다.
- Preprocessor
- 효율적인 공격 탐지를 위해 plugin을 거쳐 매칭을 확인한다.
- Detec Engine
- Snort Rule과 매칭 여부를 확인한다.
- 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 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~2999999 : 예약됨, 3000000~ : 사용 가능함) |
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의 상태 메시지 부분 값 패턴 매칭 |
참고 출처
'리팩토링' 카테고리의 다른 글
리팩토링 18주차. 악성코드 샘플 수집 및 분석 (0) | 2024.11.11 |
---|---|
Signature 란? (0) | 2024.11.05 |
리팩토링 16주차. 악성코드 분석 보고서 작성 (0) | 2024.10.31 |
리팩토링 15주차. 악성코드 분석 실습(2) (1) | 2024.10.23 |
리팩토링 14주차. 악성코드 분석 실습 (1) | 2024.10.10 |