악의적인 VIB(vSphere Installation Bundle) 1편: ESXi 하이퍼바이저에서 지속성을 유지하는 악성 코드 조사
Mandiant
*본 아티클의 원문은 2023년 9월 29일 Google Cloud 블로그(영문)에 게재되었습니다.
엔드포인트 탐지 및 대응(EDR) 솔루션은 Windows 운영체제가 설치된 시스템에서 효율적으로 악성 코드(Malware)를 탐지합니다. 이처럼 사용자 장치에 악성 코드를 배포하는 것이 어려워지자 특정 국가의 후원을 받는 위협 행위자들이 새로운 타깃을 위협하고 있습니다. 그들이 노리는 새로운 목표는 바로 네트워크 어플라이언스, SAN 어레이, VMware ESXi 서버같이 EDR을 지원하지 않는 시스템입니다.
올 초 맨디언트는 VMware ESXi, Linux vCenter, Windows 가상 머신(VM)에 영향을 끼치는 새로운 악성 코드 생태계를 발견하였습니다. 새로운 타깃을 대상으로 하는 악성 코드를 이용해 위협 행위자는 다음과 같은 활동을 하였습니다.
- 하이퍼바이저에 대한 접근성 유지
- 게스트 VM으로 라우팅 되는 하이퍼바이저에 명령 보내기
- ESXi 하이퍼바이저 및 이 환경에서 실행되는 게스트 머신 간 파일 전송
- 하이퍼바이저 로깅 서비스 변조
- 동일한 하이퍼바이저 환경에서 운영하는 한 게스트 VM에서 다른 게스트 VM으로 임의의 명령 실행
vmtoolsd.exeMandiant가 VMware ESXi 하이퍼바이저에서 호스팅 되는 Windows VM에서 합법적인 VMware 도구를 이용한 공격자 명령을 식별하였습니다. 이를 계기로 새로운 타깃을 노리는 악성 코드 생태계를 알게 되었습니다. 맨디언트는 ESXi 하이퍼바이저의 부팅 프로필을 분석하였고, 이 과정에서 위협 행위자가 악의적인 VIB(vSphere Installation Bundle)을 활용해 ESXi 하이퍼바이저에 여러 개의 백도어를 설치하는 지금껏 본 적이 없는 침투 기술을 식별하였습니다. 맨디언트는 이들 백도어는 VIRTUALPITA 및 VIRTUALPIE라고 명명했습니다.


