일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 암호화
- IDS
- DDOS
- stream_size
- 탐지
- snort
- header dos
- rule
- chromium 탐지
- signatrue
- 오탐
- 크롬 탐지
- IPS
- flowbits
- 미탐
- HTTP2
- 시그니처
- idps
- TLS
- stream buffer
- isdataat
- 수리카타
- sinature
- Reassembly
- dsize
- chrome 탐지
- slowloris
- 재조합
- Suricata
- SSL
- Today
- Total
linefilt
새로운 키워드(옵션)의 필요 (streambtis) 본문
특정 트래픽들을 탐지하기 위해서 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에서 붉은 박스로 체크된 부분은 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에서 각 주황색으로 표시된 패킷들을 검출하기 위해서 다음과 같이 작성을 할 수 있다.
pkt N - to_server - 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 - 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 |