본문 바로가기
Security/정보보안기사

[정보보안기사] #6. SNORT 정의(개념)와 기본 사용법(예제)

by 이미존재 2022. 11. 14.
반응형

■ SNORT의 정의와 기본 사용법

► snort는 정보보안 기사에서 가장 많이 다루어지는 주제 중 하나입니다.
► 단답형 문제는 물론 서술형 실무형에서도 다루어지며, 특히 정책 설정과 그 결과를 토대로 실무형 문제들이 출제되곤 합니다.
► snort의 내용은 방대하며 책 한 권은 금방 만들어내는 양입니다. 이번 포스트에서는 시험 위주의 정의와 정책에 대해서 확인해보도록 하겠습니다.

SNORT 홈페이지 https://www.snort.org

 

1. 출제 예제

 1) snort 정의에 대해 답하기

[보기]
( A )는 1998년 SourceFire사의 최고기술경영자(CTO) Martin Roesch에 의해 발표된 오픈소스 침입탐지시스템으로서 오늘날까지 침입탐지시스템의 대명사로 사용되고 있다. 이 시 스템의 패턴매칭 방법은 ( B ) 비교방법과 ( C )비교방법이 있으며, ( C )은/는  ( B )에 비해 속도가 느리지만 유연한 패턴매칭을 제공한다.


 2) snort와 비교 솔루션

다음 ( )에 들어갈 용어를 기술하시오.
( A )는 오픈소스 IDS/IPS로 기존의 ( B )의 장점을 수용하고, 대용량 트래픽을 실시간으로 처리하는데 특화된 소프트웨어 이다.
(A) 수리카타(Suricata), (B) 스노트(Snort)


 3) snort 설정 예제 빈칸 채우기

다음 snort 룰(rule)은 10번째 바이트부터 2바이트 범위에 FFFF 바이너리 패턴(헥사값)이 있는지 검사하기 위한 룰이다. 빈 칸에 알맞은 내용을 채우시오.
[보기]
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"TEST"; ( A ):|FFFF|; ( B ):9; ( C ):2; sid:10000001)


 4) snort의 정책 및 로그 결과로 공격 분석하기

오픈 소스 암호화 라이브러리의 취약점으로 서버에 저장된 중요 메모리 데이터가 노출되는 심각한 버그가 발견되어 시스템 및 소프트웨어에 대한 신속한 취약점 조치가 권고되고 있다. 이를 탐지하기 위한 snort 룰(rule)은 아래와 같다. 다음 질문에 각각 답하시오.
alert tcp any any < > any
[443,465,563,636,695,898,989,990,992,993,994,995,2083,2087,2096,2484,8443,8883,9091]
(content:"|18 03 00|"; depth: 3; content:"|01|"; distance: 2; within: 1;
content:!"|00|"; within: 1; msg: "          (1)            "; sid: 1;)
alert tcp any any < > any
[443,465,563,636,695,898,989,990,992,993,994,995,2083,2087,2096,2484,8443,8883,9091]
(content:"|18 03 01|"; depth: 3; content:"|01|"; distance: 2; within: 1;
content:!"|00|"; within: 1; msg: "      (1)             "; sid: 2;)
alert tcp any any < > any
[443,465,563,636,695,898,989,990,992,993,994,995,2083,2087,2096,2484,8443,8883,9091]
(content:"|18 03 02|"; depth: 3; content:"|01|"; distance: 2; within: 1;
content:!"|00|"; within: 1; msg: "          (1)                 "; sid: 3;)
(1) 취약점 이름은 무엇인가?
(2) 보안장비를 이용하지 않고 해당 취약점을 해결할 수 있는 방안을 2가지 서술하시오.

 


2. SNORT의 정의

 1) snort 홈페이지( snort.org)
  - 오픈 소스 침입 방지 시스템(IPS)입니다. Snort IPS는 악의적인 네트워크 활동을 정의하는 데 도움이 되는 일련의 규칙을 사용하고 이러한 규칙을 사용하여 일치하는 패킷을 찾고 사용자에 대한 경고를 생성합니다.
