Blog

악의적인 VIB(vSphere Installation Bundle) 1편: ESXi 하이퍼바이저에서 지속성을 유지하는 악성 코드 조사

Alexander Marvi, Jeremy Koppen, Tufail Ahmed, Jonathan Lepore
Sep 29, 2022
12 min read
|   Last updated: Oct 10, 2022
Malware
backdoor

엔드포인트 탐지 및 대응(EDR) 솔루션은 Windows 운영체제가 설치된 시스템에서 효율적으로 악성 코드(Malware)를 탐지합니다. 이처럼 사용자 장치에 악성 코드를 배포하는 것이 어려워지자 특정 국가의 후원을 받는 위협 행위자들이 새로운 타깃을 위협하고 있습니다. 그들이 노리는 새로운 목표는 바로 네트워크 어플라이언스, SAN 어레이, VMware ESXi 서버같이 EDR을 지원하지 않는 시스템입니다.

올 초 맨디언트는 VMware ESXi, Linux vCenter, Windows 가상 머신(VM)에 영향을 끼치는 새로운 악성 코드 생태계를 발견하였습니다. 새로운 타깃을 대상으로 하는 악성 코드를 이용해 위협 행위자는 다음과 같은 활동을 하였습니다.

  1. 하이퍼바이저에 대한 접근성 유지
  2. 게스트 VM으로 라우팅 되는 하이퍼바이저에 명령 보내기
  3. ESXi 하이퍼바이저 및 이 환경에서 실행되는 게스트 머신 간 파일 전송
  4. 하이퍼바이저 로깅 서비스 변조
  5. 동일한 하이퍼바이저 환경에서 운영하는 한 게스트 VM에서 다른 게스트 VM으로 임의의 명령 실행

vmtoolsd.exeMandiant가 VMware ESXi 하이퍼바이저에서 호스팅 되는 Windows VM에서 합법적인 VMware 도구를 이용한 공격자 명령을 식별하였습니다. 이를 계기로 새로운 타깃을 노리는 악성 코드 생태계를 알게 되었습니다. 맨디언트는 ESXi 하이퍼바이저의 부팅 프로필을 분석하였고, 이 과정에서 위협 행위자가 악의적인 VIB(vSphere Installation Bundle)을 활용해 ESXi 하이퍼바이저에 여러 개의 백도어를 설치하는 지금껏 본 적이 없는 침투 기술을 식별하였습니다. 맨디언트는 이들 백도어는 VIRTUALPITA 및 VIRTUALPIE라고 명명했습니다.

Visualization of ESXi attack path
악성 코드를 통한 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 디스크립터 파일의 일부 내용입니다.

Modified Descriptor 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'가 표시됩니다.

Example of falsified VIB acceptance level being seen in esxcli software vib signature verify
위조된 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)
 

파일 이름

 설명

vmware_local.sh

/etc/rc.local.d/에 위치한 ESXi 부팅 때마다 해당 작업이 실행되도록 하는 bash 설치 스크립트입니다. 명령줄 유틸리티인 esxcli를 사용해 백도어 트래픽에 대한 방화벽 규칙을 활성화하고, 두 백도어를 모두 실행하고, 디스크에서 VIB에 의해 생성된 모든 파일을 제거합니다.

rdt

하드코딩된 TCP 포트 2233에 리스너를 생성하는 ELF 백도어(VIRTUALPITA)입니다. 임의의 명령 실행, 파일 전송, vmsyslogd 시작 및 중지 기능을 제공합니다. VMware 매뉴얼에 따르면 이 포트는 vSAN RDT(Reliable Datagram Transfort) 서비스에 활용됩니다.

vmsyslog.py

데몬화된 IPv6 수신기를 하드코딩된 포트 546으로 생성하는 파이썬으로 작성한 경량 백도어(VIRTUALPIE)입니다. 임의의 명령줄 실행, 파일 정송 기능 및 리버스 쉘 기능을 제공합니다. 통신은 사용자 지정 프로토콜을 사용하고 RC4로 암호화됩니다.

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는 복구할 수 없습니다.

