linefilt

새로운 키워드(옵션)의 필요 (streambtis) 본문

Keyword(Option)

새로운 키워드(옵션)의 필요 (streambtis)

mong.goose 2019. 5. 25. 14:14

특정 트래픽들을 탐지하기 위해서 snort 및 suricata에서는 단순 문자열 매치뿐만 아니라 TCP 헤더에 관한 여러 가지 키워드를 제공하고 있다. flowbits나 stream_size 등이 이 경우에 포함이 된다. flowbits는 한 번에 식별할 수 있는 버퍼(chunk-size)를 초과하는 경우에 사용하기도 하며, stream_size는 세션에서 처음 시퀀스를 기준(seq 0)으로 절대 위치를 식별하거나 클라이언트 또는 서버가 전송한 bytes의 양을 측정할 수 있다.

 

위와 같은 옵션에도 불구하고 일부 상황에서는 특정 세그먼트들을 탐지하기 어려움이 있다.

 

1. 암호화 스트림을 식별하기 위해서 dsize를 연속적으로 매치해야 하는 경우가 발생

  • flowbits는 시퀀스를 식별하지 않아 "TCP out of order"에 취약 함, 실질적인 연속매치가 어려울 수 있음

2. B지점이 A지점으로 부터 얼마만큼 떨어져 있는지 정확한 식별이 불가

  • stream_size는 절대 위치만 확인 가능

Example:

Case 1: dsize의 연속 매치

그림 1. RDP over SSH의 트래픽에서 Handshaking

그림 1에서 붉은 박스로 체크된 부분은 dsize를 사용할 경우 아래와 같이 룰을 작성해야 함

 

AS-IS

alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) set"; flow:established,to_server; dsize:96; prefilter; flowbits:isnotset,rostr; flowbits:set,rostr1; noalert; sid:16; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning1"; flow:established,to_server; flowbits:isset,rostr1; dsize:304; prefilter; flowbits:unset,rostr1; flowbits:set,rostr2; noalert; sid:13; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning1 flush"; flow:established,to_server; flowbits:isset,rostr1; dsize:>304; prefilter; flowbits:unset,rostr1; noalert; sid:11; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning1 flush"; flow:established,to_server; flowbits:isset,rostr1; dsize:0<>304; prefilter; flowbits:unset,rostr1; noalert; sid:10; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning2"; flow:established,to_server; flowbits:isset,rostr2; dsize:400; prefilter; flowbits:unset,rostr2; flowbits:set,rostr3; noalert; sid:8; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning2 flush"; flow:established,to_server; flowbits:isset,rostr2; dsize:>400; prefilter; flowbits:unset,rostr2; noalert; sid:7; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning2 flush"; flow:established,to_server; flowbits:isset,rostr2; dsize:0<>400; prefilter; flowbits:unset,rostr2; noalert; sid:6; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning3"; flow:established,to_server; flowbits:isset,rostr3; dsize:192; prefilter; stream_size:client,<,11500; flowbits:unset,rostr3; flowbits:set,rostr4; noalert; sid:5; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning3 flush"; flow:established,to_server; flowbits:isset,rostr3; dsize:>192; prefilter; flowbits:unset,rostr3; noalert; sid:4; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning3 flush"; flow:established,to_server; flowbits:isset,rostr3; dsize:0<>192; prefilter; flowbits:unset,rostr3; noalert; sid:3; rev:2; metadata:linefilt.tistory.com, created_at 2019_05_09 updated_at 2020_03_09;)

 

새로운 키워드 도입 시 현재에서 1/3 정도로 룰의 개수를 단축시킬 수 있다.

TO-BE

alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) set"; flow:established,to_server; dsize:96; streambits:set, rdp_over_ssh1, client; noalert;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning1"; flow:established,to_server; dsize:304; streambits:isset, rdp_over_ssh1, client, <, 305; prefilter; streambits:set, rdp_over_ssh2, client; noalert;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning2"; flow:established,to_server; dsize:400; streambits:isset, rdp_over_ssh2, client, <, 401; prefilter; streambits:set, rdp_over_ssh3, client; noalert;)
alert tcp-pkt any any -> any 22 (msg:"RDP over SSH (Reverse) chaning3"; flow:established,to_server; dsize:192; streambits:isset, rdp_over_ssh3, client, <, 193; prefilter;)

Case 2: 특정 시퀀스(A)로 부터 지정한 값 이내의 시퀀스(B)까지 매치

 

일부 악성 행위들은 처음 탐지된 포인트(A)에서 일정 시퀀스 이내(B) 두 번째 등의 행위가 발생하는 경우가 있다. strea_size의 경우 해당 세션에서 시퀀스들의 절대적인 위치를 명시하기 때문에 탐지해야 하는 범위가 넓어지는 문제가 있다. 이를 최소화 하고자 상대적인 매치 개념을 도입해서 오탐을 최소화 하고자 함이다.

 

그림 2. streambits concept

그림 2에서 각 주황색으로 표시된 패킷들을 검출하기 위해서 다음과 같이 작성을 할 수 있다.

pkt N

- to_server
- pattern: jpg
- seq: 4100, ack:105, len:600

- streambits:set,foo

pkt N+1

- to_client

- seq:105, ack:4700, len:1100

pkt N+2

- to_client

- pattern: IHDR

- seq: 1205, ack:4700, len: 200

- streambits: isset, foo

pkt N+3

- to_server
- pattern: POST
- seq: 4700, ack:1405, len:300

- streambits:iset,foo

alert tcp-pkt any any -> any 80 (msg:"pkt N"; flow:established,to_server; content:"jpg"; streambits:set, foo, both;)
alert tcp-pkt any 80 -> any any (msg:"pkt N+2"; flow:established,to_client; content:"IHDR"; streambits:isset, foo, server, <, 1406;)
alert tcp-pkt any any -> any 80 (msg:"pkt N+3"; flow:established,to_server; content:"POST"; streambits:isset, foo, client, <, 301;)

streambits Format:

When streambits is set, it registers SEQ(+ LEN) and ACK information

"prefilter" logic such as flowbits / stream_size is supported

when "streambits: set" is set, can't not use "either" in format

Supports both tcp-pkt and tcp-stream / For tcp-stream, it records the information of the last segment(right_edge)

 

streambits:<set|isset|unset|toggle>, name, <client|server|both|either>[, <modifier>, <number>];

 

modifier:

 

> greather than
< less than
= equal
!= not equal
>= greater than or equal
<= less than or equal

 

'Keyword(Option)' 카테고리의 다른 글

threshold  (0) 2018.10.19
isdataat  (0) 2018.10.06
Comments