Snort?

Snort는 오픈소스로 활용되는 IDS, IPS

IDS, IPS의 시초로 시중에 나와 있는 모든 IDS는 Snort를 기반으로 제작

스노트는 세가지의 주요 모드인 스니퍼, 패킷 로거 그리고 네트워크 침입 탐지로 설정 가능

Snort 모드

패킷 스니퍼 모드

네트워크 패킷을 읽고 콘솔로 출력하는 기능

패킷 로거 모드

모니터링한 패킷을 저장하고 로그에 남기는 기능

침입 탐지,차단 모드

프로그램은 네트워크 트래픽을 모니터하고 사용자에 의해 정의된 규칙을 위반하는지 분석

차단 여부 결정가능

현재까지 오픈소스에서 업데이트가 되며 자동으로 룰도 업데이트 되고 기업에서 사용하는 것이 아니라 개인이 사용하는 것이면 무료로 사용가능

Snort 동작 과정

Sniffer -> Preprocessor -> Detection Engine -> Alert/Logging

Sniffer

네트워크 인터페이스에 입력되는 패킷을 수신

Preprocessing

입력되는 패킷에 대해서 특정 행위가 탐지될 경우 탐색 엔진으로 전송

Detection Engine

등록된 Rule과 동일한지 여부를 확인하는 규칙 기반 패턴 검색을 실행

Alert / Logging

탐지된 정보에 대해서 로그파일 , 네트워크 , SNMP 프로토콜 등으로 그 결과를 전송

로그파일에 기록하거나 등록된 데이터베이스에 입력

Snort Rule Signature

Snort 시그니처는 룰 헤더(Rule Header)와 룰 옵션(Rule Option)으로 구성된 룰

룰 헤더는 처리 방법 , 프로토콜 , IP주소 및 포트번호 등으로 구성되어서 탐지하는 대상을 의미

룰 옵션은 탐지하는 세부적인 조건을 정의

 

룰 헤더 (Rule Header)

처리 방법(action)

action은 패킷을 처리하는 방법으로 의미하며 alert , log , activate , dynamic 등 으로 구성

종류 내용
alert alert를 발생시키고 탐지 정보를 로그파일에 기록
log 패킷에 대해서 로그를 기록
pass 패킷을 무시
activate alert를 발생시키고, dynamic 룰을 동작
dynamic activate 시그니처에 의해서 유효하게 된 경우는 한쪽의 패킷을 기록
drop 패킷을 차단하고, 로그에 기록
reject drop과 동일하나 추가적으로 Reset(TCP) or ICMP port unreachable(UDP) 메시지를 전송
sdrop 패킷을 차단하지만 로그에 기록하지 않음(Silent Drop)

프로토콜(Protocol)

프로토콜은 TCP , UDP , IP , ICMP의 프로토콜 설정을 하면 해당 프로토콜을 탐지

IP주소와 포트번호

[Source IP] [Source Port] 형식으로 사용

IP

주소입력 내용
92.168.20.50/32 192.168.20.50 Host
192.168.20.0/24 192.168.20.0/24 서브넷
[192.168.20.0/24, 172.20.0.0/16] 192.168.20.0/24, 172.20.0.0/16 서브넷
!192.168.20.0/24 192.168.20.0/24를 제외한 나머지 서브넷
$HOME_NET 내부 IP 주소 변수
$EXTERNAL_NET 외부 IP 주소 변수
$XXX_SERVERS 특정 서버 IP 주소 변수

Port

포트입력 내용
80 80번 포트
1:500 1~500번 포트
!80 80번 포트를 제외한 나머지 포트
!1:500 1~500번 포트를 제외한 나머지 포트
any 모든 포트

Direction

Direction 은 패킷의 방향을 의미하는 것

-> : 출발지 -> 목적지 패킷 탐지

<> : 출발지 목적지 사이 모든 패킷 탐지

룰 옵션 (Rule Option)

룰 옵션은 세부적인 탐지 조건을 설정하는 부분

탐지 조건을 여러 개 설정할 때는 각 조건마다 세미콜론 (;)을 넣어서 조건을 구분

총 4개의 옵션으로 구분

General : 룰에 대한 정보를 포함하는 옵션

