Snort 란 ?
Snort 는 1998년 Martin Roesch에 의해 개발된 오픈 소스 기반 IDPS ( Intrusion Detection Prevention System ) 입니다.
시그니처 기반 탐지 시스템으로서 패턴과 매칭이 될 경우 탐지되는 방식을 사용하는 시스템입니다.
현재까지도 침입 탐지 시스템 ( IDS ) 중 가장 널리 사용되고 있는 시스템입니다.
Snort 의 기능
Snort 는 아래 작성된 3가지 기능을 수행합니다.
- Sniffer : 네트워크 트래픽을 캡쳐하는 기능
- Packet Logger : 나중에 분석할 수 있도록 네트워크 트래픽을 파일에 기록하는 기능
- IDS / IPS : 네트워크 트래픽을 분석 후 침입 탐지 및 차단 기능
Snort 동작 구조
Snort 의 동작 구조는 Sniffer -> Preprocessor -> Detection Engine -> Alert / Log 로 이루어져 있습니다.
- Sniffer
- Snort IDS 를 통과한 패킷을 수집합니다.
- Preprocessor
- 효율적인 공격 탐지를 위해 Plug-in을 먼저 거쳐 매칭을 확입합니다.
- Detection Engine
- Snort Rule과 매칭이 되는지 확인합니다.
- Alert / Log
- Snort Rule 매칭 결과에 따라 경고나 로그등 출력을 하게됩니다.
Snort Rule Signature
Rule header | Option | ||||||
Action | Protocol | Source IP | Source Port | Direction | Destination IP | Destination Port | Option |
탐지 후 행동 | 프로토콜 | 출발 IP | 출발 PORT | 탐지 방향 | 목적지 IP | 목적지 PORT | 옵션 |
Snort Rule 은 크게 Rule header 와 Rule Option 으로 구분됩니다.
ex ) alert tcp any any -> any 80 (msg:"SQL injection";content:"'1'='1";nocase;sid:1000001;)
Rule Header
먼저 Rule header에 해당하는 내용을 먼저 살펴보도록 하겠습니다.
- Action : 패턴이 매칭이 되었을 경우 할 행동을 정의
명령어 | 기능 |
alert | 로그를 남기고 경고를 발생시킵니다. |
log | 해당 패킷을 기록합니다. |
pass | 해당 패킷을 무시합니다. |
active | alert 를 발생 시킨 후 대응하는 Dynamic 을 유효화합니다. |
reject | 패킷을 차단하고 기록 후 TCP Protocol 의 경우 TCP Reset UDP Protocol 의 경우 ICMP Port Unrechable 메세지를 전송합니다. |
drop | 상대방에게 응답하지 않고 패킷을 차단하고 기록합니다 |
sdrop | 기록을 남기지 않고 패킷을 차단합니다. |
- Protocol : 탐지 할 프로토콜의 종류를 정의합니다. ( 규칙을 작성할 때 소문자로 작성하여야 합니다. )
명령어 | 기능 |
TCP | TCP 프로토콜을 탐지합니다. |
UDP | UDP 프로토콜을 탐지합니다. |
ICMP | ICMP 프로토콜을 탐지합니다. |
IP | IP 프로토콜을 탐지합니다. |
Any | 모든 프로토콜을 탐지합니다. |
- Direction : 탐지할 방향을 정의
명령어 | 기능 |
-> | 출발지 -> 목적지로 가는 패킷을 탐지합니다. |
<> | 출발지 ~ 목적지 사이 모든 패킷을 탐지합니다. |
- Source IP & Port / Destination IP & Port : 출발지, 목적지 IP , Port 정의
명령어 | 기능 |
! ( 부정연산자 ) | 부정연산자 ( ! ) 를 IP 또는 Port 앞에 기입 할 경우 해당 IP 또는 Port 번호를 제외한 주소만 매칭합니다. |
Any | 모든 IP 또는 Port 를 의미합니다. |
포트번호 | 지정된 포트번호를 의미합니다. |
포트번호1:포트번호2 | 포트번호1 ~ 포트번호2 를 의미합니다 |
:포트번호 | 지정된 포트번호 이하 모든 포트를 의미합니다. |
포트번호: | 지정된 포트번호 이상 모든 포트를 의미합니다. |
※ 여러 IP 를 작성할 경우 쉼표 ( , ) 로 IP 주소 목록을 구분하고 구분된 IP 주소 목록을 대괄호를 이용해 표시합니다.
ex ) alert tcp ![111.111.111.0/24,192.168.1.0/24] any -> [111.111.111.0/24,192.168.1.0/24] 123
위 예시를 해석 할 경우 111.111.111.0/24 또는 192.168.1.0/24 를 제외하고 tcp 프로토콜을 사용해 목적지 123번
포트로 패킷이 들어올 경우 경고를 발생이라는 정책이 됩니다.
Rule Option
Rule Header 가 1차적인 정책을 설정한 것이라면 Rule Option이 실제로 악의적인 내용의 패킷을 탐지하는 영역입니다.
다르게 말하면 Rule Option은 탐지의 정확도를 향상시켜주는 옵션입니다.
Rule Option을 사용할 경우 모든 옵션은 세미콜론 ( ; ) 을 사용해 서로를 구분하고, 규칙 옵션 키워드는 콜론 ( : ) 을 사용해 인수와 구분합니다.
Rule Option은 크게 일반 옵션, Payload, HTTP 옵션, 흐름 옵션으로 구분됩니다.
- 일반 옵션 : 규칙에 대한 정보를 제공하는 옵션으로 매칭하는 동안 어떠한 영향도 미치지 않는 옵션
명령어 | 기능 | 예시 |
msg | Snort 규칙이 탐지될 경우 출력되는 메시지 | msg:“메시지 내용”; |
sid | Snort 규칙을 구별하는 식별자 0~1,000,000 번 까지는 예약된 식별자 1,000,001이상부터 사용 |
sid:1000001; |
rev | Snort 규칙의 수정 버전을 정의 수정할 경우 1씩 증가 |
rev:1; |
classtype | Snort 규칙을 분류하는 옵션 | clsstype:분류이름; |
priority | 우선 순위를 지정하는 옵션 1 ~ 10까지 수를 사용 ( 값이 작을수록 우선순위가 높음 ) |
priority:10; |
reference | 해당 규칙에 참고가 되는 URL을 지정하는 옵션 | Reference:래퍼런스명 http://…; |
- Payload : Payload는 Snort Rule에서 실질적으로 악성 패킷을 탐지하는 옵션
명령어 | 기능 | 예시 |
content | 패킷 데이터에서 매칭할 문자열을 지정하는 옵션 | content:”abc”; => abc 문자열을 탐지 |
nocase | Content 옵션 뒤에 작성하여 content 문자열을 대소문자 구분없이 탐지하도록 함 | content:”abc”;nocase; => Abc,ABC,aBc,abC 모두 탐지 |
offset | 패킷의 페이로드에서 매칭을 시작할 문자열의 위치를 지정하는 옵션 ( 지정한 바이트 만큼 떨어진 위치부터 탐색시작, 시작은 0Byte ) |
offset:3; => 4Byte부터 탐색을 시작 |
distance | content 옵션 값 매칭 후를 기준으로 지정된 패턴 탐색을 시작하기 전 무시해야 하는 패킷의 거리를 지정하는 옵션 | content:”abc”;content:”test”;distance:5; => abc 문자열 매칭 후 지점을 기준으로 5byte 이후 test 문자열 탐색 |
within | content 옵션 매칭 후 다음 지정된 탐색을 진행할 범위를 지정하는 옵션 | content:”abc”;content:”test”;within:5; => abc 문자열 매칭 후 지점을 기준으로 5Byte 이내에 test 문자열 탐색 |
- HTTP 옵션 : content 옵션 값이 탐색할 범위를 HTTP 영역으로 한정할 때 사용하는 옵션
명령어 | 기능 |
http_method | 패킷 페이로드 중 HTTP 메소드 영역에서 content 옵션 값을 매칭하는 옵션 |
http_uri / http_raw_uri | 패킷 페이로드 중 URI 영역을 탐색하는 옵션 raw가 포함된 옵션은 디코딩되지 않은 페이로드를 대상으로 탐색하는 옵션 |
http_cookie | http 쿠키 값을 탐색하는 옵션 |
http_header / http_raw_header | HTTP 헤더 영역을 요청과 응답에 관계없이 탐색하는 옵션 |
http_client_body | HTTP 바디 영역을 탐색하는 옵션 |
http_stat_code | HTTP 응답 메시지에서 상태 코드 영역을 탐색하는 옵션 |
http_stat_msg | HTTP 응답 메시지에서 상태 메세지 영역을 탐색하는 옵션 |
- 흐름 옵션 : 패턴을 매칭할 때 적용해야 하는 트래픽의 방향을 지정하는 옵션
명령어 | 기능 |
flow | 흐름 옵션을 사용할 때 반드시 사용해야 하는 옵션 |
to_client / from_server | Server -> Client 방향으로 오는 패킷을 매칭하는 옵션 |
to_server / from_client | Client -> Server 방향으로 오는 패킷을 매칭하는 옵션 |
Established | 세션이 성립된 상태의 패킷을 매칭하는 옵션 |
statless | 세션 성립 여부와 상관 없이 매칭하는 옵션 |
'리팩토링' 카테고리의 다른 글
악성코드 샘플 분석 실습3 (0) | 2023.10.09 |
---|---|
Snort 설치 및 설정 (1) | 2023.10.09 |
악성코드 샘플 분석 실습2 (0) | 2023.10.09 |
악성코드 샘플 분석 실습 (0) | 2023.10.09 |
샘플 분석 환경 구성 (0) | 2023.03.28 |