Snort에 들어가기 앞서...
IDS/IPS의 기본 지식이 필요하기 때문에 기본 지식이 없다면 아래 글을 보고 오길 추천한다.
https://eatitstory.tistory.com/54
IDS와 IPS의 요약
IDS와 IPS는 네트워크 보안을 지키는 눈(IDS)과 손(IPS)
특징 | IDS | IPS |
주요 기능 | 공격 탐지 후 경고만 보냄 | 공격 탐지 후 자동으로 차단 |
비유 | 보안 카메라 | 자동문 잠금 장치 |
관리자 개입 필요 여부 | 필요 | 거의 필요 없음 |
장점 | 상세한 모니터링 가능 | 실시간으로 문제 해결 가능 |
단점 | 수동 대처 필요 | 오탐으로 인한 정상 활동 방해 가능 |
Snort와 IDS/IPS의 관계
- Snort는 기본적으로 IDS로 설계되었다. 즉, 네트워크 트래픽을 모니터링하고 문제가 감지되면 관리자에게 경고를 보내는 역할을 한다.
- 하지만 Snort는 추가 설정을 통해 IPS 기능도 제공할 수 있다. 이 경우, 네트워크 방화벽이나 정책 설정과 연동하여 자동으로 공격을 차단하도록 동작할 수 있다.
Snort의 개요
1998년 마틴 로슈(Martin Roesch)에 의해 개발된 Snort는 네트워크 침입 탐지 시스템(IDS, Intrusion Detection System)의 한 형태로, 주로 시그니처 기반 탐지를 수행한다.
1. 탄생 배경
- 90년대 후반, 웹 사용이 급증하면서 인터넷 환경에서의 보안 위협이 증가.
- 해커들이 악성 트래픽(DoS 공격, 악성 코드, 취약점 공격 등)을 이용해 시스템을 침해하는 사례가 급격히 늘어남.
- 네트워크 트래픽 속에서 공격 패턴이나 악성 활동을 탐지하기 위해 IDS가 필요해짐.
- Snort는 이러한 요구를 해결하기 위해 오픈 소스 기반으로 만들어진 IDS 도구로, 낮은 비용으로 강력한 네트워크 보안 기능을 제공
2. 활용 이유
- 공격 탐지를 위한 패턴 매칭 및 프로토콜 분석이 가능.
- 네트워크 트래픽을 실시간으로 모니터링하고, 의심스러운 활동을 관리자에게 알림.
- 확장성과 사용자 정의 규칙을 통해 다양한 환경에 적용 가능.
Snort의 주요 기능
- Sniffer 모드: 실시간 트래픽 모니터링을 통해 네트워크 상태 점검.
- Packet Logger 모드: 트래픽을 저장해 보안 감사 또는 침입 탐지의 사후 분석 자료로 활용.
- IDS/IPS 모드: 네트워크에서 발생하는 악의적인 활동(해킹 시도, 악성코드 다운로드 등)을 탐지 및 방지.
Snort의 동작 방식
Snort는 트래픽을 캡처하고, 단계별로 분석을 수행하여 의심스러운 활동을 탐지하거나 차단한다.
동작 단계
- 스니퍼(Sniffer)
- 네트워크 인터페이스에서 실시간 트래픽을 캡처.
- 네트워크 어댑터를 프로미스큐어스 모드로 설정해 모든 트래픽을 수집.
- 패킷 디코딩(Packet Decoding)
- 캡처된 패킷을 **OSI 모델 계층(2~4계층)**에 따라 분해.
- 출발지/목적지 IP, 포트, 프로토콜 정보를 추출.
- 전처리(Preprocessing)
- 데이터를 정리하고 탐지 우회를 방지하기 위한 처리 수행.
- 패킷 재조립: 조각난 패킷 복원.
- 프로토콜 노멀라이제이션: 비정상 데이터를 표준화.
- 탐지 엔진(Detection Engine)
- Snort 규칙(시그니처)과 트래픽을 비교하여 위협 여부 탐지.
- 탐지된 패킷은 경고를 생성하거나 로그에 기록.
- 경고 및 로그(Alert/Log)
- 탐지 결과를 경고 메시지로 출력하거나 로그 파일로 저장.
- IPS 모드에서는 트래픽을 차단하거나 연결을 종료.
Snort 시그니처(Snort Rules)
Snort 시그니처는 헤더(Header)와 옵션(Options)으로 구성되어 있다.
- 헤더(Header): 기본적인 탐지 조건(프로토콜, IP, 포트, 트래픽 방향 등)을 정의.
- 옵션(Options): 상세한 탐지 조건(내용 매칭, 패턴 분석, 경고 메시지 등)을 설정.
Snort 시그니처 형식
<동작> <프로토콜> <출발지 IP> <출발지 포트> -> <목적지 IP> <목적지 포트> (<옵션>)
<Rule Action> <Protocol> <Source IP> <Source Port> <Direction> <Destination IP> <Destination Port> (<옵션>)
헤더 구성 요소
헤더 구성 요소 | 설명 | 예시 |
Rule Action | 시그니처가 탐지 시 수행할 동작 | alert |
Protocol | 탐지할 네트워크 프로토콜 | tcp, udp, icmp |
Source IP | 트래픽의 소스 IP | any, 192.168.1.1 |
Source Port | 트래픽의 소스 포트 | any, 80 |
Direction | 탐지 트래픽의 방향 | -> (from source to destination) |
Destination IP | 트래픽의 목적지 IP | $HOME_NET, any |
Destination Port | 트래픽의 목적지 포트 | 80, 443 |
헤더 필드 설명
동작(Action)
- Snort가 규칙 조건을 만족하는 트래픽을 탐지했을 때 수행할 작업.
명령어 | 기능 | 설명 |
alert | 조건에 맞는 트래픽에 대해 경고 메시지 출력 | 탐지한 패킷에 대해 경고를 생성하여 설정된 출력 방식으로 전송. (syslog, 콘솔, 파일 등). |
log | 트래픽 정보를 로그 파일에 기록 | 탐지된 트래픽을 상세히 기록하여 분석 자료로 활용. (pcap 형식으로 저장 가능). |
pass | 트래픽을 무시하고 탐지를 수행하지 않음 | 특정 트래픽을 허용하거나 우선순위에서 제외할 때 사용. |
drop | 트래픽을 탐지하고 차단 (IPS 모드에서 사용) | 탐지된 트래픽을 패킷 차단 후 기록하지 않음. |
sdrop | 트래픽을 차단하고 상대방에게 응답하지 않음 | drop과 유사하지만, 탐지 기록도 생성하지 않아 은밀하게 차단 가능. |
reject | 트래픽을 차단하고 발신자에게 거부 메시지 전송 | drop과 달리 차단 후, 상대방에게 거부 응답 메시지(ICMP/특정 프로토콜)를 전송. |
Protocol (프로토콜)
- 탐지할 네트워크 트래픽의 프로토콜을 지정.
명령어 | 기능 | 설명 |
tcp | TCP 프로토콜 탐지 | HTTP, FTP, SSH 등 연결 기반 트래픽 탐지. |
udp | UDP 프로토콜 탐지 | DNS, SNMP, VoIP와 같은 연결 없는 트래픽 탐지. |
icmp | ICMP 프로토콜 탐지 | Ping 요청/응답 및 네트워크 상태 확인 메시지 탐지. |
ip | 모든 IP 기반 프로토콜 탐지 | TCP, UDP, ICMP 등 모든 IP 프로토콜에 대한 트래픽을 탐지. |
any | 모든 프로토콜 탐지 | 위의 모든 프로토콜을 포함하여 트래픽을 탐지. |
방향성(Direction)
- 트래픽의 방향을 지정.
명령어 | 기능 | 설명 |
-> | 출발지 → 목적지 트래픽 탐지 | 소스에서 목적지로 가는 트래픽만 탐지. |
< > | 출발지 ↔ 목적지 간의 모든 트래픽 탐지 | 양방향(출발지와 목적지 모두) 트래픽 탐지. |
Source/Destination IP 및 Port
- 탐지할 트래픽의 출발지/목적지 IP 주소를 설정.
명령어 | 기능 | 예시 | 설명 |
any | 모든 IP 또는 Port를 의미 | any | 특정 IP나 포트를 지정하지 않을 때 사용. |
[ ] |
여러 IP 주소를 목록으로 지정 | [192.168.1.1,10.0.0.1] | 리스트 형태로 IP 주소를 묶어서 정의. |
! | 부정 연산자로 특정 IP 또는 Port 제외 | ![192.168.1.1], !80 | 제외할 IP 또는 포트를 지정. |
포트번호 | 특정 포트 번호를 지정 | 80, 443 | 해당 포트 번호만 탐지. |
포트번호1:포트번호2 | 범위 내의 모든 포트 지정 | 1000:2000 | 1000번부터 2000번 포트까지 탐지. |
:포트번호 | 지정된 포트 이하 모든 포트 탐지 | :1024 | 1024번 이하 모든 포트 탐지. |
포트번호: | 지정된 포트 이상 모든 포트 탐지 | 1024: | 1024번 이상 모든 포트 탐지. |
$HOME_NET | 내부 네트워크 IP 주소 대체 변수 | $HOME_NET | Snort 설정에서 정의된 내부 네트워크 범위. (예: 내부망 IP를 지정할 때 사용) |
$EXTERNAL_NET | 외부 네트워크 IP 주소 대체 변수 | $EXTERNAL_NET | Snort 설정에서 정의된 외부 네트워크 범위. (예: 외부망 IP를 지정할 때 사용) |
$HTTP_SERVERS | 웹 서버의 주소 변수 | $HTTP_SERVERS | Snort 설정 파일에서 정의된 HTTP 서버 네트워크 주소를 사용. |
$SSH_SERVERS | SSH 프로토콜을 사용하는 장비의 IP 주소 변 | $SSH_SERVERS | Snort 설정 파일에서 정의된 SSH 서버 네트워크 주소를 사용. |
옵션
- Snort 규칙에서 Rule Option은 탐지 정확도를 높이는 데 중요한 역할을 하는 옵션이다.
- Rule Option은 일반 옵션, Payload 옵션, HTTP 옵션, 흐름 옵션으로 크게 구분된다.
- 각 옵션은 특정 조건을 지정하여 보다 정교하게 패킷을 탐지하거나, 탐지된 패킷에 대한 동작을 구체화하는 데 사용된다.
- 모든 옵션은 세미콜론(;)을 사용해 서로를 구분하고, 규칙 옵션 키워드는 콜론(:)을 사용해 인수(예: content:"GET"; 에서 "GET" 문자)와 구분한다.
일반 옵션 (General Options)
- 규칙에 대한 추가 정보를 제공하며, 패킷 매칭에는 영향을 미치지 않는 옵션이다.
명령어 | 기능 | 예시 |
msg | Snort 규칙이 탐지될 경우 출력되는 메시지. | msg:"악성 트래픽 탐지"; |
sid | Snort 규칙을 구별하는 식별자. 0~1,000,000번까지 예약된 식별자. | sid:1000001; |
rev | 규칙의 수정 버전. 수정할 때마다 1씩 증가. | rev:1; |
classtype | Snort 규칙을 분류하는 옵션. | classtype:attempted-recon; |
priority | 규칙의 우선 순위를 지정. 1~10까지 수치, 값이 작을수록 우선순위 높음. | priority:1; |
reference | 해당 규칙에 참고되는 URL 또는 문서 지정. | reference:url,www.example.com; |
Payload 옵션 (Payload Options)
- 패킷의 데이터를 분석하여 악성 패킷을 탐지하는 옵션이다.
명령어 | 기능 | 예시 |
content | 패킷 데이터에서 매칭할 문자열을 지정. | content:"abc"; => abc 문자열 탐지 |
nocase | 대소문자를 구분하지 않고 매칭. | content:"abc"; nocase; => 대소문자 구분없이 abc 탐지 |
offset | 매칭을 시작할 위치 지정 (0 바이트부터 시작). | offset:3; => 0/1/2/3 총4개 => 4byte부터 탐색 시작 |
distance | 이전 매칭 후 무시해야 할 바이트 수를 지정. | content:"abc"; content:"test"; distance:5; => abc 문자열 매칭 후 지점을 기준으로 5byte 이후 test 문자열 탐색 |
within | 매칭된 후 검색을 진행할 범위를 지정. | content:"abc"; content:"test"; within:5; => abc 문자열 매칭 후 지점을 기준으로 5byte 이내 test 문자열 탐색 |
pcre | 정규 표현식을 사용하여 패턴을 매칭. (정규 표현식 기반 패턴 탐지) | pcre:"/GET\s+/path/to/file/"; => "GET" 메소드와 그 뒤에 하나 이상의 공백이 있는 "/path/to/file" 경로를 찾는 규칙. |
HTTP 옵션 (HTTP Options)
- HTTP 프로토콜의 특정 부분에서만 패턴을 매칭할 때 사용하는 옵션이다.
명령어 | 기능 |
http_method | HTTP 메소드 영역에서 패턴을 매칭 |
http_uri | HTTP URI 영역에서 패턴을 매칭 |
http_raw_uri | 디코딩되지 않은 HTTP URI 영역에서 패턴을 매칭 |
http_cookie | HTTP 쿠키 값을 탐색 |
http_header | HTTP 헤더 영역을 요청/응답 구분 없이 탐색 |
http_raw_header | 디코딩되지 않은 HTTP 헤더를 탐색 |
http_client_body | HTTP 바디 영역을 탐색 |
http_stat_code | HTTP 응답 메시지의 상태 코드 탐색 |
http_stat_msg | HTTP 응답 메시지의 상태 메시지 탐색 |
흐름 옵션 (Flow Options)
- 패킷이 흐르는 방향을 지정하여 트래픽의 흐름을 제어하는 옵션다.
명령어 | 기능 | 예시 |
flow | 흐름 옵션을 사용할 때 필수로 지정해야 하는 옵션. | flow:to_server,established; |
to_client | 서버에서 클라이언트로 오는 패킷을 탐지 | to_client; |
from_server | 서버에서 클라이언트로 오는 패킷을 탐지 | from_server; |
to_server | 클라이언트에서 서버로 가는 패킷을 탐지 | to_server; |
from_client | 클라이언트에서 서버로 가는 패킷을 탐지 | from_client; |
established | 세션이 이미 성립된 패킷을 탐지 | established; |
stateless | 세션 여부와 관계없이 패킷을 매칭 | stateless; |
예시 시그니처
alert tcp $EXTERNAL_NET any -> $HOME_NET 80 (msg:"HTTP 공격 탐지"; content:"GET"; nocase; http_uri; offset:3; distance:5; content:"test"; within:5; sid:1000001; flow:to_server,established; rev:1;)
각 구성 요소의 설명:
- alert
- 동작 (Action): 조건을 만족하는 트래픽을 탐지하면 경고 메시지를 출력하는 규칙이다.
- tcp
- 프로토콜 (Protocol): TCP 프로토콜을 사용하는 트래픽을 탐지하는 규칙이다.
- $EXTERNAL_NET any -> $HOME_NET 80
- 출발지 IP: $EXTERNAL_NET은 외부 네트워크를 의미하며, any는 모든 출발지 IP를 의미한다.
- 출발지 포트: any는 모든 포트를 의미한다.
- 목적지 IP: $HOME_NET은 내부 네트워크를 의미한다.
- 목적지 포트: 80번 포트는 HTTP 기본 포트를 의미한다.
- (msg:"HTTP 공격 탐지";
- msg: 트래픽이 매칭되면 "HTTP 공격 탐지"라는 메시지를 출력하는 규칙이다.
- content:"GET";
- content: 패킷 데이터에서 "GET"이라는 문자열을 찾는 규칙이다.
- nocase;
- nocase: "GET" 문자열을 대소문자 구분 없이 탐지하는 규칙이다.
- http_uri;
- http_uri: 패킷의 HTTP URI 부분에서 "GET" 문자열을 찾는 규칙이다.
- offset:3;
- offset: 패킷 데이터의 첫 3바이트를 건너뛰고, 4바이트부터 "GET" 문자열을 탐지하는 규칙이다.
- distance:5;
- distance: "GET" 문자열이 매칭된 후, 5바이트를 건너뛰고 "test" 문자열을 탐지하는 규칙이다.
- content:"test";
- content: "GET" 문자열 뒤에 "test"라는 문자열을 찾는 규칙이다.
- within:5;
- within: "GET" 문자열과 "test" 문자열 사이의 거리가 5바이트 이내여야 매칭되는 규칙이다.
- sid:1000001;
- sid (Signature ID): 이 규칙의 고유 식별자 1000001을 의미하며, 규칙을 구별하는 데 사용되는 규칙이다.
- flow:to_server,established;
- flow: 패킷의 흐름을 지정하는 규칙이다.
- to_server: 클라이언트에서 서버로 가는 트래픽을 탐지하는 규칙이다.
- established: 이미 세션이 성립된 상태에서 발생하는 트래픽을 탐지하는 규칙이다.
- rev:1;)
- rev: 이 규칙의 버전 1을 의미하며, 최초 버전임을 나타내는 규칙이다.
참고자료
https://maker5587.tistory.com/24
https://medium.com/@acaremrullahkku/what-is-snort-547916bece5f
https://www.youtube.com/watch?v=QzYerZ7hDrM
https://net123.tistory.com/579
ppt
'Security > 보안관제' 카테고리의 다른 글
악성코드 샘플 분석3(상) (0) | 2024.12.27 |
---|---|
Snort 환경 구성 (1) | 2024.12.01 |
악성코드 샘플 분석2 (0) | 2024.11.10 |
악성코드 샘플 분석 (0) | 2024.11.03 |
정적, 동적 Tool 실습 (4) | 2024.10.26 |