2021. 3. 8. 02:45ㆍ정보보안
(악성코드 패킷 탐지 게시물과 연관)
스노트란
- 시그니처 기반의 NIDS
- 멀티쓰레드이 안된다는 단점
→ 수리카타의 등장 (멀티 스레드 지원, 스노트의 룰셋 지원)
- 스노트의 동작 순서
Sniffer → Preprocessor → Detection Engine → Alert / Log
Sniffer : 네트워크 패킷을 수집
Preprocessor(전처리기) : 특정 행위를 수행하는 패킷을 탐지해 Dectection Engine으로 보냄
Detection Engine : 해당 패킷이 스노트 규칙에 매칭되는지 확인
Alert / Log : 해당 패킷이 스노트 규칙에 매칭된다면 경고창을 띄우고 Log를 남김


local.rules 파일이 사용자가 직접 규칙을 설정할 수 있는 룰셋파일이다.
스노트 규칙 업데이트 명령어
rule-update
이 명령어 사용 시 다음과 같이 PulledPork 를 통해 최신 규칙으로 업데이트 된다.

만약 문법오류로 인해 rule-update 명령어가 정상적으로 먹히지 않을 때
nsm --sensor --restart --only-snort-alert 명령어를 통해 스노트를 재실행하자.
스노트 룰 작성
| 스노트 규칙 헤더 | Body | ||||||
| Action | Protocol | Src IP | Src Port | 방향 지시자 | Dst IP | Dst Port | Option |
Action : 패킷이 탐지되엇을 때(룰에 매치되었을 때)의 처리방식으로 총 8개가지의 유형이 존재함.
액션의 종류
| 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 | 패킷을 차단하지만 로그를 남기지 않는다.(slient) |
Protocols : 탐지할 프로토콜을 나타내며 총 4가지 프로토콜을 지원(TCP, UDP, ICMP, IP)
IP Address : 출발지/목적지 IP
ex1) !192.168.149.148 : 192.168.149.148 을 제외한 모든 ip
ex2) [192.168.149.148, 192.168.149.149] : 192.168.149.148 ip와 192.168.149.149 ip 두 개
ex3) any
※ 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
ex1) 1:1023 : 1부터 1023 사이의 포트
ex2) :1023 : 1023 이하의 포트(1023 포함)
ex3) 1: : 1 이상의 포트(1 포함)
ex4) [1,2,3,4] : 1,2,3,4 포트
ex5) any
Direction Operator : 방향 지시자
-> 단방향
<> 양방향
룰 바디 : 기본 옵션
| 옵션 | 설명 |
| msg | · msg 옵션에 기록된 내용이 alert 발생 시 이벤트 이름으로 사용된다. |
| reference | · rule과 관련된 외부 취약점 정보 참조 시 사용한다. |
| sid | · snort rule id로 사용되는 범위는 다음과 같음 99 이하 : 시스템 예약 sid 100 ~ 1000000 : snort에서 배포하는 룰셋에 사용되는 sid 1000000 이상 : 사용자 정의 rule sid |
| classtype | · snort는 사용자가 어떤 유형의 공격인지 쉽게 이해하고 우선순위를 결정할 수 있도록 공격 유형이랑 기본 우선순위(위험도)를 정의해둠 · 우선순위 : 1(높음), 2(중간), 3(낮음) |
| priority | · rule의 우선순위(위험도)를 숫자로 표기 · priority를 지정 시 classtype의 기본 우선순위(위험도)를 덮어쓴다 |
| rev | · rule 버전번호로 수정(revision) 횟수를 표기한다. · 수정 시 1씩 증가시켜주어야함 |

