본문 바로가기
IT/Snort

[Snort] #4 Payload Option - content, nocase / rule test

by 초록술 2023. 7. 27.
반응형

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 설치 방법

[Kali Linux] Kali(Debian)에 Snort 설치 방법

Snort 설치 및 구동 방법 - Kali Linux (Debian) 제가 운영 중인 Kali Linux(Debian) VM에 snort 테스트를 하기 위해 snort 설치를 진행하였습니다. Snort는 Network 보안에서 IPS, IDS의 중요한 부분을 차지하고 있습니

greensul.tistory.com

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.conf - local.rules 외 주석처리
snort.conf - local.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 접속
websnort WEB 접속

websnort 에 접속할 때 Kali linux에서 wireshark로 아래 패킷을 확인할 수 있습니다.
아래 패킷중에서 HTTP GET 요청을 잡기 위한 content를 작성합니다.

wireshark - websnort 접속 패킷 확인
wireshark - websnort 접속 패킷 확인

제가 탐지할 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:
content:"GET / HTTP/1.1"; 탐지

실제 탐지된 결과를 보니 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| 는 엔터로 제외했음)

"GET /  HTTP/1.1" Hex Code

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과 같이 탐지됨을 확인할 수 있습니다.

content-test-3 Hex code 탐지
content-test-3 Hex code 탐지

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가 모두 탐지됨이 확인됩니다.

nocase 테스트
nocase 테스트

감사합니다.

반응형

댓글