이러한 패킷을 중지하기 위해 Snort를 인라인으로 배포할 수도 있습니다. 
  - 스노트는 크게 세 가지 용도가 있습니다. tcpdump와 같은 패킷 스니퍼, 패킷 로거, 네트워크 트래픽 디버깅에 유용하거나 완전한 네트워크 침입 방지 시스템으로 사용될 수 있습니다.
 2) 위키백과
  - 스노트(Snort)는 자유-오픈 소스 네트워크 침입 차단 시스템(NIPS: Network Intrusion Prevention System)이자, 네트워크 침입 탐지 시스템(NIDS: Network Intrusion Detection System)으로서, 마틴 로시가 1998년에 개발하였다. 스노트는 현재 로시가 창립자이자 개발자인 Sourcefire에 의해 개발되고 있습니다. (위키백과)

 3) KISA 자료
  - nort는 “sniffer and more"라는 말에서 유래되었는데, 처음 공개되었을 때는 코드도 얼마 되지 않는 단순한 패킷 스니퍼 프로그램이었습니다. 
  - 이후 현재의 IDS와 같이 rule을 이용한 분석 기능이 추가되고, 커뮤니티를 통하여 계속적인 기능 보완과 향상을 통해 지금과 같이 다양한 기능과 탁월한 성능을 갖춘 프로그램이 되었으며 지속적인 업그레이를 제공하고 있습니다.


3. SNORT의 기능과 용도

1) snort의 기능
  - 패킷 스니퍼 모드
  - 패킷 로거 모드
  - 침입 탐지 시스템 모드
  - 침입 차단 시스템 모드

 2) Snort의 용도
  - 패킷 Sniffer / Logger
  : 네트워크의 패킷을 읽고 출력하는 기능, 모니터링 한 패킷을 저장하고 로그에 남기는 기능을 제공.
  2)-1. 옵션

-v : Snort를 패킷 Sniffing 모드로 동작(TCP)
-d : 모든 네트워크 계층을 포함.
-e 데이터 링크 계층 헤더를 포함.

  2)-2. IDS 종류
   - NIDS: 해당 네트워크 망 내에서 트래픽을 분석하여 공격을 탐지하는 기능을 제공.
   - HIDS: 호스트를 기반으로 한 IDS
   - DIDS: 여러 원격지 센서가 중앙관리 스테이션에게 정보를 보내는 형태

 


4. Snort Rule과 구조

 1) snort rule
   - 공격자의 공격을 탐지하기 위한 등록된 규칙(패턴)입니다.
   - 수신되는 패킷은 Rule과 비교해서 탐지 여부를 결정합니다.
   - Rule은 Rule Header와 Rule Option으로 구성되고 Rule Header는 Action Protocol , IP주소 , 포트 등으로 구성되고 Rule Option 은 탐지할 조건으로 구성됩니다.

 2) snort 구조
  2)-1. 스니퍼(Sniffer)
   - Sonrt는 네 가지 요소로 구성이 되어 있습니다.
     : 패킷 -> (Sniffer -> Preprocessor -> Detection Engine -> Alert/Logging) -> 로그파일
   - 네트워크 인터페이스에 입력되는 패킷을 수신받습니다.
   - Nomal Mode에서 패킷은 목적지 MAC 주소가 자신의 MAC 주소와 동일한 것 만 수신받기 때문에 탐지를 할 수가 없습니다. 스니퍼는 Promiscuous Mode(무차별 모드)로 동작합니다.

  2)-2. 전처리기(Preprocessing)
   - 입력되는 패킷에 대해서 특정 행위가 탐지될 경우 탐색 엔진으로 전송합니다.
   - 프로토콜의 종류별로 검사 여부를 결정할 수 있습니다.
  2)-3. 탐색 엔진(Detection Engin)
   - 등록된 Rule과 동일한지 여부를 확인하는 규칙 기반 패턴 검색을 실행합니다.
  2)-4. 경고(Alert 및 로깅)
   - 탐지된 정보에 대해서 로그파일 , 네트워크 , SNMP 프로토콜 등으로 그 결과를 전송합니다.
   - 로그파일에 기록하거나 등록된 데이터베이스에 입력합니다.


