학습개요

 SMB(Server Message Block)프로토콜은 컴퓨터의 애플리케이션에서 파일을 읽고 쓸 수 있으며 컴퓨터 네트워크상의 서버 프로그램에서 서비스를 요청할 수 있도록 지원하는 네트워크 파일 공유 프로토콜이다. 윈도우 시스템에서 파일 공유, 프린터 공유, 원격 윈도우 서비스 엑세스 등을 목적으로 사용된다.

 PoC(Proof of Concept)개념 실증이라고 불린다. 새로운 프로젝트가 실제로 실현 가능성이 있는가, 효과와 효용, 기술적인 관점에서부터 검증을 하는 과정을 의미한다.

 이번 학습에서는 PoC 툴을 사용하여 SMB의 취약점을 이용한 공격 중 하나인 SMBGhost로 블루스크린 현상이나 권한상승 행위를 발생시키는 실험을 해본다.

 

학습내용 1 SMB 프로토콜

 SMB란 서버 메시지 블록(Server Message Block, SMB)의 약자로 도스나 윈도우 파일, 디렉터리 및 주변 장치들을 공유하는데 사용되는 메시지 형식이다. NetBIOSSMB 형식에 기반을 두고 있으며, 많은 네트워크 제품들도 SMB를 사용한다. 이러한 SMB 기반의 네트워크에는 랜 매니저, 윈도우 포 워크그룹(Windows for Workgroups), 윈도우 NT, 그리고 랜 서버 등이 있다. 서로 다른 운영체제 사이에 파일을 공유할 수 있도록 하기 위해 SMB를 사용하는 제품들도 많이 있다. 그중 하나가 삼바(SAMBA)인데, 유닉스와 윈도우 컴퓨터들 간에 디렉터리와 파일을 공유할 수 있게 해 준다.

 SMB는 현재 SMBv3.1.1까지 발표되었고. 윈도우 10과 윈도우 서버 2016과 함께 도입되었다. SMBv1(1990년도 기준)의 경우는 보안 기능들은 전혀 갖춰지지 않았으며, Windows10 버전 1709, 서버 버전 1709 이상부터는 설치되지 않는다. 이번에 실험할 취약점은 v2v3에 해당되므로 SMBv2를 기준으로 구조를 이해한다.

 

 SMB 프로토콜은 응용 프로그램 계층 프로토콜이며 일반적인 배포에서는 TCP 포트 445로 통신한다. SMBFTP와 같은 유사한 프로토콜과 비교할 때 훨씬 많은 유연성을 허용하므로 빠르게 인기를 얻을 수 있었다. SMB는 고정된 크기의 헤더 패킷(SMB header)으로 시작되며 헤더 패킷 내 커맨드(Command) 필드의 값에 따라 어떤 오퍼레이션을 수행할지가 결정된다.

 

SMB2 Packet Header

학습내용 2SMBGhost

 2020312, microsoft가 긴급 업데이트를 통해 취약점 패치를 제공했다. 이 취약점이 코로나블루(coronaBlue) 또는 SMB고스트(SMBGhost)로 불리는 CVE-2020-0796이다. 발표 당시 치명적인 위협으로 간주되었으며, 일부에서는 2의 워너크라이 사태가 발생할 수 있다고 우려하기도 했다. 또한 20204월 레몬덕(Lemonduck) 악성코드에 이 취약점을 스캔하는 코드가 추가되기도 하였으며, 악성코드 전파를 위해 최근까지 지속적으로 사용되고 있다.

- 영향받는 버전

Windows 10 Version 1903 for 32-bit Systems

Windows 10 Version 1903 for ARM64-based Systems

Windows 10 Version 1903 for x64-based Systems

Windows 10 Version 1909 for 32-bit Systems

Windows 10 Version 1909 for ARM64-based Systems

Windows 10 Version 19039 for x64-based Systems

Windows Server, version 1903 (Server Core installation)

