content, nocase - OTN Payload Option
지난번 포스팅에 이어 OTN(Option Tree Node) Payload option은 패킷의 실제 데이터 부분을 검사하는 데 사용됩니다. 그중 Snort rule에서 가장 많이 사용되는 content 키워드에 대해 알아보겠습니다. 또한 content 키워드의 modifier(수식어) 중 nocase에 대해서도 확인해 보겠습니다.
이전에 snort를 설치한 kali linux로 rule 옵션을 확인해 보도록 하겠습니다.
테스트하기 전에 kali linux의 snort, websnort 설치가 필요합니다. 아래 포스팅을 우선 진행하시길 추천드립니다.
[Kali Linux] Kali(Debian)에 Snort 설치 방법
Snort conf 설정
linux에서 snort를 구동하기 위한 명령어는 아래와 같습니다.
snort -i eth0 -A console -c /etc/snort/snort.conf
하지만 snort 를 설치하면 기본으로 include 되는 rules 가 많이 있어 테스트하기에 불편함이 있습니다.
그래서 snort 를 구동하기 전에 아래와 같이 /etc/snort/snort.conf 에서 nclude $RULE_PATH/ 로 시작하는 구문을 우리가 사용할 local.rules를 제외하고 다른 rules는 모두 주석처리(#) 해줍니다.
이제 snort 를 구동하면 local.rules 에 있는 snort rule 만 엔진에 올리게 됩니다.
참고로 local.rules을 편집하면 snort를 재기동하셔야 합니다.
Content
content 탐지 테스트를 위해 kali linux에 websnort를 구동하고 접속해 봅니다.
- 참고
- local IP : 192.168.98.16
- websnort IP / Port : 192.168.98.20 / 8080
kali에서 wireshark를 구동하고(default로 설치되어 있음) local PC에서 VM의 websnort에 접속합니다.
- http://kali_linux_ip:8080
websnort 에 접속할 때 Kali linux에서 wireshark로 아래 패킷을 확인할 수 있습니다.
아래 패킷중에서 HTTP GET 요청을 잡기 위한 content를 작성합니다.
제가 탐지할 payload content는 "GET / HTTP/1.1"입니다.
content를 테스트하기 위해 vi /etc/snort/rules/local.rules에 아래 rule 2개를 추가합니다.
alert tcp any any -> any any (msg:"content-test-1"; content:"GET / HTTP/1.1"; sid:1000000001;)
alert tcp any any -> any any (msg:"content-test-2"; content:"get / HTTP/1.1"; sid:1000000002;)
kali Linux에서 snort 를 구동(snort -i eth0 -A console -c /etc/snort/snort.conf) 합니다.
그 후 local PC에서 websnort에 접속하여 content 가 정상 탐지가 되는지 확인합니다.
아래와 같이 snort 실행창에서 실시간으로 탐지 확인이 가능합니다.
실제 탐지된 결과를 보니 content:"GET / HTTP/1.1"; 만 탐지됨을 확인할 수 있습니다.
content는 기본적으로 대소문자를 구분하기 때문입니다.
참고로 문자에 대소문자를 섞어 쓰는 공격에 대응하기 위해서 content 뒤에 modifier(수식어/수정자) nocase를 사용합니다.
content로 문자열이 아닌 Hex Code를 탐지할 수 있습니다. 파이프(|) 사이에 hex 값을 넣어 탐지할 수 있습니다.
- Hex Code 탐지 예 - content:"|47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31|";
이전 websnort 테스트를 진행한 wireshark 에서 "GET / HTTP/1.1"는 |47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31| 임을 확인 가능합니다. (hex code |0d 0a| 는 엔터로 제외했음)
Hex 값을 local.rules에 다음과 같이 추가 후 snort 를 재구동 시킵니다.
alert tcp any any -> any any (msg:"content-test-3"; content:"|47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31|"; sid:1000000003;)
Web 접속 시 content-test-3 이 기존 탐지된 content-test-1과 같이 탐지됨을 확인할 수 있습니다.
snort rule 관련 처음 포스팅이기 때문에 상세하게 적었지만 이후에는간략하게 내용 공유 하겠습니다.
nocase
"content-test-2" 는 테스트 시 탐지가 되지 않은 rule입니다. 이유는 문자열 GET을 소문자 "get"으로 만들었기 때문입니다.
이를 nocase 를 사용하여 대소문자 구분 없이 탐지되도록 할 수 있습니다. nocase는 content 키워드 뒤에서 content를 수정합니다. 이와 같이 content 뒤에 선언되어 앞의 content를 수정하는 키워드를 modifier 키워드라 합니다.
content modifier |
nocase |
rawbytes |
depth |
offset |
distance |
within |
http_client_body |
http_cookie |
http_raw_cookie |
http_header |
http_raw_header |
http_method |
http_uri |
http_raw_uri |
http_stat_code |
http_stat_msg |
fast_pattern |
content-test-2 에 다음과 같이 nocase; 를 추가해서 수정하겠습니다.
# content-test-2 에 nocase; 추가
alert tcp any any -> any any (msg:"content-test-1"; content:"GET / HTTP/1.1"; sid:1000000001;)
alert tcp any any -> any any (msg:"content-test-2"; content:"get / HTTP/1.1"; nocase; sid:1000000002;)
alert tcp any any -> any any (msg:"content-test-3"; content:"|47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31|"; sid:1000000003;)
websnort 접속 후 탐지 여부를 확인해 보겠습니다.
아래와 같이 3개의 rules가 모두 탐지됨이 확인됩니다.
감사합니다.
'IT > Snort' 카테고리의 다른 글
[Snort] #5 Payload Option - offset & Rule test (0) | 2023.08.10 |
---|---|
Colasoft Packet Builder - Windows용 패킷 전송툴(snort rule 검증) (1) | 2023.07.28 |
[Snort] #3 Payload Option - Snort Rule OTN (0) | 2023.07.19 |
[Kali Linux] Kali(Debian)에 Snort 설치 방법 (8) | 2023.07.17 |
[Snort] #2 Snort Rule 기초 - RTN, OTN, General Option (0) | 2023.07.17 |
댓글