SNORT(스노트)란?
- 오픈소스 기반의 네트워크 기반 탐지 시스템(IDS)
- 실시간 트래픽 분석&IP에서의 패킷 로깅을 수행+프로토콜 분석+내용 검색&매칭 수행
- 1998년 Matin Roesch(마틴 로시)가 만듦
- 조사나 공격 탐지 시 사용 가능함 → TCP/IP 스택 핑거프린팅, 공용 게이트웨이 인터페이스, 버퍼 오버플로, 서버 메시지 블록 조사, 스텔스 포트 스캔 등
Snort의 기능
- 스니퍼 모드(Sniffer Mode): 네트워크 인터페이스의 패킷을 읽고 스니핑하여 보여줌.
- 패킷 로거(Packet Logger): 수집한 패킷에 대한 로그를 저장함.
- 네트워크 침입 탐지 모드: 네트워크 트래픽을 사용자에 의해 정의된 규칙에 의해 탐지되는지 분석함.
Snort의 용도
- 패킷 스니퍼/ 로거: 네트워크의 패킷을 읽고 출력하는 기능 & 모니터링한 패킷을 저장하고 로그에 남기는 기능 제공함.
- 옵션
-
- -v: Snort를 패킷 스니핑 모드로 동작(TCP)
- -d: 모든 네트워크 계층을 포함
- -e: 데이터 링크 계층 헤더를 포함
-
- IDS 종류: NIDS(해당 네트워크 망 내에서 트래픽을 분석하여 공격을 탐지하는 기능 제공), HIDS(호스트 기반 IDS), DIDS(여러 원격지 센서가 중앙관리 스테이션에게 정보를 보내는 형태)
Snort Rule과 구조
Snort Rule
- 공격자의 공격을 탐지하기 위한 등록된 패턴(규칙)
- 수신되는 패킷은 Rule과 비교해서 탐지 여부를 결정함
- Rule Header와 Rule Option으로 구성됨
Snort 구조
- 스니퍼(Sniffer)
- 4가지 요소로 구성되는데, 패킷→ (Sniffer→ Preprocessor→ Detection Engine → Alert/Logging) → 로그파일
- 네트워크 인터페이스에 입력되는 패킷 수신받음
- Normal Mode: 패킷이 목적지 MAC 주소가 자신의 MAC주소와 동일한 것만 수신받아서 탐지 불가. 스니퍼는 프로미스큐어스 모드(무차별 모드)로 동작함
- 전처리기(Preprocessing)
- 입력되는패킷에 대해 특정 행위가 탐지될 경우 탐색 엔진으로 전송함
- 프로토콜의 종류별로 검사여부 결정 가능
- 탐색 엔진(Detection Engine)
- 등록된 Rule과 동일여부 확인하는 규칙 기반 패턴 검색 실행함
- 경고(Alert 및 로깅)
- 탐지된 정보에 대해서 로그파일, 네트워크, SNMP 프로토콜 등으로 결과 전송함
- 로그파일에 기록하거나 등록된 데이터베이스에 입력함
** SNMP : SNMP(Simple Network Management Protocol)는 UDP(Port 161)을 사용하여 장비의 정보를 수집. 네트워크 장비의 성능과 핵심 기능의 현 상태/기능 정보를 수집, 관리, 저장할 수 있는 프로토콜
Snort 룰
- Rule Header 와 Rule Option으로 구성됨.
Rule Header
| 액션 | 프로토콜 | 송신 IP | 송신 Port | 방향 | 수신 IP | 수신 Port | 룰 옵션 |
| 탐지 후 행동들 | 탐지 프로토콜 | 출발 IP | 출발 Port | 방향 | 목적 IP | 목적 포트 |
Action: 탐지 후 행동들
- alert : 경고를 발생시킴
- log : 로그 기록
- pass : 패킷을 무시
- active : alert를 발생& 대응하는 dynamic을 유효화함
- dynamic : active에 의해 유효화된 경우 한쪽의 패킷을 기록함
- drop : 패킷을 차단하고 기록함
Protocol: 탐지 할 프로토콜 종류
- TCP, UDP, ICMP, IP
송신 IP & PORT
- any : 모든 포트
- 포트번호 : 특정 포트
- 포트번호:포트번호 : 포트번호 ~ 포트번호
- 포트번호 : 포트번호 이하 모든 포트
- 포트번호: : 포트번호 이상 모든 포트
Direction
- → : 출발지 -> 목적지 패킷 탐지
- -<> : 출발지 목적지 사이 모든 패킷 탐지
Rule Body
- 룰 바디는 룰 헤더에서 지정한 조건이 충족될 때, 추가적인 세부 조건을 정의하고 그에 따라 수행할 작업을 기술한다. 룰 바디는 주로 옵션(options)이라고 불리는 여러 개의 구성 요소로 이루어져 있는데, 각 옵션은 key:value; 형식으로 지정된다.
- 패킷 탐지 사용자 설정
- 세미콜론(;)을 이용하여 옵션과 옵션을 구분
**룰 바디의 주요 옵션들
일반옵션 설정
- msg (Message):
- 룰이 트리거될 때 생성되는 알림 메시지를 정의.
- 예: msg:"Possible port scan detected";
- sid (Snort ID):
- 룰의 고유 식별자. Snort 규칙에 고유 번호를 부여하여 관리.
- 예: sid:1000001;
- rev (Revision):
- 룰의 개정 번호를 지정. 룰이 업데이트될 때마다 rev 값이 증가.
- 예: rev:1;
페이로드 범위 설정
- classtype:
- 탐지된 이벤트의 분류를 정의. Snort 규칙에는 여러 클래스 타입이 있으며, 이를 통해 이벤트의 심각도를 나타낼 수 있다.
- 예: classtype:attempted-recon;
- content:
- 패킷 페이로드에서 특정 문자열을 탐색. 바이너리 또는 ASCII 문자열을 검색할 수 있으며, 다양한 옵션을 조합하여 정교한 검색이 가능.
- 예: content:"/etc/passwd";
- pcre:
- 정규 표현식을 사용하여 패킷 페이로드에서 특정 패턴을 탐색. pcre는 강력한 패턴 매칭을 제공하며, 다양한 조건을 표현할 수 있다.
- 예: pcre:"/user|pass/";
- uricontent:
- HTTP 요청 URI에서 특정 문자열을 검색 할 수 있다. 웹 공격 탐지에 유용.
- 예: uricontent:"/admin";
- nocase:
- 대소문자를 구분하지 않고 문자열을 검색. content 또는 uricontent와 함께 사용.
- 예: content:"user"; nocase;
- offset, depth:
- 검색 시작 위치와 검색 깊이를 지정. 패킷의 특정 부분에서만 검색을 수행할 때 유용.
- 예: content:"example"; offset:4; depth:10;
- isdataat:
- 페이로드의 특정 위치에 데이터가 존재하는지 검사. 이는 TCP 스트림의 특정 오프셋에서 데이터 존재 여부를 확인할 때 사용.
- 예: isdataat:100,relative;
- flow:
- 패킷의 방향성(예: from_client, from_server)을 지정. 세션 흐름의 방향을 지정하여 양방향 통신을 분석할 수 있다.
- 예: flow:from_client,established;
- dsize:
- 페이로드의 크기를 지정하여 특정 크기의 데이터를 검사.
- 예: dsize:<100;
- threshold : 패킷의 발생량을 기반으로 탐지함.아직까지 흔히 사용 되고 있지만 공식적으론 사용을 권장X. 비슷한 기능을 하진 detection_filter 사용이 권장됨.
- type limit(로그발생기준: 임계값), threshold(로그발생기준: 패킷량), both(로그발생기준: IP)
- track by_src , by_dst
- count n : number events used by the thresholding
- seconds m : time period over which count is accrued.
Snort 예제)
alert tcp any any -> any 22 (msg:"SSH Brute Force Attack";
content:"SSH-2.0"; nocase; threshold:type both, track by_src, count 5, seconds 30; sid:1000001;)
룰 헤더
- alert:
- 이 룰의 동작을 지정. alert는 매치가 될 때 경고 메시지를 생성하도록 설정.
- tcp:
- 이 룰이 적용될 프로토콜을 지정. 여기서는 TCP 프로토콜을 감시.
- any any -> any 22:
- any any: 출발지 IP 주소와 포트를 나타낸다. any any는 모든 IP 주소와 모든 포트에서 오는 트래픽을 의미한다.
- ->: 방향을 나타낸다. 여기서는 출발지에서 목적지로 향하는 트래픽을 감시한다.
- any 22: 목적지 IP 주소와 포트를 나타낸다. any 22는 모든 IP 주소의 포트 22로 향하는 트래픽을 의미한다. 포트 22는 일반적으로 SSH 서비스가 사용하는 포트.
룰 바디
- msg:"SSH Brute Force Attack":
- 룰이 트리거될 때 생성되는 경고 메시지. 이 메시지는 관리자가 경고를 받을 때 알림으로 표시된다. 여기서는 "SSH Brute Force Attack"이라는 메시지를 지정하여 SSH 브루트 포스 공격을 의미.
- content:"SSH-2.0":
- 패킷의 페이로드에서 "SSH-2.0"이라는 문자열을 찾는다. 이 문자열은 SSH 연결이 초기화될 때 사용하는 프로토콜 버전 식별자. 이 부분은 SSH 통신이 발생했음을 확인하는 역할을 한다.
- nocase:
- 대소문자를 구분하지 않고 문자열을 검색하도록 지정. 이 경우, "SSH-2.0"이라는 문자열이 대문자, 소문자 등 다양한 형태로 나타날 수 있으므로, 이를 구분하지 않고 탐지한다.
- threshold:type both, track by_src, count 5, seconds 30:
- 이 옵션은 탐지의 임계값을 설정한다. SSH 브루트 포스 공격은 일반적으로 여러 번의 로그인 시도가 단기간에 이루어지기 때문에, 특정 조건을 만족하는 횟수를 제한하여 경고를 생성한다.
- type both: 룰의 동작 조건을 지정합니다. both는 이벤트 발생 조건을 입력과 출력 모두에 대해 추적한다.
- track by_src: 출발지 IP 주소별로 카운트를 추적한다. 즉, 동일한 출발지 IP에서 발생한 이벤트를 추적한다.
- count 5: 경고를 발생시키기 위해 발생해야 하는 이벤트의 수를 지정한다. 여기서는 5번의 이벤트가 발생하면 경고가 발생합한다.
- seconds 30: 카운트가 누적될 시간 범위를 지정. 여기서는 30초 동안 5번의 이벤트가 발생하면 경고가 발생한다. 이는 30초 내에 5번의 SSH 연결 시도가 있으면 브루트 포스 공격으로 간주하겠다는 의미.
- sid:1000001:
- 이 룰의 고유 식별자로, Snort에서 각 룰을 고유하게 식별하기 위해 사용된다. 관리자가 이 룰에 대해 업데이트를 적용하거나 로그를 확인할 때 사용된다.
- 따라서, 이 Snort 룰은 SSH 브루트 포스 공격을 탐지하기 위해 설정되었다. 포트 22로 향하는 모든 SSH 트래픽에서 "SSH-2.0" 문자열을 감지하며, 대소문자 구분 없이 문자열을 찾고, 같은 출발지 IP에서 30초 내에 5번 이상의 시도가 발생하면 브루트 포스 공격으로 간주하고 경고 메시지를 생성하는 룰이다.
'Training & Research Projects > 네트워크관제' 카테고리의 다른 글
| 프로젝트 기본 흐름도 정리 및 용어 정리 (7) | 2024.10.31 |
|---|---|
| 네트워크 기본 정리 (2) | 2024.08.05 |