본문 바로가기
IT_정보보안/보안관제 프로젝트

18. Snort

by jys275 2024. 3. 5.

다음부터는 보안 관제 프로젝트를 실무와 유사한 형식으로 진행할 예정이다.

 

악성 샘플을 구하는 것부터 시작해서 기초, 정적, 동적분석을 진행하고 

동적분석 과정에서 네트워크 트래픽 및 패킷을 분석할 때, 만드는 탐지 패턴을 실제로 Snort 환경에다가 적용할 것이다.

 

위의 탐지 패턴을 적용했을 때, 악성 코드를 실행시키면 정말로 탐지가 되는지와 같이

관제 업무 프로세스와 관련된 부분을 직접적으로 경험해 보는 그런 과제를 수행할 것이다.

 

즉, 이번 글에서는 이를 위해 Snort에 대한 이론적인 개념을 알아보고자 한다.

 

 


 

 

Snort

 

 

개념
네트워크 침입 탐지 시스템(IDS) 및 네트워크 침입 방지 시스템(IPS)으로 사용되는 오픈 소스 소프트웨어로 
네트워크 상에서 발생하는 데이터 트래픽을 실시간으로 모니터링하여 악성 활동을 감지할 수 있다.

특징
Snort는 사전에 정의된 rule에 따라 트래픽을 분석하고 악성 활동을 식별한다.
사용자는 rule을 수정하는 등 사용자 지정에 따라 네트워크 환경에 맞춤화할 수 있다.

기능

패킷 스니퍼 모드 (Packet Sniffer Mode)

네트워크 트래픽을 실시간으로 캡처하고 분석한다.

단순히 트래픽을 모니터링하고 분석하여 네트워크 상태를 파악할 수 있다.

패킷 로거 모드 (Packet Logger Mode)

감지된 이벤트 및 트래픽에 대한 로깅을 수행한다.
로그를 바탕으로 후속 분석 및 보고서에 활용이 가능하다.

침입 탐지 시스템 (IDS) / Snort inline (IPS)


구조

패킷 스니퍼(Packet Sniffer)

네트워크로부터 들어오는 패킷을 캡처하여 분석 대상으로 전달한다.

프리프로세서(Preprocessor)

입력 패킷을 전처리하여 정규화하거나 특정 프로토콜의 디코딩을 수행한다. 
이를 통해 분석의 효율성과 정확성을 향상한다.

탐지 엔진(Detection Engine)

사전에 정의된 rule에 따라 탐지 엔진이 패킷을 분석하여 악성 활동을 탐지한다.

출력(Output)

탐지된 이벤트 및 결과를 적절한 형식으로 출력한다.

출력은 로그 파일, 알림 메시지, 경고 등 다양한 형태로 이루어진다.

 


이렇게 Snort는 패킷 스니퍼 모드와 패킷 로거 모드를 통해 트래픽을 모니터링하고, 
IDS, IPS로 네트워크 침입을 탐지하고 방지하는데 도움을 준다.



 

 

Snort rule

 

 

개념
사전에 정의된 패턴 또는 조건을 통해 네트워크 트래픽을 분석하고, 악성 활동을 탐지하기 위한 규칙 세트를 의미한다. 

이 규칙은 네트워크 트래픽에서 특정한 패턴, 행동 또는 특징을 찾아내어 
악성 활동으로 간주되는지 여부를 결정하는 데 사용된다.

Ex) alert tcp any any -> any any (content:"malware"; msg:"Malware detected"; sid:10001;)

위의 rule은 트래픽에서 "malware"라는 문자열을 발견하면 알림을 생성하여 악성 활동으로 간주하고, 
"Malware detected"라는 메시지를 출력한다.

Snort rule의 구성

 

Snort rule에는 헤더(Header)와 옵션(Option)으로 불리는

두 가지를 사용자가 지정해서 탐지하고자 하는 패턴을 만들 수 있다.

 

사실상 룰의 헤더만 이용을 해서 탐지하고자 하는 패턴을 만들 수 있기도 하지만, 공격자가 악의적인 목적을 가지고

IP와 포트 번호를 우회하거나 랜덤하게 지정한다면 미탐과 오탐 등의 상황이 지속적으로 발생할 수 있다.

 