5. SNORT의 시그니처(Signiture)

 - snort 시그니처(signature)는 룰 헤더(Rule Header)와 룰 옵션(Rule Option)으로 구성된 룰을 말합니다.
 - 룰 헤더는 처리 방법 , 프로토콜 , IP주소 및 포트번호 등으로 구성되어서 탐지하는 대상을 의미합니다.
 - 룰 옵션은 탐지하는 세부적인 조건을 정의합니다.

alert tcp any any -> any any | (msg: "detection!!" ; sid:100000491;)
| 를 기준으로 왼쪽이 룰 헤더 , 오른쪽이 룰 옵션 이다. 


6. 룰 헤더 (Rule Header)

 1) 처리 방법(action)
  - action은 패킷을 처리하는 방법으로 의미하며 alert , log , activate , dynamic 으로 구성되어 있습니다.
  - action 종류

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


 2) 프로토콜(Protocol)
  - 프로토콜은 TCP , UDP , IP , ICMP의 프로토콜 설정을 하면 해당 프로토콜을 탐지(Detection) 합니다.

 3) IP주소와 포트번호
  - 송신자와 수신자의 IP주소와 포트번호이다. IP주소는 서브넷 마스크(Subnet Mask)와 함께 설정이 가능하며 서브넷 마스크와 함께 설정하는 경우는 IP주소 / 24와 같은 형태로 사용합니다.

 4) Direction
  - Direction 은 패킷의 방향을 의미하는 것으로 " -> "으로 설정하면 왼쪽은 송신자 정보 , 오른쪽은 수신자 정보가 됩니다. 만약 송신자와 수신자를 구별하지 않고 전송되는 모든 패킷을 탐지하려면 "<>"로 사용하면 됩니다.

 


7. 룰 옵션 (Rule Option)

 - 룰 옵션은 세부적인 탐지 조건을 설정하는 부분으로 Snort는 매우 많은 세부적인 조건을 설정할 수 있습니다. 탐지 조건을 여러 개 설정할 때는 각 조건마다 세미콜론 (;)을 넣어서 조건을 구분합니다.

alert tcp any any -> any any | (msg: "detection!!" ; sid:100000491;)

 

옵션 내용
msg alert 발생하면 msg 설정된 문장을 로그파일에 기록
sid 시그니처 아이디를 지정하는 것으로 0~99 예약되어 있고 100~1,000,000 snort.org에서 공식적으로 배포하는
1,000,000
이상의 값으로 사용자가 지정해서 사용
dsize 버퍼 오버플로우를 탐지할 자주 사용
전송되는 패킷의 사이즈를 식별 있어서 dsize보다 작은 값에 대한 설정이 가능
범위 지정 : dsize100<>500 -> 100에서 500바이트 패킷 탐지
nocase 패턴을 매칭할 대문자와 소문자를 구분하지 않음


 1) content
  - 전송하는 페이로드(Payload)를 검색해서 지정한 문자열이 있는지 확인하는 옵션입니다.

  - 검색 문자열 지정은 단순 문자열과 바이너리 문자열로 지정할 수 있습니다.

  - 단순 문자열은 대문자와 소문자를 구분합니다.

  - 바이너리 문자열은 16진수를 사용해서 지정해야 합니다.

구분 내용
텍스트 content: "/bin/bash";
바이너리 16진수로 표현하고 " | " 둘러싸야 함.
content: " | 00 01 02 AA AB AF | ";
혼합 content: "| AA AB AF | /bin/bash";
예제) 사용자가 berasix.tistory.com을 웹 브라우저로 접근하거나 nslookup을 사용해서 nslooup berasix.tistory.com 을 실행하면 탐지하는 룰을 작성하라.

