본문 바로가기

Information Security/Security Solution

Snort IDS (Intrusion Detection System)

반응형

* Snort IDS : Open-Source Network IDS

Snort IDS 주요 기능 설명
Sniffer - 네트워크 상 패킷을 스니핑 하여 보여주는 기능
Logger - 모니터링 한 패킷을 저장, 로그에 남기는 기능
Network IDS/IPS - 네트워크 트래픽을 분석하여 공격을 탐지/차단하는 기능

 

 

 

* Snort Rule Configuration

1) Snort Rule/Signature 구성

Snort Rule/Signature 구성 설명
Header - 처리할 패킷을 판단하는 기준 명시
Body - 패킷을 탐지하기 위한 규칙을 명시

2) Snort Rule Header Configuration

Header 구성 요소 설명
Rule Actions * 패킷이 Rule에 의해 매치되었을 때의 처리 방식 (총 8가지 유형)


1) alert : 선택한 alert 방식을 이용하여, alert 발생 및 패킷 로깅
- generate an alert using the selected alert method, and then log the packet


2) log : 패킷을 로깅
- log the packet


3) pass : 패킷을 무시
- ignore the packet


4) activate : alert를 발생시키고, 대응하는 dynamic rule을 활성화
- alert and then turn on another dynamic rule


5) dynamic : activate rule에 의해 활성화 되고, log rule과 동일하게 동작
- remain idle until activated by an activate rule, then act as a log rule


6) drop : 패킷을 차단하고 로깅
- block and log the packet


7) reject : 패킷을 차단하고 로깅하나, TCP의 경우 TCP Reset 전송/UDP의 경우 ICMP Port Unreachable 전송
- block the packet, log it, and then send a TCP reset if the protocol is TCP or an ICMP port Unreachable message f the protocol is UDP


8) sdrop : 패킷을 차단하나, 로그에 남기지 않음(silent)
- block the packet but do not log it
Protocols * 탐지할 프로토콜 지정


- TCP, UDP, ICMP, IP 지정 가능
IP Address * 출발지/목적지 IP에 대한 지정


- 단일IP, IP 대역(CIDR 표기), IP 리스트([대괄호]로 묶어 콤마(,) 구분자 사용) 지정 가능
ex) [192.168.10.20,192.168.10.30] 또는 [192.168.10.0/24,192.168.10.30]


- any로 지정할 경우 모든 IP를 의미


- 부정 연산자 ! (negation operator)를 이용하여 주소 표현 가능
ex) !192.168.10.1
Port Number * 출발지/목적지 Port에 대한 지정


- 단일 Port, 포트 범위(Range), Port list 지정 가능


- 포트 범위 지정 시, 콜론(:)을 이용하여 표시
ex) 1:1023


- 포트 리스트 지정 시
ex) [포트,포트,포트,...]
Direction Operator * 방향 지시자


-> : (단방향) 왼쪽에 출발지 정보, 오른쪽에 목적지 정보를 의미


<> : (양방향) 출발지와 목적지 사이에 오가는 모든 패킷을 의미


<- : 해당 방향 지시자는 없음

- 설정 예시

예제 1

  • alert 액션으로 아래와 일치하는 패킷 탐지 시, alert 발생 및 log를 남김
  • 프로토콜 정보 : TCP
  • 출발지 정보 : 모든 IP / 모든 Port
  • 목적지 정보 : 192.168.10.0/24 대역 / 80 Port

예제 2

  • log 액션으로 아래와 일치하는 패킷 탐지 시, log만 남김
  • 프로토콜 정보 : TCP
  • 출발지 정보 : $EXTERNAL_NET에 설정된 IP(snort.conf 설정 파일에 정의한 환경변수로 외부 네트워크를 의미, default any) / 모든 Port
  • 목적지 정보 : $HOME_NET에 설정된 IP(snort.conf 설정 파일에 정의한 환경변수로 내부 네트워크를 의미) / 80 Port

3) Snort Rule Body Configuration

3-1) Body 일반 옵션 설정

옵션 설명
msg * msg 옵션에 기록된 내용이 alert 발생 시, 이벤트의 이름으로 사용
reference * rule과 관련된 외부 취약점 정보 참조 시 사용
sid * snort rule id로 사용 범위는 아래 참조


- 99 이하 : 시스템에 예약된 sid


