摘 要 传统蜜罐有着不少的优点,比如收集数据的保真度,不依赖于任何复杂的检测技术等。然而随着应用的广泛,传统蜜罐的缺点也开始显现了出来。取而代之的是由一组高交互用来获取广泛威胁信息的蜜罐组成的蜜网。本文针对蜜网中蜜罐所面临的挑战:捕获工具隐藏、加密会话数据的捕获、数据传输隐蔽通道,给出了详细的解决方案。
关键词 蜜罐;Linux;模块隐藏;加密会话捕获;隐蔽通道
1 引言
蜜罐是一种安全资源,其价值在于被扫描、攻击和攻陷[1]。它以牺牲真实的没有打补丁的操作系统(一般以Linux为平台)为代价欺骗入侵者以达到采集黑客攻击方法和保护真实主机目标。
传统蜜罐有着不少的优点,比如收集数据的保真度,蜜罐不依赖于任何复杂的检测技术等,因此减少了漏报率和误报率。使用蜜罐技术能够收集到新的攻击工具和攻击方法,而不像目前的大部分入侵检测系统只能根据特征匹配的方法检测到已知的攻击。但是随着应用的广泛,传统蜜罐的缺点也开始暴露了出来,综合起来主要有3个方面:
(1)蜜罐技术只能对针对蜜罐的攻击行为进行监视和分析,其视图不像入侵检测系统能够通过旁路侦听等技术对整个网络进行监控。
(2)蜜罐技术不能直接防护有漏洞的信息系统并有可能被攻击者利用带来一定的安全风险。
(3)攻击者的活动在加密通道上进行( IPSec,SSH,SSL,等等)增多,数据捕获后需要花费时间破译,这给分析攻击行为增加了困难。
针对以上问题出现了蜜网技术。蜜网技术实质上是一类研究型的高交互蜜罐技术,与传统蜜罐技术的差异在于,蜜网构成了一个黑客诱捕网络体系架构,在这个架构中,可以包含一个或多个蜜罐,同时保证了网络的高度可控性,以及提供多种工具以方便对攻击信息的采集和分析。图1给出了蜜网的结构及其蜜罐在蜜网中的位置。其中最为关键的部件为称为HoneyWall的蜜网网关,包括三个网络接口,网卡1接入外网,网卡2连接蜜网,而网卡3作为一个秘密通道,连接到一个监控网络。HoneyWall是一个工作在链路层的桥接设备,作为蜜网与其他网络的惟一连接点,所有流入流出蜜网的网络流量都将通过HoneyWall,并受其控制和审计,同时不会对网络数据包进行 TTL 递减和网络路由,也不会提供本身的 MAC 地址,因此对黑客而言,HoneyWall 是完全不可见的,因此黑客不会识别出其所攻击的网络是蜜网。
图1 蜜网体系架构
2 蜜网中蜜罐所面临的挑战
蜜网是一个体系结构,成功地部署一个蜜网环境,这里有两个严格的需求,这也是针对传统蜜罐的缺点而提出来的。这两个需求是:数据控制和数据捕获。
数据控制就是限制攻击者活动的机制,它可以降低安全风险。这是图1中蜜网网关所要做的一部分工作。
数据捕获就是监控和记录所有攻击者在蜜网内部的活动,包括记录加密会话中击键,恢复使用SCP拷贝的文件,捕获远程系统被记录的口令,恢复使用保护的二进制程序的口令等。这些捕获的数据将会被用于分析,从中学习黑客界成员们使用的工具、策略以及他们的动机。这正是蜜罐所要做的工作。
这其中的难点就是:
(1)使黑客无法侦测到数据捕获这个进程的同时搜集尽可能多的数据。
(2)黑客们越来越多的使用加密工具来保护他们的传输通道。如果目标机器没有安装加密服务,那么他们也会自己安装上如SSH、加密的GUI客户端或者SSL等服务。如果没有密钥,基于网络的数据捕获工具将无法察看传输的数据。
(3)要将收集到的数据通过一个秘密通道汇总到蜜墙中的数据收集服务器。
3 解决方案
3.1 捕获工具隐藏
3.1.1 隐藏模块
捕获数据的工具是以模块化的机制在Linux系统启动后动态地加载到内核成为内核的一部分进行工作的。当捕获程序的模块被加载到内核时,一个记载已加载模块信息的安装模块链表里面就记录下已加载模块的信息,用户可以通过内存里动态生成的proc文件系统下的module文件来查看到。当特权用户root调用/sbin/insmod命令加载模块时会有一个系统调用sys_create_module(),这个函数在Linux2.4的源代码中位于kernel/module.c。它会将含有新加载的模块信息的数据结构struct module插入到名为moudle_list的模块链表中去。
281 sys_create_module(const char *name_user,size_ t size)
282 {
……
309 mod-next = module_list;
310 mod-name = (char *)(mod + 1);
311 mod-size = size;
312 memcpy((char*)(mod+1),name,namelen+1);
313
314 put_mod_name(name);
315
316 module_list = mod;
……
325 }
可以看出当一个模块加载时,它被插入到一个单向链表的表头。黑客们在攻入蜜罐系统后,可以根据以上存在的漏洞,找出他们认为是可疑的蜜罐捕获模块并从内核卸载模块,这样蜜罐也就失去了它的功能。
为了达到隐藏模块的目的就必须在加载模块后,将指向该模块的链表指针删除,这样通过遍历表查找时就再也无法找到该模块了,实现的代码
……
struct module *mod_current;
mod_current = &__this_module;
While (mod_current.next)
{
if (strcmp(mod_current.next,str)); /*str为模块的名称*/
{ mod_current.next = mod_current.next-next; /*删除了数据捕获模块*/
break;
}
else mod_current=mod_current.next;
}
……
3.1.2 进程隐藏
进程是一个随执行过程不断变化的实体。在Linux系统运行任何一个命令或程序系统时都会建立起至少一个进程来执行。这样蜜罐捕获程序必定会在系统中运行多个进程,利用类似于ps这样查询进程信息的命令便可以得到所有的进程信息,这样很容易就会暴露蜜罐的存在。由于在Linux中不存在直接查询进程信息的系统调用,类似于ps这样查询进程信息的命令是通过查询proc文件系统来实现的。proc文件系统是一个虚拟的文件系统,它通过文件系统的接口实现,用于输出系统运行状态。它以文件系统的形式,为操作系统本身和应用进程之间的通信提供了一个界面,使应用程序能够安全、方便地获得系统当前的运行状况以及内核的内部数据信息,并可以修改某些系统的配置信息。由于proc以文件系统的接口实现,因此可以象访问普通文件一样访问它,但它只存在于内存之中,因此可以用隐藏文件的方法来隐藏proc文件系统中的文件,以达到隐藏进程的目的。
首先必须了解查询文件信息的原理。Linux系统中用来查询文件信息的系统调用是sys_getdents(),当查询文件或者目录的相关信息时,Linux系统用sys_getedents()函数来执行相应的查询操作,并把得到的信息传递给用户空间运行的程序,所以如果修改该系统调用,去掉结果中与proc文件系统中的特定文件的相关信息,那么所有利用该系统调用的程序将看不见该文件,这样就实现了进程的隐藏。
判断文件是否属于proc文件系统是根据它只存在于内存之中,不存在于任何实际设备之上这一特点,所以Linux内核分配给它一个特定的主设备号0以
及一个特定的次设备号1,除此之外在外存上没有与之对应的i节点,所以系统也分配给它一个特殊的节点号PROC_ROOT_INO(值为1),而设备上的1号索引节点是保留不用的。这样可以得出判断一个文件是否属于proc文件系统的方法。
(1) 得到该文件对应的inode结构d_inode;
(2) if (d_inode-i_ino == PROC_ROOT_INO && !MAJOR(d_inode-i_dev) &&;
MINOR(d_inode- i _dev) == 1) {该文件属于proc文件系统}。
再来看一下查询文件系信息系统调用的原型:
int sys_getdents(unsigned int fd,struct dirent *dirp,unsigned int count)
其中fd为指向目录文件的文件描述符,该函数根据fd所指向的目录文件读取相应dirent结构,并放入dirp中,其中count为dirp中返回的数据量,正确时该函数返回值为填充到dirp的字节数。
通过上面的分析,给出隐藏特定进程的伪码表示:
Hiding_Proc(unsigned int fd,struct dirent *dirp,unsigned int count)
{ /*调用原来的系统调用*/
sys_getdents(fd,&dirp,count);
得到fd所对应的节点;
if(该文件属于proc文件系统&&该文件名需要隐藏)
{从dirp中去掉该文件相关信息}
}
3.2 捕获加密会话数据
为了观察入侵者使用加密的会话,就必须找到破解加密会话的方法,不过许多组织已经证明这是非常困难的。强攻不行就只能智取,加密的信息如果要使用就肯定会在某些地方不是被加密的,绕过加密进程就可以捕获未加密的数据。这是解密工作的基本机制,然后获得访问未保护的数据。使用二进制木马程序是对付加密的一种办法。当入侵者攻破蜜罐,他可能会使用如SSH的加密工具来登陆被攻陷的主机,登陆的时候肯定要输入命令,这时木马shell程序会记录他们的动作。不过二进制木马程序隐蔽性不高,而且入侵者可能会安装他们自己的二进制程序。
从操作系统内核访问数据将是一个很好的捕获方法。不管入侵者使用什么二进制程序,都可以从内核捕获数据并且可以记录它们的行为。而且,由于用户空间和内核空间是分开的,所以在技术上还可以实现对所有包括root在内的用户隐藏自己的动作。图2中左边的数据捕获机制说明了其工作的原理。
数据捕获是由内核模块来完成的,所以要使用这个模块获得蜜罐机操作系统内核空间的访问,从而捕获所有read()和write()的数据。捕获模块通过替换系统调用表的read()和write()函数来实现这个功能,这个替换的新函数只是简单的调用老read()和write()函数,并且把内容拷贝到一个数据包缓存。见图2中的步骤①、②、③、④。
图2 加密会话数据捕获及隐蔽传输通道原理
替换原来的函数就是改变系统调用表的函数指针。当用户空间的进程调用标准的read()和write()函数的时候会产生一个系统调用,这个调用映射到系统调用表数组的索引偏移。因为捕获模块把read和write索引的函数指针修改指向到它自己的函数实现,所以当执行到内核的read实现时就会执行捕获模块修改后的read和write调用,捕获模块通过这个系统调用看到所有访问的数据。这个技术同样可以用来修改想要监视的任意系统调用。
3.3 数据传输隐蔽通道的建立
当蜜罐捕获到数据后,那么它需要在入侵者没有察觉的情况下把数据发送到蜜网网关服务端。蜜罐通常都是布置在局域网内,如果捕获模块只是简单使用UDP流来给服务端发送数据,入侵者只需监听网络上的数据传输就可以判断是否有蜜罐系统的存在了。不过捕获模块还是可以使用UDP来给服务端发送数据,只不过它需要修改内核使用户无法看到这些数据包,包括其它主机发送的该类型使用相同配置的数据包。当捕获模块把这些数据发送到网络的时候,操作系统也无法阻止这些数据包的传输。
如果一个局域网上每个蜜罐安装了按照以上方法改进后的数据捕获模块,入侵者将不能发现任何捕获模块的数据,然而服务端能够完全访问这些由蜜罐客户端捕获的数据。每个read()或write()调用请求都会产生一个或多个日志数据包,每个数据包都包含了一点关于这个调用内容的信息和这个调用访问的数据。每个包还包含了一个记录,这个记录包含一些产生调用的进程描述、调用产生的时间和记录数据的大小。这些包完全由捕获模块产生,而不是使用TCP/IP协议栈来产生或发送数据包,所以系统无法看到或阻断这些数据包。当数据包创建好的时候就直接发送给驱动设备,这就绕过了原始套接字代码和包过滤代码。由于嗅探器通常都是基于libpcap的,而libpcap使用原始套接字接口来收集数据包,所以嗅探器不能看到运行在蜜罐主机上由捕获模块产生的数据包。
图2中右边的发送机制给出了产生的数据包怎样绕过协议栈并且直接发送到网络设备驱动的方法,见步骤⑤、⑥、⑦、⑧。这使得攻击者检测蜜罐捕获数据的活动非常困难,因为捕获蜜罐产生自己的数据包且直接通过设备驱动发送它们,所以用户无法使用IPTABLES来阻断数据包,也无法用网络嗅探器来监视它们,这也防止了蜜罐上的入侵者通过检查局域网数据传输来检测是否有捕获工具。
同时还有一个要解决的问题,就是要阻止蜜罐A检测到蜜罐B的捕获到的数据包。使用以太交换不能解决这个问题,因为数据包不是通过ARP获取目标IP地址对应的目标MAC地址,所以它对ARP欺骗有自然免疫能力。但是在有些情况下,A可以看到B的数据包,这样入侵者就可以在蜜罐A运行嗅探器来看到局域网上来自蜜罐B的捕获到的数据包。为了解决这个问题,捕获模块的包产生机制应该实现自己独特的原始套接字实现,从而实现安静地忽略来自局域网中的其他蜜罐发送出数据包。在发送的数据包头定义了预先设定的目标UDP端口和固有的特定数字,如果这两个值都匹配了,那么这个数据包就会被忽略。这样蜜罐A在收到蜜罐B的数据包时就会丢弃它们并且移到队列里的下一个数据包,这使得入侵者用嗅探器也无法捕获数据包。
4 结论
针对传统的蜜罐的局限性和缺点,出现了蜜网技术,它实质上也是一种蜜罐技术,与传统蜜罐不同的是,蜜网是由许多用来与攻击者进行交互的蜜罐组成的网络。本文针对蜜网中蜜罐所面临的问题:隐藏自身、加密会话数据捕获以及和蜜网网关建立隐蔽数据传输通道,给出了详细的解决方案。但同时也存在着一些不足,比如本文中所提到的隐藏蜜罐数据捕获模块和进程的方法,虽然达到了保护自身的目的,但也带来了一些负面问题:捕获模块被加载就再也无法卸载,root用户再也无法找到它,一旦捕获模块中出现bug,由于无法管理,可能会引起内核的不稳定甚至系统崩溃等,这将会影响到蜜罐的正常工作,从而影响整个蜜网的性能。这些问题都有待进一步的研究。
参考文献
[1] L.Spitzner,“Honeypot-Definitions and Value of Honeypots” 2003,http://www.tracking-hackers.com/papers/ honeypots.html
L.Spitzner,”Honeypots:Catching the Insider Threat”,Proceedings of the 19th Annual Computer Security Applications Conference,Las Vegas,Nevada,USA,December 08–12,2003
Know Your Enemy: Honeynets - 12 November,2003,http://www.honeynet.org/papers/honeynet/index.html
Know Your Enemy: GenII Honeynets - 03 November,2003,http://www.honeynet.org/papers/honeynet/index.html
[美] Jonathan Corbet,Alessandro Rubini,Greg Kroah- Hartman.Linux Device Drivers,3rd Edition.O`REILLY,2006.01
[美] Kurt Wall 等着、张辉译.GNU/Linux编程指南(第二版).清华大学出版社,2005.08
毛德操、胡希明 着.Linux内核源代码情景分析.浙江大学出版社,2002.04
相关文章
学术参考网 · 手机版
https://m.lw881.com/