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한
,