개인 공부용 포스팅이므로 처음 접하시는 분은 다른 글을 보고 오시는걸 추천드립니다.
많은 중간 과정이 생략되어 있습니다.
전에 언급했던 섬멸조격인 iptables 를 사용하기 전에, 사용하는 '수색조' 격의 성격을 가지는 Snort는
Sniffer and More 라는 뜻으로 네트워크 트래픽을 더 많이 감시하고 분석한다는 뜻이다.
주요 기능으로
패킷 스니퍼 : 네트워크 상의 패킷을 스니핑하여 보여주는 기능
패킷 로거 : 모니터링한 패킷을 저장하고 로그에 남기는 기능
네트워크 IDS/IPS : 네트워크 트래픽을 분석하여 공격을 탐지/차단하는 기술
룰 액션 / 프로토콜 / IP주소 / Port 번호 / 방향지시자 (Direction Operator) 로 구성되어 있으며
Action은 다음과 같다
alert | 선택한 alert 방식을 이용하여 alert를 발생시키고 패킷을 로그에 남긴다 |
log | 패킷을 로그에 남긴다 |
pass | 무시한다 |
activate | alert를 발생시키고 대응하는 dynamic rule를 활성화한다 |
dynamic | activate rule에 의해 활성화 되고, log rule과 동일하게 동작한다. |
drop | 패킷을 차단하고, 로그에 남긴다 |
reject | drop rule과 동일하게 패킷을 차단하고 로그에 남긴 후 TCP일 경우 TCP Reset을 전송하고, UDP의 경우 ICMP port unreachable 메세지를 전송한다 |
sdrop | 패킷을 차단하지만 로그에 남기진 않는다! (silent) |
단방향의 형태는 아래와 같으며
★ alert 액션으로 탐지되면 alert를 발생시키고 패킷을 로그에 남긴다.
TCP 프로토콜에 대해서 출발지 IP,PORT는 모든 IP,PORT이고, 목적지 IP는 192.168.133.0 대역에 목적지 Port가 80인 패킷을 탐지한다.
양방향의 형태는 아래와 같다.
action | protocol | ipaddress | port | direction | ipaddress | port |
log | tcp | $EXTERNAL_NET | any | <> | $HOME_NET | 80 |
log 액션으로 탐지되었을 때 패킷을 로그에 남긴다.
TCP 프로토콜에 대하여 외부 네트워크 IP, any 포트와 내부 네트워크 IP, 80포트 사이의 송수신 패킷을 탐지한다.
$EXTERNEL_NET : snort 설정파일 (snort.conf)에 정의되어 있는 환경변수로 외부 네트워크를 의미, 기본적으로 any 로 설정되어 있다.
$HOME_NET : snort 설정파일(snort.conf)에 정의되어 있는 환경변수로 내부 네트워크를 의미, 환경변수에 적절한 내부 대역을 설정한다.
룰 바디 설정역시 여러가지 옵션이 있는데
msg | msg 옵션에 기록된 내용이 alert 발생 시 이벤트 이름으로 사용된다 |
reference | rule과 관련된 외부 취약점 정보 참조 시 사용한다 |
sid | snort rule id 로 사용 범위는 다음과 같다. 99이하 : 시스템에 예약된 sid 100 ~ 1,000,000 이하 : snort(www.snort.org)에서 배포하는 룰셋(ruleset)에서 사용하는 sid 1,000,001 이상 : 사용자 정의 rule에서 사용하는 sid |
classtype | snort 사용자가 어떤 유형의 공격인지 쉽게 이해하고 우선순위를 결정할 수 있도록 공격 유형과 기본 우선순위를 정의해 놓았다. 1 = 높음 2 = 중간 3 = 낮음 |
priority | rule의 우선순위에 대해 숫자로 표기한다. priority를 지정하면 classtype의 기본 우선순위 (위험도) 를 덮어쓴다 |
rev | rule 버전번호로 수정 횟수를 표기한다. 수정을 할 때마다 1씩 증가한다 |
대충 읽어보면 알겠지만 정보보안 기사 시험 실무 문제서 중요한 내용은
msg,sid,classtype,priority 정도이다.
그중 가장 중요한것이 msg 이고, 나머지는 고득점 용이다. (물론 서술형에 작정하고 나오면 큰일나지만.)
다음으로 언급할것이 페이로드를 검사할 범위 관련 옵션이다
content | 페이로드에서 검사할 직접적인 문자열을 지정하는 단이며 content는 binary 형식일 수 도 있으며, Text 형식일수도 있으며, 두 개가 복합된 형식일 수 도 있다. text형식은 [ content : "pattern" ] 과 같이 " " 내에 기술되며 binary 형식은 [ content : "| FF FF |" ] 와 같이 " " 내 파이프 라인 ( | | ) 내에 기술된다. !(부정연산자) 등을 앞쪽에 사용하여 [ content : !"pattern" ] 해당 문자열이 없는지 검사하는것도 가능하다. |
uricontent | content 문자열을 전체 패킷과 비교하는 대신 HTTP 클라이언트 요청 URI 정보를 검사할 문자열을 지정한다. |
offset | 페이로드에서 cotent 패턴을 검사할 시작 위치 |
depth | offset ~ 몇바이트까지 검사할건지 |
distance | depth 부터 몇 바이트부터 다시 검사 시작할건지 |
within | within의 depth 속성값으로 within 에서 부터 몇 byte까지 검사할건지 계산 |
nocase | 페이로드 검사 시 대/소문자를 구분하지 않는다. |
쉽게 정리하면
content에 매칭되는 것이 있다면 msg를 표출한다.
여기서 content 매칭되는 영역은 offset, depth, distance, within 이 결정하고
nocase 옵션을 설정하면 대, 소문자를 검사하지 않는다.
Event Threshold (이벤트 제한) 옵션
snort 옵션 중 나름 비중이 큰 옵션이다.
특정 시간동안 발생되는 이벤트 수를 제한하기 위한 옵션으로, 과도하게 중복된 많은 이벤트가 발생하는 것을 방지할 수 있다.
threshold type<limit | threshold | both >, track<by_src | by_dst >, count<c>, seconds<s>
type 에 대해
limit : 매 s초동안 c번째 이벤트까지 action을 수행한다.
ex ) threshold type limit, track by_src, count 2, seconds 10
출발지 IP를 기준으로 매 10초동안 2번째 이벤트까지 action을 수행한다
threshold : 매 s초 동안 c번째 이벤트마다 action을 수행한다.
ex ) threshold type threshold, track by src, count 10, seconds 5
출발지 IP를 기준으로 매 5초 동안 10번째 이벤트마다 action을 수행한다
both : 매 s 초 동안 c번째 이벤트 시 한 번 action을 수행한다.
ex) threshold type both, track by_src, count 10, seconds 1
출발지 IP를 기준으로 매 1초동안 10번째 이벤트 시 한 번 action 을 수행한다.
즉, 1초동안 10번 이상의 이벤트가 발생하면 action을 한 번 수행한다.
예제
TCP SYN Flooding 공격 탐지
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:1000170;)
TCP 프로토콜을 이용하고 80번 포트를 목적지로 하고 있어 HTTP 클라이언트로부터 요청 데이터를 탐지하기 위한 것이며 flags 옵션을 통해 TCP 연결 요청 시 사용하는 SYN 플래그를 검사하고 있다.
threshold 옵션을 살펴보면 출발지 주소를 기준으로 매 1초동안 5번째 이벤트 마다 alert 액션을 수행하도록 하고 있다. 따라서 HTTP SYN Flooding 공격에 의해 다수의 연결 요청이 발생한 경우 이를 Threshold 이벤트 제한을 주어 탐지하도록 하는 설정인 것을 알 수 있다.
UDP/ICMP Flooding 공격 탐지
alert udp any any -> $HOME_NET any (msg:"UDP Flooding attack";
threshold:type threshold, track by_src, count 5, seconds 1; sid:1000180;)
alert icmp any any -> $SHOME_NET any(msg:"ICMP Flooding attack";
threshold:type threshold, track by_src, count 5, seconds 1;sid:1000190;)
HTTP Get Flooding 공격 탐지
alter 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:1000160;)
스노트 룰을 살펴보면 TCP 프로토콜을 이용하고 80번 포트를 목적지로 하고 있어 HTTP 클라이언트로부터 요청 데이터를 탐지하기 위한 것이며, content 옵션을 통해 GET 요청(HTTP 요청 라인 정보)을 검사하고 있다.
HTTP/1.0과 HTTP/1.1 버전을 모두 탐지하기 위해서 중복되는 "HTTP/1." 문자열 패턴으로 설정하고 있다.
threshold 옵션을 살펴보면 출발지 주소를 기준으로 매 1초동안 100번째 이벤트 마다 alert 액션을 수행하도록 하고 있다. 따라서 HTTP GET Flooding 공격에 의해 다수의 GET 요청일 발생할 경우, 이를 Threshold 이벤트 제한을 주어 탐지하도록 하는 설정인 것을 알 수 있다.
비정상 TCP 패킷 탐지
SYN_FIN 플래그 조합 비정상 TCP 패킷 탐지.
alert tcp any any -> 10.10.10.0/24 any (msg : "SYN_FIN Scan Detect"; flags:SF; sid:100240;)
flags : SF
연산자가 없을경우 SYN,FIN 만 설정된 경우를 말한다.
flags : SF+
+ 연산자가 있을 경우 SYN,FIN 은 반드시 포함하고, 다른 플래그도 설정될 수 있다.
flags : SF*
* 연산자가 있을 경우 지정한 플래그를 하나 이상 포함한 경우를 말한다. SYN or FIN or SYN_FIN 을 포함하고 다른 flag도 포함될 수 있다.
flags : !SF
! 연산자가 있으면 지정한 프래그를 포함하지 않은 설정을 말한다.
플래그가 설정되지 않은 비정상 TCP 패킷 탐지 (NULL 스캔)
alert tcp any any -> 10.10.10.0/24 any (msg:"NULL Scan Detect"; flags:!UARPSF; sid:100270;)
URG,ACK,PSH,RST,SYN,FIN 을 칭한다. 이것이 모두 설정되지 않은 (!) 것을 찾는것.
'Operating System > Security' 카테고리의 다른 글
iptables 의 기본문법과 실전예제 (0) | 2023.04.12 |
---|---|
syslog란? (0) | 2021.08.03 |