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 |