본문 바로가기

보안/악성코드

Virtual Machine 탐지 및 우회


1. 레지스트리


1) 시스템 등록 정보 


 - 경로 : HKEY_LOCAL_MACHINE\SYSTEM

윈도우에서 사용하는 파일 시스템, 하드웨어 드라이버, 윈도우의 커널이 사용하는 정보 등 윈도우 하부 시스템에 관련된 다양한 설정 내용에 대한 정보가 저장된다.


 - 하위키 : ControlSet001, ControlSet001 

윈도우가 부팅할 때 사용하는 컨트롤 집합이 들어 있는 키로, 최소한 2개 이상 존재한다. 윈도우 XP는 하드웨어의 내용이 변경될 때 마다 새로운 컨트롤 집합을 만들어 순서대로 번호를 붙인다.


 - 하위키 : CurrentControlSet

컴퓨터를 부팅하기 위해 사용한 컨트롤 집합이다. 부팅에 사용된 컨트롤 집합은 자동으로 이 키에 그 내용이 복사된다.


 - 하위키 : CurrentControlSet/Enum

부팅하는 동안 시스템에서 발견된 하드웨어 장치에 대한 정보가 모두 기록되어있다. 


 - 하위키 : CurrentControlSet/Services

윈도우가 사용하는 드라이버와 서비스에 대해 정의되어 있다. 각 하위키는 윈도우에서 실행되는 서비스와 드라이버 이름으로 구성되어 있다. 각 키에는 Start 값이 있는데 이 값의 데이터에 따라 서비스와 드라이버가 언제 어떻게 실행되었는지 알 수 있다.

 

 - 하위키 : CurrentControlSet/Control

SYSTEM 키의 구성 요소 중 가장 많은 항목을 포함하고 있는 키로 윈도우와 시스템 파일이 설치된 폴더, 네트워크 이름등이 저장된다.


가) VirtualBox 관련 레지스트리


 - RegEnumKey : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE

시스템에 설치된 하드디스크에 대한 구성이 기록된다. 이 항목은 시스템에 설치된 하드디스크별로 설정된다.




나) VMWare 관련 레지스트리


 - RegEnumKey : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\SCSI



- RegEnumValue : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\disk\Enum-> 0



 - RegEnumKey : HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\0000\DriverDesc




2) 하드웨어 정보


 - 경로 : HKEY_LOCAL_MACHINE\HARDWARE

시스템에 장착된 하드웨어에 대한 정보가 각 하위키에 저장되어 있다. 시스템이 부팅될 때마다 하드웨어 인식기인 Ntdetect.com이 하드웨어를 인식해 이곳에 새로운 정보를 저장한다.


 - 하위키 : ACPI

Advanced Configuration and Power Interface의 약자로 컴퓨터에 연결된 모든 주변기기에 전력을 시스템이 조절할 수 있도록 하는 절전 장치 규격이다. ACPI를 조정하고 지원하는 장치에 대한 정보가 들어 있다.


 - 하위키 : DESCRIPTION

부팅시 설치되어 있는 하드웨어를 검사해 이 키에 관련 목록을 저장 한다. 하드웨어 인식기인 Ntdetect.com을 이용해 목록을 만들며 휘발성으로 부팅시 갱신 된다. 각 하위키에는 Identifier라는 값이 있는데, 이 값의 데이터에 장치 이름이 저장 된다.


 - 하위키 : DEVICEMAP

각 하드웨어 장치들과 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services에 저장되어 있는 드라이버들을 서로 연결하는 값이 저장되어 있다. 즉 장치를 실행하기 위해 필요한 드라이버 컨트롤 집합의 위치 정보가 저장되어 있다.


가) VirtualBox 관련 레지스트리


 - RegEnumKey : HKEY_LOCAL_MACHINE\HARDWARE\ACPI\DSDT

 - RegEnumKey : HKEY_LOCAL_MACHINE\HARDWARE\ACPI\FADT

 - RegEnumKey : HKEY_LOCAL_MACHINE\HARDWARE\ACPI\RSDT



 - RegEnumValue : HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM -> VideoBiosVersion





나) VMWare 관련 레지스트리


 - RegEnumValue : HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port X\Scsi Bus 0\Target Id 0\Logical Unit Id 0 -> Identifier



3) 소프트웨어 정보


 - 경로 : HKEY_LOCAL_MACHINE\SOFTWARE


윈도우에 설치된 소프트웨어와 디바이스 드라이버에 대한 전반적인 정보가 저장되어있다.


가) VMWare 관련 레지스트리


 - HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\VMWAREHOSTOPEN.EXE 하위의 관련 키, 값





2. 관련 파일


1) 드라이버 파일


- 경로 : C:\Windows\System32\drivers 


가) VMWare 관련 파일


- vmhgfs.sys

- hgfs.sys