악성 코드를 통한 ESXi 공격 경로
새로 식별한 침해는 외부 원격 코드 실행 취약점을 노린 것이 아니란 점을 주목해야 합니다. 공격자는 악성 코드를 배포하기 전에 ESXi 하이퍼바이저의 관리자 수준 권한이 필요합니다. 본 포스팅을 작성 시점을 기준으로 볼 때 초기 접근 권한을 얻거나 악성 VIB 배포를 위해 위협 행위자가 제로데이 취약점을 활용하였다는 증거는 없습니다.
현재 ESXi 환경에 악성 또는 변칙적인 VIB가 설치되었는지 매뉴얼 방식을 찾는 방법은 관련 내용을 소개하는 블로그를 참조 바랍니다. 더불어 VMware도 vSphere 보호 방법을 소개하는 글을 공개하였으니, 이 정보도 참조 바랍니다.
vSphere VIB
맨디언트는 VIRTUALPITA 및 VIRTUALPIE라는 악의적인 VIB를 통해 설치된 2개의 새로운 악성 코드를 식별하였습니다. VMware VIB는 소프트웨어 배포 및 VM 관리를 위한 파일 모음입니다. 관리자는 이를 활용해 시스템 시작, 사용자 지정 방화벽 규칙 생성, EXSi 시스템을 재시작 할 때 사용자 지정 바이너리 배포 등의 작업을 할 수 있습니다. 이처럼 VIB 패키지는 관리자가 업데이트를 배포하고, 시스템을 관리하는 데 쓰는 일상적인 도구입니다. 위협 행위자는 이 패키지를 침투 환경에서 지속성을 유지하는 수단으로 활용하였고, 그 결과 ESXi 하이퍼바이저 접근성을 확보하였습니다.
VIB는 3가지 구성 요소로 나눌 수 있습니다.
- XML 디스크립터(Descriptor) 파일
- VIB 페이로드(.vgz 아카이브)
- 서명 파일 - VIB 호스트 승인 수준을 확인하는 데 사용되는 디지털 서명
XML 디스크립터 파일은 다음과 같이 구성됩니다.
- 설치할 페이로드
- 이름, 설치 날짜 같은 VIB 메타 데이터
- VIB 서명 파일
VIB 페이로드는 VIB를 통해 ESXi 시스템에 성성할 디렉토리와 파일이 포함된 .vgz 아카이브입니다. 포함된 파일들은 부팅 시 VIB가 로드될 때 실행할 수 있습니다.
서명 파일은 VIB의 호스트 승인 수준을 확인하는 데 사용합니다. 허용 수준은 VMware에서 사용하는 디지털 서명 시스템을 거쳐 정합니다. 간단히 소개하자면 VIB가 게시되기 전에 VMware 또는 파트너가 수행한 테스트를 기준으로 지정합니다. 이 과정을 거쳐 호스트, 이미지 프로필, 개별 VIB에 대한 허용 수준이 설정됩니다. VIB 디스크립터에는 다음과 같은 4가지 허용 수준이 나열됩니다.
- VMwareCertified
- VMwareAccepted
- PartnerSupported
- CommunitySupported
VMware 매뉴얼에 따르면 ESXi 호스트에 VIB를 설치할 수 있는 최소 허용 수준은 PartnerSupported입니다. 이 허용 수준은 VMware가 신뢰하는 파트너에 의해 VIB가 게시된 것임을 나타냅니다. 이는 최소 허용 수준인데, ESXi 관리 계정을 이용하면 변경할 수 있습니다. VIB 설치에 사용하는 'esxcli software vib install' 명령은 최소 허용 수준만 허용하지만 '-force' 플래그를 사용해 설치하면 허용 수준 요구를 무시할 수 있습니다.
맨디언트가 찾은 악성 VIB의 허용 수준은 PartnerSupported였습니다. 맨디언트가 검토한 바에 따르면 서명 파일은 비어 있고, 공격자가 XML 디스크립터 파일을 수정하여 acceptance-level 필드를 VMware나 파트너의 검토를 거치지 않은 수준인 CommunitySupported에서 PartnerSupported로 바꾸었습니다. 이를 통해 VIB 파일이 VMware가 신뢰하는 파트너가 게시한 것으로 가장했습니다. 다음은 맨디언트가 식별한 수정된 XML 디스크립터 파일의 일부 내용입니다.


수정된 XML 디스크립터 파일
공격자가 XML 디스크립터 파일의 acceptance-level 필드를 수정했지만, ESXi 시스템은 위조된 VIB 파일을 설치를 허용하지 않습니다. 이를 회피하기 위해 공격자는 '--force' 플래그를 악용하여 CommunitySupported 허용 수준의 VIB를 설치하였습니다.
테스트 결과 XML 디스크립터 파일에는 설치된 VIB 패키지를 나열하는 'esxcli software vib list' 명을 속이는 acceptance-level 필드 수정이 포함되어 있습니다. VMware 명령어인 'esxcli software vib signature verify'는 설치된 VIB 패키지의 서명을 확인하고 다음 필드를 표시합니다.
- VIB 이름
- 버전
- 공급 업체
- 허용 수준
- VIB 서명 확인 결과
맨디언트는 'esxcli software vib signature verify' 명령이 악성 VIB를 식별하는 것을 확인하였습니다. 이 명령은 XML 디스크립터 파일에 있는 허용 수준과 Signature Verification 서명 파일이 일치하지 않을 경우 이를 표시합니다. 서명을 확인할 수 없으면 Signature Verification 열에 다음과 같이 'Signature Not Available: Host may have been upgraded from an older ESXi version'가 표시됩니다.