- 100 - 1,000,000 이하 : www.snort.org 에서 배포하는 ruleset에서 사용


- 1,000,001 이상 : 사용자 정의 rule sid
classtype * 사용자 이해 및 우선순위 결정을 위한 공격 유형과 기본 우선순위(위험도) 정의


- 우선순위 : 1(높음), 2(중간), 3(낮음)


- 공격 유형 ex) classtype:attempted-admin;
priority * rule의 우선순위(위험도)에 대해 숫자로 표기
(단, priority 지정 시, classtype의 기본 우선순위(위험도)를 덮어씀
rev * rule 버전번호로, 수정(revision) 횟수를 표기
(수정 시 마다 1씩 증가)

3-2) Body Payload/범위 관련 옵션 설정

Action 설명
content * Payload에서 검사할 문자열을 지정


- text 형식 : content:"pattern", 해당 patter 문자열 검사


- binary 형식 : content:"|FF FF|", 파이프 기호 사이에 Hex 값으로 표현


- !(부정연산자) 사용 : content:!"pattern", 해당 pattern 문자열이 없는지 검사


- ; \ " 앞의 3가지 특수문자는 escape 처리해서 사용 필요 (ex, \;)


- text와 binary 형식 혼합 사용 가능
ex) "|2f 65 74 63 2f|passwd";  (/etc/passwd 탐지 문자열)
uricontent * content 문자열을 전체 패킷과 비교하는 대신, HTTP 클라이언트 요청 URI 정보를 검사할 문자열 지정
offset * Payload에서 content 패턴을 검사할 시작 위치 지정
(단, Payload의 첫 번째 바이트 위치는 1이 아닌, 0부터 시작)


- (snort manual) The offset keyword allows the rule writer to specify where to start searching for a pattern within a packet
depth * offset 부터 몇 바이트까지 검사할 것인지 지정


- (snort manual) The depth keyword allows the rule writer to specify how far into a packet Snort should search for the specified pattern from a given offset.
distance * 이전 content 패턴에 매치된 경우, 매치된 이후 바이트부터 몇 바이트 떨어진 위치에서 다음 content를 검사할 것인지 지정


- (snort manual) The distance keyword allows the rule writer to specify how far into a packet Snort should ignore before starting to search for the specified pattern relative to the end of the previous pattern match
within * 이전 content 패턴에 매치된 경우, distance 부터 몇 바이트 범위 내에서 다음 content를 검사할 것인지 지정


- (snort manual) The within keyword is a content modifier that makes sure that at most N bytes are between pattern matches using the content keyword
nocase * Payload 검사 시, 대/소문자를 구분하지 않음 (바이너리 형식도 동일하게 구분하지 않음)

- offset, depth, distance, within 등 범위 지정 옵션 : 전체 페이로드 패턴 매칭보다 일부분 패턴 매칭이 성능 향상 및 오탐을 줄여줌 (과할 시, 미탐 발생 할 수 있으니 적절한 범위 설정 필요)

offset, depth 설정
distance, within 설정

3-3) Body Payload/정규표현식 옵션

- Snort의 경우 문자열 탐지 유연성을 위한 pcre(Perl Compatible Regular Expression) 옵션을 지원하며, 슬래시(/) 기호 사이에 정규 표현식을 입력 (ex. "/ ~~~~~ \/";)

정규표현식(Regular Expression) : 일정 규칙을 가지는 문자열을 표현하는 방식