vmtoolsd.exe executing commands passed by ESXi
ESXi에서 전달한 명령을 실행하는 vmtoolsd.exe

공격자가 게스트 가상 머신에서 실행한 명령은 기본 도구 'dir' 및 'makecab'을 사용하여 시스템과 연결된 파일 공유에서 파일을 열거하고 압축하는 데 중점을 두었습니다. 이러한 수정된 명령 샘플은 다음과 같습니다.

C:\Windows\system32\cmd.exe" /c dir /od /s /a s:\ > C:\Windows\Temp\ts_<REDACTED>.tmp 2>null


C:\Windows\System32\cmd.exe makecab  /F C:\Windows\Temp\TS_<REDACTED>.txt  /D compressiontype=lzx /D compressionmemory=21 /D maxdisksize=1024000000 /D diskdirectorytemplate=C:\Windows\Temp\   /D cabinetnametemplate=TS_<REDACTED>.cab

또한, 맨디언트는 자격 증명 수집을 위해 가상화된 시스템을 목표로 하는 공격자도 식별하였습니다. 공격자는 Minidump를 사용해 프로세스 메모리를 덤프하고 일반 텍스트로 된 자격 증명을 검색했습니다. 다음은 명령의 일부입니다.

-- “ C:\Program Files\VMware\Vmware Tools\vmtoolsd.exe”
---- “C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe”
------ rundll32.exe C:\windows\System32\comsvcs.dll MiniDump <Process ID> C:\Windows\Temp\TS_<REDACTED>.tmp full

프로세스 메모리가 덤프 되면 파워쉘 스크립트를 사용해 일반 텍스트 자격 증명에 대한 결과 파일을 구문 분석했습니다. 다음은 자격 증명 수집에 사용한 스크립트의 내용입니다. 공격자는 KeyPass 암호 데이터 파일도 표적으로 삼았습니다.

$b = New-Object System.IO.streamReader("C:\windows\Temp\<REDACTED>.tmp",[Text.Encoding]::UTF8)

$n = 0

while (($b1 =$b.ReadLine()) -ne $null)

{

    if($b1 -like '*&password=*'){

    $n++

      Write-Host "YES $n"

      Write-Host $b1

    }

      

}

if($n -eq 0){Write-Host "NO!"}

$b.Dispose()

공격자는 침해 활동 후 C:\Windows\Temp 디렉토리 내용을 지웠습니다. 그러나 흔적을 남기는 작은 오류를 범하였습니다. 다음과 같이 공격자는 dir 목록 출력을 .tmp 파일로 보냈습니다. 공격자는 Windows 구문 (2>nul) 대신 Linux 구문 (2>null)를 사용하였습니다. 이에 따라 모든 오류는 작업 디렉토리의 null 파일로 전달되었습니다. C:\Windows\System32\null 파일은 dir 명령으로 열거된 파일의 디렉토리 경로가 너무 길어 표시될 수 없는 경우만 생성되었습니다.

C:\Windows\system32\cmd.exe" /c dir /od /s /a s:\ > C:\Windows\Temp\TS_<REDACTED>.tmp 2>null

 

속성

맨디언트는 이번에 식별한 활동을 UNC3886으로 추적하기 시작하였습니다. 이 위협 클러스터는 특성을 감안할 때 침해 동기가 사이버 스파이 활동과 관련된 것으로 의심됩니다. 맨디언트는 UNC3886와 중국의 관련성을 염두에 두고 평가를 하고 있습니다. 맨디언트는 수천 건의 침해 조사를 수행하고 있으며, 여러 활동 간 상호 연관성 파악을 위해 Advanced Team의 분석 인력도 투입해 평가 작업을 하고 있습니다. 알려진 공격 그룹의 활동으로 볼 충분한 데이터가 없을 경우 맨디언트는 새로운 UNC 그룹을 만들어 추적합니다. 참고로 UNC 그룹은 인프라, 도구 등 관찰 가능한 아티팩트가 겹치는 침해 활동의 집합체입니다. APT나 PIN으로 구분할 준비가 덜 된 그룹을 UNC로 분류한다고 보면 됩니다. 맨디언트가 UNC를 어떻게 구분하여 추적하는지에 대한 내용은 관련 글을 참조 바랍니다.

 

