그림 1. SURICATA 로고 


Suricata(수리카타)는 Open source기반의 IDS(Intrusion detection system)입니다. 사실 Open source 기반의 IDS/IPS라고 하면 Snort(스노트)가 대표적입니다. 거의 독보적이라고 할 정도로 오랜 시간 입지를 굳혀오고 있었지요. 오픈 소스의 특성상 많은 사람들이 사용하고 피드백을 주게 되면 그 만큼 오류 수정 및 기능 추가에 용의하게 됩니다. Snort는 오랜 시간 전 세계 많은 사용자의 도움으로 다양한 공격을 좀 더 정확하게 탐지하는 방법에 중점을 두고 발전을 해왔다고 봅니다. 


문제는, 그 사이 인터넷 세상은 집집마다 광 케이블을 통한 초고속 인터넷이 설치 되는가 하면 스마트폰 보급이 빠른 속도로 진행되면서 급속도로 팽창하게 됩니다. 그 결과 트래픽 양이 급격히 증가하면서 대용량 트래픽의 실시간 처리에 대한 이슈가 부각되게 됩니다. Snort는 구조상 단일 스레드(Single-thread)만 지원 하다 보니 처리 대용량 트래픽을 실시간으로 처리하기에 버거운 환경이 된 겁니다. 


Suricata는 Snort의 단점은 개선하면서 장점은 그대로 수용하여 이상적인 IDS/IPS를 개발하는 것이 기본적인 목표인것 같습니다. 아래는 Suricata의 주요 장점이라고 할 수 있는 내용입니다. 


1. 멀티 코어(Multicore)/멀티 스레드 (Multi-threading) 완벽 지원 (snort는 지원 불가. snort-3.0에서 시도 했으나 포기함.)

2. Snort 룰 완벽 호환 ( 기존 시스템에서 사용중인 snort 시그니처를 그대로 사용 할 수 있음.)

3. 하드웨어 밴더의 개발 지원으로 하드웨어 가속 지원. (GPU 가속)

4. 스크립터 언어(lua)로 시그니처 작성 가능 (snort 룰 포맷을 몰라도 시그니처 작성이 가능함.)

5. Snort의 대부분의 기능 모두 지원 



그림 2. suricata work flow


Suricata는 OISF(Open Information Security Foundation)에서 개발 한 것으로, 2009년 12월에 베타 버전이 나온 이후로.. 2012년 10월에는 Fedora 17버전에 포함되면서 엄청나게 빠른 속도로 기반을 잡아가고 있습니다. 

이제는 Fedora에서 '# yum install suricata'라는 명령 하나만으로 Suricata를 설치/사용 할 수 있는 환경이 된 것이죠. 


이처럼 급격한 성장은 OISF라는 단체에 대해 알고 나면 금방 이해가 될 겁니다.  

OISF는 미국의 해군 우주해양전쟁시스템센터(SPAWAR-Navy's Space and Naval Warfare Systems Command)국토안보부의 과학기술국 (Department of Homeland Security's Directorate for Science and Technology)오픈 보안기술(HOST-Homeland Open Security Technology) 프로그램의 일환으로 창립 되었습니다. 


그림 3. OISF 로고


이 재단의 목표는, 미국 정부 기관의 전반적인 보안 및 인터넷 보안을 위해 사용할 새로운 보안 시스템을 개발 하는 것입니다. 오픈 프로젝트여서 결과물에 대해서 사용자나 기관에서 사용 할 수 있도록 공개도 해줍니다. 


우리나라는 강 바닥 파는데 투자할 때 미국은 보안 소프트웨어에 대대적인 투자를 시작한것이죠. 이게 시각의 차이인가 싶네요. 


어쨌든, 미국의 국토안보부에서 재정 지원을 하는 만큼 재정적으로 부족함이 없을것 같네요. 


아래는 OISF의 파트너사 입니다. 


그림 4. OISF Partners