그러다 보니 헤더만으로는 탐지 패턴을 만들기에는 역부족이다라고 판단해서

옵션에 해당하는 부분들을 기반으로 탐지 패턴을 좀 더 정교화해서 만드는 것이다. 

 

결론적으로 옵션을 잘 적용해야지만 효과적인 탐지 패턴을 만들 수 있는 것이다.

 

탐지 패턴을 아무리 잘 만들더라도 시간이 지남에 따라서 탐지가 안 될 가능성도 있다.

 

그렇기 때문에 조직에서는 처음에 탐지 패턴을 만들었다고 해서 멈추는 것이 아니라,

정기적으로 이 탐지 패턴이 유효한지 체크하는 과정도 거친다. 

 

룰 헤더(Rule Header)

- 액션(Action) : 규칙이 트래픽에서 일치하는 패턴을 발견했을 때 취해야 할 동작을 지정. alret
- 프로토콜(Protocol) : 규칙이 적용되는 네트워크 프로토콜을 지정. tcp
- IP 주소, 포트(IP Address, Port) : 규칙이 적용되는 트래픽의 송신지와 수신지의 IP주소와 포트 번호를 지정. any any
- 방향 연산자(Direction Operator) : 패킷의 방향을 지정. ->

 

액션에 지정하는 부분은 보통 alret(경고 발생 및 로그 기록)를 사용한다.

 

관제 업무를 수행할 때 가장 중요한 것은 실시간 모니터링이기 때문에,

액션에 해당하는 부분을 alret로 지정해야 된다.

 

룰 옵션(Rule Options)

룰 옵션은 세부적으로 탐지 조건을 설정할 수 있는 부분으로, 매우 많은 설정이 가능하다. 
모든 룰 옵션은 룰 헤더 뒤에 괄호로 묶여 있으며, 각 옵션은 세미콜론(;)으로 종료된다.

content:"malware"msg:"Malware detected"; sid:10001;  

 

보안 장비만 갖다 놓는다고 해서 그 장비가 동작하는 것이 아니다.

 

장비가 원활하게 동작을 하고 올바르게 탐지할 수 있도록 탐지하고자 하는 패턴을 만들어서

해당 장비에다가 넣어줘야, 원활한 동작, 탐지, 차단이 가능하다.

 

그렇기 때문에 위의 Snort rule을 알아야 한다.

 

 


 

 

룰 헤더(Rule Header)

 

 

액션
alert : 현재 패킷에 대한 경고 생성
block : 현재 패킷과 잔여 모든 후속 패킷을 차단
drop : 현재 패킷을 삭제, 차단 (로그 기록 o)

sdrop : 현재 패킷을 삭제, 차단 (로그 기록 x)
log : 현재 패킷을 기록
pass : 현재 패킷을 통과된 것으로 표시, 패킷에 대한 후속 평가 중지

 

아래와 같이 감지된 패킷에 대한 응답으로 일부 작업을 수행하는 ”active responses"도 존재한다


react : 클라이언트에 응답을 보내고 세션을 종료
reject : drop과 동일하지만 TCP일 경우 TCP Reset, UDP일 경우 ICMP unreachable로 세션을 종료
rewrite : ”replaces" 옵션을 사용하는 경우 패킷 내용 덮어쓰기를 활성화

 

정보보안기사에서 보통 drop, sdrop, reject 세 가지에 대해서

각각의 특징과 차이점을 기술 또는 비교하는 문제가 생각보다 많이 나온다.


프로토콜
IP, ICMP, TCP, UDP

IP 주소
any : 모든 IP 주소
000.000.0.0 : IP 주소
!000.000.0.0 : 해당 IP를 제외한 모든 IP 주소
[000.000.0.0, 000.000.0.0] : IP 주소 리스트는 대괄호로 묶고 쉼표로 구분

 

포트
any : 모든 포트 번호
00 : 특정 포트 번호
!00 : 해당 포트 번호를 제외한 모든 포트 번호
범위 연산자 사용 : 1:1024(1~1024), 500:(500~), :500(~500)
[1:1024, 4444, 5555] : 포트 번호 리스트는 대괄호로 묶고 쉼표로 구분


