* 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 | * 방향 지시자 -> : (단방향) 왼쪽에 출발지 정보, 오른쪽에 목적지 정보를 의미 <> : (양방향) 출발지와 목적지 사이에 오가는 모든 패킷을 의미 <- : 해당 방향 지시자는 없음 |
- 설정 예시
- alert 액션으로 아래와 일치하는 패킷 탐지 시, alert 발생 및 log를 남김
- 프로토콜 정보 : TCP
- 출발지 정보 : 모든 IP / 모든 Port
- 목적지 정보 : 192.168.10.0/24 대역 / 80 Port
- 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 등 범위 지정 옵션 : 전체 페이로드 패턴 매칭보다 일부분 패턴 매칭이 성능 향상 및 오탐을 줄여줌 (과할 시, 미탐 발생 할 수 있으니 적절한 범위 설정 필요)
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;) |
'Information Security > Security Solution' 카테고리의 다른 글
FDS (Fraud Detection System) (0) | 2021.02.08 |
---|---|
FIDO (Fast Identity Online) (0) | 2021.01.14 |
OAUTH (Open Authorization) (0) | 2021.01.14 |
SSO(Single Sign On) / EAM(Enterprise/Extranet Access Management) / IAM(Identity Access Management) (0) | 2021.01.14 |
Kerberos (0) | 2021.01.14 |