미국 처럼 큰 나라의 정부가 주관하는 프로젝트여서 그런지 많이 들어본 친숙한 회사들이 여럿 있습니다. 


어찌 보면 이제 시작인지도 모릅니다. 시간이 지나면서 점점 참여 업체가 많아지고.. 실제로 사용할 만한 수준이 되고 나면 급속도로 snort가 차지하고 있던 시장을 대체해 버릴지도 모르겠네요. 따지고 보면 snort는 한 업체의 제품이고 suricata는 미국의 범 정부 차원의 프로젝트 결과물이니 당연한 것인지도 모르겠네요. 


어쨌든, 한국 IPS시장도 현재는 Snort 일색인데.. 머지않은 미래에 큰 변화가 생길지도 모르겠네요. 


아래는 관련 사이트 링크 


Posted by KT한
,

모든 IPS(IDS)는 패킷에서 특정 패턴을 찾는 기능을 기본으로 합니다. 


스노트는 'content' 라는 이름을 사용하고 있습니다. 

이 옵션을 사용하면 패킷의 페이로드 전 부분에 대해 패턴을 찾게 됩니다. 

페이로드라 함은 아래의 그림에서 빨간색 박스로 표시해둔 부분을 말합니다. 


스노트 옵션 중 가장 기본이 되는 패턴을 지정하는 'content'옵션에 대해 알아봅시다. 


  • 기본 사용법
  1. content라는 키워드를 쓰고,                                                                  content
  2. 콜론(:)을 붙여 시작을 알립니다.                                                           content:
  3. 따옴표(")로 패턴이 시작됨을 지정하고,                                                content:"
  4. 탐지하고자 하는 패턴을 입력 합니다.                                                   content:"pat
  5. 따옴표(")를 한 번 더 붙여서 패턴이 끝남을 지정합니다.                     content:"pat"
  6. content가 끝났음을 세미콜론(;)을 붙여 명시합니다.                          content:"pat";


  • 옵션
  1. !     입력한 패턴이 매칭되지 않는지 검사 
  2. |     hex값을 표현할 때 사용
  3. \    특수 기호 escape 처리 할 때 사용


  • 사용 예
  1. content:"pattern";                       단순 패턴 
  2. content:"|20|hex|20 28|";         패턴 + Hex값
  3. content:"\"pattern\|";                 사용 불가한 패턴을 escape처리
  4. content:!"negate";                      패킷에 negate 패턴이 없는지 검사


  • 주의사항

다음 세 가지는 escape처리를 하지 않으면 사용 불가능한 기호입니다. 

;  \  "



  • 함께 사용하는 옵션들

순번 

옵션  

설명 

 1

nocase 

 대/소문자 구분 하지 않음

 2

rawbytes 

 decode하지 않은 raw data와 매칭 시도

 3

depth 

 payload에서 패턴 매칭을 할 끝 위치 지정

 4

offset 

 payload에서 패턴 매칭을 할 시작 위치 지정

 5

distance 

 이전 content에 매칭된 경우, 패턴 매칭을 시작할 상대 위치 지정

 6

within 

 이전 content에 매칭된 경우, 패턴 매칭을 끝 낼 상대 위치 지정  

 7

http_client_body 

 HTTP body 부분에 대해 패턴 매칭 시도

 8

http_cookie 

 HTTP cookie 부분에 대해 패턴 매칭 시도

 9

http_raw_cookie 

 HTTP cookie를 decode하지 않은 부분에 대해 패턴 매칭 시도

 10

http_header 

 HTTP header  부분에 대해 패턴 매칭 시도

 11

http_raw_header

 HTTP header를  decode하지 않은 부분에 대해 패턴 매칭 시도

 12

http_method 

 HTTP method  부분에 대해 패턴 매칭 시도

 13

http_uri 

 HTTP uri  부분에 대해 패턴 매칭 시도

 14

http_raw_uri 

 HTTP uri를  decode하지 않은 부분에 대해 패턴 매칭 시도

 15

http_stat_code 

 HTTP response 패킷의 stat code 부분에 대해 패턴 매칭 시도

 16

http_stat_msg 

 HTTP response 패킷의 stat msg 부분에 대해 패턴 매칭 시도

 17

fast_pattern 

 longest pattern 지정 - keyword처럼 동작함. 

※ HTTP 관련 옵션 참고 글


  • offset/depth/distance/within 동작 원리 

페이로드에서 패턴을 찾고자 하는 위치를 지정해 주는 이 옵션들을 사용하는 주된 이유는 오탐을 줄이기 위해서 입니다. 

더불어, 엔진 내부적으로는 성능 향상을 위해서도 중요한 역할을 합니다. 

페이로드 전체에 대해서 패턴 매칭을 시도하는 것보다 페이로드 일부분에 대해서 패턴 매칭을 시도하는데 걸리는 시간이 짧은건 당연할테니까요. 

아래의 테이블에 시그니처를 작성 했을 때 실제 패턴 매칭에 사용되는 버퍼를 케이스 별로 정리해 두었습니다. 

가장 이상적인 것은 패턴 매칭에 사용되는 버퍼의 크기와 시그니처에 작성된 패턴의 크기가 같은 경우겠죠? 


예) 패킷 페이로드 : 1234567890abcdefghijklmn

 순번

시그니처 

 패턴 매칭 버퍼 

 1

 content:"def";   1234567890abcdefghijklmn

 2

 content:"234"; offset:1; depth:5;  23456  

 3

 content:"123"; depth:3; content:"abc"; distance:5; within:8;   90abcdef

 4

  content:"abc"; distance:5; within:8;

 67890abc


  • 알아두면 뼈가되고 살이되는 정보 

fast_pattern 옵션을 얼마나 잘 활용하는가에 따라 초보자와 숙련가를 구분 할 수 있다고 해도 과언이 아닙니다. 

이 옵션을 사용하지 않아도 동일한 유해 패킷을 탐지 할 수 있기 때문입니다. 

그런데 궂이 왜 이런 옵션을 만들어둔 것일까요? 


fast_pattern은 특정 패턴을 longest pattern으로 지정한다고 했는데요.

기본적으로 스노트는 content에 입력한 패턴 중 길이가 가장 긴 녀석을 longest pattern이라고 부르고, 이런 패턴들을 모아서 Aho-Corasick 알고리즘에 의해 빠르게 검사해야할 시그니처를 걸러냅니다. (보통은 패턴의 길이가 길면 다른 패턴과 중복되지 않고 Unique한 경우가 많기 때문에 스노트에서는 가장 긴 패턴을 골라서 검사해야할 시그니처를 걸러내는 목적으로 사용하고 있는것같습니다. )

이 과정에서 얼마나 많은 시그니처를 걸러내느냐는 얼마나 빨리 공격을 탐지하는가와 직결되는 문제입니다. 

간혹 패턴의 길이는 짧지만 매우 Unique한 패턴이 있다면 이 패턴을 Keyword로 설정해서 Aho-Corasick알고리즘에 의한 필터링에 사용하는게 더 유리하겠죠? 

이것을 가능하게 해주는 옵션이 fast_pattern인 것입니다. 


※ fast_pattern은 부가적인 옵션과 함께 사용가능한데요.. 그 내용들도 알아두면 좀 더 완성도 높은 시그니처를 작성 할 수 있을겁니다. 


  • 몰라도 무관한 재미난 사실 

content에 입력한 값은 Hex값으로 입력 하더라도 문자로 표현할 수 있는 범위(0x20~0x7E)의 값이라면 문자로 변환해서 저장하고 있으며,  그 외의 값은 모두 Hex값으로 저장하고 있게 됩니다. 

이렇게 함으로써 Hex값에 대해서 nocase 옵션을 붙여주게 되면, 그 값이 문자열일 경우 대소문자를 구분하지 않고 탐지가 가능합니다. 

예) content:"|61 62 63|"; nocase;