정규표현식
관련 메타문자
설명
\ * 특수문자의 기능을 제거하는 이스케이프 문자
ex) \^, \$ 등
^ * ^ 다음에 오는 문자가 문자열의 시작을 의미
ex) pcre:"/^ ~~~~ \/";
$ * $ 바로 앞에 있는 문자가 문자열의 끝을 의미
. * 임의 문자 1개를 의미
[ ] * 집합 안에 지정한 문자들 중 하나와 일치
ex) [abc] : a, b, c 문자 중 하나
ex) [a-zA-Z] : a에서 z사이 또는 A에서 Z사이 문자 중 하나
ex) [0-9] : 0에서 9사이의 문자 중 하나
[^] * 집합 안에 지정한 문자들을 제외한 임의 문자 하나와 일치
ex) [^0-9] : 숫자를 제외한 임의의 문자 탐지
| * | 앞에오는 문자열과 뒤에오는 문자열 중 하나와 일치
- 보통 항목들을 묶어주는 ()와 함께 사용
ex) (GET|POST) : GET, POST 문자열 중 하나
정규표현식
관련 수량자
설명
* * 앞에 오는 문자가 0회 이상 나타남
ex) He*llo : Hllo(O), Hello(O), Heello(O), Hallo(X), ello(X)
- 보통 첫 탐지 시, 문자열 개행 구문 탐지로 사용하기도 함 : "/^[\s\r\n]*
+ * 앞에 오는 문자가 1회 이상 나타남
? * 앞에 오는 문자가 0회 또는 1회 나타남
{x} * {x} 앞에 오는 문자가 정확히 x회 나타남
ex) He{3}llo : Heeello(O), Hello(X)...
{x,} * {x,} 앞에 오는 문자가 x회 이상 나타남
ex) He{3,}llo : Heeello(O), Hello(X), Heeeello(O)...
{x,y} * {x,y} 앞에 오는 문자가 정확히 x회 이상, y회 이하 나타남

3-4) Body Payload/HTTP 관련 옵션

- Snort에서 HTTP 패킷 전체가 아닌, 특정 필드에서 패턴을 검사하는 기능을 지원
(아래 옵션 중 raw가 붙은 옵션은 URL 디코딩을 하지 않은 상태로 검사함을 의미)

옵션 설명 (content 옵션값과 함께 사용 및 content 값에 일치 하는 패킷 탐지)
http_method * HTTP method 부분을 검사
ex) GET /index.php HTTP/1.1
http_uri
(http_raw_uri)
* HTTP URI 부분을 검사
ex) GET /index.php HTTP/1.1
http_header
(http_raw_header)
* HTTP Header 부분을 검사, 요청(request)/응답(response) 헤더에 모두 사용
http_cookie
(http_raw_cookie)
* HTTP Cookie 부분을 검사
http_client_body * HTTP Client Request의 Body 부분을 검사 (POST 요청에 대한 검사)
http_stat_code * HTTP 응답 Status_code 부분을 검사
ex) HTTP/1.1 200 OK
http_stat_msg * HTTP 응답 Status_message 부분을 검사
ex) HTTP/1.1 200 OK

3-5) Body Event Threshold(이벤트 제한) 옵션

- 특정 시간동안 발생되는 이벤트 수를 제한하는 옵션

threshold type <limit|threshold|both>, track <by_src|by_dst>, count <c>, seconds <s>
type * limit : 매 s초 동안 c번째 이벤트까지 action을 수행
ex) threshold type limit, track by_src, count 2, seconds 10 : 출발지 IP 기준으로 매 10초 동안 2번째 이벤트까지 action을 수행


* threshold : 매 s초 동안 c번째 이벤트마다 action을 수행
ex) threshold type threshold, track by_src, count 10, seconds 5 : 출발지 IP 기준으로 매 5초 동안 10번째 이벤트 마다 action을 수행


* both : 매 s초 동안 c번째 이벤트 시 한번 action을 수행
ex) threshold type both, track by_src, count 10, seconds 1 : 출발지 IP 기준으로 매 1초 동안 10번째 이벤트 시 한번 action을 수행 => 즉, 1초 동안 10번 이상 이벤트가 발생하면 action을 수행
track by_src : 출발지 IP 기준 추적


by_dst : 목적지 IP 기준 추적

 

 

 

* 공격 패킷 탐지 Snort Rule Set 예시

1) FTP 관련 이벤트 탐지

FTP 이벤트 분류 내용 및 Snort Rule Set
root 로그인 * FTP 로그인 시, USER 명령을 통한 ID를 평문으로 전송하는 부분을 Content로 탐지


alert tcp any any -> any 21 (msg: "FTP root user access"; content:"USER root"; nocase; sid:100100;)
FTP Brute Force,
Dictionary Attack
* 스캔성 공격 특성상 임계치 설정을 통해 탐지할 수 있으며, FTP 서버의 Login incorrect 문자열을 탐지하는 방식으로 운용 가능
- 아래는 목적지 주소 기준으로 매 30초 동안 5번째 이벤트 마다, alert 액션 수행하도록 설정


alert tcp any 21 -> any any (msg: "FTP login brute force attack"; content:"Login incorrect"; nocase; threshold:type threshold; track by_dst, count 5, seconds 30; sid:1000101;)
FTP anonymous 로그인 * FTP 익명 계정에 대한 접근 탐지
- USER anonymous 문자열에 대한 탐지와, 문자열 이후, 개행이 있으며, 통상 20byte 내로 탐지할 수 있기때문에 범위를 좁혀 운용


