You cannot see this page without javascript.

진주성 블로그 방문하기

Snort

 내가정한 룰 대로 탐지하는 솔류션으로 룰헤더와 룰옵션으로 이야기할수 있다 
 

snort 실행옵션

-v : 스니핑 모드로 동작

-d : 모든 네트워크 계층을 포함

-c : Rule 파일을 지정

-l : 로그 저장 디렉토리

-e : 데이터 링크 계층의 헤더를 포함

-i : NIC 카드
-h : 도움말

 

1. 룰헤더( rule header)

아래와 같이 처리방법, 프로토콜, 어디서, 어디로 포트로 구성돼어 있다

                                  반듯이공백
alert 201.1.1.1 10 -> 110.1.1.1 80 ( msg:"Land Attack"; sameip; )
		   <- --없음
		   <> --같지않음
alert tcp any any -> any any ( mag:"asdf"; flags:SF; )
      udp					  S: SYN-SENT
          					  F: FIN-WAIT
						  0: Null scan
				content:"5858585";  -> Ping Of Death
				uricontent:"http://asdasdf";

alert icmp any any -> any any ( mag:"icmp echo Reply"; itype:0; )
alert icmp any any -> any any ( mag:"icmp echo Request"; itype:8; )

 

 

처리방법에는

alert : 알람을 발생 시키고 로그에 남긴다.

log : 패킷에 대해서 로그 남긴다.

pass : 패킷 무시

activete : 알람을 발생 시키고 대응하는 dynamic action을 활성

dynamic : activate 에 의해 활성화 되면 로그에 남긴다

drop : iptables 통해 패킷을 차단하고 로그 남긴다.

sdrop : iptables 통해 패킷을 차단하고 로그 안남김. (silent-Drop)

reject : drop과 동일하지만 메세지를 남긴다. TCP : RST 패킷 발생 , UDP : ICMP Destination Unreachable 발생

 

         

2. 룰옵션 (rule option)

 

규칙옵션

msg : 경고, 로그 파일에 메시지를 출력
flags : SAPUFR - SYN, ACK, PSH, URG, FIN, RST
content : 문자열 검색, ! - 일치하지 않음, | - Hex값 표한할때 앞뒤로 사용, \ - 특수기호 탐지
          content:"|5858585|";  -> Ping Of Death
          content:"login failed";  -> telnet login failed
          content:"Documents and Setting";  -> telnet login Success
          content:"SSH-2.0";  -> SSH Connection
          content:"Login incorrect";  -> FTP login failed
          content:"GET/admin/index.html";  -> admin 접근 탐지
         
uricontent : 패킷의 URI(index.php)을 탐지한다
flow : TCP를 재조립하여 동작, to_server, to_client, from_server, from_client, established
ttl : 지정하고 싶은 TTL값
nocase : 대소문자 구분안함
offset : 입력 중에서 처음부터 검색할 바이트수
depth : offset 부터 몇바이트까지 검사할 것인지 지정
distance : 이전 content 패턴에 매치된 경우, 매치된 이후 바이트부터 몇 바이트 떨어진 위치에서 다음 content를 검사할 것인지 지정
within : distance 부터 몇 바이트 범위 내에서 다음 content 를 검사할 것인지를 지정 
itype : ICMP 타입의 개수, 0 - icmp echo Reply, 8 - icmp echo Request
icode : ICMP 로그의 개수
minflag : 최소한 조각 크기
seq : TCP Sequence 숫자
ack : TCP Ack 숫자
id : IP Header 조각 ID 숫자
logto : 경고를 저장할 파일
dsize : 패킷이 일치한다고 가정할 크기
session : FTP 및 Telnet과 같이 깨끗한 텍스트 프로토콜로 부터 트래픽 세션을 기록
          session : printable - 세션기록
ipopts : 특정한 IP 옵션을 체크
sameip : Land Attack
threshold : threshold: type [limit, threshold, both], track[by_src, by_dst], count[횟수], seconds[횟수]

limit : 매 s초 동안 c번째 이벤트까지 auction을 수행한다

threshold : 매 s초 동안 c번째 이벤트마다 auction을 수행한다

both : 매 s초 동안 c번째 이벤트시 한번 auction을 수행한다

                              

sid : 1000001 이상 - 사용자 정의 rule

rev : 수정횟수

pcre:"/정규표현식/"

 

 

 

 

flags 옵션

S : SYN - TCP 연결 시에 동기화를 요구한다.
F : FIN - 정상 접속 종료
A : ACK - 응답에 대한 확인
U : URG - 긴급 포인터 
P : PSH - 데이터 버퍼링을 하지 않고 수신자에게 송신을 요구한다
R : RST - 비정상 종료
1 : 1의보수
2 : 2의보수
0 : NULL

HTTP 관련 옵션

http_method

http_uri

http_header

