SMB, 너로 정했다! ch.01

By choirish | July 7, 2017

Research by BlackPerl Security

Writer Choirish



뚜둔! 오랜만입니다!



Blackperl Security에서는,
올해 5월 Wannacry 랜섬웨어가 등장하면서 SMB에 관심을 갖게 되었고
김치콘에서 발표하는 것을 목표로 공동연구를 진행하게 되었습니다!!

오랜 연구 끝에 무사히 KIMCHICON 발표를 마치고…
저희가 발표를 준비하면서 공부한 내용을 좀 더 많은 분들에게 널리 알리고자
이!렇!게! 블로그 포스팅으로 찾아왔습니다.





KIMCHICON2017

힘든 여정이었지만… 끝나고 나니 세상뿌듯!!
감동의 후기를 뒤로 하고 본격 들어가볼게요 >ㅅ<!!!




※ 알려드립니다 :) ※

  • 본 포스팅은 기존의 발표자료에 추가 설명을 덧붙이는 형태로 구성되었습니다!
  • 총 3부로 나누어 진행될 예정이니 많은 기대 부탁드립니다! ‘ㅅ’





목차는 다음과 같습니다.
이번 포스팅에서는 chapter 1,2 에 대한 이야기를 하려고 합니다 ‘ㅅ’)/
그럼 먼저 어떻게 이 연구를 진행하게 되었는지 썰을 좀 풀어볼게요 후후





WannaCry는 OS 자체의 SMB 1-day 취약점을 이용하기 때문에,
사용자가 특별한 행위를 하지 않고 네트워크에 접속하는 것만으로도 감염될 수 있습니다.





SMB는 Windows OS에 기본적으로 탑재되어 있고,
SMB 취약점을 이용하면 Remote Code Execution 공격이 가능하다는 사실이 넘나 매력적!!
나도 모르게 끌림!!!





…도 있긴 있었지만, 저 캐릭터랑 닮은 분이 어느날 갑자기 카톡으로.. 충격적인 소식을 전하심 -0-





강력히 현실을 부정하고싶었지만… 처절하게 실패…





그런 고로, 다음과 같은 발표 내용을 준비하였습니다!


1. WannaCry와 유사하게, SMB RCE를 활용했던 Conficker의 MS08-067 취약점을 간단히 구경!

2. 이번 WannaCry에 사용된 MS17-010 취약점을 자세히 분석!

3. 그리고… 새로운 SMB 취약점을 찾기 위한 삽질 스토리!






MS08-067 부터 먼저 기기!










  • Windows Server Service에서 파일이나 프린터 등을 공유할 때 사용하는 RPC APINetprPathCanonicalize() 함수에 취약점이 존재합니다.



  • ※ 관련 용어 참고 링크
    • Well-known MSRPC named pipes
      • 여기서 srvsvc(Server Service)라는 named pipe를 따라가면, Operation number 0x1f 위치에 NetprPathCanonicalize()가 있음을 확인할 수 있습니다.
    • Server Service Remote Protocol – MSDN
      • 여기서 첫 번째 줄을 보면 Server Service의 기능과 SMB 프로토콜의 연계성에 대해 알 수 있습니다.
      • Specifies the Server Service Remote Protocol, which remotely enables file and printer sharing and named pipe access to the server through the Server Message Block Protocol.






  • wcscpy() : wide-character version of strcpy.






  • 파일을 공유하기 위해서는, 파일이나 디렉터리의 경로를 처리하는 함수가 필요!
  • NetprPathCanonicalize()가 바로 그러한 함수인데… 경로 주소에서 “\blahblah\..”와 같은 부분은 없애도 같은 의미가 되니, 이러한 부분을 제거하는 기능을 합니다.
  • 그 방법은, “\..”를 기준으로 앞에 나타는 첫번째 “\”를 탐색하여 해당 부분을 제거하는 것입니다.






  • 근데 만약 다음과 같이 “\..” 앞에 “\blahblah” 값이 존재하지 않는다면 어떻게 될까요? 그림으로 함께 살펴봅시다.






메모리 상태를 왼쪽부터 차례로 보면..

  1. “\aaa..”부분을 제거한 후,
    • 나머지 경로값을 버퍼의 시작(“\aaa”가 있던 위치)으로 복사한다.
  2. “..”가 존재하므로, “..” 앞부분의 버퍼를 쭉 탐색하며 “\”를 찾는다.
    • 그러다보면 RET 주소 너머에 있는 영역까지 탐색하게 될 수 있다.
  3. 이 때, RET 주소 너머의 “\”가 있는 곳을 버퍼의 시작으로 착각하여 나머지 경로값을 그 곳에 복사하게 되고 임의의 조작된 값을 통해 RET 주소를 컨트롤 할 수 있게 된다!!

알고보니 아주 간단한 Stack Buffer Overflow 취약점입니다! 하지만 이런 사소한 실수로 인해 큰 피해가 발생했었지요…:(






해당 취약점은 다음과 같이 패치되었습니다.

  • “..” 앞에 있는 “\”를 탐색하는 과정에서 버퍼의 시작 위치(v1)를 만나면 탐색을 중단하도록 하는 체크 루틴을 추가!
  • 즉, 기존의 경로 주소 버퍼를 벗어나 탐색하지 않도록! 버퍼를 벗어난 곳에 값을 복사하지 않도록 차단!




뚜둔! 복잡할 것 같았던 MS08-067 취약점 분석까지 훅 지나가버리고…
아쉽지만 벌!써! SMB 너로 정했다 ㅇ<-< 1부가 끝났습니다!




다음 포스팅에서는 MS17-010 취약점이 발생하는 주요 함수에 대한 자세한 분석이 이루어질 예정이니 많은 관심 부탁드립니다 :D

그럼 다시 곧 만나요 뿅!




– comments by Choirish

comments powered by Disqus