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 API 중 NetprPathCanonicalize() 함수에 취약점이 존재합니다.
- ※ 해당 취약점을 분석한 참고 문서 링크
- ※ 관련 용어 참고 링크
- 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”
값이 존재하지 않는다면 어떻게 될까요? 그림으로 함께 살펴봅시다.
![]()
메모리 상태를 왼쪽부터 차례로 보면..
- “\aaa..”부분을 제거한 후,
- 나머지 경로값을 버퍼의 시작(“\aaa”가 있던 위치)으로 복사한다.
- “..”가 존재하므로, “..” 앞부분의 버퍼를 쭉 탐색하며 “\”를 찾는다.
- 그러다보면 RET 주소 너머에 있는 영역까지 탐색하게 될 수 있다.
- 이 때, RET 주소 너머의 “\”가 있는 곳을 버퍼의 시작으로 착각하여 나머지 경로값을 그 곳에 복사하게 되고 임의의 조작된 값을 통해 RET 주소를 컨트롤 할 수 있게 된다!!
알고보니 아주 간단한 Stack Buffer Overflow 취약점입니다! 하지만 이런 사소한 실수로 인해 큰 피해가 발생했었지요…:(
![]()
해당 취약점은 다음과 같이 패치되었습니다.
- “..” 앞에 있는 “\”를 탐색하는 과정에서 버퍼의 시작 위치(v1)를 만나면 탐색을 중단하도록 하는 체크 루틴을 추가!
- 즉, 기존의 경로 주소 버퍼를 벗어나 탐색하지 않도록! 버퍼를 벗어난 곳에 값을 복사하지 않도록 차단!
뚜둔! 복잡할 것 같았던 MS08-067 취약점 분석까지 훅 지나가버리고…
아쉽지만 벌!써! SMB 너로 정했다 ㅇ<-< 1부가 끝났습니다!
다음 포스팅에서는 MS17-010 취약점
이 발생하는 주요 함수에 대한 자세한 분석이
이루어질 예정이니 많은 관심 부탁드립니다 :D
그럼 다시 곧 만나요 뿅!
– comments by Choirish