결론

UNC3886이 사용하는 기술을 활용하려면 ESXi와 VMware 가상화 플랫폼에 대한 깊은 수준의 이해가 필요합니다. 맨디언트는 다른 위협 행위자가 이번 포스팅에 소개한 정보를 참조해 유사한 기능을 구축할 수도 있다고 봅니다. 맨디언트는 ESXi 및 VMWare 제품을 사용하는 조직은 본 포스팅을 참조해 ESXi 관련 공격 가능한 표면을 줄일 것을 권장합니다.

 

MITRE ATT & CK

 

Collection

  • T1560: Archive Collected Data
  • T1560.001: Archive via Utility

Execution

  • T1059: Command and Scripting Interpreter
  • T1059.001: PowerShell
  • T1059.003: Windows Command Shell
  • T1059.004: Unix Shell
  • T1059.006: Python
  • T1129: Shared Modules

Command & Contorl

  • T1105: Ingress Tool Transfer
  • T1573.001: Symmetric Cryptography

Defense Evasion

  • T1027: Obfuscated Files or Information
  • T1070: Indicator Removal on Host
  • T1070.003: Clear Command History
  • T1070.004: File Deletion
  • T1140: Deobfuscate/Decode Files or Information
  • T1202: Indirect Command Execution
  • T1218.011: Rundll32
  • T1497: Virtualization/Sandbox Evasion
  • T1497.001: System Checks
  • T1620: Reflective Code Loading

Discovery

  • T1016: System Network Configuration Discovery
  • T1083: File and Directory Discovery

Lateral Movement

  • T1021: Remote Services
  • T1021.004: SSH

Credential Access

  • T1003: OS Credential Dumping
  • T1003.001: LSASS Memory

Persistence

  • T1547: Boot or Logon Autostart Execution

침해 지표(IOC)

 유형

 

 설명

MD5

SHA1

SHA256

2716c60c28cf7f7568f55ac33313468b

5ffa6d539a4d7bf5aacc4d32e198cc1607d4a522 

2be5f4520846bf493b4694789841907d058fe08d59fff6bad7abe1db8ed96e7d 

Malicious VIB .vgz Payload

MD5

SHA1

SHA256

bd6e38b6ff85ab02c1a4325e8af29ce4

17fb90d01403cb3d1566c91560f8f4b7dd139aa8 

e68872c49aaedeb3bde3ff5fd2ad6f70658687dc02d04f12ebc7cb28e821cc88 

Malicious VIB Deployment Script

MD5

SHA1

SHA256

8e80b40b1298f022c7f3a96599806c43

e9cbac1f64587ce1dc5b92cde9637affb3b58577

c2ef08af063f6d416233a4b2b2e991c177fc72d70a76c24bca9080521d41040f 

VIRTUALPITA

MD5

SHA1

SHA256

61ab3f6401d60ec36cd3ac980a8deb75

93d5c4ebec2aa45dcbd6ddbaad5d80614af82f84 

4cf3e0b60e880e6a6ba9f45187ac5454813ae8c2031966d8b264ae0d1e15e70d 

VIRTUALPIE

MD5

SHA1

SHA256

9ea86dccd5bbde47f8641b62a1eeff07

b90b19781fde2c35963eb3eac4ce2acc6f5019fb 

23eb8d056f18e7c69ec3568f2833c9d09e91df98d11b11de235331ef42756fe5 

Malicious VIB Payload

MD5

SHA1