Payload : 패킷 내 페이로드 내부의 데이터를 찾고 상호작용을 할 수 있는 옵션

Non-payload: 페이로드가 없는 데이터에서 사용

Post-detection :사후탐지에 대한 옵션, 룰 실행 후의 규칙

General

msg

alert 엔진을 통해 전달하는 메시지를 설정

msg:"<message text>";

reference

CVE, nessus, mcafee 등 다른 외부 참조를 통해 규칙을 참조

reference:<id system>, <id>;

gid

generator id 를 의미

패턴이나 시그니처를 그룹으로 관리하기 위한 아이디

gid:<generator id>;

sid

Snort ID의 약자로 룰을 식별하기 위해 사용

sid:<snort rules id>;

rev

해당 룰의 버전 정보 를 표현할 수 있는 영역

rev:<revision integer>;

classtype

특정 공격에 대한 분류를 하는데 사용

Snort에서 제공되는 특정 공격들에 대한 분류를 이용

classtype:<class name>;

priority

우선순위를 지정

priority:<priority integer>;

Payload

content

페이로드 내 존재하는 특정 문자열이나 헥스 값 등을 판별하여 룰에 영향

헥스 값의 경우 ‘|’ 으로 감싸주어 사용

content :[!]"<content string>";
alert tcp any any -> any 80 (content:!"GET") ⇒ 외부로 나가는 모든 80 포트에 GET이 포함되지 않은 경우 경고

 

protected_content

룰에 접근 가능한 다른 사용자로부터 콘텐트의 내용을 숨길 수 있다. md5, sha256&512 해시 알고리즘을 이용한다.

protected_content:[!]"<content hash>", length:orig_len[, hash:md5|sha256|sha512];
alert tcp any any <> any 80 (msg:"SHA256 Alert"; protected_content:"56D6F32151AD8474F40D7B939C2161EE2BBF10023F4AF1DBB3E13260EBDC6342"; hash:sha256; offset:0; length:4;)
⇒ 해당 해시 값을 검색하면 ‘HTTP’ 문자열 검색가능 length 필드의 4는 해시함수를 거치기 전 원래 콘텐트의 길이 값을 의미

hash

[protected_content]에서 함께 사용하는 옵션 해당

해시 값이 어떤 해시 알고리즘을 사용했는지 명시

length

[protected_content]에서 함께 사용하는 옵션

해시화하기 전 원래의 문자열에 대한 길이

nocase

대소문자 구분을 하지 않는다는 의미

alert tcp any any -> any 21 (msg:"FTP ROOT"; content:"USER root"; nocase;) ⇒ tcp 프로토콜을 이용하여 ftp 21로 접근하는 모든 패킷에서 ”User root” 라는 문자열을 포함되어 있는 경우 ‘FTP ROOT’라는 메시지를 출력한다. ”User root” 문자열의 경우 대소문자를 구분하지 않음

 

rawbytes

키워드명처럼 raw 데이터를 검출

alert tcp any any -> any 21 (msg:"Telnet NOP"; content:"|FF F1|"; rawbytes;) ⇒ 21 포트로 접근하는 패킷에서 로우데이터에 **0xFF 0xF1**가 포함된 경우 Telnet NOP 이라는 메시지를 출력

 

depth

지정된 패턴을 검색 시 패킷의 길이를 지정

depth가 5인 경우 페이로드의 처음 5바이트 내에서 지정된 패턴을 검색.

offset 키워드와 함께 사용

offset

해당 오프셋부터 패턴을 검색

offset이 5인 경우 offset 5부터 지정된 패턴을 검색

alert tcp any any -> any 80 (content:"cgi-bin/phf"; offset:4; depth:20;) ⇒ 80(http/tcp)로 접근하는 모든 패킷의 offset 4부터 20바이트 내 cgi-bin/phf 문자열이 존재하는지 확인

 

distance

이전 패턴이 일치한 경우 매치된 바이트부터 특정 바이트 떨어진 위치에서 다음 패턴을 검사할지 지정

within

distance와 함께 사용 distance부터 특정 바이트 범위 내에서 패턴을 검사할지 지정

alert tcp any any -> any any (content:"ABC"; content:"EFG"; within:10;) ⇒ 모든 패킷 내 ABC 문자열이 포함된 패킷을 검출, 검출된 경우 해당 오프셋에서 부터 10바이트 범위 내에서 DEF 문자열이 포함된 패킷을 검색

 

