極楽せきゅあブログ

ときどきセキュリティ

ボットなどのVMware判別

蕎麦で喋ろうかとも思ったけど、まとめきれなかったし古いネタなのでメモだけしとこうと思います。
VMware Workstationによるハニーポットは多いが、ゲスト側のバックドアをチェックすれば「現在VMwareの中にいる」ということがわかる。

VMWareのローカル検知
http://chitchat.at.infoseek.co.jp/vmware/backdoorj.html
によれば、

	/* Intel 表記 (MASM 他、多くの Windowsアセンブラ) */

	MOV EAX, 564D5868h                      /* マジックナンバー  */
	MOV EBX, コマンド特有のパラメータ
	MOV CX,  バックドアコマンド番号
	MOV DX,  5658h                          /* VMware I/O ポート */

	IN  EAX, DX (または OUT DX, EAX)

	/* AT&T 表記 (gnu as 他、多くの unixアセンブラ)   */

	movl $0x564D5868, %eax;                 /* マジックナンバー  */
	movl コマンド特有のパラメータ, %ebx;
	movw バックドアコマンド番号, %cx;
	movw $0x5658, %dx;                      /* VMware I/O ポート */

	inl  %dx, %eax; (または outl %eax, %dx)

という手順でバックドア機能を呼び出すことが可能であるようだ。
あるいは、BIOSを探ることで「もしかしてVM?」と疑うこともできる。このあたりを称してVMのフィンガープリントという。

実際にAGOBOTのソース?にも、バックドアを利用する検知機能が組み込まれている。実際にバックドアにコマンドを送りつけ、バージョン情報などの結果を得ている。

/* executes 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;

#ifdef _WIN32
	__try {
#endif
		__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
		}
#ifdef _WIN32
	} __except (EXCEPTION_EXECUTE_HANDLER) {}
#endif
	
	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(&version, &magic, &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; }

CDebugDetect::CDebugDetect() {
	m_bIsDebug=false;
}

フランスのハニーポットプロジェクトのVMwareパッチを用いれば、各種のVMフィンガープリントを「偽装」することが可能ではある。
http://honeynet.rstack.org/tools/vmpatch.c
ただしVMware Workstation 5.0.0 build-13124用。
関連:
http://www.securityfocus.com/infocus/1803
http://www.securityfocus.com/infocus/1805
http://www.securityfocus.com/infocus/1826
http://www.securityfocus.com/infocus/1828