http_cookie

http_client_body

http_stat_code

http_stat_msg

 

아래부터는 예시이다 설명을 참조하기 바란다.

 

alert icmp any any -> any any (msg:"ICMP Ping"; sid:1000001;)

ping 패킷 추출

 

0123456789ABCDEF 중에서 찾을때 offset-depth, distance-within

alert tcp any any -> any any (msg:"offset-depth, distance-within test" ;

content :"234" ; offset :2 ; depth:3 ; content :"BCD"; distance:6 ; within:3; nocase ; sid:1000026;)

 

pcre옵션을 이용한 SQL Injection 탐지

alert tcp any any -> any any (msg:"pcre sql injection detect"

content:"+or+"; content:"%27%3D%27" ; nocase; distance:0 ; within:20; pcre:"/^(GET|POST)/"; sid:1000001;)

            공백                       '='

 

요청메소드가 GET인지 여부 검사

alert tcp any any -> any any (msg:"http method GET";

content:"GET"; http_method; nocase; sid:100001;)

 

요청 uri 에 xss 를 위한 <script>태그 포함 여부 검사

alert tcp any any -> any any (msg:"http_uri_xss_script_detect";

content:"<scripy>"; http_uri; nocase; sid:1000002;)

 

ftp root 로그인 시도 탐지

alert tcp any any -> any 21 (msg:" ftp root user access";

content:"USER root"; nocase; sid:1000001;)

 

telnet root 로그인 성공 탐지

alert tcp any 23 -> any any (msg:"telnet root login success";

content:"login"; pcre:"/root@.*#/"; nocase; sid:1000001;)

 

telnet 로그인 brute force/dictionary attack 공격 탐지 - 목적지 주소를 기준으로 매 5초 동안 1번째 이벤트까지만 액션수행

alert tcp any 23 -> any any (msg:"telnet login brute force attack";

content:"Login incorrect"; nocase; threshold: type limit, track by_dst, count 1, seconds 5; sid:1000001;)

 

ftp 로그인 brute force/dictionary attack 공격 탐지 - 목적지 주소를 기준으로 매 30초 동안 5번째 이벤트마다 액션수행

alert tcp any 21 -> any any (msg:"ftp login brute force attack";

content:"Login incorrect"; nocase; threshold: type threshold, track by_dst, count 5, seconds 30; sid:1000001;)

 

ssh 로그인 brute force/dictionary attack 공격 탐지 - 출발지 주소를 기준으로 매 30초 동안 5번째 이벤트시 한번 액션수행

alert tcp any any -> any 22 (msg:"ssh login brute force attack";

content:"SSH-2.0"; nocase; threshold: type both, track by_src, count 5, seconds 30; sid:1000001;)

 

http GET Flooding 공격탐지 ( offset:0 가 생략되어있음)

alert tcp any any -> any 80 (msg:" http GET Follding Attack";

content:"GET / HTTP/1."; depth:13; nocase; threshold: type threshold, track by_src, count 100, seconds 1; sid:1000001;)

 

TCP SYN Flooding 공격탐지

alert tcp any any -> any 80 (msg:"TCP SYN Flooding attack";

flags: S; threshold: type threshold, track by_src, count 5 , second 1; sid:1000001;)

 

UDP/ICMP Flooding 공격탐지

alert udp any any -> any any (msg:"UDP Flooding attack";

threshold: type threshold, track by_src, count 5 , second 1; sid:1000001;)

alert icmp any any -> any any (msg:"icmp Flooding attack";

threshold: type threshold, track by_src, count 5 , second 1; sid:1000001;)

 

비정상적인 인터넷구간의 사설ip 차단

alert udp 10.0.0.0/8 any -> any any (msg:"private ip (10.) detect"; sid:1000001;)

alert udp 172.16.0.0/12 any -> any any (msg:"private ip (172.) detect"; sid:1000001;)

alert udp 192.168..0.0/16 any -> any any (msg:"private ip (192.) detect"; sid:1000001;)

 

비정상패킷은 SYN-FIN scan tcp 패킷 탐지

alert tcp any any -> any any (msg:"SYN-FIN Scan Detect"; flags:SF; sid:1000001;)

 

비정상패킷은 SYN-FIN scan tcp 패킷 탐지

alert tcp any any -> any any (msg:"SYN-FIN+ Scan Detect"; flags:SF+; sid:1000001;)

 

비정상패킷은 FIN scan tcp 패킷 탐지

alert tcp any any -> any any (msg:"FIN Scan Detect"; flags:F; sid:1000001;)

 

비정상패킷은 NULL scan tcp 패킷 탐지

alert tcp any any -> any any (msg:"NULL Scan Detect"; flags:!UAPRSF; sid:1000001;)

 

Rule을 이용한 HTTP 패킷 덤프 추출