alert tcp any any -> any any (msg:"Berasix Detection!" ; content: "berasix" ; nocase ; sid:100000111;)

  - 패턴 매칭 옵션

옵션 내용 예제
! 입력한 일치하지 않으면 탐지한다. content: !"google";
| hax 표현할때 사용한다. content: "| 30 |";
\ 특수 기호를 탐지할 사용된다. content: "\" google\|";


 2) flags
  - TCP 프로토콜에서 제어 플레그(Control Flags)를 지정하는 것으로 SYN,FIN,URG,ACK 등을 지정할 수가 있습니다.

  - SYN flag는 flags: S로 지정하고 , SYN과 FIN을 모두 탐지하고 싶으면 flags:SF라고 지정하면 됩니다.

alert tcp any any -> any 80 (msg: "TCP SYN and FIN";flags:SF;sid:100000777;)


 3) flow
  - TCP를 재조립하여 동작하는 것으로 TCP로 연결이 확립된 세션을 탐지하기 위해서 established를 지정합니다.

  - to_server , to_client , from_server , from_client를 사용해서 전송되는 곳을 지정할 수가 있습니다.

  - TCP로 연결되어서 서버로 전송되는 패킷을 지정한다면 flow:to_server , established; 로 지정하는 방식입니다.

alert tcp any any -> any 80 (msg:"TCP Connetcion" ; flow:established; sid:10000791;)


 4) itype과 inode
  - ICMP 프로토콜로 오류를 감시할 때 ICMP는 ICMP Echo Request를 전송하고 ICMP Echo Reply로 응답을 받아서 네트워크 오류를 확인합니다. ICMP 헤더에는 Type이라는 헤더가 있는데 Type 값이 0 이면 ICMP Echo Reply이고 8이면 ICMP Echo Request를 의미합니다.

alert icmp any any -> any any (itype: 0 ; msg "ICMP echo Reply" ; sid:1000000797;)


 5) sameip
  - 송신자와 수신자의 IP 주소가 동일한 것을 탐지하기 위해서 sameip 옵션을 사용할 수가 있습니다.
  - Land Attack 탐지 룰

alert tcp any any -> 192.168.48.129/24 (msg:"Land Attack!"; sameip;)

 

 6) session
  - TCP를 사용하는 POP3 프로토콜의 세션 정보를 로그에 기록하는 시그니처를 확인하면 로그기록을 위해서 action으로 log를 지정하고 POP3는 110 TCP 포트를 사용하므로 110 포트를 지정합니다. 룰 옵션으로는 session:printable을 사용해야 합니다.

log tcp any any -> any 110 (session:printable;)


 7) threshold

  - 시험에 자주 나오는 부분입니다.
  - threshold는 동일한 특정 패킷에 대해서 설정한 시간 내에 일정 수가 발생하면 탐지하는 것으로 무작위 공격(Brute Force)을 탐지하는 데 사용할 수 있습니다.

threshold:type[limit,threshold,both] , track[by_src,by_dst] , count[],seconds[]

  - threshold 옵션

구분 내용
both seconds마다, count 동안 횟수만큼 트래픽이 탐지 시에 한번만 탐지
threshold seconds마다, count 횟수에 해당시 마다 계속 탐지한다.
limit seconds마다, count 동안에 횟수 번째 트레픽까지 계속 탐지한다.
by_src 출발지 패킷만 탐지한다.
by_dst 목적지 패킷만 탐지한다.

예제) ICMP 패킷이 20초 동안 5번 발생하면 한 번씩 경고 메시지를 기록한다.

alert icmp any any -> any any (msg:"ICMP";threshold:type both,track by_src,count 5,seconds 20; sid:100000747;


 8) depth
  - 패킷 중 n번째 자리(바이트)까지
예제) 모든 네트워크 대역에서 Telnet으로 접속하는 패킷 중 14번째 자리까지'anonymous'가 포함된 트래픽에 대해서 
'Dangerous' 메시지로 경고

alert tcp any any -> any 23 ( msg:"Dangerous";content:"anonymous";depth:14;sid:1000001;)


 9) offset, distance, within 등 검색 위치 옵션
  - 검색을 시작할 패킷의 특정 위치를 지정