Non-Payload

fragoffset

IP Fragment 오프셋 필드의 값을 비교할 수 있다.

fragoffset:[!]<|>]<number>;

ttl

TTL(Time To Live) 항목이다. traceroute 명령어를 탐지하기 위한 키워드

ttl:[<,>,=,<=,>=]<number>; , ttl:[<number>]-[<number];

id

특정한 IP ID 필드의 값을 확인하는데 사용

예로 31337은 공격자들이 도구를 이용해 많이 사용하는 IP ID 필드의 값

id:31337;

fragbits

단편화된 패킷이거나 IP Header 내 flags 필드에 비트가 설정되어 있는지 확인하는데 사용

M - More Fragments, D - Don’t Fragments, R - Reserved Bit

fragbits:MD+;

flags

TCP flag 비트를 확인하는데 사용

기본적으로 UAPRSF(URG, ACK, PSH, RST, SYN, FIN)를 확인할 수 있고, 추가적으로 CWR, ECE 를 사용가능

alert tcp any any -> any any (flags:SF;) ⇒ 모든 패킷에 SYN과 FIN 패킷을 탐지

seq

TCP sequence number를 확인

seq:0;

ack

TCP acknowledge number를 확인

ack:0;

itype

ICMP type을 확인

itype:>30;

icode

ICMP code를 확인

icode:<number<=256

icmp_id

특정 ICMP의 식별자를 확인

icmp_id:0;

ip_proto

IP 프로토콜 헤더 대한 검사를 수행

alert ip any any -> any any (ip_proto:igmp;)⇒ IGMP 트래픽을 확인

sameip

출발지와 목적지 IP가 같은 패킷을 확인

alert ip any any -> any any (sameip;)

thresholds

: 임계값을 설정

  • Formatthreshold: type <limit|threshold|both>, track <by_src|by_dst>, count <c>, seconds <s>;
    • type : limit매 s 초 동안 c 번째 이벤트까지 액션 수행
    • type : threshold매 s 초 동안 c 번째 이벤트 마다 액션 수행
    • type : both매 s 초 동안 c 번째 이벤트 시 한번의 액션을 수행
    • track by_src출발지 ip 기준
    • track by_dst도착지 ip 기준
    • **count(c)/seconds(s)**횟수 및 시간
alert tcp $External_net any -> $Home_net any (msg:"HTTP Get Flooding"; content:"GET"; http_method; nocase; sid:1000001; threshold:type threshold, track by_dst, count 10, seconds 1;)

Post-Detection

logto

패턴에 탐지되는 것들에 대해 로그 파일로 저장

logto:"filename";

session

telnet, rlogin, ftp, http 와 같이 평문 통신 프로토콜로 부터 세션의 트래픽을 기록

log tcp any any <> any 23 (session:printable;)

PCRE(Perl Comaptible Regular Expression)

Snort 룰 매칭시 content 정보를 세밀하게 검색할 때 사용

PCRE 구성 요소 : 메타 문자, 수량자, 클래스, 서브패턴, 옵션

사용 방법 : pcre:"/정규표현식/옵션";

alert tep $EXTERNAL_NET any -> $HOME_NET any (uricontent:"/readme.eml"; content: "12C|Read |FF 45| it"; distance:4; pcre: /a+bc\\s{2}blah/R; sid: 435;)
alert tcp $EXTERNAL_NET any -> $HOME_NET any (pcre: "/^a+.?bc\\s(2} (Def)+|(Fed)+$/sm"; sid: 1098;)

 

Reference

https://feccle.tistory.com/52

https://berasix.tistory.com/entry/정보보안기사-6-SNORT-정의와-기본-사용법

https://shhoya.github.io/snort.html#msg

https://ast-216.tistory.com/25

https://seculog.tistory.com/2

'보안관제' 카테고리의 다른 글

악성코드 분석 보고서  (0) 2024.04.30
악성코드 보고서 작성하기  (0) 2024.02.01
악성 코드 분석 실습2  (2) 2024.01.14
악성코드 분석 실습1  (1) 2024.01.10
동적분석 도구 실습  (0) 2023.12.21

+ Recent posts