BoB/공통교육

suricata

js0807 2021. 1. 13. 18:51

Intro

suricata란, 오픈소스 IDS/IPS 툴이다.

(자세한 설명 : suricata-ids.org)

 

Suricata

Open Source IDS / IPS / NSM engine

suricata-ids.org

suricata는 rule을 제작하여 우리가 원하는 IDS/IPS를 설정할 수 있다.

우리는 suricata를 사용하여 네트워크에 접속할 시에 접속했다고 알려주는 rule을 제작할 것이다.

 

아래 사이트에서 rule에 대한 규칙을 찾아볼 수 있다. 도움이 필요하면 여기를 참고하자.

(suricata rule documentation : suricata.readthedocs.io/en/suricata-6.0.0/index.html)


Practice : start

※ 작업 환경 : Ubuntu 18.04 LTS

 

일단 suricata 설치를 해보자.

sudo apt install suricata

 

설치가 완료되었으면, 우리만의 rule을 만들어야 하므로,

touch test.rules
vim test.rules

rule 파일을 만들고 아래와 같이 입력한다.


alert tcp any any -> any 80 (msg:"me.go.kr access"; content:"GET /"; content:"Host: "; content:"me.go.kr"; sid:10001;)
alert tcp any any -> any 80 (msg:"cha.go.kr access"; content:"GET /"; content:"Host: "; content:"cha.go.kr"; sid:10002;)
alert tcp any any -> any 80 (msg:"mofa.go.kr access"; content:"GET /"; content:"Host: "; content:"mofa.go.kr"; sid:10003;)


입력 후 저장을 하고 실행시켜보자.

 

ifconfig
suricata -s test.rules -i eth0(ens33, ...)

ifconfig로 먼저 현재 네트워크가 어떤 인터페이스로 설정되어 있는지 보고 eth0을 설정한다.

이후 명령어를 실행하게 되면 suricata가 test.rules를 기반으로 실행된다.

 

suricata 실행 화면

위 사진처럼 suricata가 실행되며 사이트 접속시 로그가 남는데 그 로그파일은 

tail -f /var/log/suricata/fast.log

위 로그를 보여주는 command를 통해서 살펴볼 수 있다.

 

fast.log 화면


Practice : theory

alert tcp any any -> any 443 (msg:"me.go.kr access"; content:"GET /"; content:"Host: "; content:"me.go.kr"; sid:10001;)

먼저, 구조이다. suricata rule의 구조는 3단계로 이루어져 있는데,

  • Action
  • Header
  • Rule Options

로 이루어져 있다. 자세한 설명은 아래 링크를 참조하자.

(자세한 설명 : suricata.readthedocs.io/en/suricata-6.0.0/rules/intro.html)

 

그렇다면 저 구문을 분석해보자.

alert tcp any any -> any 80 (msg:"me.go.kr access"; content:"GET /"; content:"Host: "; content:"me.go.kr"; sid:10001;)

alert는 alert를 생성하는 역할의 Action이다. alert는 로그를 띄우거나, 어떤 처리를 할 때 사용될 수 있다.

 

alert tcp any any -> any 80 (msg:"me.go.kr access"; content:"GET /"; content:"Host: "; content:"me.go.kr"; sid:10001;)

Header부분에서는 여러가지를 다룬다. Protocol, Source & Destination, Ports, Direction 이 있다.

 

이 구문의 Header를 설명하자면,

현재 tcp를 사용해 아무곳(any)에서 아무곳(any)으로 아무 포트(any)가 80포트로 접속을 시도했을 때 alert를 하게 한다.

 

alert tcp any any -> any 80 (msg:"me.go.kr access"; content:"GET /"; content:"Host: "; content:"me.go.kr"; sid:10001;)

다음은 Rule Options이다. 앞의 ActionHeader 조건이 충족되면 Rule Options을 실행하는 방식이다.

 

이 구문의 Rule Options를 설명하면,

  • msg:"me.go.kr access" - 환경부에 접속했다고 메시지를 보낸다.
  • content:
    • "GET /" - Get 방식을 사용하며
    • "Host: " - Host 요청 헤더가 있으며
    • "me.go.kr" - 환경부가 있는
    • 패킷들을 대상으로 한다.
  • sid:10001 - 식별번호

이다.

 

따라서, 이 구문을 한문장으로 표현하면 이렇다.

TCP를 사용해 사용자가 80포트로 GET방식을 통해 환경부에 접속하며 Host 헤더를 가졌을 때, 이를 10001 코드로 구분하며 "me.go.kr access"를 ALERT 한다.

Practice : application

현재 환경부는 HTTP로 되어있어 80포트로 Detect가 가능하다.

하지만 많이 사용하는 naver, google, daum 등 여러 사이트들은 HTTPS를 사용하므로 Detect가 되지 않는다.

 

그러면 어떻게 해야할까?

 

먼저 HTTPS의 포트부터 알아보자.

443이다. 따라서 Header 부분에 80이라 되어있는 부분을 443으로 고치기만 하면 Detect가 될까? 한번 해보자.

 

하지만 어림도 없다는 사실을 알게 될 것이다.

왜냐하면 포트가 변경되었기에 그 포트를 사용하는 프로토콜에 맞추어 Rule Options를 변경해야 하기 때문이다.

 

나는 이렇게 바꾸었다. (따로 설명은 하지 않겠다. 공부하세요!)

alert tcp any any -> any 443 (msg:"naver.com access"; tls_sni; content:"naver.com"; sid:20001;)
alert tcp any any -> any 443 (msg:"github.com access"; tls_sni; content:"github.com"; sid:20002;)
alert tcp any any -> any 443 (msg:"namu.wiki access"; tls_sni; content:"namu.wiki"; sid:20003;)

이런식으로 수정을 해주면

 

443 Port를 이용한 TLS 통신을 ALERT한 Log

이렇게 443 포트를 통해 통신하는 HTTPS까지 ALERT 모습을 볼 수 있다.


Conclusion

평소에 IDS/IPS 말만 들어보고, 그런것들이 어떤 활동을 하는지만 알아봤지 실제로 프로그램을 사용하여 구현해 본 것은 처음이였다. 그래서 좀 신기하고, 재미가 있었다. 물론 이것을 BoB 9기 공통교육 과제로 하기는 했지만, 그래도 하면서 보람있었고 찾아보는 재미있었던 것 같다.

 

내 코드 : github.com/js0807/suricata-rule

 

※ BoB 9기 공통교육 중 내용이므로 Study 목적 외에는 사용 금지 부탁드리겠습니다.

 

 

'BoB > 공통교육' 카테고리의 다른 글

packet-stat  (0) 2021.02.05