안녕하세요 !
이번 게시글은 스노트 구문에 대해서 글을 써보려고 합니다.
바로 글을 써보도록 하겠습니다.
액션의 종류
Action | 설명 |
alert | 선택한 alert 방식을 이용해서 alert를 발생시키고 패킷을 로그에 남긴다. |
log | 패킷을 로그에 남긴다. |
pass | 패킷을 무시한다. |
activate | alert를 발생시키고 대응하는 dynamic rule 을 활성화한다. |
dynamic | activate rule 에 의해 활성화 되며 log rule 과 동일하게 작동한다. |
drop | 패킷을 차단하고 로그를 남긴다. |
rejction | 패킷을 차단하고 로그를 남긴 후 TCP일 경우 TCP Reset 전송, UDP 일 경우 ICMP Port Unreachable 전송한다. |
sdrop | 패킷을 차단하지만 로그를 남기지 않는다. |
Protocols : 탐지할 프로토코콜을 나타낸다. 총 4가지 프로토콜을 지원한다. ( TCP, UDP, ICMP, IP )
IP Address : 출발지 / 목적지 IP
* Snort conf 에 정의되어있는 IP 변수
- $ EXTERNAL_NET : 외부 IP 변수
- $ HOME _ NET : 내부 IP 변수
- $HTTP_SERVERS : 웹 서버 IP 변수
- $ DNS _ SERVERS : DNS 서버 IP 변수
- $SMTP_SERVERS : SMTP 메일 서버 IP 변수
- $SSH _ SERVERS : SSH 프로토콜을 사용하는 장비 IP 변수
Port Numbers : 출발지 / 목적지 Port
EX 1) 1 : 1023 : 1부터 1023 사이의 포트
EX 2) 1023 : 1023 이하의 포트 ( 1023 포함 )
EX 3) 1 : 1이상의 포트 ( 1포함 )
EX 4 ) [1, 2, 3, 4] : 1, 2, 3, 4 포트
EX 5 ) any
Direction Operator : 방향 지시자
-> 단방향
< > 양방향
룰 바디 : 기본 옵션
옵션 | 설명 |
msg | msg 옵션에 기록된 내용이 alert 발생 시 이벤트 이름으로 사용된다. |
reference | rule과 관련된 외부 취약점 정보 참조 시 사용한다. |
sid | snort rule id로 사용되는 범위는 다음과 같음 99 이하 : 시스템 예약 sid 100 ~ 1000000 : snort에서 배포하는 룰셋에 사용되는 sid |
classtype | snort는 사용자가 어떤 유형의 공격인지 쉽게 이해하고 우선순위를 결정할 수 있도록 공격 유형이랑 기본 우선순위(위험도)를 정의해둠 · 우선순위 : 1(높음), 2(중간), 3(낮음) |
priority | ule의 우선순위(위험도)를 숫자로 표기 · priority를 지정 시 classtype의 기본 우선순위(위험도)를 덮어쓸 수 있음 |
rev | rule 버전번호로 수정(revision) 횟수를 표기한다. · 수정 시 1씩 증가시켜주어야함 |
룰 바디 : 페이로드 / 범위 관련 옵션
옵션 | 설명 |
content | 페이로드에서 검사할 문자열을 지정한다. content 는 text 형식일 수도 있다. 바이너리 형식일 수도 있고 2개가 복합된 형식일 수 있다. text 형식 : content "pattern", 해당 pattern 검사 binary 형식 :content "|FF FF|", 파이프 기호 사이에 헥사값으로 표현한다. ! 사용 : ! 문자는 부정연산자임 content !"pattern", 해당 pattern 문자열이 없는지 검사한다. \ " 3가지 특수문자는 escape 처리해서 사용한다. " |
uriconternt | content 문자열을 전체 패킷과 비교하는 대신 HTTP 클라이언트 요청 URI 정보를 검사할 문자열을 지정하였다. |
offset | 페이로드에서 CONTENT 패턴을 검사할 시작 위치 페이로드의 첫 번쨰 바이트 위치가 0부터 시작한다. |
depth | offset 부터 몇 바이트까지 검사할 것인지를 지정한다. |
distance | 이전 content 패턴에 매치된 경우 매치된 이후 바이트로부터 몇 바이트 떨어진 위치에서 다음 content 를 검사할 것인지를 지정한다. |
within | 이전 content 패턴에 매치된 경우 distance 부터 몇 바이트 범위 내에서 다음 content 를 검사할 것인지를 지정한다. |
nocase | 대소문자를 구분하지 않는다. |
pcre | 스노트는 펄 호환 정규표현식인 PCRE를 지원한다. |
룰 바디 : 페이로드 HTTP 관련 옵션
http_method | HTTP 요청 메서드를 탐지하는 옵션입니다. GET, POST, PUT 등 특정 HTTP 메서드를 탐지할 수 있습니다. |
http_uri | HTTP 요청 URI를 필터링하는 옵션입니다. 클라이언트가 요청한 URL 경로를 탐지할 때 사용됩니다. |
http_client_body | HTTP 요청의 본문 데이터를 필터링하는 옵션입니다. 주로 POST 요청의 페이로드를 분석할 때 사용됩니다. |
http_cookie | HTTP 쿠키 값을 탐지하는 옵션입니다. 쿠키 값을 기반으로 HTTP 트래픽을 탐지할 수 있습니다. |
http_raw_uri | HTTP URI의 인코딩되지 않은(raw) 값을 기반으로 탐지하는 옵션입니다. |
http_header | HTTP 헤더 정보를 탐지하는 옵션입니다. 주로 User-Agent나 Host 등의 헤더 값을 분석할 때 사용됩니다. |
http_stat_code | HTTP 응답 상태 코드를 필터링하는 옵션입니다. 예: 200, 404 등 특정 응답 코드를 탐지할 수 있습니다. |
http_stat_msg | HTTP 응답 상태 메시지를 필터링하는 옵션입니다. 예: OK, Not Found 등의 메시지를 탐지할 수 있습니다. |
http_raw_header | 인코딩되지 않은(raw) HTTP 헤더 값을 분석할 때 사용하는 옵션입니다. |
http_user_agent | HTTP 요청의 User-Agent 헤더 값을 기반으로 특정 브라우저나 클라이언트 트래픽을 탐지할 수 있습니다. |
예시
alert tcp any any -> 192.168.1.0/24 80 (msg:"Possible Web Exploit"; content:"GET"; http_method; sid:1000001; rev:1;)
구문 분석
- alert: 룰의 동작을 정의합니다. 이 예시에서는 'alert'로 설정되어 있어 탐지된 이벤트가 경고로 표시됩니다.
- tcp: 이 룰이 TCP 프로토콜에 적용된다는 의미입니다. 다른 프로토콜로는 UDP, ICMP 등이 있을 수 있습니다.
- any any: 트래픽의 출발지 IP와 포트를 의미합니다. 여기서는 출발지 IP와 포트에 대해 'any'(모든 것)를 지정한 것입니다.
- ->: 트래픽의 방향을 나타냅니다. 이 룰은 출발지에서 목적지로 가는 트래픽을 탐지합니다.
- 192.168.1.0/24 80: 목적지 IP와 포트를 의미합니다. 이 경우, 목적지 IP는 192.168.1.0/24 서브넷 범위, 포트는 80번(HTTP)입니다.
- (msg:"Possible Web Exploit": 탐지될 경우 경고 메시지로 표시될 텍스트입니다. 이 메시지는 로그에서 확인할 수 있습니다.
- content:"GET": 탐지할 트래픽 내용입니다. 여기서는 HTTP 요청에서 "GET" 문자열을 찾습니다.
- http_method: HTTP 메소드(GET, POST 등)를 탐지하는 옵션입니다.
- sid:1000001: 룰의 고유 식별자입니다. 사용자가 직접 설정할 수 있으며, 충돌을 방지하기 위해 유일해야 합니다.
- rev:1: 룰의 버전을 의미합니다. 이 룰이 업데이트될 경우 이 값을 증가시켜 관리할 수 있습니다.
주요 옵션 설명
- msg: 룰이 탐지되었을 때 표시되는 메시지입니다.
- content: 특정 패턴이 포함된 트래픽을 탐지하는 옵션으로, 문자열이나 바이트 패턴을 사용할 수 있습니다.
- sid: Snort 룰의 고유한 식별자입니다. 커스텀 룰을 만들 때는 1000000 이상의 값을 사용합니다.
- rev: 룰의 버전 관리용 필드입니다. 같은 룰에 대해 업데이트가 있을 때마다 증가시킵니다.
- http_method: HTTP 요청에서 메소드를 필터링할 때 사용합니다.
끝