'abc', 'Abc', 'ABC', 'aBc' 모두 탐지 가능 


단, 아래 4가지 값은 hex값으로 저장하고 있게 됩니다. 

 순번

 Hex값

기호 

 1

20 

'스페이스' 

 2

22 

 3

3B 

 4

7C 


찾는 내용이 없다면 [스노트/Snort] 카테고리의 다른 글을 참고해보세요~ ^^


Posted by KT한
,

Snort에는 여러가지 유용한 전처리기들이 존재합니다. 

그 중 HTTP inspection 모듈은 다양한 공격 패킷을 탐지하는데 매우 중요한 역할을 합니다. 

더불어 실시간으로  좀 더 정확하게 패킷을 검사하는데도 일조 하고 있죠. 



  • HTTPINSPECT PACKET FLOW 와 각 모듈별 역할 


1. Session Inspection Module

  - 'snort.conf' 파일에 정의해둔 http server port값과 비교해서 서버/클라이언트를 판단 

  - 또한, http inspect를 수행 할 지에 대한 판단도 함께 진행 

  - 현재는 Stateless 모드만 지원한다. (Stateful로 수행하기에는 좀 버거울 지도..)


2. HTTP Inspection Module

  - method/header/body/cookie등 HTTP패킷을 파트별로 분류하는 작업 수행 

  - pipeline request 패킷에 대한 처리도 함께 수행 함


