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에 대해서도 동일하게 처리하고 있답니다.
'IT 생활 > IPS & Snort' 카테고리의 다른 글
스노트(Snort)를 위협하는 IPS시장의 신 강자 수리카타(Suricata) (0) | 2012.10.23 |
---|---|
[스노트-Snort] 시그니처 content 옵션 이해하기 (43) | 2012.08.22 |
[스노트-snort] snort HTTP 관련 매칭 옵션 (http_uri, http_client_body, http_header, etc..) (9) | 2012.01.27 |
[스노트-snort] byte 관련 옵션 (byte_test, byte_jump, byte_extract) (3) | 2011.11.04 |
[스노트-snort] snort-2.9.1 이후 버전 설치 (12) | 2011.11.04 |