위에서 말했던 것과 같이 공격자가 의도적으로 변조 또는 지정할 수 있기 때문에,

사실상 IP 주소와 포트 모두 any로 지정하는 것이 일반적인 형태이다.

 

방향 연산자
-> : 왼쪽 IP 주소와 포트 번호가 송신지, 오른쪽 IP 주소와 포트 번호가 수신지
<> : 양방향 연산자로 두 개의 IP 주소와 포트가 서로 대상으로 간주

방향 연산자 또한 '->' 해당 연산자가 일반적인 형태이다.

 

조직에서 취급하는 우선순위와 중요도에 따라 다르긴 하지만, 양방향으로 사용하는 것은

장비의 부하가 두 배 이상으로 가는 것도 있으며, 특정 케이스 외에는 잘 사용하지 않는다.

 

 

 

룰 옵션(Rule Option)

 

 

룰 옵션은 일반 옵션, 페이로드 옵션(어떤 종류, 어디서, 어떻게 패킷 데이터를 찾는지), 비페이로드 옵션, HTTP 기반 옵션, 

사후 탐지 옵션(규칙이 트래픽을 탐지하고 알림을 생성한 후에 취해야 할 추가 동작 지정) 등 

정말 많은 옵션이 존재한다.

 

하지만 이런 옵션을 전부 사용하는 것은 아니며, 대표적인 세 가지 옵션인 msg, content, nocase을 알아볼 것이다.

 

msg

규칙이 일치할 때 출력 할 메시지를 설정

 

msg:"message";

 

탐지 패턴을 만들고 식별할 수 있는 수단을 만들지 않으면

어떤 이유로 탐지되는 패턴이었는지 기억하기 힘들 것이기 때문에,

msg 옵션을 활용해서 탐지 패턴의 이름을 지정할 수 있는 것이다.

 

 

content

트래픽의 페이로드를 검색해서 지정한 문자열이 존재하는지 확인

 

content:"malware";

 

특정한 네트워크 행위는 보통 문자열로 되어 있는데, 그 문자열 정보를 content 옵션에 입력해 놓으면

해당 값을 기반으로 해당 악성 코드만이 가지고 있는 특정한 네트워크 행위인지 더 쉽게 탐지할 수 있는 것이다.

 

 

nocase

content와 동일하지만, 대소문자를 구분하지 않는다.

 

content:"malware"; nocase;

 

사용자가 대문자로 패턴을 만들었지만, 공격자가 소문자로 공격을 했다면

서로 다른 것으로 취급을 해서 탐지를 하지 못한다.

 

즉, 이러한 것들을 사전에 방지하고자 nocase 옵션을 사용하는 것이다.

 

dsize, depth, within

더보기

예를 들면 악성코드가 그냥 'abc'라고 동작하는 경우도 있겠지만, 'abcdfe', 'aabcc'와 같이 동작할 수도 있다.

 

하지만 탐지하고자 하는 목적이 'abc'라고만 들어간 것을 탐지해야 하지만

결과적으로 a, b, c라는 문자가 모두 들어가 있다 보니, 불필요한 탐지도 할 가능성이 높아진다.

 

그래서 위와 같은 경우를 줄이기 위해서 위의 옵션들을 사용할 수 있다.

 

dsize

패킷의 페이로드 크기를 기준으로 조건을 설정한다.

즉, 트래픽의 페이로드 크기가 지정된 크기와 일치하는 패킷을 탐지한다.


dsize:100;는 페이로드 크기가 100바이트인 패킷을 탐지한다.

 

depth

패킷의 페이로드에서 검색할 최대 길이를 지정한다. 


depth:20;은 패킷의 처음 20바이트까지만 검색하라는 것을 의미한다.


within

특정 패턴이나 문자열이 페이로드에서 연속적으로 나타나는 것을 제한한다.

즉, 특정 길이 범위 내에서 패턴이 연속적으로 나타나는 패킷을 탐지한다.


within:10;은 트래픽에서 10바이트 이내에 연속적으로 특정 패턴이 나타나는 패킷을 탐지한다.

 

 


 

 

다음 글에서는 Snort 환경 구성을 실시할 예정이다.