下一页 1 2 3
有一个问题至今还在困扰蜜罐研究者:怎样在不被入侵者察觉的情况下监视他们?蜜罐设计的目的是为了观察入侵者在一些普通系统里的所作所为,所以我们要确保让他们没有感觉到被监视。传统的做法是记录相关活动的网络数据,这种做法对入侵者来说是不可见的。
但是黑帽子们是越来越精明了,他们越来越多的使用加密工具来保护他们的传输通道。如果目标机器没有安装加密服务,那么他们也会自己安装上如SSH、加密的GUI客户端或者SSL等服务。如果没有密钥,基于网络的数据捕获工具将无法察看传输的数据。
为了观察入侵者使用加密的会话,研究者必须找到破解加密会话的方法,不过许多组织已经证明这是非常困难的。强攻不行就只能智取,Honeynet项目开始尝试在蜜罐机器安装基于内核的rootkit来捕获感兴趣的数据。这些实验的结果导致开发出一个叫Sebek的工具,它是运行在内核空间的一段代码,记录系统用户存取的一些或者全部数据。这个工具有这些功能:记录加密会话中击键,恢复使用SCP拷贝的文件,捕获远程系统被记录的口令,恢复使用 Burneye保护的二进制程序的口令还有其它的一些入侵分析任务相关的作用。这篇文章讨论Sebek版本2,当然也覆盖Sebek的内容。
下面将详细讨论Sebek,包括它如何工作和有什么价值。我们会介绍它的结构和关键组成,演练如何执行以及操作的技术细节。最后,我们会给出Sebek包括它最新的Web接口在内的使用例子。
Sebek最初是在Linux系统开发的,现在它已经移植到Win32、Solaris和OpenBSD等操作系统上。这篇文章介绍的是Linux版本的Sebek,但是许多讨论到的概念也适合其它移植版本。
Sebek是一个数据捕获工具。所有数据捕获工具的目的都是用捕获的数据准确的给我们重现蜜罐上的事件。我们需要通过这些信息来确定入侵者是什么时候攻破系统的,他们是怎么做的,以及在获得访问权限后又做了什么。这些信息还可能告诉我们谁是入侵者,他们的动机是什么,以及他们和谁一起工作。为了确定入侵者获得访问权限后所作的事情,我们需要捕获的数据能够提供入侵者的击键记录和攻击的影响。
如果没有使用加密,那么用ethereal等工具重组网络上捕获数据的TCP流就可以得到会话的内容,从而监视入侵者的击键。这种技术不但可以得到入侵者输入的信息,也可以得到入侵者看到的输出。当会话没有被加密的时候,流重组技术是捕获入侵者动作的理想方法。但是会话被加密的时候,流重组也只能得到加密的会话内容,破解加密会话内容是非常困难的。
加密的信息如果要使用就肯定会在某些地方不是被加密的,绕过进程就可以捕获未加密的数据。这是解密工作的基本机制,然后获得访问未保护的数据。使用二进制木马程序是对付加密的首次尝试。当入侵者攻破蜜罐,他可能会使用如SSH的加密工具来登陆被攻陷的主机,登陆的时候肯定要输入命令,这时木马shell程序会记录他们的动作。
二进制木马程序隐蔽性不高,而且入侵者可能会安装他们自己的二进制程序。从操作系统内核访问数据将是一个很好的捕获方法。不管入侵者使用什么二进制程序,我们都可以从内核捕获数据并且可以记录他们的行为。而且,由于用户空间和内核空间是分开的,所以在技术上我们还可以实现对所有包括root在内的用户隐藏自己的动作。
第一个版本的Sebek设计成直接从内核搜集击键数据。这些早期版本参考了Adore Rootkit,通过替换sys_read系统调用来捕获击键,然后把击键记录到一个隐藏文件并通过网络模拟成其它如NetBIOS等UDP数据传输把它发送出去。这样就能满足我们监视入侵者击键的要求了,但是它很复杂,而且只需使用包嗅探器就可以简单的检测到,并且效率不高。最后还发现除了击键,其它数据记录很困难。
在下一个版本,也就是当前的Sebek版本2,它不但可以记录击键,还记录所有通过sys_read的数据。收集到所有数据,我们就可以监视蜜罐的所有动作,不再局限于击键。比如有一个文件拷贝到蜜罐,Sebek能够发现并记录它,产生一个同一的拷贝。如果入侵者使用IRC或邮寄客户端,Sebek也能看见那些消息。第二个重要的改变是Sebek变得更难检测出来,我们改进了日志数据传输,对黑帽子来说是完全隐藏。现在他们用嗅探器检测不到Sebek的数据传输。
Sebek现在还没有对TCP会话重组,只是用来对付加密。相比以前的黑盒子技术,Sebek使得对蜜罐内部工作的监视变得透明。比如入侵者安装了一个恶意软件,然后退出,现在我们还可以继续追踪恶意程序的本地行为,即使它没有访问网络。
Sebek有两个组成部分:客户端和服务端。客户端从蜜罐捕获数据并且输出到网络让服务端收集(参考图1所示)。服务端有两种方式收集数据:第一种是直接从网络活动的数据包捕获,第二种是从tcpdump格式保存的数据包文件。当数据收集后既可以上传到相关数据库,也可以马上显示击键记录。Sebek使用无连接、不可靠的UDP协议进行通信。
图1
典型的Sebek部署。客户端模块安装在蜜罐(蓝色)里,蜜罐里攻击者行为被捕获后发送到网络(对攻击者是不可见的)并且由Honeywall网关被动的收集。.
客户端完全在蜜罐的内核空间,根据Linux版本的情况以可加载内核模块(LKM)的方式执行。客户端可以记录用户通过read()系统调用的所有数据,运行Sebek的蜜罐以难以检测的方式把这些数据输出到服务端所在的网络,然后服务端收集所有蜜罐发送的数据。因为这些数据都有一个统一的标准格式,所以服务端可以收集各种不同操作系统蜜罐的数据。下面让我们更深入的了解一下客户端实际是如何捕获数据的。
数据捕获是由内核模块来完成的,我们使用这个模块获得蜜罐内核空间的访问,从而捕获所有read()的数据。Sebek替换系统调用表的read()函数来实现这个功能,这个替换的新函数只是简单的调用老read()函数,并且把内容拷贝到一个数据包缓存,然后加上一个头,再把这个数据包发送到服务端。替换原来的函数就是改变系统调用表的函数指针。
图2
改变read系统调用的示意图
当用户空间的进程调用标准的read()函数的时候会产生一个系统调用,这个调用映射到系统调用表数组的索引偏移。因为Sebek把read索引的函数指针修改指向到它自己的函数实现,所以当执行到内核的read实现时就会执行Sebek修改后的read调用,Sebek通过这个系统调用看到所有访问的数据。我们可以用同样的技术来修改我们想要监视的任意系统调用。
数据在使用的时候一般都是解密的。比如有动作发生的时候,SSH会话的击键显示在shell上的数据肯定不是加密的。这个动作一般会产生一个系统调用,在内核空间收集数据,我们能截获这个系统调用访问进程解密后但还没有处理的数据,通过这种方法就可以在加密环境捕获击键、文件传输、Burneye的口令等。
为了使Sebek模块更加隐蔽,我们使用了一些如Adore等基于LKM的rootkit的技术。由于Sebek完全驻留在内核空间中,那么我们可以通过安装第二个cleaner模块来隐藏Sebek模块,这个模块把Sebek从安装模块链表中删除记录。虽然这是一种不错的隐藏模块的技术,但是在第61期的phrack杂志上有一篇文章描述了通过查看所有出现的关键模块结构,以暴力的方式检测隐藏的内核模块。
移除模块有两方面的效果。首先,用户将看不见Sebek被安装了。第二,如果已经安装,用户将无法卸载Sebek模块。安装脚本sbk_install.sh的”Testing”变量如果设置成”1”,那么就禁止了隐藏功能。
当Sebek客户端捕获数据,那么它需要在入侵者没有察觉的情况下把数据发送到服务端。一般情况下蜜罐都是布置了一个局域网内,如果Sebek只是简单使用UDP流来给服务端发送数据,入侵者只需监听网络上的数据传输就可以判断是否安装了Sebek。不过Sebek还是使用UDP来给服务端发送数据,但是它修改内核使用户无法看到这些数据包,包括其它主机发送的该类型使用相同配置的数据包。而且当Sebek把这些数据发送到网络的时候,系统也无法阻止这些数据包的传输。
如果一个局域网上每个蜜罐安装了Sebek,它们都不能发现任何Sebek数据,然而服务端能够完全访问这些由客户端捕获的数据。每个read()调用请求Sebek都会产生一个或多个日志数据包,每个数据包都包含了一点关于这个调用内容的信息和这个调用访问的数据。每个包还包含了一个Sebek记录,这个记录包含一些产生调用的进程描述、调用产生的时间和记录数据的大小。这些报完全由Sebek产生,而不是使用TCP/IP协议栈来产生或发送数据包,所以系统无法看到或阻断这些数据包。当数据包创建好的时候就直接发送给驱动设备,这就绕过了原始套接字代码和包过滤代码。由于嗅探器是基于libpcap 的,而libpcap使用原始套接字接口来收集数据包,所以嗅探器不能看到运行Sebek主机上由Sebek产生的数据包。
图3
Sebek数据包产生的概念图。注意Sebek产生的数据包怎样绕过协议栈并且直接发送到网络设备驱动。这使得攻击者检测Sebek的活动非常困难。