위조된 VIB 허용 수준의 예
VIRTUALPITA(VMware ESXi)
VIRTUALPITA는 ESXi 서버의 하드코딩된 포트 번호에 리스너를 생성하는 64비트 패시브 백도어입니다. 백도어는 종종 VMware 서비스 이름과 포트를 사용해 합법적인 서비스로 가장합니다. 임의의 명령 실행, 파일 업로드 및 다운로드, vmsyslogd 시작 및 중지 기능을 지원합니다. 임의의 명령을 실행하는 동안 악성 코드는 환경 변수 HISTFILE을 '0'으로 설정해 시스템에 발생한 활동을 추가로 숨깁니다. 이 악성 코드 변공은 VMCI(Virtual Machine Communication Interface)에서 수신 대기하고, 활동을 파일에 기록하는 것으로 나타났습니다.
VIRTUALPIE(VMware ESXi)
VIRTUALPIE는 VMware ESXi 서버의 하드코딩된 포트에서 데몬화된 IPv6 수신기를 생성하는 파이썬으로 작성한 경량 백도어입니다. 임의의 명령줄 실행, 파일 전송 기능 및 리버스 쉘 기능을 지원합니다. 통신은 사용자 지정 프로토콜을 사용하고 RC4로 암호화됩니다.
VIB lsu-lsi-lsi-mrarpid-plugin라고 이름 붙인 첫 번째 악성 VIB는 lsu_lsi_.v05 (MD5: 2716c60c28cf7f7568f55ac33313468b) 페이로드를 참조합니다(표 참조). 여기에는 다음 3개의 파일이 포함됩니다.
- /etc/rc.local.d/vmware_local.sh(MD5: bd6e38b6ff85ab02c1a4325e8af29ce4)
- /bin/rdt(MD5: 8e80b40b1298f022c7f3a96599806c43)
- /bin/vmsyslog.py(MD5: 61ab3f6401d60ec36cd3ac980a8deb75)
VIRTUALPITA (LINUX)
init.dMandiant는 Linux vCenter 시스템에서 시작 서비스로 지속되는 TCP 포트 7475에서 수신 대기하는 VIRTUALPITA 샘플 2개를 추가로 발견했습니다. 자신을 위장하기 위해 바이너리는 합법적인 바이너리인 ksmd 이름을 공유했습니다. KSMD(Kernel Same-Page Merging Daemon)은 일반적으로 Linux에서 메모리 중복 제거를 담당하며 이 포트에서 수신 대기하지 않습니다. 샘플은 다음 디렉토리에서 찾았습니다.
- /usr/libexec/setconf/ksmd(MD5: 744e2a4c1da48869776827d461c2b2ec)
- /usr/bin/ksmd(MD5: 93d50025b81d3dbcb2e25d15cae03428)
이 백도어는 임의 명령 실행, 파일 전송, vmsyslogd 시작 및 중지 기능을 제공합니다.
VIRTUALGATE (Windows)
감염된 하이퍼바이저에 호스팅 된 Windows 게스트 VM에는 고유한 악성 코드 샘플(C:\Windows\Temp\avp.exe)도 있었습니다. VIRTUALGATE라고 이름 분ㅌ인 이 악성 코드는 C로 작성한 유틸리티로 드로퍼와 페이로드 두 부분으로 구성되어 있습니다. 메모리 전용 드로퍼는 VMware의 VMCI 소켓을 사용해 하이퍼바이저 호스트의 게스트 VM 또는 동일한 호스트의 다른 게스트 VM 간 명령을 수행하는 2단계 DLL 페이로드를 난독화합니다.
vmtoolsd.exe를 통한 명령 실행
맨디언트는 ESXi 하이퍼바이저를 검토해 프로세스 /bin/rdt (VIRTUALPITA)를 통해 게스트 시스템에 명령을 실행한 공격자도 식별하였습니다. 상위 프로세스는 다음과 같이 실행할 대상 게스트 머신과 명령을 지정하는 파이썬 스크립트를 호출하는 bash 쉘을 생성하였습니다.
-> /bin/rdt -i
....-> sh -c /bin/sh
........-> /bin/sh
...........-> python e.py 127.0.0.1 vpxuser <password> <target guest machine> C:\Windows\system32\cmd.exe /c dir /od /s /a c:\ > C:\Windows\Temp\TS_<REDACTED>.tmp 2>nul
e.py에 인수로 전달된 명령도 대상 Windows 게스트 시스템에서 실행되는 것으로 확인되었습니다. vmtoolsd.exe 실행은 다음 그림을 참조 바랍니다. 상위 바이너리 /bin/rdt가 디스크에 있었지만 ESXi 하이퍼바이저 프로세스 메모리를 덤프 하여 복구할 수 있었습니다. 게스트 시스템에 명령을 보낸 파이썬 스크립트인 e.py는 복구할 수 없습니다.