예제) 패킷의 처음부터 검색을 진행하여 test를 포함 시

(②content:"|18 03 00|"; offset:0; depth: 3; ③content:"|01|"; distance: 2; within: 1; ④content:!"|00|"; within: 1; ⑤msg: "SSLv3 Malicious Heartbleed Request V2";sid: 1;)
 : 페이로드 0바이트부터(offset:0) 시작하여 3바이트(depth: 3)까지 바이너리 형식 |18 03 00| 검색
 : 페이로드에서 이전 검색 매칭 후 2바이트 이후(distance: 2) 1바이트 이내(within: 1) 바이너리 형식 |01| 검색
 : 페이로드에서 이전 검색 매칭 후 1바이트 이내(within: 1) 바이너리 형식 |01|이 아닌것(!) 검색

 

옵션   설명 
nocase   /소문자 구분 하지 않음
rawbytes   decode하지 않은 raw data 매칭 시도
offset   payload에서 패턴 매칭을 시작 위치 지정
depth   payload에서 패턴 매칭을 위치 지정
distance   이전 content 매칭된 경우, 패턴 매칭을 시작할 상대 위치 지정
within   이전 content 매칭된 경우, 패턴 매칭을 상대 위치 지정  
http_client_body   HTTP body 부분에 대해 패턴 매칭 시도
http_cookie   HTTP cookie 부분에 대해 패턴 매칭 시도
http_raw_cookie   HTTP cookie decode하지 않은 부분에 대해 패턴 매칭 시도
http_header   HTTP header  부분에 대해 패턴 매칭 시도
http_raw_header  HTTP header  decode하지 않은 부분에 대해 패턴 매칭 시도
http_method   HTTP method  부분에 대해 패턴 매칭 시도
http_uri   HTTP uri  부분에 대해 패턴 매칭 시도
http_raw_uri   HTTP uri  decode하지 않은 부분에 대해 패턴 매칭 시도
http_stat_code   HTTP response 패킷의 stat code 부분에 대해 패턴 매칭 시도
http_stat_msg   HTTP response 패킷의 stat msg 부분에 대해 패턴 매칭 시도
fast_pattern   longest pattern 지정 - keyword처럼 동작함


  - 케이스  설정의 예

 케이스  