3. HTTP Normalization Module

  - HTTP패킷에 대한 정규화작업을 수행  (하단 설명 참고)

  - 별도의 버퍼에 HTTP패킷을 파트별로 구분해둔 값을 설정 


4. HTTP Detection Module

  - 시그니처와 패턴 매칭 수행 

  - 위에서 설정한 별도의 버퍼에 대해서 탐지를 수행


5. HTTP Event Output Module

  - 매칭된 결과에 대한 출력 




  • 정규화(Normalization) 작업의 허와 실 


정규화는 인코딩된 URL값을 디코딩 하는 작업을 말합니다. 


인코딩은 흔히 다음과 같이 이루어 지게되죠. 


'&' -> %26 (hex값으로 26이 '&'이므로)



일반적으로 웹서버는 인코딩 된 값을 알아서 디코딩 해 주는데, 

중간에서 악성 패킷을 검사하는 보안 장비는 일반적으로 

장비 성능 이슈 때문에 디코딩을 완벽하게 수행하지는 않습니다. 


해커는 이 점을 악용해서 공격을 할때 인코딩을 한 패킷을 전송할 수도 있겠죠?


중간에 보안 장비가 있을 것을 대비해서 여러번 인코딩 한 패킷을 전송할 수도 있겠구요. 

아쉽게도 Snort(스노트)는 HTTP 패킷에 대해 최대 2번까지만 디코딩 작업을 수행합니다. 

다시 말하면 3번 인코딩한 패킷을 탐지 못한다는 뜻이됩니다. 



어쨌든, 

디코딩한 결과를 'uricontent'라는 옵션을 사용해서 시그니처를 작성 할 수 있습니다. 


기본적으로 uricontent는 http inspection모듈에 의해 normalization을 수행한 결과값을 가지고 있게되구요. 


일반적으로 uricontent는 HTTP 패킷의 uri 필드에  '%28' 과 같은 값을 '(' 와 같이 디코딩 하여 

uricontent:"("; 와 같이 시그니처를 작성 함으로써 인코딩 된 패킷을 탐지하는데 사용됩니다. 


만약, 

시그니처에 uricontent:"%33%34"와 같은 시그니처가 있다면 

실제 탐지하는 패킷은 %%%33%33%%%33%34 와 같은 패턴을 가지고 있겠죠.

 

