虚拟机检测与蜜罐检测
对于虚拟机与蜜罐的检测,首先我们要了解什么是虚拟机,什么是蜜罐。首先虚拟机是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。而蜜罐好比是情报收集系统。蜜罐好像是故意让人攻击的目标,引诱黑客前来攻击。所以攻击者入侵后,你就可以知道他是如何得逞的,随时了解针对公司服务器发动的最新的攻击和漏洞。还可以通过窃听黑客之间的联系,收集黑客所用的种种工具,并且掌握他们的社交网络。作为信息安全方向的学员,了解虚拟机与蜜罐的检测技术,对于网络安全的研究有着重要的意义。
一、对于虚拟机的检测
对虚拟机主要有以下四种方向的检测方法:
(1)利用内存差异的检测方法;
(2)利用相对性能的检测方法;
(3)利用虚拟处理器的异常行为的检测方法;
(4)其他检测方法;
利用内存的差异性检测,主要有IDT(Interrupt Descriptor Table)或LDT(Local Descriptor Table)的检测方法。该方法利用了虚拟机和真实主机中重要的操作系统的某些关键数据结构的不同位置来判断执行环境是否是虚拟机。这类方法对VMware、Virtual PC 都比较有效。
x86的ISA中存在17条敏感非特权指令,其中包括SIDT、SLDT和SGDT,它们可以在用户态使用。使用它们可以获取IDT、LDT和GDT(Global Descriptor Table)的信息。因为只有一个IDTR寄存器、一个GDTR寄存器和一个LDTR寄存器,但是有两类操作系统在运行:虚拟机系统和真实主机系统。为了能够正确地虚拟化,每个虚拟机都应该维持这几个描述表的“影子”拷贝,虚拟机监控器必须改变虚拟机中描述表的位置。这样就会使虚拟机和真实主机产生一个不一致,使用这个不一致可以用来判断虚拟机的存在。
其中利用IDT基址检测虚拟机的具体实现如下:
中断描述符表IDT(Interrupt Descriptor Table)用于查处理中断时所用的软件函数,它
是一个由256项组成的数据,其中每一中断对应一项函数。为了读取IDT基址,我们需要通过SIDT指令来读取IDTR(中断描述符表寄存器,用于IDT在内存中的基址),SIDT指令是以如下格式来存储IDTR的内容:
typedef struct {
WORD IDTLimit; // IDT的大小
WORD LowIDTbase; // IDT的低位地址
WORD HiIDTbase; // IDT的高位地址
} IDTINFO;
由于只存在一个IDTR,但又存在两个操作系统,即虚拟机系统和真主机系统。为了防止发生冲突,VMM(虚拟机监控器)必须更改虚拟机中的IDT地址,利用真主机与虚拟机环境中执行sidt指令的差异即可用于检测虚拟机是否存在。
#include <stdio.h>
int main () {
unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3"; //相当于SIDT[adrr],其中addr用于保存IDT地址
*((unsigned*)&rpill[3]) = (unsigned)m; //将sidt[addr]中的addr设为m的地址
((void(*)())&rpill)(); //执行SIDT指令,并将读取后IDT地址保存在数组m中
printf ("idt base: %#x\n", *((unsigned*)&m[2])); //由于前2字节为IDT大小,因此从m[2]开始即为IDT地址
if (m[5]>0xd0) printf ("Inside Matrix!\n", m[5]); //当IDT基址大于0xd0xxxxxx时则说明程序处于VMware中
else printf ("Not in Matrix.\n");
return 0;
}
但是,IDT检测方法有一个缺点,它在有多个CPU的机器上误警率太高。因为多个CPU的机器上,每个处理器有不同的IDT,IDT的基地址在不同时刻所取得的值并不相同。为此, Danny Quist和Val Smith提出了使用LDT的检测方法。LDT检测方法和IDT的方法类似但是它在具有多个CPU的环境时检测的表现非常好。总的来说,这类方法简单有效,通用性强,虚拟机实现不能避免此类差异。
软件测试app其次是利用相对性能的检测方法。主要介绍基于时间差的检测方式。通过选择一段经过精心设计的代码,通过比较该代码在真实物理主机和目标主机上运行的相对时间来判断是否存在虚拟机。这类方法是一种通用的方法,不依赖于具体的软件虚拟机的实现方法。这种方法的缺点是需要知道目标主机的硬件配置信息。但是,这个前提通常很容易得到满足。如在进行恶意软件分析时,恶意软件很容易探测出目标主机的配置信息。
Jason Franklin 等人就使用了这种思想,他们提出的方法不需要获得目标主机的精确配置,因此,Jason Franklin 称他们所使用的方法为Fuzzy Benchmake方法。实验证明,该方法能够检测出VMware、Virtual PC、Xen等的存在。
第三是利用虚拟处理器的异常行为的检测方法。该方法主要通过利用虚拟处理器的异常行为来判断虚拟机是否存在。为了处理如客户机和宿主机进行通信等有关问题,一些虚拟机引入了一些“额外”的非标准x86指令集的指令。主要有以下三种:
通过执行特权指令来检测虚拟机。Vmware为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“IN”指令来读取特定端口的数据以进行两机通讯,但由于IN指令属于特权指令,在处于保护模式下的真机上执行此指令时,除非权限允许,否则将会触发类型为“EXCEPTION_PRIV_INSTRUCTION”的异常,而在虚拟机中并不会发生异常,在指定功能号0A(获取VMware版本)的情况下,它会在EBX中返回其版本号“VMXH”;而当功能
号为0x14时,可用于获取VMware内存大小,当大于0时则说明处于虚拟机中。
基于STR的检测方法。在保护模式下运行的所有程序在切换任务时,对于当前任务中指向TSS的段选择器将会被存储在任务寄存器中,TSS中包含有当前任务的可执行环境状态,包括通用寄存器状态,段寄存器状态,标志寄存器状态,EIP寄存器状态等等,当此项任务再次被执行时,处理器就会其原先保存的任务状态。每项任务均有其自己的TSS,而我们可以通过STR指令来获取指向当前任务中TSS的段选择器。这里STR(Store task register)指令是用于将任务寄存器 (TR) 中的段选择器存储到目标操作数,目标操作数可以是通用寄存器或内存位置,使用此指令存储的段选择器指向当前正在运行的任务的任务状态段 (TSS)。在虚拟机和真实主机之中,通过STR读取的地址是不同的,当地址等于0x0040xxxx时,说明处于虚拟机中,否则为真实主机。
基于注册表检测虚拟机。在windows虚拟机中常常安装有VMware Tools以及其它的虚拟硬件(如网络适配器、虚拟打印机,USB集线器……),它们都会创建任何程序都可以读取的windows注册表项,因此我们可以通过检测注册表中的一些关键字符来判断程序是否处于虚拟机之中。
最后是其他检测方法。主要是利用虚拟硬件指纹检测虚拟机。利用虚拟硬件指纹也可用于检测虚拟机的存在,比如VMware默认的网卡MAC地址前缀为“00-05-69,00-0C-29或者00-50-56”,这前3节是由VMware分配的唯一标识符OUI,以供它的虚拟化适配器使用。但由于这些可经过修改配置文件来绕过检测。另外,还可通过检测特定的硬件控制器,BIOS,USB控制器,显卡,网卡等特征字符串进行检测。
由于目前虚拟机技术的发展,经过测试,目前这些技术许多已经失效,无法进行具体演示,新的虚拟机检测技术有待我们去探索发现。
虽然无法检测,但我们仍能看出虚拟机与真机的差别,也为我们今后的探索提供了一些思路。
二、蜜罐的检测技术
目前,蜜罐技术已由单一的蜜罐发展到现在的第三代蜜网,还出现了动态蜜罐(Activate Honeypots)、蜜场 (Honeyfarm)、Honeytoken、应用层蜜罐(Honeyapp)、 同步/异步交
互蜜罐(Active/Passive Honeyclient)等新概念、新技术。但是其核心技术如数据控制、数据捕获、数据分析、重定向等是不会变的。在计算机应用领 域,无论蜜罐作为一个系统还是一个软件甚至是网络, 都会存在这样那样的弱点,而蜜罐识别技术就是利用这些弱点来对蜜罐进行识别。
首先是基于蜜罐个性特征的识别技术。在实际的应用中,由于Honeypot产品和技术的不同,针对特定的Honeypot进行识别的技术也是多种多样。主要方法有虚拟机检测和Uml检测。虚拟机检测上面已近有了较详细的介绍,这里主要讲uml检测。
UML(User—mode Linux)允许在一个Linux系统(主机)上运行另外一个Linux系统(客户机),客户机可以作为蜜罐使用,和VMware类似,它同样是虚拟的系统,并没有使用实际的硬盘,而是使用一个叫UDB的虚拟IDE设备。通过查看关于UML的系统配置文件,例如检查一下/etc/fstab和目录/dev/ubd,或者运行mount你就会发现运行在一个·UML system 内,当然这些信息可以被伪装。
其次是基于蜜罐共性特征的识别技术,主要分为基于TCP/IP协议栈的识别和基于网络特征的识别。
基于TCP/IP协议栈的操作系统识别是比较成熟的技术,这方面的常用工具有Nmap,Queso等。在比较简单的低交互度的一些Honeypot中,仅仅在应用程序级别模拟操作系统,并没有对协议栈进行模拟,如Specter假如模拟的操作系统和本机的操作系统不相同,攻击者利用协议栈的指纹识别可以发现正在攻击的操作系统和识别出的操作系统类型不符,从而判断蜜罐的存在。
基于网络特征的识别,网络特征主要包括连接数目、网络流量、数据包内容、TCP/IP值、网络延迟和路由以及重定向等。利用网络连接识别,例如对Honeywall的检测就用到了该方法。Honeywall作为一个蜜网网关,是第二代蜜网方案整体架构中最重要的核心部件之一。作为蜜网与其他网络的惟一连接点,所有流入、流出蜜网的网络流量都将通过Honeywall,并受其控制和审计。同时由于其是一个工作在链路层的桥接设备,不会对网络数据包进行TTL递减和网络路由,也不会提供本身的MAC地址,因此对黑客而言,Honeywall是完全不可见的。
由于Honeywall的存在出境的通信将被严格限制,比如每天只允许15个出境TCP连接。只需要启动大量的出境连接,然后观察如果在一定数量的连接之后连接是否受到了阻止,即可判断Honeywall的存在。
第二种方法是利用Snort inline软件,它检测出从Honeypot向外发出的含有的攻击特征的攻击数据包,发出报警信息并对攻击数据包加以抛弃或修改,使其不
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论