Windows Server, version 1909 (Server Core installation)

 

 SMB2 COMPRESSION_TRANSFROM_HEADER는 통신에서 클라이언트나 서버가 압축된 메시지를 전송하게 될 때 사용되는 헤더이다. 해당 헤더는 Windows10 이후 버전에 쓰인다. COMPRESSION_TRANSFORM_HEADER의 구조는 아래 그림과 같다.

 

 CVE-2020-0796 취약점은 조작된 SMB2_COMPRESSION_TRANSFORM_HEADER 패킷을 처리할 때, srv2!Srv2DecompressData 함수에서 압축 해제 루틴을 처리하게 되는데 헤더에 존재하는 Originalsize + Offset 값이 0Xffffffff를 넘어가게 되면 정수 오버플로우(Integer Overflow) 취약점에 의해 비정상적인 메모리 공간이 할당되는 취약점이다. 서버와 네고시에이트(Negotiate) 통신을 통해 세션을 생성하고 SMB2 COMPRESSION_TRANSFORM_HEADEROriginalSize + Offset0Xffffffff보다 큰 데이터로 조작한다. 조작된 패킷을 서버로 전송한다.

 본 게시글에서 다룰 내용은 위 표의 COMPRESSION_TRANSFORM_HEADEROriginalCompressedSegmentSize의 값을 기존보다 크게 변조하여 플러딩을 유발하면 SMB는 예상외의 행동을 하게 된다. 그리고 이번에 실습할 내용이 이를 이용한 공격 실습이 될 것이다. 다음에 보게 될 실습 동영상은 CVE2020-0796의 영상으로 위와 같은 취약점을 이용하여 취약점 분석과 블루스크린과 권한 상승 등을 실습하는 내용의 영상이다. 본 보고서에서는 블루스크린을 일으키는 실습을 진행할 예정이다.

참고 영상

ㅇ URL : https://youtu.be/Ltt2Cz_Dy9c

ㅇ 동영상 검색 키워드: windows 10 exploit or CVE 2020-0796

ㅇ 동영상 재생 시간: 2904

 

학습내용 3SMBGhost 공격 실습

 

1. 실습 환경 준비

1) 가상 머신에 칼리리눅스와 윈도우10 설치

칼리리눅스와 윈도우10의 네트워크 어댑터 타입은 NAT로 설정한다. 나중에 IP를 확인해보면 동일한 네트워크(서브넷)에 연결됨을 알 수 있다.

칼리리눅스

Kali-linux-2022.3-amd64.iso(64비트)

윈도우10 설치

피해자 PC를 구성하기 위해 VMware Workstation에 윈도우10을 설치한다. 윈도우 파일은 microsoft에서 window 10iso 형태로 다운받으면 된다. 이때 window11의 경우 패치가 진행되어 다음의 취약점이 통하지 않기 때문에 window10을 설치해야 한다.

Windows 10 x64.iso (1909,1903,1836(3).720 이전버전)

2) 어택 툴 다운로드

CVE-2020-0796 Remote overflow PoC

- https://github.com/jiansiting/CVE-2020-0796

 다음 어택 툴을 사용하면 POC를 활용하여 대상 PC에 블루스크린을 유발하도록 공격이 진행된다. 저장은 리눅스 어디에 해도 상관없으나 공격을 실행할 때는 공격 툴이 들어있는 폴더에서 실행해야 한다.

 
 

2. 윈도우 사전 설정

1) 윈도우 방화벽 비활성화

 

 실습을 진행하기 전에 방화벽에 들어가 윈도우 방화벽을 비활성화 하도록 한다. 그렇지 않으면 github에서 다운로드 받은 어택 툴을 사용할 수 없다. 또한 ping 테스트를 할 때 ping이 가지 않을 것이다.

2) 공격전 리눅스의 상태를 점검하기 위해 update를 진행

 

3) 공격대상(윈도우)의 아이피를 확인

4) 공격대상(윈도우)의 아이피가 연결되어 있는지 Ping 테스트 진행

 

5) 칼리리눅스에서 다운받은 툴을 이용하여 공격대상의 아이피를 입력 후 실행

(이때, 꼭 파일을 다운받은 폴더에 들어가 공격을 수행해야 한다.)

 

- python3 cve-2020-0796.py (공격대상 ip)

python3 명령어가 실행되지 않을 수도 있는데 그럴 경우 python을 따로 설치해주어야 한다.

- sudo(관리자 계정이 아닌경우) apt install (프로그램명)

이렇게 수행을 했는데도 실행이 되지 않는다면 설치파일에 대한 문제가 있을 수도 있다. 재설치 후 다시 실행한다.

 

 위 사진과 같이 SMB취약점에 의한 원격코드가 실행되어 윈도우 자체가 먹통이 되는 블루 스크린 현상을 확인할 수 있다.

 OriginalCompressedSegmentSize 필드에 저장 가능한 값보다 큰 값을 넣으면 해당변수가 변조된 값을 감당할 수 없어 의도치 않게 매우 작은 수로 인식하거나, 음수 값으로 인식하게 된다. 이 때 프로그램이 예상 밖의 동작을 하게 될 수 있는데 이것이 블루스크린 혹은 권한 상승 같은 현상을 유발 시킬 수 있다.

복사했습니다!