룰 바디 : 페이로드/범위 관련 옵션
| 옵션 | 설명 |
| content | · 페이로드에서 검사할 문자열을 지정함 · content는 text 형식일 수도 있고 binary 형식일 수도 있고 두개가 복합된 형식일 수 있다. · text 형식 : content:"pattern", 해당 pattern 검사 · binary 형식 : content:"|FF FF|", 파이프 기호 사이에 헥사값으로 표현 · ! 사용 : ! 문자는 부정연산자임 content:!"pattern", 해당 pattern 문자열이 없는지 검사 · ; \ " 3가지 특수문자는 escape 처리해서 사용 |
| uricontent | · content 문자열을 전체 패킷과 비교하는 대신 HTTP 클라이언트 요청 URI 정보를 검사할 문자열을 지정함 |
| offset | · 페이로드에서 CONTENT 패턴을 검사할 시작 위치 · 페이로드의 첫 번째 바이트 위치가 0부터 시작 |
| depth | · offset 부터 몇 바이트까지 검사할 것인지를 지정 |
| distance | · 이전 content 패턴에 매치된 경우, 매치된 이후 바이트부터 몇 바이트 떨어진 위치에서 다음 content를 검사할 것인지를 지정 |
| within | · 이전 content 패턴에 매치된 경우 distance 부터 몇 바이트 범위 내에서 다음 content를 검사할 것인지를 지정 |
| nocase | · 페이로드 검사 시 대소문자를 구분하지 않음(바이너리 형식 또한 대소문자를 구분하지 않음) |
| pcre | · 스노트는 펄 호환 정규표현식인 PCRE를 지원 |
룰 바디 : 페이로드/HTTP 관련 옵션
| 옵션 | 설명 |
| http_method | · HTTP method 부분을 검사 |
| http_uri | · HTTP URI 부분을 검사 |
| http_header | · HTTP Header 부분을 검사 · 요청(Request)/응답(Response) 헤더에 모두 사용 |
| http_cookie | · HTTP Cookie 부분을 검사 |
| http_client_body | · HTTP 클라이언트 요청의 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 |
룰 바디 : 흐름 옵션
| 옵션 | 설명 |
| to_server 또는 from_client | · 클라이언트 -> 서버 패킷 룰 매칭 |
| to_client 또는 from_server | · 서버 -> 클라이언트 패킷 룰 매칭 |
| established | · 세션이 연결된 상태의 패킷 룰 매칭 |
| stateless | · 세션 연결 유무와 상관 없이 룰 매칭 |
예시) flow:to_client, established;
룰 바디 : Event Threshold(이벤트 제한) 관련 옵션
threshold type <limit|threshold|both>, track <by_src|by_dst>, count <c>, seconds <s>
type
1. limit : 매 s초 동안 c번째 이벤트까지 action을 수행
(예시 : threshold type limit, track by_src, count 2, seconds 10
→ 출발지 ip를 기준으로 매 10초마다 2번째 이벤트까지 action을 수행)
2. threshold : 매 s초 동안 c번째 이벤트마다 action을 수행
(예시 : threshold type threshold, track by_src, count 10, seconds 5
→ 출발지 ip를 기준으로 매 5초마다 10번째 이벤트마다 action을 수행)
3. both : 매 s초 동안 c번째 이벤트 시 한번 action을 수행
(예시 : threshold type ㅠㅐ소, track by_src, count 10, seconds 1
→ 출발지 ip를 기준으로 매 1초마다 10번째 이벤트 시 한번 action을 수행)
track
1. by_src : 출발지 IP를 기준으로 추적
2. by_dst : 목적지 IP를 기준으로 추적
■ 정규표현식
스노트에서는 바디 옵션에서 pcre옵션를 이용해 정규표현식을 이용할 수 있음
메타문자
| 문자 | 의미 |
| \ | · 이스케이프 문자로 따옴표, 느낌표, 역슬래시, 슬래시 등 특수문자나 특정 기능을 하는 문자를 문자 그대로 탐지하고자 할 때 사용 |
| ^ | · ^ 다음에 오는 문자가 문자열의 시작읨을 의미 |
| $ | · $ 바로 앞에 있는 문자가 문자열의 끝을 의미 |
| . | · 임의의 문자 1개를 의미 |
| | | · | 앞에 오는 문자열과 뒤에 오는 문자열 중 하나와 일치 예시) (one|two|three) : one, two, three 문자열 중 하나 |
| ? | · ? 앞에 오는 문자가 0회 또는 1회 나타남을 의미 |
| * | · * 앞에 오는 문자가 0회 이상 나타남 (안나타나도 된다는것) |
| + | · + 앞에 오는 문자가 1회 이상 나타남 |
수량자/클래스
수량자는 중괄호 {} 안에 값을 설정하며
클래스는 대괄호 [] 안에 값을 설정한다.
| 수량자/클래스 | 의미 |
| {n} | 해당 표현 앞에 문자나 클래스가 n개 존재하는 문자열 검색 |
| {n,} | 해당 표현 앞에 문자나 클래스가 n개 이상 존재하는 문자열 검색 |
| {n,m} | 해당 표현 앞에 문자나 클래스가 n개 이상 m개 이하 존재하는 문자열을 검색 |
| [abc] | a,b,c 문자 중 1개 문자 |
| [a-z] | 소문자 알파벳 a부터 z까지 중 1개의 문자 |
| [0-9] | 0부터 9까지 숫자 중 1개의 숫자 |
| [A-Z] | 대문자 알파벳 A부터 Z까지 중 1개의 문자 |
| [A-Za-z0-9] | 모든 단어 중 1개 문자 |
| [^0-9] | 숫자가 아닌 모든 문자 중 1개(클래스에서 ^ 는 부정을 의미) |
| [^A-Z] | 대문자 알파벳이 아닌 모든 문자 중 1개 |
정규표현식 옵션(PCRE 자체 옵션)
| 옵션 | 의미 |
| i | · 패턴의 대문자와 소문자를 구별하지 않게 해주는 옵션 |
| s | · 개행되더라도 문자열을 1줄로 인식하여 메타문자 .기능이 동작하는 옵션 |
| m | · 메타문자 ^와 $가 행마다 동작하게 하는 옵션 |
| x | · 패턴에 존재하는 모든 공백을 무시하는 옵션 |
정규표현식 옵션(스노트 지원 PCRE 옵션)
| 옵션 | 의미 |
| B | · 정규화되지 않은 원본 패킷과 패턴 매치 |
| M | · HTTP 메소드와 패턴 매치 |
| H | · 정규화된 HTTP 요청 메시지 헤더 정보와 패턴 매치 |
| D | · 정규화 되지 않은 HTTP 요청 메시지 헤더 정보와 패턴 매치 |
| P | · HTTP 요청 메시지 바디와 패턴 매치 |
| U | · 정규화된 URL 디코딩 문자열과 패턴 매치 |
| I | · 정규화되지 않은 URL 디코딩 문자열과 패턴 매치 |
| C | · 정규화된 HTTP 요청과 응답(Response)의 쿠키 값과 패턴 매치 |
| K | · 정규화되지 않은 HTTP 요청과 응답의 쿠키 값과 패턴 매치 |
| S | · HTTP 응답 코드와 패턴 매치 |
| Y | · HTTP 응답 상태 메시지와 패턴 매치 |
'정보보안' 카테고리의 다른 글
| 소켓 통신 (0) | 2021.03.11 |
|---|---|
| Format Characters (0) | 2021.03.09 |
| 스카피(Scapy)와 네트워크 헤더 (0) | 2021.03.08 |
| Sguil (스구일) (0) | 2021.03.07 |
| 가상환경 구성 (0) | 2021.03.01 |