root 로그인 시도/성공 탐지 # FTP root 로그인 시도 탐지
alert tcp any any -> 10.10.10.0/24 21 (msg: "FTP root user access"; content: "USER root"; nocase; sid: 100100;) 
# Telnet root
로그인 성공 탐지
alert tcp 10.10.10.0/24 23 -> any any (msg: "Telnet root login sucess"; content "login"; pcre: "/root@.*#/"; nocase; sid: 100110;) 
온라인 패스워드 크래킹 공격 탐지
# Telnet
alert tcp 10.10.10.0/24 23 -> any any (msg: "Telnet login brute force attack"; content "Login incorrect"; nocase; threshold:type limit, track by_dst, count 1, seconds 5; sid: 100120;)
# FTP 
alert tcp 10.10.10.0/24 21 -> any any (msg: "FTP login brute force attack"; content "Login incorrect"; nocase; threshold:type threshold, track by_dst, count 5, seconds 30; sid: 100130;)
# SSH
alert tcp any any -> 10.10.10.0/24 22 (msg: "SSH login brute force attack_Binary"; content "|53 53 48 2d 32 2e 30|"; nocase; threshold:type both, track by_src, count 5, seconds 30; sid: 100140;)
또는
alert tcp any any -> 10.10.10.0/24 22 (msg: "SSH login brute force attack_Text"; content "SSH-2.0"; nocase; threshold:type both, track by_src, count 5, seconds 30; sid: 100150;)
플러딩 계열 공격 탐지 HTTP GET 플러딩 공격 탐지 alert tcp any any -> 10.10.10.0/24 80 (msg: "HTTP Get Flooding attack"; content: "GET / HTTP/1."; depth: 13; nocase; threshold:type threshold, track by_src, count 100, seconds 1; sid:100160;)
TCP SYN 플러딩 공격 탐지 alert tcp any any -> 10.10.10.0/24 80 (msg: "TCP SYN Flooding attack"; flags: S; threshold:type threshold, track by_src, count 5, seconds 1; sid:100170;)
UDP/ ICMP 플러딩 공격 탐지 alert udp any any -> $HOME_NET any (msg: "UDP Flooding attack"; threshold:type threshold, track by_src, count 5, seconds 1; sid:100180;)
alert icmp any any -> $HOME_NET any (msg: "ICMP Flooding attack"; threshold:type threshold, track by_src, count 5, seconds 1; sid:100190;)
비정상 IP 패킷 탐지 인터넷 구간의 사설 IP alert udp 10.0.0.0/8 any -> $HOME_NET any (msg: "Private IP(10.) Detect"; sid:100200;)
alert udp 172.16.0.0/12 any -> $HOME_NET any (msg: "Private IP(172.) Detect"; sid:100210;)
alert udp 192.168.0.0/16 any -> $HOME_NET any (msg: "Private IP(192.) Detect"; sid:100220;)
출발지와 목적지가 동일한 IP alert ip any any -> $HOME_NET any (msg: "Land Attack Detect"; sameip; sid:100230;)
비정상 TCP 패킷 SYN FIN alert tcp any any -> 10.10.10.0/24 any (msg: "SYN_FIN Scan Detect"; flags:SF; sid:100240;)
SYN FIN 변형 alert tcp any any -> 10.10.10.0/24 any (msg: "SYN_FIN+ Scan Detect"; flags:SF+; sid:100250;)
FIN스캔 alert tcp any any -> 10.10.10.0/24 any (msg: "FIN Scan Detect"; flags:F; sid:100260;)
NULL스캔 alert tcp any any -> 10.10.10.0/24 any (msg: "NULL Scan Detect"; flags:!UAPRSF; sid:100260;)


 10) PCRE(Perl Compatable Regular Expression) : Perl 기반의 정규 표현 

alert tcp any any -> any 80 (msg:"Detect Social security Number"; content:"SSN"; pcre:"/[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1,2][0-9]|3[0,1])-[1-4][0-9]{6}/"; sid:1000132;)

※ pcre의 시작과 끝은 /로 구분합니다. 주민등록번호 규칙과 pcre 옵션은 다음과 매핑됩니다.

주민번호 규칙 PCRE 옵션
1) 연도 2자리 : 모든 숫자 가능 [0-9]{2} : [0~9] 하나의 숫자가 {2} 반복
2) 2자리 : 01 ~ 12까지 가능 (0[1-9]|1[0-2]) : 01~09 또는(|) 10~12 가능
3) 2자리 : 01 ~ 31까지 가능 (0[1-9]|[1,2][0-9]|3[0,1]) : 01~09 또는(|) 10~19, 20~29 또는(|) 30~31
- -
4) 성별 : 내국인은 1~4까지 가능 [1-4] : 1~ 4까지 가능
5) 지역번호(4자리)+접수번호(1자리)+검증번호(1자리) : 모든 숫자 가능 [0-9]{6} : 0~9 하나의 숫자가 {6} 반복


 11) Flag에 일부 제어 비트(FIN, PSH, URG) 또는 전체 제어 비트를 설정한 패킷을 탐지합니다.

Flag 옵션 설명
Flags : FS 연산자가 없는 경우는 FIN, SYN 설정된 패핏을 탐지
Flags : FS+ +연산자가 있는 경우는 FIN, SYN 반드시 포함하고, 다른 플래그도 설정된 패킷 탐지
Flags : FS* *연산자가 있는 경우는 FIN 또는 SYN 포함하고, 다른 플래그도 설정된 패킷을 탐지
Flags : !FS !연산자가 있는 경우는 FIN, SYN 포함하지 않은 패킷을 탐지




728x90

댓글