2018년 1월 14일 일요일

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

이기종간 데이터 통신, 특히 인증서 인코딩에 많이 쓰인다는 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'은 '81 30 a3 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년도면 방화벽이 나름 대중화됐을 때 아닌가?

댓글 없음:

댓글 쓰기

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