ESXi에서 전달한 명령을 실행하는 vmtoolsd.exe
공격자가 게스트 가상 머신에서 실행한 명령은 기본 도구 'dir' 및 'makecab'을 사용하여 시스템과 연결된 파일 공유에서 파일을 열거하고 압축하는 데 중점을 두었습니다. 이러한 수정된 명령 샘플은 다음과 같습니다.
또한, 맨디언트는 자격 증명 수집을 위해 가상화된 시스템을 목표로 하는 공격자도 식별하였습니다. 공격자는 Minidump를 사용해 프로세스 메모리를 덤프하고 일반 텍스트로 된 자격 증명을 검색했습니다. 다음은 명령의 일부입니다.
프로세스 메모리가 덤프 되면 파워쉘 스크립트를 사용해 일반 텍스트 자격 증명에 대한 결과 파일을 구문 분석했습니다. 다음은 자격 증명 수집에 사용한 스크립트의 내용입니다. 공격자는 KeyPass 암호 데이터 파일도 표적으로 삼았습니다.
공격자는 침해 활동 후 C:\Windows\Temp 디렉토리 내용을 지웠습니다. 그러나 흔적을 남기는 작은 오류를 범하였습니다. 다음과 같이 공격자는 dir 목록 출력을 .tmp 파일로 보냈습니다. 공격자는 Windows 구문 (2>nul) 대신 Linux 구문 (2>null)를 사용하였습니다. 이에 따라 모든 오류는 작업 디렉토리의 null 파일로 전달되었습니다. C:\Windows\System32\null 파일은 dir 명령으로 열거된 파일의 디렉토리 경로가 너무 길어 표시될 수 없는 경우만 생성되었습니다.
속성
맨디언트는 이번에 식별한 활동을 UNC3886으로 추적하기 시작하였습니다. 이 위협 클러스터는 특성을 감안할 때 침해 동기가 사이버 스파이 활동과 관련된 것으로 의심됩니다. 맨디언트는 UNC3886와 중국의 관련성을 염두에 두고 평가를 하고 있습니다. 맨디언트는 수천 건의 침해 조사를 수행하고 있으며, 여러 활동 간 상호 연관성 파악을 위해 Advanced Team의 분석 인력도 투입해 평가 작업을 하고 있습니다. 알려진 공격 그룹의 활동으로 볼 충분한 데이터가 없을 경우 맨디언트는 새로운 UNC 그룹을 만들어 추적합니다. 참고로 UNC 그룹은 인프라, 도구 등 관찰 가능한 아티팩트가 겹치는 침해 활동의 집합체입니다. APT나 PIN으로 구분할 준비가 덜 된 그룹을 UNC로 분류한다고 보면 됩니다. 맨디언트가 UNC를 어떻게 구분하여 추적하는지에 대한 내용은 관련 글을 참조 바랍니다.
결론
UNC3886이 사용하는 기술을 활용하려면 ESXi와 VMware 가상화 플랫폼에 대한 깊은 수준의 이해가 필요합니다. 맨디언트는 다른 위협 행위자가 이번 포스팅에 소개한 정보를 참조해 유사한 기능을 구축할 수도 있다고 봅니다. 맨디언트는 ESXi 및 VMWare 제품을 사용하는 조직은 본 포스팅을 참조해 ESXi 관련 공격 가능한 표면을 줄일 것을 권장합니다.
MITRE ATT & CK
침해 지표(IOC)
Yara 탐지 룰
rule M_APT_VIRTUALPITA_4
{
meta:
author = "Mandiant"
md5 = "fe34b7c071d96dac498b72a4a07cb246"
description = "Finds opcodes from 401f1c to 401f4f in fe34b7c071d96dac498b72a4a07cb246 to decode text with multiple XORs"
strings:
$x = {4? 8b 4? ?? 4? 83 c1 30 4? 8b 4? ?? 4? 8b 10 8b 4? ?? 4? 98 4? 8b 04 ?? ?? ?? ?? ?? 4? 31 c2 4? 8b 4? ?? 4? 83 c0 28 4? 8b 00 4? c1 e8 10 0f b6 c0 4? 98 4? 8b 04}
condition:
uint32(0) == 0x464c457f and all of them
}
감사의 말
본 포스팅에서 소개한 악성 코드에 대한 조사 및 탐지 방법 관련 도움을 준 Brad Slaybaugh, Joshua Kim, Zachary Smith, Kirstie Failey, Nick Simonian, Charles Carmakal에게 감사의 말을 전합니다. 더불어 이번 연구를 위해 협력한 VMware에도 감사드립니다.
-Mandiant, 작성자: Alexander Marvi, Jeremy Koppen, Tufail Ahmed, Jonathan Lepore