2018년 1월 14일 일요일

간만에 Snort 분석(OS-WINDOWS Microsoft Windows SMB Session Setup NTLMSSP unicode asn1 overflow attempt)

이기종간 데이터 통신, 특히 X.509 등 인증서 인코딩에 많이 쓰인다는 ASN.1 프로토콜 버퍼오버플로우 공격을 탐지하는 룰이 있다.

alert tcp $EXTERNAL_NET any -> $HOME_NET 139
(msg:"OS-WINDOWS Microsoft Windows SMB Session Setup NTLMSSP unicode asn1 overflow attempt";
flow:to_server,established;
① content:"|00|"; depth:1;
② content:"|FF|SMBs"; within:5; distance:3;
③ byte_test:1,&,128,6,relative;
④ pcre:"/^.{27}/R";
⑤ byte_test:4,&,2147483648,21,relative,little;
⑥ content:!"NTLMSSP"; within:7; distance:27;
⑦ asn1:double_overflow, bitstring_overflow, relative_offset 27, oversize_length 2048;

metadata:ruleset community; reference:bugtraq,9633; reference:bugtraq,9635; reference:cve,2003-0818; reference:nessus,12052; reference:nessus,12065; reference:url        ,technet.microsoft.com/en-us/security/bulletin/MS04-007; classtype:protocol-command-decode; sid:3000; rev:11;)

탐지 과정은 다음과 같다.

① content:"|00|"; depth:1;
 -> 페이로드 시작 지점부터 1byte내에서(depth:1) 문자열 검사.


② content:"|FF|SMBs"; within:5; distance:3;
 -> 이전 패턴매칭이 끝난 지점에서 3byte를 건너뛴 후(distance:3), 5byte내에서(within:5) SMB 헤더 문자열 검사.
 -> SMB 'Session Setup Andx' 명령어 확인


③ byte_test:1,&,128,6,relative;
 -> 이전 패턴매칭이 끝난 지점에서(relative) 6byte를 건너뛴 후, 1byte(c8)를 128과 AND 비트연산.
 -> unicode string 여부 검사
 -> 바이트 오더는 '07 c8'인데 'c8 07(0xc807)'로 읽는다. 어감이 좀 이상하지만 기분탓 네트워크 바이트 오더는 빅엔디안인데 리틀엔디안으로 해석하는 건가?


④ pcre:"/^.{27}/R";
 -> 이전 패턴매칭이 끝난 지점부터(R) 27개의 문자열 검사.
 -> 왜 27개를 검사할까? Max Buffer 영역까지 검사하기 위해서?


⑤ byte_test:4,&,2147483648,21,relative,little;
 -> 이전 패턴매칭이 끝난 지점에서(relative) 21byte를 건너뛴 지점에 위치하는 4byte를 2147483648과 AND 비트 연산.
 -> 'little endian'을 적용하기 때문에 '81 a3 30 81'은 원래 순서로 정렬. 그런데 'big endian' 순서로 계산해도 결과가 같네?-_-
 -> 더 큰 문제는 해당 비트가 특정 패킷 구조를 의미하지 않는다. 비트 연산 왜 하지?


⑥ content:!"NTLMSSP"; within:7; distance:27;
 -> 이전 패턴매칭이 끝난 지점에서 27byte를 건너뛴 후(distance:27), 7byte내에서(within:7) 문자열 검사.
 -> 해당 문자열 매칭이 실패했을 때 검사 성공.


⑦ asn1:double_overflow, bitstring_overflow, relative_offset 27, oversize_length 2048;
 -> 이전 패턴매칭이 끝난 지점에서 27byte를 건너뛴 후(relative_offset 27), 나머지 바이트 스트림에서 ASN.1 규격을 벗어나는 인코딩 형식 및 사이즈 등을 체크하는 듯.


이전 검사가 성공하면 순서대로 다음 검사 옵션으로 이어지는데, 옵션 을 비활성화하면, 정상적인 윈도우 시스템간 파일 공유 환경에서도 탐지로그를 발생시킬 수 있다.

모두 NTML 인증 과정에서 발생

byte_test에서 'little endian' 옵션이 어떻게 쓰이나 궁금해서 일부러 오탐을 만들어 봤는데, 해당 옵션이 있으나 없으나 결과가 같음. -_-

그런데 저 탐지룰이 복잡도만큼 효과가 있을지는 모르겠다. 오래된 건 둘째치고, 해당 시스템에 접근하지 못하면 말짱 황인데, 만약 접근이 가능하다면 내부 접근 권한이 있다는 뜻이기 때문에 저런 공격을 할 필요가 없다. 2004년도면 방화벽이 대중화됐을 때 아닌가?

관련 글

댓글 없음:

댓글 쓰기

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