무슨 말인지 어렵다구요? 

단계별로 알아보면.. 


%  %  %33 %33 % % %33 %34

%  % 3 3              % % 3 4                    - 1번째 디코딩

% 33                    % 34                         - 2번째 디코딩


물론, 한번 더 디코딩을 한다면 34가 됩니다.

 


주의사항:

HTTP패킷의 uri 필드에 '+' 가 있는경우,

snort에서는 '빈칸'으로 인식하고 Hex값 '20'으로 치환해버립니다. 


일반적으로 HTTP패킷의 body에서는 빈칸을 '+'로 표시하는데,

snort는 uri에 대해서도 동일하게 처리하고 있답니다. 


Posted by KT한
,
  • Snort-2.9.1 버전에 대해..
대표적인 IDS/IPS 오픈소스인 스노트가 2.9.xx 버전이 나온지도 한참 지났네요.
2.8.xx 버전과 비교해서 많은 기능이 추가되었고, 수 많은 버그 또한 수정 되었지요. 
(물론, 모든 버그가 수정된건 아니겠지만..)

어쨌든.. 
지속적으로 추가되는 기능들 때문에.. 
처음 접하는 사람들에게는 조금 부담 스러울 수도 있을 정도로 복잡해져 가는것 같습니다. 

설치 과정부터 사용법까지 차근차근 포스팅 해보려고 합니다. 


혹시 몰라 페도라 17에 snort 설치 하는 법에 대한 영문 매뉴얼을 첨부했으니 필요하신분은 참고하세요.
  • 설치 과정
먼저, 사전에 설치 해야할 rpm 들이 있습니다. 'rpm.pbone.net' 혹은 구글링을 통해 다운 받아둡니다. 
'# rpm -i <패키지 이름>' 으로 설치 합니다. 
libpcap
libpcap-devel
pcre
pcre-devel
libdnet
libdnet-devel 


1.  daq 다운 

우선 아래 홈페이지에 접속해서 snort와 필수 유틸인 daq를 다운 받아야 합니다. 


스노트(snort) 공식 홈페이지 

rpm을 받으셔도 되고 tar로 묶인 소스 파일을 받으셔도 됩니다.


2. daq를 설치


1) tar파일을 받으셨다면..
압축을 풀어주시고..
README 파일에 나와있는 설치 순서에 따라 실행해주면 됩니다. 


   # ./configure

   # make

   # sudo make install


2) rpm을 받으셨다면 rpm명령으로 설치하시면 됩니다. 

# rpm -ivh daq-*.rpm 

이 과정에서 libpcap(버전 1.0.0 이상) 이나 
다른 필요 항목들이 설치되어 있는지 확인하는 과정을 거치게 됩니다.  

daq는 패킷을 처리하기 위한 필수 유틸로
이를 설치하지 않으면 snort가 정상적으로 설치되지 않습니다. 

(2.8.xx 버전에는 없었으나.. 2.9.xx에서 추가된 기능 같더군요. )


3. snort 설치


snort 홈페이지에서 tar확장자로 압축된 snort 파일을 다운 받아 압축을 풀고..
 
snort-2.9.1/doc/INSTALL 파일에 나와있는 설치 순서에 따라 실행해주면 됩니다.


1) 이전 버전의 snort가 설치되어 있다면.. 이를 제거해줘야 겠죠?

# sudo make uninstall


2) 필수 유틸들이 정상적으로 설치되어 있는지 확인합니다. 

libdnet, libpcap, libpcre 가 확인해야할 유틸들입니다. 

또한, 'which' 명령어를 써서 dnet-config, pcre-config, daq-modules-config 가 존재 하는지 확인합니다. 


예) # which daq-modules-config

/usr/local/bin/daq-modules-config


만약, 위의 것들중 없거나 설치되지 않은게 있다면 먼저 설치해 주어야 합니다. 


3) 설치를 시작합니다. 