alert tcp any any -> any any (msg"FTP anonymous Attempt"; content:"USER anonymous|0d 0a|"; nocase; offset:0; depth:20;)
FTP 특정 명령어 입력 * FTP의 경우 비밀번호 입력(PASS), Passive Mode 동작(PASV), 파일 복사본 전송(RETR), 데이터 입력 및 서버 측 파일로 저장(STOR) 등의 Critical한 행위를 사전에 로그로 남겨 놓을 수 있어야 하며 아래 정도의 Rule을 설정하여, 침해 행위에 대한 추가 판단을 위해 운용 가능


alert tcp any any -> any any (msg"FTP PASS"; content:PASS "; nocase;)
alert tcp any any -> any any (msg"FTP PASV"; content:PASV "; nocase;) 
alert tcp any any -> any any (msg"FTP GET"; content:RETR "; nocase;) 
alert tcp any any -> any any (msg"FTP PUT"; content:STOR "; nocase;) 

2) Telnet 관련 이벤트 탐지

Telnet 이벤트 분류 내용 및 Snort Rule Set
root 로그인 성공 탐지 * 텔넷 로그인 성공 시, 서버의 응답 데이터로 login 문자열 및 쉘 프롬프트(ex. root@~~ 등) 정보가 전달


alert tcp any 23 -> any any (msg:Telnet root login success"; content:"login"; pcre:"/root@.*#"; nocase; sid:100110;)
- 해당 문자열 탐지 시, pcre 정규표현식을 통해 "root@" 문자열 다음에 임의 문자(.)가 0개 이상(*) 포함되며, 이후 #을 포함하는 문자열 검사
telnet 로그인
BruteForce/Dictonary Attack
* 23번 포트 대상 Login incorrect 문자열을 임계치 기반으로 설정하여 서버 응답값을 탐지하도록 운용


alert tcp any 23 -> any any (msg:Telnet login brute Force"; content:"Login incorrect"; nocase; threshold:type limit, track by_dst, count 1, seconds 5; sid:100120;)
Reverse Telnet * 외부 요청은 대부분 방화벽에서 필터링이 가능하지만, 내부에서 외부로 연결하는 요청의 경우 누락될 수 있으니, Reverse Telnet 룰로 탐지 운용


alert tcp any any -> any any (msg:Reverse Telnet"; pcre:"/telnet \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,5}/";}
- reverse telnet의 경우 raw Data 내 ip.ip.ip.ip 포트번호 를 탐지하는 것으로 확인 가능하므로, pcre 정규표현식을 통해 \d(문자 부류 [0-9]) 지정 및 {x,y}를 통해 반드시 x자리 이상, y자리 이하의 문자(IP 및 Port 최대 자리수) 탐지 설정

3) SSH 관련 이벤트 탐지

SSH 이벤트 분류 내용 및 Snort Rule Set
SSH 로그인
BruteForce/Dictonary Attack
* SSH 기본 포트는 22이지만, 변경해서 사용할 수 있으므로, 범위를 확장하여 운용
(단, 전체 포트 지정 시, 광범위한 탐지가 될 수 있으니 주의)


alert tcp any any -> any any (msg:"SSH login bruteForce"; content:"SSH-2.0"; nocase; threshold:type both, track by_src, count 5, seconds 30; sid:1000150;

4) Flooding 계열 공격 탐지

Flooding 계열 이벤트 분류 내용 및 Snort Rule Set
HTTP GET Flooding * HTTP GET 요청에서 HTTP 버전 1.0 및 1.1을 모두 탐지하며 임계치를 설정하여 운용


alert tcp any any -> any 80 (msg:"HTTP GET Flooding"; content:"GET / HTTP1."; depth:13; nocase; threshold:type threshold, track by_src, count 100, seconds 1; sid:1000160;)
TCP SYN Flooding * TCP Syn flag 한정하여, 임계치 기반 탐지 운용


alert tcp any any -> any any (msg:"TCP SYN Flooding"; flags:S; threshold:type threshold, track by_src, count 5, seconds 1; sid:1000170;)
UDP/ICMP Flooding * Protocol 설정과 임계치 기반 설정을 통해 탐지 운용


alert udp any any -> any any (msg:"UDP Flooding attack"; threshold:type threshold, track by_src, count 5, seconds 1; sid:1000180;)


alert icmp any any -> any any (msg:"ICMP Flooding attack:; threshold:type threshold, track by_src, count 5, seconds 1; sid:1000190;)

 

 

 

* 비정상 패킷 탐지 : RFC(Request For Command) 문서에 정의된 프로토콜 표준에 위배되는 패킷으로, 공격자가 IDS/IPS/FW 등의 보안 장비를 우회 또는, 시스템 장애나 오류를 유발하기 위한 목적으로 이용

비정상 패킷 내용
Web 구간 사설 IP * 예약 사설 IP를 제외하고, Web에서 볼 수 없는 IP주소로, 조작된 주소가 대부분이며 탐지/차단을 수행


* 사설 IP 대역
- 10.0.0.0 ~ 10.255.255.255(10.0.0.0/8)
- 172.16.0.0 ~ 172.31.255.255(172.16.0.0/12)
- 192.168.0.0 ~ 192.168.255.255(192.168.0.0/16)


* Snort Rule 기반 탐지
alert ip 10.0.0.0/8 any -> $HOME_NET any (msg:"Private IP(10.) Detect"; sid:100200;)
- 하부 다른 사설 IP 대역도 동일한 방식으로 생성
출발지<->목적지 동일 IP * Land Attack의 경우 시스템 장애 유발이 가능하므로, 탐지/차단
alert ip any any -> $HOME_NET any (msg:"Land Attack(SRC/DST SameIP) Detect"; sameip; sid:100230;)


* sameip 옵션
- 출발지/목적지 IP가 동일한지 탐지하는 목적의 옵션
비정상 TCP 패킷 * 보통의 정상 TCP 플래그 조합 유형(RFC 793)
- SYN, SYN_ACK, ACK는 정상 3-Way Handshake (TCP 연결)


- 초기 SYN 패킷을 제외하고, 연결을 맺은 모든 패킷들의 경우 ACK 플래그가 설정됨


- FIN_ACK, ACK는 정상 4-Way Handshake (TCP 연결 종료)


- RST_ACK (연결 즉시 종료)


- 연결 후, 송수신되는 패킷들은 Default로 ACK 플래그를 포함하며, 필요시 PSH, URG 포함 가능
* SYN_FIN 플래그 조합 비정상 TCP Packet
- SYN과 FIN은 동시에 설정될 수 없는 플래그로, 일부 구형 보안 솔루션에서 허용 및 로깅하지 않는 경우가 존재함


* Snort Rule 기반 탐지
alert tcp any any -> any any (msg:"SYN_FIN Scan Detect"; flags:SF; sid:100240;)


* Snort flags 옵션 분류
ex) flags:SF
- 연산자 없으므로, SYN, FIN만 설정된 경우 탐지


ex) flags:SF+
- + 연산자의 경우, 지정 플래그를 반드시 포함하며, 다른 플래그도 설정될 수 있음


ex) flags:SF*
- * 연산자의 경우, 지정 플래그를 하나 이상 포함하며, 다른 플래그도 설정될 수 있음


ex) flags:!SF
- * 지정 플래그를 포함하지 않는 설정
* SYN_FIN 플래그 변형 비정상 TCP Packet
- SYN, FIN 플래그만 설정 될 시, 탐지 될 수 있으므로, 이를 우회하기 위해 추가 플래그 조합을 설정


* Snort Rule 기반 탐지
alert tcp any any -> any any (msg:"SYN_FIN+ Scan Detect"; flags:SF+; sid:100250;)
* FIN 플래그만 설정된 비정상 TCP Packet
- 정상 종료(FIN_ACK 플래그 조합)가 아닌, FIN만 설정하여 스텔스(Stealth) 스캐닝으로 활용하는 경우 탐지


* Snort Rule 기반 탐지
alert tcp any any -> any any (msg:"FIN Scan Detect"; flags:F; sid:100260;)
* TCP NULL Packet(플래그가 설정되지 않은 비정상 패킷)
- Stealth 스캐닝으로 활용하는 경우로 탐지


* Snort Rule 기반 탐지
alert tcp any any -> any any (msg:"Null Scan Detect"; flags:!UAPRSF; sid:100270;)

 

반응형