본문 바로가기
공부/정보보안기사

Snort

by Skogkatt의 개인 블로그 2020. 4. 6.
반응형

Snort

  • 1998년 SourceFire사의 CTO Martin Roesch에 의해 발표된 오픈 소스 침입탐지 시스템
  • 패킷을 스니핑 하여 지정한 Rule과 동일한 패킷을 탐지한다.
  • Snort Rule
  • 공격을 탐지하기 위해 등록하는 규칙(패턴)이다.
  • 수신되는 패킷은 등록한 룰과 비교해 탐지 여부를 결정한다. 탐지가 완료되면 규정된 조건에 따라 경고 및 로그를 발생한다.

Snort 구조

1. 스니퍼(Sniffer)
  • 네트워크 인터페이스에 입력되는 패킷을 수신받는다.
  • Promiscuius 모드로 동장하여 네트워크에 전송되는 모든 패킷을 수신한다.
  • 스니핑은 WinPcap 라이브러리가 수행한다.
2. 전처리기(Preprocessing)
  • 입력되는 패킷에 대해 특정 행위가 탐지될 경우 탐색 엔진으로 전송한다.
  • 프로토콜의 종류별로 검사 여부를 결정할 수 있다.
3. 탐색 엔진(Detection Engine)
  • 등록된 룰과 동일한지 여부를 확인하는 역할을 맡는다.
  • 일치하는 경우 로그를 기록하거나 알람을 발생한다.
4. 경고 및 로깅(Alert & Logging)
  • 탐지된 정보에 대해 로그파일, 네트워크, SNMP 프로토콜 등으로 결과를 전송한다.
  • 로그 파일이나 데이터베이스에 결과를 기록한다.

Snort Signature

  • Snort 시그니처는 룰 헤더와 룰 옵션으로 구성된다.
  • 헤더는 처리 방법, 프로토콜, IP주소 및 포트번호 등으로 구성되어 탐지하는 대상을 정한다.
  • 룰 옵션은 탐지하는 대상의 세부적인 조건을 정한다.

룰 헤더(Rule Header)

처리 방법(action)
  • 조건에 맞는 패킷을 처리하는 방법

프로토콜(Protocol)
  • TCP, UDP, IP, ICMP의 프로토콜을 설정하여 해당 프로토콜을 탐지한다.
IP주소, port번호
  • 송신자와 수신자의 IP주소, port 번호가 들어간다.
  • IP주소는 서브넷 마스크와 함께 설정이 가능하며 서브넷 마스크와 함께 설정하는 경우 IP주소/24와 같은 형태를 사용한다.
Direction
  • Direction은 패킷의 방향을 의미하는 것으로 ->의 경우 왼쪽은 송신자, 오른쪽은 수신자로 표시한다.(송신자 -> 수신자)
  • 송신자와 수신자를 구별하지 않고 전송되는 모든 패킷을 탐지하려면 <>을 사용한다.

룰 옵션(Rule Option)

  • 세부적인 탐지 조건을 설정하는 부분으로 Snort는 세부 조건을 매우 많이 제공한다.
  • 탐지 조건을 여러 개 설정할 때에는 각 조건마다 세미콜론(;)을 넣어 구분한다.

content

페이로드를 검색해 지정한 문자열이 있는지 확인하는 옵션.

단순 문자열과 바이너리 문자열로 지정할 수 있다.

단순 문자열은 대소문자를 구분하며 바이너리 문자열은 16진수를 사용해 지정해야 한다.

 

flags

TCP 프로토콜에서 Control Flag를 지정하는 것으로 SYN, ACK, PSH, URG, FIN, RST을 설정할 수 있다.

SYN을 설정하려면 flasgs:S;, SYN FIN을 둘 다 설정하고 싶으면 flags:SF;

flow 
  • TCP 연결이 확립된 세션을 탐지하기 위해서 established를 설정한다.
  • to_server, to_client, from_server, from_client를 사용해서 전송되는 곳을 지정할 수 있다.
  • 예 : flow:to_server, established; (TCP로 연결되어 서버로 전송되는 패킷)
itype, icode
  • ICMP 프로토콜의 타입 값과 코드 값을 탐지한다.
  • Type 값이 0이면 echo reply, 8이면 echo requset
sameip
  • 송수신자의 IP주소가 동일한 것을 탐지하기 위해 사용할 수 있다.
  • 예 : alert ip any any -> IP/24 any (msg:"land attack";sameip;
session
  • TCP 세션에서 사용자 입력 데이터를 검출한다.
threshold
  • 특정한 동일 패킷에 대해 설정한 시간 내에 일정 수가 발생하면 탐지한다.
  • 무작위 공격을 탐지할 수 있다.
  • threshold: type[limit, threshold, both], tack[by_src, by_dst], count[count], seconds[seconds]

 

반응형

댓글