스노트(Snort)
스노트는 무엇인가?
스노트(Snort)
- 1998년 마틴 로쉬가 오픈소스로 개발
- 시그니처 기반 네트워크 침입 탐지 시스템
- 작동 방식: Sniffer Mode, Packet Logging Mode, NIDS Mode
스노트 동작
- 스니퍼: 네트워크 패킷 수집
- 패킷 디코더: 전처리기와 탐지 엔진이 파싱 할 수 있도록 정규화
- 전처리기: 특정 행위가 발견된 패킷을 탐지 엔진으로 전송
- 탐지엔진: 전달받은 패킷을 스노트 규칙에 매칭되는지 확인
- 경고/로깅: 스노트 규칙에 매칭된 경우 경고 출력 및 기록
수리카타는 무엇인가?
수리카타(Suricata)
- 오픈 소스 보안 재단(OISF)에서 개발한 시그니처 기반 네트워크 침입 탐지 시스템
- 멀티 코어 / 멀티 스레드 지원하여 대용량 트래픽 처리 가능
- LUA 언어로 시그니처 작성
- 스노트 기능 및 규칙 호환
수리카타 동작
스노트 관련 파일 경로
- 스노트 규칙 파일 경로: /etc/nsm/rules
- downloaded.rules: 기본으로 제공되는 스노트 규칙 파일
- local.rules: 사용자가 정의한 스노트 규칙 파일
- 스노트 설정 파일 경로: /etc/nsm/templates/snort
- snort.conf: 스노트 설정 파일
규칙 구조(Rule Signature)
- 스노트 시그니처는 규칙 헤더와 규칙 옵션 영역으로 구분한다.
- 샘플 규칙
규칙 헤더(Rule Header)
액션(Action)
종 류 | 내 용 |
Alert | 패킷의 정보를 로그에 기록하고 사용자가 확인할 수 있도록 경고 발생 |
Log | 패킷의 정보를 설정한 로그 파일에 기록 |
Pass | 패킷 무시. 대부분 사용하지 않지만 특정 네트워크의 트래픽을 무시하고 싶을 때 사용 |
Drop | 인라인(In-Line)방식으로 구성되어 있을 경우 IPS 역할이 가능. 규칙에 매칭되는 패킷을 차단하고 기록 |
Reject | Drop과 같은 액션을 취함. TCP의 RESET 패킷을 출발지로 전송. ICMP 패킷은 Unreachable 로 반송. |
Sdrop | Drop과 동일하게 패킷을 차단하지만 로그 기록하지 않음. |
프로토콜(Protocol)
- TCP / UDP / ICMP / IP / ANY 중 택 1
송신 / 수신 IP (Src/Dst IP)
종 류 | 내 용 |
|
! | 부정 연산자로 특정 네트워크 대역 제외. | |
[ ] | 비연속적인 IP 지정. | |
any | 모든 IP를 의미. | |
192.168.100.100/32 | 특정 호스트 IP 지정. | |
192.168.100.0/24 | 특정 IP 대역대 지정. | |
!192.168.100.0/24 | 전체 IP에서 특정 IP 대역대 제외. | |
$EXTERNAL_NET | 외부 IP 주소 변수. | 설정 파일 Snort.conf |
$HOME_NET | 내부 IP 주소 변수. | |
$HTTP_SERVERS | 웹 서버의 주소 변수. | |
$DNS_SERVERS | DNS 서버의 IP 주소 변수. | |
$SMTP_SERVERS | SMTP 메일 서버의 IP 주소 변수. | |
$SSH_SERVERS | SSH 프로토콜을 사용하는 장비의 IP 주소 변수. |
송신 / 수신 포트 (Src/Dst Port)
종 류 | 내 용 |
! | 부정 연산자로 특정 포트를 제외. |
: | 연속적인 포트번호 지정. Ex) 1:1000 1부터 1000까지 포트 지정 |
any | 모든 포트 의미 |
!1:1000 | 1부터 1000까지를 제외한 포트 지정. |
방향 연산자
종 류 | 내 용 |
-> | 송신지에서 수신지 방향을 의미, 단방향 |
<> | 송신지와 수신지의 오가는 패킷 의미, 양방향 |
규칙 옵션(Rule Option)
일반 옵션(General Options)
옵 션 | 내 용 | 예 시 |
msg | 경고 이벤트를 보여줄 때 나타나는 메시지 | msg:"SQL Injection"; |
sid | 규칙을 구별하는 식별자 모든 규칙은 식별 번호를 가짐. 0-2999999 : 이미 예약된 식별자 3000000 ~ : 사용 가능한 식별자 |
sid:3000001; sid:2016113003; |
rev | 해당 규칙에 대한 버전. 수정 할 때마다 숫자를 1씩 증가. |
rev:1; |
priority | 우선 순위를 숫자로 지정. 1(높음)-10(낮음) | priority:1; |
calsstype | 스노트 규칙을 분류하는 옵션. 정의 파일: /etc/nsm/센서명/classification.config |
classtype:분류명; |
reference | 취약점의 참고가 되는 정보(URL 등)를 연결 정의 파일: /etc/nsm/센서명/reference.config |
reference:url, www.security.com/123.html; referecne:CVE, 2012-1823; |
흐름 옵션(Flow Options)
옵 션 | 방 향 옵 션 | 내 용 |
flow | to_server | 클라이언트에서 서버로 향하는 트래픽 |
from_client | ||
to_client | 서버에서 클라이언트로 향하는 트래픽 | |
from_server |
- established: 세션이 연결된 상태의 트래픽만 매칭
- Stateless: 세션의 연결 유무와 상관 없이 매칭
EX) flow:to_server, established
페이로드(Payload)
옵 션 | 내 용 | 예 시 |
Content | 탐지한 패턴을 설정하는 옵션 | Content: "abc"; Content: "|61 62 63|" → | | 내의 값은 아스키 코드 Hex 값 |
Nocase | 패턴 매칭 시 대소문자 구별하지 않고 매칭 | Content: "abc"; nocase; |
offset | 해당 옵션에서 지정한 바이트만큼 떨어진 위치부터 탐색 시작 0바이트 부터 시작 |
offset:5; |
Depth | 패킷 데이터에서 찾을 내용의 범위를 지정하는 옵션. 예를 들어 5로 지정하면 처음부터 5바이트까지 문자열 탐색. |
depth:5; |
distance | 이전 content 설정 값 매칭 후 탐색할 위치를 지정. 예시) abc가 매칭된 위치에서 32바이트 떨어진 위치부터 test 문자열을 탐색 시작. |
Content: "abc"; nocase; Content: "test"; distance:32; |
within | 이전 content 설정 값 매칭 후 매칭을 끝낼 상대 위치를 지정. 예시) abc가 매칭된 위치에서 10바이트 이내에 test 문자열 존재하는지 탐색. |
Content:"abc"; nocase; Content:"test"; within:10; |
pcre | 스노트 규칙에서 사용가능한 정규표현식. 특정 문자열의 집합을 표현할 때 효과적으로 사용 가능. |
Pcre:"/Select\b.*FROM/Ui"; |
HTTP 관련 옵션
옵 션 | 내 용 |
http_method | 페이로드 앞부분의 HTTP 메소드 부분의 패턴을 매칭. 메소드: GET, POST, PUT, HEAD, DELETE, TRACE... |
http_uri | 페이로드에서 HTTP URI 값을 패턴 매칭 |
http_cookie | 페이로드에서 HTTP 쿠키 값을 패턴 매칭 |
http_header | HTTP 요청 / 응답 헤더 값에서 패턴 매칭 시도 |
http_client_body | HTTP 요청 / 응답 바디 값에서 패턴 매칭 시도 |
http_stat_code | HTTP 응답 메시지의 상태코드에서 매칭 시도 ex) HTTP/1.1 200 OK |
http_stat_message | HTTP 응답 메시지의 상태 메시지 부분에서 매칭 시도 ex) HTTP/1.1 200 OK |
Threshold 옵션
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, secnods 5 → 출발지 IP를 기준으로 매 5초마다 10번째 이벤트마다 action을 수행 |
both | 매 s초 동안 c번째 이벤트 시 한번 action을 수행 ex) threshold type both, track by_src, count 10, seconds 1 → 출발지 IP를 기준으로 매 1초마다 10번째 이벤트 시 한번 action을 수행 |
- track
1. by_src: 출발지 IP를 기준으로 추적
2. by_dst: 목적지 IP를 기준으로 추적
규칙 업데이트 명령어
스노트 규칙 업데이트 명령어
- rule -update
→ PulledPork 도구로 Emerging Threats의 최신 규칙 다운로드 후 적용
잘못된 스노트 규칙 수정 후 업데이트 명령어
- nsm --sensor --restart --only-snort-alert
정규표현식(PCRE)
기본 특징
- 펄 호환 정규표현식(Perl Compatible Regular Expression)
- 스노트 패턴 탐지 옵션 Content를 보완하고 정확도를 높이는 데 사용
- PCRE의 시작과 끝은 구분자(/)로 결정 → pcre:"/표현식/옵션";
- 테스터 사이트: https://www.debuggex.com
Debuggex: Online visual regex tester. JavaScript, Python, and PCRE.
View Cheatsheet Visual ModeText Mode {{nfaModel.error.msg}} Result: Matches Does not match starting at the black triangle slider
www.debuggex.com
정규표현식 테스트 사이트
이스케이프 기호
기호 | 의미 | 예제 |
\\ | 역슬래쉬 문자 자체 | \ |
\n | 줄바꿈(Line feed), 커서를 다음 줄로 이동 | |
\r | 캐리지 리턴(Carrage Return), 커서를 맨 앞줄로 이동 | |
\t | 탭(Tab) | |
\v | 수직 탭(Vertical Tab) | |
\f | 폼 피드(Form Feed), 다음 페이지로 넘어 가기 | |
\' | 작은 따옴표(Single Quote) | ' |
\" | 큰 따옴표(Double Quote) | " |
\d | 모든 숫자 | == [0-9] |
\D | 숫자가 아닌 문자 [^0-9] | == [^0-9] |
\s | 공백 | == [\t\n\r\f\v] |
\S | 공백이 아닌 문자 | == [^\t\n\r\f\v] |
\w | _ 를 포함한 숫자 또는 문자 | == [A-Za-z0-9_] |
\W | 숫자 또는 문자가 아닌 것 | == [^A-Za-z0-9_] |
\b | 단어와 공백 사이를 찾음 | ab\b --> nnnab (O) / nnnabn (X) |
[\b] | back space, \b와 혼동하면 안됨 | |
\B | 단어의 경계가 아님 | ab\B --> nnnab (X) / nnnabn (O) |
메타문자
- 기능(의미)를 가지는 문자 \t \n \r \b
- 클래스 [ ] : 괄호 안의 문자 중 하나를 찾는다. [abc] : a, b, c 중 하나, [a-z] : 알파벳 소문자 중 하나
- 서브 패턴 ( ) : 문자열을 하나로 묶음(특정 패턴을 묶어서 반복 기호등과 함께 사용)
- 수량자 { } : 앞 문자가 몇 번 반복되는지, \d{1,3}: 1자리, 2자리, 3자리 숫자 의미
문자 | 의미 | 문자 | 의미 |
\ | 이스케이프 문자 | + | 1번 이상 |
^ | 문자열 시작 | [ | 클래스 시작 |
$ | 문자열 끝 | ] | 클래스 끝 |
. | 임의의 문자 하나 | ( | 서브 패턴 시작 |
| | OR 연산 | ) | 서브 패턴 끝 |
? | 0번 또는 1번만 | { | 수량자 시작 |
* | 0번 또는 1번 이상 | } | 수량자 끝 |
문제 풀이 - 메타 문자
예제1) pcre:"/a.a/" 가 탐지 할 수 있는 경우를 찾으시오.
1. Aaa
2. aTa
3. aTat
예제2) pcre:"/(one|two) apple/" 가 탐지 할 수 있는 경우를 찾으시오.
1. one apple
2. onetwo apple
3. apple
예제3) pcre:"/boan?/"가 탐지 할 수 있는 경우를 찾으시오.
1. boan
2. boaan
3. boa
예제4) pcre:"/pro*ject/"가 탐지 할 수 있는 경우를 찾으시오.
1. project
2. prject
3. projject
예제5) pcre:"/boan+project/"가 탐지 할 수 있는 경우를 찾으시오.
1. boanproject
2. boanpproject
3. boannproject
수량자 및 클래스 사용
- 수량자는 설정한 패턴이나 클래스의 반복 횟수를 결정
- 수량자는 { } 안에 값을 설정
- 클래스는 탐지할 패턴을 결정하며 [ ] 안에 값을 결정
수량자/클래스 | 의미 |
{n} | 앞선 문자나 클래스가 n개 존재하는 문자열 검색 |
{n,} | 앞선 문자나 클래스가 n개 이상 존재하는 문자열 검색 |
{n,m} | 앞선 문자나 클래스가 n개 이상 m개 이하 만큼 존재하는 문자열 검색 |
[abc] | a,b,c 중 하나라도 속한 문자열 검색 |
[a-z] | 소문자 a부터 z까지 하나라도 속한 문자열 검색 |
[A-Z] | 대문자 A부터 Z까지 하나라도 속한 문자열 검색 |
[0-9] | 숫자 0부터 9까지 하나라도 속한 문자열 검색 |
[A-Za-z0-9] | 모든 단어 검색 |
[\f\r\t\n\v] | 모든 공백 검색 |
[^0-9] | 숫자가 아닌 모든 문자 검색(클래스 내의 ^는 부정을 의미) |
문제 풀이 - 수량자 및 클래스 사용
예제1) pcre:"/[A-Z]{3}/" 가 탐지 할 수 있는 경우를 찾으시오.
1. aaA
2. ABC
3. A-Z3
예제2) 클래스를 사용하여 숫자 9가 4개 이상 포함된 문자열을 찾는 정규식을 만드시오.
→ pcre:"/9{4,}/"
예제3) pcre:"/bo{2,4}an/" 가 탐지 할 수 있는 경우를 찾으시오.
1. booan
2. boan
3. booooan
PCRE 옵션
- 메타 문자 이외에 추가적인 기능을 하는 옵션
- 구분자 뒤에 사용 /abc/iU
옵션 | 의미 |
i | 패턴의 대문자와 소문자를 구별하지 않고 검색하는 옵션 |
s | 개행이 되더라도 문자열을 1줄로 인식하여 메타문자 . 기능이 동작하는 옵션 |
m | 메타문자 ^와 $가 행마다 동작하게 하는 옵션 |
x | 패턴에 존재하는 모든 공백을 무시하는 옵션 |
스노트 지원 PCRE 옵션
- HTTP 관련 옵션과 동일한 기능
옵션 | 의미 | 유사 스노트 옵션 |
B | 정규화 되지 않은 원본 패킷과 패턴 매치 | rawbytes |
M | HTTP 메소드(Method)와 패턴 매치 | http_method |
H | 정규화된 HTTP 요청(Request) 메시지 헤더 정보와 패턴 매치 | http_header |
D | 정규화 되지 않은 HTTP 요청 메시지 헤더 정보와 패턴 매치 | http_raw_header |
P | HTTP 요청 메시지 바디와 패턴 매치 | http_client_body |
U | 정규화된 URL 디코딩한 문자열과 패턴 매치 | http_uri, uricontent |
I | 정규화 되지 않은 URL 디코딩한 문자열과 패턴 매치 | http_raw_uri |
C | 정규화된 HTTP 요청과 응답(response)의 쿠키 값과 패턴 매치 | http_cookie |
K | 정규화 되지 않은 HTTP 요청과 응답의 쿠키 값과 패턴 매치 | http_raw_cookie |
S | HTTP 응답 코드와 패턴 매치 | http_stat_code |
Y | HTTP 응답 상태 메시지와 패턴 매치 | http_stat_msg |
문제 풀이 - 정규표현식 옵션
예제1) pcre:"/union/Ui" 가 탐지 할 수 있는 경우를 찾으시오.
1. UniON
2. union
3. UnioN
예제2) 200 응답 코드나 404 응답 코드를 찾는 정규식을 만드시오
→ pcre:"/(200|404)/S"
예제3) 요청 메시지 헤더에서 select 문자열을 찾는 정규식을 만드시오
→ pcre:"/select/Hi"
아스키 코드 참고
참고