SHA256

9d5cc1ee99ccb1ec4d20be1cee10173e

9d191849d6c57bc8a052ec3dac2aa9f57c3fe0cd 

4d995eb87b0685124b7f1640d1ab431f5a1ab991ade02750b876ed5c523234bb 

Malicious VIB Deployment Script

MD5

SHA1

SHA256

2c28ec2d541f555b2838099ca849f965

e35733db8061b57b8fcdb83ab51a90d0a8ba618c 

505eb3b90cd107cf7e2c20189889afdff813b2fbb98bbdeab65cde520893b168 

VIRTUALPITA

MD5

SHA1

SHA256

744e2a4c1da48869776827d461c2b2ec

a3cc666e0764e856e65275bd4f32a56d76e51420 

4a6f559426493abc0d056665f23457e2779abd3482434623e1f61f4cd5b41843 

VIRTUALPITA

MD5

SHA1

SHA256

93d50025b81d3dbcb2e25d15cae03428

abff003edf67e77667f56bbcfc391e2175cb0f8a 

13f11c81331bdce711139f985e6c525915a72dc5443fbbfe99c8ec1dd7ad2209 

VIRTUALPITA

MD5

SHA1

SHA256

fe34b7c071d96dac498b72a4a07cb246

0962e10dc34256c6b31509a5ced498f8f6a3d6b6 

5731d988781c9a1d2941f7333615f6292fb359f6d48498f32c29878b5bedf00f 

VIRTUALPITA

Descriptor XML Name

lsu-lsi-lsi-mrarpid-plugin

VIB Name

Filename

lsu_lsi_.v05

VIB .vgz payload

Fullpath

/etc/rc.local.d/vmware_local.sh

VIB Deployment Script

Fullpath

/bin/rdt

VIRTUALPITA

Fullpath

/bin/vmsyslog.py

 

Descriptor XML Name

ata-pata-pdc20211

VIB Name

Filename

payload1.v00

VIB .vgz payload

Fullpath

/etc/rc.local.d/vmware_rhttpio.sh

VIB Deployment Script

Fullpath

/usr/lib/vmware/weasel/consoleui/rhttpproxy-io

VIRTUALPITA

Fullpath

/usr/libexec/setconf/ksmd

VIRTUALPITA (Linux)

Fullpath

/usr/bin/ksmd

VIRTUALPITA (Linux)

Fullpath

C:\Windows\Temp\avp.exe

VIRTUALGATE

Fullpath and Hash (MD5)C:\Windows\Temp\Silverlight\wmpd.exe 
76df41ee75d5077f2c5bec70747b3c99 
Deleted File created by vmtoolsd.exe and executed by vmtoolsd.exe child process 

Yara 탐지 룰

rule M_APT_VIRTUALPITA_1

{

       meta:

             author = "Mandiant"

             md5 = "fe34b7c071d96dac498b72a4a07cb246"

             description = "Finds opcodes to set a port to bind on 2233, encompassing the setsockopt(), htons(), and bind() from 40973d to 409791 in fe34b7c071d96dac498b72a4a07cb246"

      strings:

            $x = {8b ?? ?? 4? b8 04 00 00 00 [0 - 4] ba 02 00 00 00 be 01 00 00 00 [0 - 2] e8 ?? ?? ?? ?? 89 4? ?? 83 7? ?? 00 79 [0 - 50] ba 10 00 00 00 [0 - 10] e8}

      condition:

            uint32(0) == 0x464c457f and all of them  

}

rule M_APT_VIRTUALPITA_2