snort 폴더에 있는 configure 를 실행합니다. 

만약 설정을 바꾸고 싶은게 있다면 '-h' 명령어로 세부 내용을 확인 후 설정값을 넣어주면 됩니다. 


예)

 # ./configure --enable-active-response --enable-reload --enable-react


4)  설치를 진행합니다. 

# make && sudo make install


5) 정상적으로 설치 되었는지 확인 후 실행하시면 됩니다. 

실행파일은 'src/snort' 파일로 생성되며,

'make install' 후에는 '/usr/local/bin/snort' 에도 들어가게 됩니다. 

※ bin 폴더에 넣어줌으로써 어떤 경로에서든 snort를 자유롭게 실행할 수 있게 되는 겁니다. 


daq가 정상적으로 설치 되었는지 확인 해보는 작업을 예로 들어보겠습니다. 


예) 

# snort --daq-list


Available DAQ modules:

pcap(v3): readback live multi unpriv 

ipq(v5): live inline multi 

ipfw(v2): live inline multi unpriv 

dump(v1): readback live inline multi unpriv 

afpacket(v4): live inline multi unpriv


만약 DAQ 모듈에 대한 정보가 정상적으로 출력되지 않는다면.. 

설치 과정에서 DAQ가 정상적으로 설치되지 않은 것입니다. 


6) 설정 적용 및 시그니처 파일 설정

기본적으로 '/etc/snort/snort.conf' 파일에서 원하는 설정 정보를 수정 및 적용 가능합니다. 

또한, '/etc/snort/rules/' 폴더에서 'rules'라는 확장자를 가진 파일에서는 시그니처를 설정 및 적용 할 수 있습니다. 


아래와 같이 설정 파일(snort.conf)에 시그니처 파일의 경로를 지정하면 해당 시그니처 파일의 경로를 찾아서 시그니처를 로드하게 됩니다. 

'/etc/'snort/rules'폴더를 변수로 설정 하고, 해당 경로의 'my.rules'를 include 함으로써 snort가 해당 시그니처 파일을 읽도록 설정해주는 내용입니다. 

var RULE_PATH /etc/snort/rules 

include $RULE_PATH/my.ruels 


7) 실행 옵션 지정

실행에 필요한 옵션 정보는 다음과 같이 조회가 가능합니다. 


# snort -?


'-D' 옵션은 데몬모드로 실행하도록 하는 옵션입니다. 

이런 내용은 위 명령어를 쓰면 모두 조회가 가능합니다. 



4. snort 사용 및 검증

우선 '-D'옵션을 사용해서 데몬 모드로 실행합니다. 


# snort -D -Q --daq afpacket -i eth1:eth2 --daq-var buffer_size_mb=64 -c /etc/snort/snort.conf 


시그니처가 정상적으로 탐지되고 있는지 확인하기 위해 snort에서 생성하는 alert 파일을 열어봅니다. 

# tail -f /var/log/snort/alert
  
[**] [1:225:7] test [**]
[Priority: 0]
11/04-17:36:58.370718 192.168.11.101:445 -> 192.168.9.148:49220
TCP TTL:127 TOS:0x0 ID:96 IpLen:20 DgmLen:1500 DF
***A**** Seq: 0x911E284F  Ack: 0x1E88D7E9  Win: 0xFC4E  TcpLen: 20


이벤트가 발생할 때마다 위와 같은 포맷의 결과를 확인할 수 있습니다. 

만약 snort가 동작중에 시그니처를 변경했다면.. 
다음 명령어로 snort를 종료하지 않고 설정을 다시 읽어들일 수 있습니다. 
 
# kill -SIGHUP <snort pid> 


만약 reload가 되지 않는다면..
'--enable-reload' 옵션을 주고 configure를 다시 수행 해보시기 바랍니다.  

이제 열심히 snort를 즐기기만 하면 됩니다!!
HAVE FUN! 


 

Posted by KT한
,