목차
1. snort - rule 설정
1-1 rule - header
1-2 rule - option
1-3 실습
1. snort - rule 설정
1-1 rule - header
● rule 구조
header | option | ||||||
action | protocol | s.ip | s.port | -> | d.ip | d.port | option |
alert icmp any any ‐> 192.168.12.11 any (msg:"APICMP Detect"; sid:1000002; rev:1)
<--------------header-----------------> <----------------option----------------->
● rule 구조 - header
action | alert : 조건에 맞으면 경고 발생, 로그 기록 log : 로그 기록, 경고 미발생 pass : 무시 |
protocol | tcp, udp, ip, icmp, any 등 |
s.ip [d.sip] : host, network 주소지정 | host, network 주소 지정 - [192.168.10.11,192.168.0.0/24] 와 같이 리스트로 작성 가능하다. 공백은 없다. |
s.port [d.port] : 포트번호지정 | 포트 번호 지정 - any, 80, !80 - :1023, 1024:, 2048:2056, !2048:2056 와 같이 범위 지정이 가능하다. - [80,443,2048:2056] 과 같이 리스트로 작성 가능하다. |
- :1023, 1024:, 2048:2056, !2048:2056 의 경우 각각 1023까지 모두, 1024부터 모두, 2048~2056모두, 2048~2056 빼고 모두를 나타낸다.
- 부정연산자 '!' 사용이 가능하지만 현재는 옵션 기술에서 부정연산자는 사용하지 않는다.
1-2 rule - option
● rule 구조 - option
general | 일반 옵션 - msg, sid, rev 등이 있다. |
payload | 프로토콜에서 실제로 전달하고자 하는 패킷의 message에 해당하는 부분 - content, nocase, offset, depth, distance 등이 있다. |
non payload | 패킷의 헤더 부분 - fragoffset, frages, seq, ack, itype 등이 있다. |
post detection |
● option - general
msg
: 경고 메시지 지정
sid
: 룰 식별자
: 100 미만은 예약되어 있으며 100 ~ 100만 까지는 미리 설정되어 있으므로 사용자 정의는 1000001부터 사용한다.
rev
: 원본이 수정되었을 때 시리얼 넘버로써 이용한다.
: 기술적으로 필요한 이유는 없다.
● option - payload
content
: 텍스트 탐색
: 16진수나 문자열을 기반으로 검출한다.
alert tcp any 22 -> any any (content:"|535348|";)
// ssh서버가 클라이언트에게 보내는 패킷을 검출한다.
// 535348은 ssh의 16진수이며 | | 사이에 작성한다.
nocase
: 대소문자 구분 없이 탐색한다.
alert tcp any any ‐> any 21 (msg:"FTP ROOT"; content:"USERroot"; nocase;)
// ftp 클라이언트가 ftp 서버에게 보내는 패킷을 검출한다.
offset
: 지정한 byte부터 탐색한다.
depth
: 지정한 byte까지 탐색한다.
alert tcp any any ‐> any 80 (content:"cgi‐bin/phf"; offset:4; depth:20;)
// 브라우저가 웹 서버에게 보내는 패킷이다.
// 4byte부터 20byte까지 content의 내용이 있다면 검출한다.
distance
: 첫 content 매핑 후 지정한 위치 이후 두 번째 content를 탐색한다.
alert tcp any any ‐> any any (content:"ABC"; content:"DEF"; distance:1;)
// ABC DEF 를 검출한다.
within
: 첫 content 매핑 후 지정한 위치 이내 두 번째 content를 탐색한다.
alert tcp any any ‐> any any (content:"ABC"; content:"EFG"; within:10;)
// ABC 다음 10byte 내에 EFG 가 있는 것을 검출한다.
● option - non payload
itype
: 지정한 ICMP type 탐색
: itype:[ < | > ] number
: itype:>20; 또는 itype:0
icode
: 지정한 ICMP code 탐색
: icode:[ < | > ] number
: icode:>10; 또는 itype:0
seq
: 지정한 TCP sequence 번호 탐색
: 처음 생성 시 난수로 생성되므로 특정 번호를 검색하는 의미가 없다.
: seq:0;
ack
: 지정한 TCP ACK 번호 탐색
: 처음 생성 시 난수로 생성되므로 특정 번호를 검색하는 의미가 없다.
: ack:0;
sameip
: src ip와 dst ip가 동일한 패킷 탐색
: 센더의 ip는 조작이 가능하므로 해당 패킷 검출 시 공격 징후를 의심할 수 있다.
: alert ip any any -> any any(sameip;)
flags
: 지정한 tcp flag 탐색
: flags:[ * | 0 ]<FSRPAU>;
- * : 아무거나 검출, 0 : NULL
- S(SYN), F(FIN), A(ACK), U(UGR), P(PSH), R(RST)
- U와 P, S와 R, S와 F 처럼 같이 쓰일 일이 없는 flag가 같이 검출 될 경우 공격을 의심할 수 있다.
alert tcp any any ‐> any any (flags:FUP; msg:"XMAS Packet Detected";)
alert tcp any any ‐> any any (flags:0; msg:"NULL Packet Detected";)
alert tcp any any ‐> any any (flags:F; msg:"FIN Scan Detected";)
flow
: 패킷 이동 방향에 따른 탐색
to_server, from_client | 클라이언트 → 서버 방향 |
to_client, from_server | 서버 → 클라이언트 방향 |
established | 3-way 핸드셰이크가 완료된 TCP 연결에서만 탐지 |
stateless | 세션 상태 무시 (비연결형 또는 비정상 트래픽 탐지에 사용) |
- to_~ 는 반드시 established를 필요로 하며 정상적인 tcp 세션을 탐지한다.
- from_~ 는 세션 상태와 무관한 트래픽으로 스캔과 같은 비정상 트래픽을 감지한다.
- scan 등의 공격을 감지할 때 stateless는 TCP, UDP, ICMP 등 모든 프로토콜에 사용 가능하지만 from_client는 TCP인 경우만 감지 가능하다.
alert tcp any any ‐> any 80 (flow:to_server,established; content:"GET";)
alert tcp any 21 ‐> any any (flow:to_client,established; content:"Login successful";)
alert udp any any ‐> any 53 (flow:stateless; content:"example.com";)
● option - post detection
- threshold
: 이벤트의 반복적인 발생에 따라 액션 수행
threshold:type <threshold|limit|both>,track <by src|by dst>, count <c>, second <s>
조건: c = 3, s = 10 인 경우 | |
threshold | 10초동안 이벤트가 3회 반복될 때마다 액션을 1회 수행한다. |
limit | 10초동안 이벤트 3회까지 액션을 1회씩 수행한다. |
both | 10초동안 3번째 이벤트에서만 액션을 1회 수행한다. |
by src | by dst | src 또는 dst IP 기준으로 탐색한다. |
count | second | 횟수 | 시간 |
※ 예제
환경: 초당 1회 씩 이벤트가 발생하며, 100초 동안 감시한다.
threshold:type threshold, count 4, second 10
// 매 10초마다 4번 이벤트가 발생할 때마다 1번씩 경고하여 10초당 2번씩 경고한다. 총 20회 경고를 발생한다.
threshold:type limit, count 4, second 10
// 매 10초마다 4번째 이벤트까지 4번씩 경고하여 총 40회 경고한다.
threshold:type both, count 4, second 10
// 매 10초마다 4번째 이벤트에 1번씩 경고하여 총 10회 경고한다.
- threshold, both의 경우 첫 10초까지는 횟수가 정확하나, 시스템마다 카운팅 메커니즘이 조금씩 달라 총 횟수는 값이 다를 수 있다.
alert icmp any any ‐> any any (msg:"[THRESHOLD] ICMP Echo Request";itype:8;threshold:typethreshold, track by_src, count 3, seconds 10;sid:2001001;rev:1;)
alert icmp any any ‐> any any (msg:"[LIMIT] ICMP Echo Request";itype:8;threshold:typelimit, track by_src, count 3, seconds 10;sid:2001002;rev:1;)
alert icmp any any ‐> any any (msg:"[BOTH] ICMP Echo Request";itype:8;threshold:typeboth, track by_src, count 3, seconds 10;sid:2001003;rev:1;)
1-3 실습
다음과 같이 룰을 설정할 수 있다.
[root@server ~]# cat /etc/snort/rules/local.rules
alert icmp any any -> $HOME_NET any (msg:"ICMP TEST"; sid:10000001; rev:001;)
alert tcp any 22 -> $HOME_NET any (msg:"ssh test";content:"|535348|";sid:1000002;)
alert icmp any any -> $HOME_NET any (msg:"[THRESHOLD] ICMP Echo Request";itype:8;threshold:type threshold, track by_src, count 3, seconds 10;sid:1000003;rev:1;)
alert icmp any any -> $HOME_NET any (msg:"[LIMIT] ICMP Echo Request";itype:8;threshold:type limit, track by_src, count 3, seconds 10;sid:1000004;rev:1;)
alert icmp any any -> $HOME_NET any (msg:"[BOTH] ICMP Echo Request";itype:8;threshold:type both, track by_src, count 3, seconds 10;sid:1000005;rev:1;)
alert tcp any any -> $HOME_NET any (msg:"XMAS Scan Detected";flags:FPU;flow:stateless;sid:1000006;rev:1;)
alert tcp any any -> $HOME_NET any (msg:"FIN Scan Detected";flags:F;flow:stateless;sid:1000007;rev:1;)
alert tcp any any -> $HOME_NET any (msg:"SYN Scan Detected";flags:S;flow:stateless;threshold:type threshold, track by_dst, count 5, seconds 2;sid:1000008;rev:1;)
alert udp any any -> $HOME_NET any (msg:"UDP packet"; sid:1000009;rev:1;)
alert tcp any any -> $HOME_NET 80 (msg:"Att: SYN Flooding";flags: S;threshold: type threshold, track by_dst, count 10, seconds 1; sid:1000010;)
alert udp any any -> $HOME_NET any (msg:"ATT : UDP Flooding";threshold: type threshold, track by_dst, count 10, seconds 1; sid:1000011;)
alert icmp any any -> $HOME_NET any (msg:"ATT : icmp Flooding"; threshold: type threshold, track by_dst, count 10, seconds 1; sid:1000012;)
스노트 실행 후 다음과 같이 공격을 실행하여 패킷을 검출할 수 있다.
위의 환경은 nat에 가상으로 구축한 영역으로 12.19가 패킷을 볼 수 있으나, 실제 일반적인 네트워크 환경은 스위칭 허브 환경이므로 위와 같이 11.36에서 12.11로 보낸 패킷을 12.19에서 실제로는 모니터링이 불가하다.
실제 환경에서 모니터링하기 위해서는 스위칭허브의 포트미러링 기능을 사용하여 특정 포트로 온 패킷을 다른 포트로 복사해 보내줘야 모니터링이 가능하다.
'일일 정리' 카테고리의 다른 글
SQL 인젝션 방어 (1) | 2025.05.15 |
---|---|
SQL 인젝션 (1) | 2025.05.14 |
보안 장비 운용, IDS(Intrusion Detection System), IDS - snort (0) | 2025.05.09 |
리눅스 Firewall 설정 (0) | 2025.05.08 |
리눅스 Firewall (5) | 2025.05.02 |