본문 바로가기

보안/study

Snort

Snort란?  '마틴 로시' 가 1998년에 개발하였다. (Sniffing and More) . 스노트는 현재 마틴 로시가 창립자이자 개발자인 Sourcefire에 의해 개발되고 있으며, 2013년 이후로 시스코 시스템즈가 소유중이다.

패킷 스니핑 기능 + 패킷 로깅 기능 + IDS/IPS 기능 

1. Snort 구조

(1) 헤더 : 처리할 패킷을 판단하는 기준  [ RuleAtion Protocol IP Port -> or <> IP Port]

Rule Action

Action 설명
alert 탐지시 alert 하고 패킷을 로깅함
log 탐지시 패킷을 로깅함
pass 무시 (룰 임시 disable 용도로 쓰임)
activate alert 발생하고 대응하는 dynamic 룰 활성화시킴
dynamic activate rule에 의해 활성화 되고, 패킷을 로깅함(cf alert 와 무엇이 다른가? 
drop 패킷 차단, 로깅
reject 패킷 차단, 로깅, TCP -> TCP reset 전송, UDP -> ICMP Port unrecheable 전송
sdrop (silent+drop) 패킷 차단, 로깅 남기지 않음

Protocol : 탐지할 프로토콜 종류로 4가지 프로토콜 지원함 (TCP, UDP, ICMP, IP) 

IP Address : 출발지/목적지 IP

  • IP 리스트 지정 : [IP1,IP2,IP3,...]
  • IP 대역 표기(CIDR), !(부정연산자) 사용 가능
  • snort.conf 파일에 정의되어있는 환경변수 사용
</etc/snort.conf 예시>
var HOME_NET 192.168.200.0/24     

var EXTERNAL_NET any   

Port : 출발지/목적지 Port

  • 포트 범위 지정 : 1:1023 - 1~1023 까지의 포트, :1023 - 1023 이하의 포트, 1023: - 1023 이상의 포트
  • port 리스트 지정 : [port1, port2,port3,....)

⑤ 방향 지시자 : 

  • -> (단방향) : 방향지시자 기준 왼쪽이 출발지, 오른쪽이 목적지이다. (<- 지시자는 없다)
  • <> (양방향) : 출발지와 목적지 사이에 오가는 모든 패킷

 

(2) 바디(옵션) : 패킷을 탐지하기 위한 규칙

기본 옵션

옵션 설명
msg 이벤트 이름. 탐지시 alert 되는 문자열
reference rule과 관련된 취약점 정보 참조(CVE ID)
sid snort rule id
- ~99 : 시스템에 예약된 sid
- 100 ~ 1,000,000 : snort에서 배포하는 룰셋에서 사용되는 sid
- 1,000,001 ~ : 사용자 정의 룰 sid
classtye snort 에서 공격 유형과 기본 우선순위(위험도) 정의
우선순위 : 1(높음), 2(중간), 3(낮음)
priority 룰의 우선순위(위험도) 숫자로 표기. priority classtype 둘 다 옵션에 존재할 시 priority 기준을 우선시 함
rev revision. 룰 버전 번호로 수정할 떄마다 1씩 증가함.

② 페이로드 옵션

옵션 설명 예시
content - 페이로드에서 검사할 문자열 지정
- ; \ " 3가지 특수문자는 escape 처리하여 사용
content: "text", content: "|FF FF|"
content: "|FF|text|FF|" , content : !"text"
content: "\"text"
uricontent HTTP 클라이언트 요청 URI 정보를 검사할 문자열을 지정  
offset 페이로드에서 content를 검사할 시작 위치 (첫 바이트가 0) 문자열 : abcdefghijkl
(msg: "test offset1"; content: "bc"; offset:"1"; depth:"2"; nocase; sid:1000001)
depth offset으로 부터 몇 바이트 검사할 것인지 지정
dsize 버퍼오버플로우 탐지 가능
<> 한계치(숫자)
 
distance 이전 content 가 매치된 경우, 매치된 이후 바이트로부터 몇바이트 떨어진 위치 다음 content를 검사할 것인지 문자열 : abcdefghijkl
(msg: "test offset2"; content: "bc"; offset:"1"; depth:"2"; content:"gh"; distance:"3"; within:"2" nocase; sid:1000002)

within 이전 content가 매치된 경우 distance다음 몇 바이트 검사할 것인지 지정
nocase 대소문자 구별하지 않음(text,binary)
pcre perl 기반 정규표현식 문법
pcre옵션은 슬래시(/) 기호안에 정규표현식을 입력한다.
pcre 사용법 : https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions
pcre: "/ /"

③ HTTP 관련 옵션

옵션 설명 (content 옵션과 함께 사용)  
http_method HTTP method 부분 검사 GET, POST
http_uri HTTP uri 부분 검사 GET /index.html HTTP/1.1
http_header HTTP Header 부분 검사
요청/응답 헤더에 모두 사용
 
http_cookie HTTP Cookie 부분 검사  
http_client_body HTTP 클라이언트 요청의 Body 부분 검사(Post 요청에 대한 검사)  
http_stat_code HTTP 응답의 status_code 부분 검사 HTTP/1.1 404 Not found
http_stat_msg HTTP 응답의 status_msg 부분 검사 HTTP/1.1 404 Not found

④ 임계치 관련 옵션 : [ threshold type <limit|threshold|both>, track <by_src|by_dst>, count <n> , seconds <m> ]

    예시
type limit : 매 m초동안 n번째 이벤트 까지 action 이벤트 : 10초에 100건 발생
threshold type limit, track by_src, count 10 , seconds 10 -> 10초동안 처음 발생한 패킷부터 10개(1~10)
threshold : 매 m초동안 n번째 이벤트 마다 action 이벤트 : 10초에 100건 발생
threshold type threshole, track by_src, count 10 , seconds 10 -> 10초동안 10의 배수마다 10개(10,20,30~100)
both : 매 m초동안 n번째 이벤트 시 1번 action 이벤트 : 10초에 100건 발생
threshold type both, track by_src, count 10 , seconds 10 -> 10초동안 10번째 이벤트 1개 (10)
track by_src 출발지 IP 기준으로 탐지
by_dst 목적지 IP 기준으로 탐

⑤ byte 관련 옵션 

byte_test  : 특정 위치의 값을 비교/확인 하는데 사용

[byte_test:<bytes to convert>,[!]<operator>,<value>,<offset>[,relative][,<endian>][,<number type>,string];]

 

⑥ flow 옵션

flow: to_server established;

- to_server , from_client : 클라이언트 -> 서버

- to_client , from_server : 서버 -> 클라이언트

- to_server. established; : 클라이언트 -> 서버 세션 연결 패킷 매칭