alert tcp 192.168.10.0/24 any -> !192.168.10.0/24 80 (msg:"HTTP Packet"; sid:1000002;) 즉, 왼쪽의 형식은 프로토콜은 TCP를 이용 192.168.10.0 대역대에서 포트 상관없이 외부로 나가는 패킷에서 192.168.10.0의 대역대가 아닌 네트워크에 80번 포트로 접속하는 패킷을 검출한다는 룰이다

 

Rule의 옵션을 통한 패킷 덤프 추출

alert tcp 192.168.20.20 8080 -> 192.168.10.20 any (msg:"NC Contest Test"; content:"Test"; sid:1000004;) tcp 프로토콜을 이용한 192.168.20.20의 8080 포트에서 192.168.10.20의 어떤 포트로 오는 패킷중 문자열 Test를 가진 패킷을 검출한다

Content옵션과 nocase옵션을 통한 패킷 덤프 추출

이전의 Snort 룰 옵션에 nocase를 추가 
alert tcp 192.168.20.20 8080 -> 192.168.10.20 any (msg:"NC Contest Test"; content:"Test"; nocase; sid=1000004;) 즉 이전의 형식과 동일하며 여기에 대소문자를 구분하지 않고 Test라는 문자가 있기만 하면 검출 하겠다는 옵션을 추가하도록 한다

Content와 offset과 nocase를 이용한 데이터 검출

이전의 Rule 옵션에 offset옵션 추가 
alert tcp 192.168.20.20 8080 -> 192.168.10.20 any (msg:"NC Content Test"; content:"Test"; offset:0; nocase; sid:1000004;) 
offset 옵션을 주는 이유는 좀더 명확한 데이터 검출을 위해서다. 
해당 데이터가 담겨오는 Offset을 살펴보면 실제 36 Offset이 되는데 Snort는 특징 상 Application의 데이터부터 Offset을 부여하기 때문에 바로 0이 데이터가 시작되는 Offset이 된다. 

내부에서의 Telnet 서버로의 접근 시도에서의 패킷 검출

alert tcp 192.168.10.20 23 -> !192.168.10.10 any (msg:"Telnet YES Access"; content:"|fffa1801fff0|"; nocase; sid:1000006;) 
-tcp를 사용하며 Telnet Server인 192.168.10.20에서 23번 포트를 이용하여 주는 메시지 중에서 위와 같은 Hex값을 데이터로 보내는 것을 검출
alert tcp 192.168.10.20 23 -> !192.168.10.10 any (msg:"Telnet NO Access"; content:"Login Failed"; nocase; sid:1000005;) 
Content 옵션을 사용하여 Login Failed라는 데이터가 전달되면 검출 

외부에서의 Telnet 서버로의 접근 시도에서의 패킷 검출

alert tcp 192.168.10.20 23 -> !192.168.10.0/24 any (msg:"Telnet External YES Access"; content:"|fffa1801fff0|"; nocase; sid:1000008;) 
tcp 프로토콜을 사용하며 192.168.10.20 에서 23번 포트를 이용하여 자신의 내부 네트워크가 아닌 외부 네트워크로 패킷을 보낼때 그 패킷의 값중 위의 Raw 데이터가 포함되면 검출 
alert tcp 192.168.10.20 23 -> !192.168.10.0/24 any (msg:"Telnet Externel NO Access"; content:"Login Failed"; nocase; sid:1000007;) 
즉 위의 형식은 내부와 동일하지만 내부에서의 패킷이 아닌 외부로 나가는 패킷만 잡도록 하는 것이다
alert tcp 192.168.10.1 23 -> 192.168.10.0/24 any (msg:"Router Success"; content:"|0d0a52313e|"; nocase; sid:1000009;) 
즉 tcp 프로토콜을 사용하며 192.168.10.1 에서 23번 포트를 이용하여 자신의 내부 네트워크에 패킷을 보낼때 이 값에 0d0a523133=>..R1>의 데이터를 보내면 검출하겠다는 뜻이 된다. 
즉 Router의 호스트네임으로 검출하는 것이다. 
alert tcp 192.168.10.1 23 -> 192.168.10.0/24 any (msg:"Router NO Sucess"; content:"Bad Password"; nocase; sid:1000010;) 
성공의 경우와 동일하지만 이번에는 패킷에 Bad Password라는 문자열이 포함되는 것으로 검출하겠다는 것이다. 즉, Router접속에 실패하였을 경우가 된다. 

 

 

  • Snort를 이용한 Nmap Port Scanning 탐지

-sS 탐지

