2023. 5. 6. 13:37ㆍ기타/tools
# about snort
- 시그니처 기반의 NIDS 오픈소스
- n/w 패킷 수집 후 트래픽을 모니터링 해줌
- 준비된 룰과 비교하여 일치하면 칩입탐지, 경로를 발생시킴
# snort rule
- 기본적으로 시그니쳐, 패턴을 비교, 검사하는 방식으로 탐지함
- 정규표현식으로 탐지 룰을 규정할 수 있음
ex)
[헤더]
action | protocol | scr ip | src port | direction | dst ip | dst port |
alrert | tcp | any | any | -> | 192.123.1.0/24 | 80 |
[옵션]
(msg:"mounted access"; content:"|00 01 86 a5|")
name | descriptions |
action | alert |
protocol | tcp |
source | 룰 적용대상출발지(공격자)ip 주소, 포트는 전체 |
direction | 특정 네트워크 인바운드 |
destination | 192.123.1.0/24네트워크 80포트에 대한 접근 |
msg | mounted access |
parttern(content) | TCP payload에서 Hexa ㅅ트링 0x00, 0x01, 0x86, 0xA5 패턴을 찾는다 |
1. action
alert -> 경고발생
log -> 패킷을 로그로 저장
pass -> 패킷무시
active -> 경고를 발생시킨 다음 다른 동적 규칙 활성화
dynamic -> acvice 옵션으로 활성화
drop -> 패킷차단후 로그로 저장
reject -> 차단 및 로그 저장후 세션을 리셋(rst전송)함[tcp인경우]
차단 및 로그 저장후 icmp port unreachable 메세지 전송[udp인경우]
sdrop -> 패킷을 차단하지만 로그는 남기지 않음
2. protocol
tcp -> tcp프로토콜에적용
udp -> udp프로토콜에적용
icmp -> icmp프로토콜에적용
ip -> ip프로토콜에적용
3. ip, port
option | role |
ip | any = 모든 ip 주소 1.1.1.1 = 특정 ip 주소 [1.1.1.1, 2.2.2.2] = 여려 ip 주소 [1.1.1.1/24] = 특정 ip 주소 |
port | any = 모든 포트 번호 80 = 특정포트번호 1 : 1024 = 1024번 이하 범위 80: = 80번 이상 범위 :1024 = 1024번 이하 범위 !80 = 80번을 뺀 나머지 |
-> | 단방향 |
<> | 양방향 |
4. 일반옵션
- 규칙에 대한 정보를 제공하는 옵션
- 검색하는 동안 영향x
msg | - 규칙이 탐지될 경우 출력되는 메시지 - 공격유형과 정보를 기록 |
sid | - 규칙 식별자로 모든 규칙은 반드시 식별 번호를 가짐 - 예약된 식별자 = 0 - 2,999,999 - local.rules에는 3,000,000 이상 부터 사용 |
rev | - 규칙의 수정 버전을 나타냄 - 규칙이 수정 시 1씩 증가 |
classtype | - 규칙을 분류하는 옵션 - 클래스 명은 classfication.config 파일에 정의 |
priority | - 규칙의 우선순위 지정 - 1 - 10 까지의 수 사용, 숫자가 작을수록 높은 우선순위를 가짐 |
5. payload옵션
- 악성패킷을 탐지하는 옵션
content | - 매칭할 문자열 지정 - 문자열 지정 -> content :"text"; - 숫자지정 -> content:"|121212|"; - 정규표현식지정 -> pcre:"/^select/"; |
prce | - 문자열로 표현하기 어려운 것들을 정규 표현식을 이용하여 정의할 경우 사용 |
nocase | - 대소문자 구별하지 않고 매칭 |
offset | - 매칭할 문자열의 위치 지정 ex) (content: “a”; offset:1) -> 1번지부터 a찾아 |
depth | - 문자열의 범위 지정 ex) (content: “a”; offset:1 ; depth:1) -> 1번부터 a찾는데 1바이트까지 찾아 |
distance | - Content 옵션값 이후 탐색할 위치 지정 |
within | - Content옵션값 이후의 탐색할 범위를 지정 |
# offset, depth example
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
↓ ↓ ↓
0byte X byte Y byte
-> 3번째 바이트[offset:2]부터 2바이트 범위[depth:2]내에서 지정된 문자열 패턴이 있는지 검사
# distance, within example
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
↓ ↓ ↓ ↓ ↓
0byte X byte Y byte within[검색범위]
-> 이전 패턴이 매치된 이후 3바이트 떨어진 위치에서 지정된 패턴의 문자를 3바이트 범위내에서 검사
# dectection rule example
alert tcp $EXTERNAL_NET any ⟶ $HOME_NET any (msg: “ TEST”; content: “S”; offset:2; depth:2; content: “R”; distance:3; within:2; sid:1000001;)
-> 3번째 byte 부터 2byte 범위에 S 패턴이 있는 지 검사, 패턴이 검사된 이 후 3byte 떨어진 위치에서 2byte 범위 내에서 R이라는 문자가 있는지 검색[=3whs에서 닫힌 포트 찾을때]
| F | A | L | S | E | & | T | R | U | E |
↓ ↓ ↓ ↓ ↓
0byte X byte Y byte within[검색범위]
| offset | | depth |
alert tcp $EXTERNAL_NET any ⟶ $HOME_NET any (msg: “ TEST”; content:|FFFF|; offset:9; depth:2; sid:1000001;)
- > 10번째 byte 부터 2byte 범위에 FFFF 바이너리 패턴이 있는지 검사
alert tcp any any ⟶ any 80 (msg: “ Web Scan Detected”; content: “/administrator”;)
-> 전송되는 패킷의 내용을 검사하여 “/administrator”란 문자열이 포함 된 경우 “Web Scan Detected”란 메시지로 로깅
alert tcp any any ⟶ any 80 (content: “root”; nocase;)
-> 목적지 포트가 80인 모든 TCP 패킷에 대하여 대/소문자 구분없이 페이로드에 root문자열이 포함한 경우 alert 발생
alert tcp any any ⟶ any 22 (content: “login”; depth:10;)
-> 목적지 포트가 22인 모두 TCP 패킷에 대하여 페이로드의 첫번째 byte부터 10byte 범위 내에 소문자 login 문자열이 포함한 경우 alert 발생
alert tcp any any ⟶ any any (msg: “Get Flooding”; content:“Get / HTTP1.”; nocase; depth:13; threshold:type threshold, track by_dst, count 10, seconds 1; sid:1000999)
-> HTTP Flooding 공격 특징은 대부분 웹서버 공격 트래픽에서 최초 웹페이지에 대해 웹 접속 요청을 폭주시켜 세션자원을 소진검색 탐지 룰
- 첫 번째 바이트부터 13번째 바이트 범위 내에서 검색 (offset을 명시하지 않으면 첫번째 byte부터 검색)
- Get : http request line, / : 호스트의 default page , HTTP1. : HTTP 버전
- 목적지 IP주소를 기준으로 1초마다 10번째 이벤트마다 alert action을 수행시켜 과도하게 많은 alert event가 발생하는 것을 방지
drop tcp any any ⟶ any any (msg: “ SYN/FIN Drop”; flags:SF;)
- 제어 플래그 중 SYN와 FIN이 동시에 설정되어 있는 TCP 패킷 차단함
- SYN은 연결 요청, FIN는 연결 종료를 위한 플래그이므로 동시에 설정될 수 없는 비정상 패킷임. 비정상 패킷은 IDS/IPS의 탐지를 우회하여 공격 또는 스캐닝 을 위한 목적으로 사용되므로 이를 탐지 및 차단해야 함
alert tcp any any ⟶ any any (pcre: “ /POST.*Content\x2dLength\x3a\x20evilstring/”;)
- 목적지 주소 및 포트가 모두 any로 설정으로 모든 패킷을 검사함. 장비에 많은 부하를 발생시킴
- HTTP 서비스를 제공하는 IP주소 및 PORT 정보를 파악해서 목적지 IP주소와 Port에 대한 검사만 검사룰을 적용시켜 장비의 부하를 줄일 수 있음
alert tcp any any ⟶ any 80 ( msg:“XSS Detect”; content:“GET”; offset:0; depth:3; content:“/login.php?id=%3Cscript%3E”; distance:1; sid:1000500 );
- 첫바이트~ 세번째 바이트 내에서 GET이라는 문자 검색
- 첫번째 매치된 문자열에서 1바이트 떨어진 곳에서부터 해당 문자 검색
alert tcp any any <> any [443,465,563] (msg:“SSLv3 Malicious Heartbleed Request V2”; content: “|18 03 00|”; depth:3; content: “|01|”; distance:2, within:1; content:! “|00|”; within:1; sid:100300;)
- 첫 바이트부터 3바이트 범위 내에서 패턴 감사[a]
- 첫 번째 content가 매치 된 이후 2바이트 떨어진 위치에서 1바이트 내에서 지정된 패턴 검사[b]
- 두 번째 content가 매치된 이후 1바이트 떨어진 위치에서 지정된 패턴 검사[c]
[b]distance : 2 [c] within : 1
<---------------------> <--------->
| | 180300 | | | | | | | | |
depth : 3[a] [c] within : 1
첫번째 바이트로부터 3바이트 내 1바이트내에서
# test
간단한 테스트를 위해 rules디렉토리에 local.rules을 나노로 편집하여 alert tcp 192.168.10.20 23 -> any any(msg:"Password Cracking";sid:"30000001";content:"login incorrect";nocase;)
telnet으로 메타에 접근해서 비밀번호 틀리게 하여 incorrect문구가 나오게 시도
그리고 sguil로 들어가면 snort룰에서 생성한 메시지가 보임
'기타 > tools' 카테고리의 다른 글
Security Onion & Snort (0) | 2023.03.22 |
---|---|
Postman (0) | 2022.05.18 |
about Wireshark (0) | 2022.04.11 |
about Burp suite (0) | 2022.04.11 |