- prleth.sys

- prlfs.sys

- prlmouse.sys

- prlvideo.sys

- prl_pv32.sys

- vpc-s3.sys

- vmsrvc.sys

- vmx86.sys

- vmnet.sys



2) GUEST <--> HOST 간의 전송된 파일들이 저장되어있는 폴더




3. 프로세스 및 서비스


1) 서비스


가) VMWare 관련 서비스



2) 프로세스


가) VMWare 관련 프로세스




4. 특정 명령어


1) I/O 명령


본래 인텔의 IN명령과 OUT명령은 커널 레벨에서만 실행 가능하다. 하지만 VMWare의 경우 Host와 Guest 간의 통신채널 제공을 위해 응용프로그램에서도 실행이 가능하다.


가) VMWare 탐지 관련 코드


VMware backdoor I/O function call

#define VMWARE_MAGIC            0x564D5868      // Backdoor magic number

#define VMWARE_PORT             0x5658          // Backdoor port number

#define VMCMD_GET_VERSION       0x0a            // Get version number

int VMBackDoor(unsigned long *reg_a, unsigned long *reg_b, unsigned long *reg_c, unsigned long *reg_d) {

        unsigned long a, b, c, d;

        b=reg_b?*reg_b:0;

        c=reg_c?*reg_c:0;

        xtry {

                __asm {

                        push eax

                        push ebx

                        push ecx

                        push edx

                        mov eax, VMWARE_MAGIC

                        mov ebx, b

                        mov ecx, c

                        mov edx, VMWARE_PORT

                        in eax, dx

                        mov a, eax

                        mov b, ebx

                        mov c, ecx

                        mov d, edx

                        pop edx

                        pop ecx

                        pop ebx

                        pop eax

                }

        } xcatch(...) {}

        if(reg_a) *reg_a=a; if(reg_b) *reg_b=b; if(reg_c) *reg_c=c; if(reg_d) *reg_d=d;

        return a; 

}


Check VMware version only

int VMGetVersion() {

        unsigned long version, magic, command;

        command=VMCMD_GET_VERSION;

        VMBackDoor(&amp;version, &amp;magic, &amp;command, NULL);

        if(magic==VMWARE_MAGIC) return version;

        else return 0; 

}

Check if running inside VMWare

int IsVMWare() {

        int version=VMGetVersion();

        if(version) return true; else return false; 

}


5. 기타


1) User 이름


 - currentuser

 - sandbox

 - honey

 - vmware

 - nepenthes

 - snort

 - andy

 - roo


2) MAC 주소


가) VMWare 특정 MAC 주소


출처 : http://www.coffer.com/mac_find/?string=VMware


Prefix

Vendor

00:05:69

VMWARE, Inc.

00:0C:29

VMware, Inc.

00:1C:14

VMware, Inc. 

00:50:56

vmware, inc.

00:05:69

VMWARE, Inc. 

00:0C:29

VMware, Inc.

00:1C:14

VMware, Inc.

00:50:56

vmware, inc.




3) Interrupt Descriptor Table(IDT) 의 메모리 위치를 이용한 방법


 - IDT의 Base address 가 0xd000000 보다 클 경우 Guest

 - 단점 : 코어가 여러 개일 경우 정확하지 않음


4) 메모리 문자열 검색

 - 테스트 방법

- 램 2GB의 Windows 환경

- FDPro를 이용해 메모리 덤프

- String.exe 를 이용해 문자열 추출

- “VMware” 검색 결과 관련 문자열 9160개 발견






6. 실제 악성코드가 사용하는 VM 탐지 방법


경로 : https://www.alienvault.com/open-threat-exchange/blog/your-malware-shall-not-fool-us-with-those-anti-analysis-tricks


7. 쿠쿠샌드박스 (uckoo sandbox)가 VM탐지하는 악성코드를 우회하는 방법


경로 : https://github.com/jaimeblasco/AlienvaultLabs/blob/master/cuckoomon_hardened/cuckoomon_vbox_hardened.patch


8. 위에 적은 모든 내용을 간략하게 정리한 내용


경로 : 

http://www.eicar.org/files/2013_how_to_detect_the_cuckoo_sandbox_and_hardening_it_-_eicarconf_2013.pdf


9. 이외의 다양한 종류의 가상머신을 탐지하는 방법


경로 : http://artemonsecurity.com/vmde.pdf


10. 서비스 탐지를 우회하는 방법


OpenService API를 사용해 해당 서비스가 설치되어있는지 확인할 수 있다. 설치되어 있지 않을 경우 NULL을 리턴 하므로 위의 API를 패치해주면 된다.


OpenService(check_serv_handle, service_name, SERVICE_QUERY_STATUS);

serivce_name이 VMware Tools 일 때 NULL을 리턴하도록 코드를 작성한다.