alert tcp !192.168.10.10 any -> 192.168.10.20 any (msg:"Nmap -sS Detect"; flags:S; threshold:type both, track by_src, count 20,   seconds 10; sid:10000030;) 
flag값을 S즉 SYN 패킷이 유발될때 탐지를 한다는 뜻이고 관리자가 아닌 PC가 WIN_XP에게 유발 할때 탐지하도록 했다.
이때 시간은 10초당 20번의 패킷이 유발되는 것으로 조정하여 매우 짧은 시간에 여러번의 비정상적인 패킷이 유발됨을 봄으로써 포트 스캐닝 임을 알 수 있도록 하였다. 

-sF 탐지

alert tcp !192.168.10.10 any -> 192.168.10.20 any (msg:"Nmap -sF Detect"; flags:F; threshold:type both, track by_src, count 20, seconds 10; sid:10000031;) 
-sS와 동일하되 flags 옵션만 F즉 FIN 패킷이 비정상적으로 과도하게 유발 될 때를 탐지하는 형식이다. 

NULL 탐지

alert tcp !192.168.10.10 any -> 192.168.10.20 any (msg:"Nmap Null Detect"; flags:!AFPSUR; threshold:type both, track by_src, count  20, seconds 10; sid:10000032;) 
이전과 동일 하되 !AFPSU 즉 , 부정연산자인 '!'를 사용하여 각 패킷의 옵션이 할당 되지 않았을 경우 탐지하도록 하였다

XMAS 탐지 = URG, PUSH, FIN

alert tcp !192.168.10.10 any -> 192.168.10.20 any (msg:"Nmap XMAS Detect"; flags:UPF; threshold:type both, track by_src, count 20, seconds 10; sid:10000033;) 
이전과 동일하되 Flag를 UPF로 지정하여 URG,PSH,FIN 옵션이 짧은 시간에 다량으로 유발될 때 탐지하도록 하였다

Snort를 이용한 SSH 접근 검출

alert tcp 192.168.10.20(SSH_Sever) -> !172.168.10.10(관리자) any (msg:"SSH Detect"; content:"|535348|"; sid:10000011;)로 작성하였다. 
SSH Server가 관리자가 아닌 누군가에게 보내려는 패킷중에 SSH라는 문자열을 가진 패킷이 발생하면 검출하겠다는 것이다. 
여기서 Version을 결정할때의 SSH는 항상 대문자로 전달되기 때문에 nocase 옵션을 제외 시켰다

Snort를 이용한 SSH & Telnet & FTP Brute Force 공격 탐지

alert tcp 192.168.10.20 22 -> !172.168.10.10 any 
(msg:"SSH Brute Detect"; content:"|535348|"; threshold:type both, track by_src, count 10, seconds 20; sid:10000012;)
alert tcp 192.168.10.20 23 -> !172.168.10.10 any 
(msg:"Telnet Brute Detect"; content:"Microsoft"; nocase; threshold:type both, track by_src, count 10, seconds 20; sid:10000013;)
alert tcp 192.168.10.20 21 -> !172.168.10.10 any 
(msg:"FTP Brute Detect"; content:"530 Login or password incorrect"; threshold:type both, track by_src, count 10, seconds 20; sid:10000014;) 


Snort를 이용한 Admin 페이지 접근 탐지

alert tcp !192.168.10.20 any -> 192.168.10.20 80 (msg:"HTTP Admin Attack"; content:"admin.html"; nocase; sid:10000015;) 


Snort를 이용한 Reverse Shell 탐지

alert tcp 192.168.10.0/24 any -> !192.168.10.0/24 any (msg:"Reverse Shell Detect"; flag s:PA; content:"Microsoft"; nocase; sid:10000034;) 
피해자인 XP와 같은 네트워크 대역대에서 같은 대역대가 아닌 어떠한 Host로든 PUSH, ACK를 셋팅한 flags 옵션과 Microsoft라는 문자열을 포함해서 보내는 패킷을 탐지하도록 한 것이다


Snort를 이용한 Ping of Death탐지

hping3 --icmp [타켓's ip] -d [Data Size] --flood  : 공격시연

alert ip !192.168.10.0/24 any -> 192.168.10.20 any (msg:"Ping of Death"; threshold:type both, track by_src, count 20, seconds 10; sid:10000035;) 
내부네트워크 망이 아닌 외부 네트워크 망에서 10초당 20개의 즉, 과도한 Ping을 날려 DOS 형태를 보이는 공격을 탐지하는 Rule이다
alert icmp any any -> any any (msg: "Ping of Death"; content:"|5858585858|"; threshold:type both, track by_src, count 10, seconds 20; sid:10000035;) 


Land Attack탐지

alert ip any any -> 192.168.10.0/24 any (msg:"Land Attack Detect"; sameip; sid:10000036;) Protocol은 IP를 사용하였으며 어떠한 IP와 어떤 Port에서 내부 네트워크 망으로 접근을 하는데 이때 sameip 옵션을 주어 출발지 IP와 도착지 IP가 같은 패킷을 탐지하는 Rule이다

 

 

 

진주성 블로그 방문하기
CLOSE