2015년 8월 16일 일요일

Snort 분석(deleted.rules)

Snort 룰 경로(C:\Snort\rules)를 보면 'deleted.rules' 란 파일이 있다. 오래된 취약점 등 위험이 없다고 판단되어 비활성화된 룰인데 자그마치 6,900개.


Snort가 버린 룰이지만 다양한 오탐을 경험하자는 차원에서 재활용을 해보면 어떨까? 주석만 제거해주면 된다. (물론 snort.conf 수정도 함께)



그런데 실행을 하니 에러가 난다. 6,489번째 행에 문제가 있단다. 찾아보니 룰 파일에는 룰만 있어야 하는데 주석 처리하지 않은 코멘트가 있다. 주석 처리를 해주자.


그런데 감이 살짝 안온다. 일일이 찾아서 주석 처리를 하긴 귀찮고,  'alert'으로 시작하지 않는 행을 찾아서 일괄적으로 '#'을 추가해줘야 하는데 일단 검색부터 안된다.


'부정형 후방탐색' 정규표현식을 이용한 검색 명령어 '\(^alert\)\@<!.*'는 행의 시작 문자가 'alert'이 아닌 모든 문자를 검색한다. 

의도는 그랬으나 그런데 '.*'이란 정규표현식이 '부정형 후방탐색' 이후, 다시 모든 문자를 검색에 포함해버리는 듯. '전후방탐색'에 대해서 잠깐 살펴보자. 일단 '긍정형'은 좀 쉽다. 
  • PCRE 정규표현식 : .*(?=>) 
  • '>'로 끝나는 모든 문자를 검색하되, '>'는 검색 결과에서 제외 
  • VI 정규표현식 : .*\(>\)\@= 

긍정형 전방탐색

다음 PCRE 정규표현식 '(?<=>).*'는 '>'로 시작하는 모든 문자를 검색하되, '>'는 검색 결과에서 제외한다. 나름 의도대로 검색이 된 듯 하다. '긍정형'은 존재하는 특정 문자를 검색 시작이나 종료 위치로 지정함을 알 수 있다.
  • VI 정규표현식 : \(>\)\@<=.*

긍정형 후방탐색

'부정형'은 (반대니까) 존재하지 않는 특정 문자를 검색 시작이나 종료 위치로 지정한다. 일단 존재하지 않는 특정 문자를 찾아야 한다. 응? 존재하지 않는 문자를 찾으라고?


특정 문자로 시작하지 않거나, 끝나지 않는 문자를 찾는다고 생각하면 좀 쉽다(..) 다음 PCRE 정규표현식 '.*(?!>)'는 '>'로 끝나지 않는 모든 문자를 검색한다. 좀 찜찜하지만 검색 의도랑은 일치하는 것 같다.
  • VI 정규표현식 : .*\(>\)\@!

부정형 전방탐색

다음 PCRE 정규표현식 '(?<!>).*'는 '>'로 시작하지 않는 모든 문자를 검색한다. 이것도 찜찜하게 검색 의도와 일치한다. 그런데 부정형은 전후방탐색 모두 검색 결과가 똑같다?
  • VI 정규표현식 : \(>\)\@<!.*

부정형 후방탐색

왜 이런 결과가 나왔을까? 긍정형은 탐색 표현식과 일치하는 문자가 검색 위치를 결정하기 때문에 위치 예상이 쉬우며, 결과적으로 의도하는 검색 결과를 얻기가 쉽다. 

그런데 부정형은 탐색 표현식과 일치하지 않는 문자가 검색 위치를 결정하기 때문에 검색 위치가 다양해질 수 있다. 그렇기 때문에 최종 검색 표현식은 최대한 명확하게 해줄 필요가 있다. 즉 '.*'은 너무 두루뭉술하다. 

PCRE 정규표현식 '(?<!_)net'을 이용한 다음 사례는 '_'로 시작하지 않는 문자 'net'만을 검색한다. '부정형' 전후방탐색 사용 시 최종 검색 표현식의 중요성을 알려준다. 


그런데 'deleted.rules'에서 룰을 제외한 나머지 코멘트를 일괄적으로 주석 처리하기에는 대상 문자들의 패턴이 너무 다양하다. 문자 단위 검색의 한계인가? 어떻게 하면 특정 문자를 포함하지 않는 행만을 검색해서 일괄적으로 치환할 수 있을까?


이전 글에서도 'g/패턴/d' 형식의 명령어를 소개한 적이 있는데, VI는 해당 명령어를 이용해서 행 단위 검색 후, 삭제(d)는 물론 치환(s)도 가능하다.
  • g!/^alert/s/^/#/
  • 'alert'으로 시작하지 않는 행을 찾아서 '#'을 시작 문자로 추가


실행도 잘 되고, 버림받은 애들답게 오탐도 신나게 올라온다. 다음 로그 분석 사례는 이 중에서 하나 골라봐야지.

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스