{

       meta:

             author = "Mandiant"

             md5 = "fe34b7c071d96dac498b72a4a07cb246"

             description = "Finds opcodes to decode and parse the recieved data in the socket buffer in fe34b7c071d96dac498b72a4a07cb246.  Opcodes from 401a36 to 401adc"

      strings:

            $x = {85 c0 74 ?? c7 05 ?? ?? ?? ?? fb ff ff ff c7 8? ?? ?? ?? ?? 00 00 00 00 e9 ?? ?? ?? ?? 4? 8b 05 ?? ?? ?? ?? 4? 83 c0 01 4? 89 05 ?? ?? ?? ?? c7 4? ?? 00 00 00 00 e9 ?? ?? ?? ?? 8b 4? ?? 4? 98 4? 8d 9? ?? ?? ?? ?? 4? 8d ?? e0 4? 8b 0? 4? 89 0? 4? 8b 4? ?? 4? 89 4? ?? 8b 4? ?? 4? 98 4? 8d b? ?? ?? ?? ?? b? ?? ?? ?? ?? e8 ?? ?? ?? ?? c7 4? ?? 00 00 00 00 eb ?? 8b 4? ?? 8b 4? ?? 01 c1 8b 4? ?? 03 4? ?? 4? 98 0f b6 9? ?? ?? ?? ?? 8b 4? ?? 4? 98 0f b6 8? ?? ?? ?? ?? 31 c2 4? 63 c1 88 9? ?? ?? ?? ?? 83 4? ?? 01}

      condition:

            uint32(0) == 0x464c457f and all of them  

}

rule M_APT_VIRTUALPITA_3

{

       meta:

             author = "Mandiant"

             md5 = "fe34b7c071d96dac498b72a4a07cb246"

             description = "Finds opcodes from 409dd8 to 409e46 in fe34b7c071d96dac498b72a4a07cb246 to set the HISTFILE environment variable to 'F' with a putenv() after loading each character individually."

      strings:

            $x = {4? 8b 4? ?? c6 00 48 4? 8b 4? ?? 4? 83 c0 05 c6 00 49 4? 8b 4? ?? 4? 83 c0 01 c6 00 49 4? 8b 4? ?? 4? 83 c0 06 c6 00 4c 4? 8b 4? ?? 4? 83 c0 02 c6 00 53 4? 8b 4? ?? 4? 83 c0 07 c6 00 45 4? 8b 4? ?? 4? 83 c0 03 c6 00 54 4? 8b 4? ?? 4? 83 c0 08 c6 00 3d 4? 8b 4? ?? 4? 83 c0 04 c6 00 46 4? 8b 4? ?? 4? 83 c0 09 c6 00 00 4? 8b 7? ?? e8}

      condition:

            uint32(0) == 0x464c457f and all of them       

}

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

}

rule M_Hunting_Script_LaunchAndDelete_1

{

       meta:

             author = "Mandiant"

             md5 = "bd6e38b6ff85ab02c1a4325e8af29ce4"

             description = "Finds scripts that launch and then delete files, indicative of cleaning up tracks and remaining in-memory only."

      strings:

            $ss = /setsid[^\n\r]{,250}-i[\r\n]{,5}rm/

      condition:

            all of them

}

rule M_Hunting_Python_Backdoor_CommandParser_1

{

      meta:

author = "Mandiant"

            md5 = "61ab3f6401d60ec36cd3ac980a8deb75"

            description = "Finds strings indicative of the vmsyslog.py python backdoor."

      strings:

            $key1 = "readInt8()" ascii wide

            $key2 = "upload" ascii wide

            $key3 = "download" ascii wide

            $key4 = "shell" ascii wide

            $key5 = "execute" ascii wide

            $re1 = /def\srun.{,20}command\s?=\s?self\.conn\.readInt8\(\).{,75}upload.{,75}download.{,75}shell.{,75}execute/s

      condition:

            filesize < 200KB and all of them

}

감사의 말

본 포스팅에서 소개한 악성 코드에 대한 조사 및 탐지 방법 관련 도움을 준 Brad Slaybaugh, Joshua Kim, Zachary Smith, Kirstie Failey, Nick Simonian, Charles Carmakal에게 감사의 말을 전합니다. 더불어 이번 연구를 위해 협력한 VMware에도 감사드립니다.