Sebek学习笔记

 

1、Sebek是一个数据捕获工具。

2、Sebek是运行在内核空间的一段代码,记录系统用户存取的一些或者全部数据。

    这个工具有这些功能:记录加密会话中击键,恢复使用SCP拷贝的文件,捕获远程系统被记录的口令,恢复使用 Burneye保护的二进制程序的口令还有其它的一些入侵分析任务相关的作用。
    入侵者会使用加密工具来保护他们的传输通道,监视者如果没有密钥,基于网络的数据捕获工具将无法察看传输的数据,因此采用基于内核的Sebek来捕获数据。

3、Sebek有两个组成部分:客户端和服务端。客户端从蜜罐捕获数据并且输出到网络让服务端收集(参考图1所示)。服务端有两种方式收集数据:第一种是直接从网络活动的数据包捕获,第二种是从tcpdump格式保存的数据包文件。当数据收集后既可以上传到相关数据库,也可以马上显示击键记录。Sebek使用无连接、不可靠的UDP协议进行通信。


4、数据捕获是由内核模块来完成的,我们使用这个模块获得蜜罐内核空间的访问,从而捕获所有read()的数据。Sebek替换系统调用表的read()函数来实现这个功能,这个替换的新函数只是简单的调用老read()函数,并且把内容拷贝到一个数据包缓存,然后加上一个头,再把这个数据包发送到服务端。替换原来的函数就是改变系统调用表的函数指针。

5、为了使Sebek模块更加隐蔽,我们使用了一些如Adore等基于LKM的rootkit的技术。由于Sebek完全驻留在内核空间中,那么我们可以通过安装第二个cleaner模块来隐藏Sebek模块,这个模块把Sebek从安装模块链表中删除记录。

6、Sebek客户端如何秘密的向服务端发数据报文。
    当Sebek客户端捕获数据,那么它需要在入侵者没有察觉的情况下把数据发送到服务端。这些报完全Sebek产生,而不是使用TCP/IP协议栈来产生或发送数据包,所以系统无法看到或阻断这些数据包。当数据包创建好的时候就直接发送给驱动设备,这就绕过了原始套接字代码和包过滤代码。由于嗅探器是基于libpcap 的,而libpcap使用原始套接字接口来收集数据包,所以嗅探器不能看到运行Sebek主机上由Sebek产生的数据包。

     第二个要解决的问题是需要阻止蜜罐A检测到蜜罐B的Sebek数据包。为了解决这个问题,Sebek安装了自己的原始套接字实现。在Sebek数据包头定义了预先设定的目标 UDP端口和固有的魔术数字,如果这两个值都匹配了,那么这个数据包就会被忽略。这个简单的实现不会对Sebek数据包有影响,只是丢弃它们并且移到队列里的下一个数据包,这使得入侵者即使使用嗅探器也无法捕获Sebek数据包。

7、Sebek的协议格式

    为了确保所有版本的Sebek能协同工作定义了一个通用的协议。客户端和服务端的通信通道是单向的,只能从客户端发送数据包给服务端。这个通道使用UDP协议,每个数据包都包含一个记录,记录有不同长度的MTU和一个固定长度的头。这个48字节的头结构如下

这个头在IP/UDP头后面,其后跟随蜜罐活动表现的数据(攻击者的击键、文件、密码等)
字段名               数据类型                 描述
Magic            Unsigned 32 bit Int      前面是目标端口,Sebek使用Magic来识别那些数据包需要隐藏
Version          Unsigned 16bit Int       Sebek协议版本
Type              Unsigned 16bit Int       记录的类型。读数据是0,写数据是1。目前只实现了读。
Counter          Unsigned 32bit Int       PDU计数器,用来识别数据包什么时候丢失。刚安装时计数器是0
Time_sec       Unsigned 32bit Int       蜜罐从UNIX纪元开始的秒数
Time_usec     Unsigned 32bit Int       剩余的微秒数
PID                Unsigned 32bit Int       进程ID
UID                Unsigned 32bit Int       用户ID
FD                 Unsigned 32bit Int       文件描述符
Com              12 Character Array      记录命令名字的前12个字符
Length           Unsigned 32bit Int       8位PDU实体的长度。Length字段基于读请求返回的长度。如果从read()调用返回数据的长度大于局域网的MTU,Sebek会把
                                                      读到的数据分成多个分片以适应局域网传输。每个分片都包含了完整的Sebek记录头。

8、Sebek的配置

    在linux系统下要修改脚本文件skb_install.sh,这个脚本有八个配置参数,一般局域网上所有蜜罐都要使用相同的值。windows下的配置需要双击Configuration Wizard.exe。

    接口:指定记录哪个接口,默认是eth0。不需要配置IP地址。
    目标IP:这个字段定义了所有产生的Sebek数据包使用的目标IP地址。由于Sebek服务端收集数据包的时候不看目标IP地址,所以这里无需配置成Sebek服务端的IP,而且也不推荐,否则入侵者看到这些数据包的时候有机会知道哪个主机是Honeynet里提供数据控制功能的。
    目标MAC地址:这个字段指定蜜罐使用目标以太MAC地址,目标MAC可以设置成缺省网关的。把它设置成FF:FF:FF:FF:FF:FF将引起所有的包广播到局域网上每个主机,这是测试的小技巧。
    Magic值:这个值结合目标端口,用来确定蜜罐上哪个包需要隐藏。强烈推荐局域网上所有安装的Sebek都使用相同的Magic值和目标端口。
    目标UDP端口: 这个字段定义Sebek数据包的目标UDP端口。这个值结合Magic值,用来确定蜜罐上哪个包需要隐藏。
    源UDP端口:这个字段定义了Sebek数据包的源UDP端口。
    只记录击键:这个标记可以设定成1或0。设置成1,那么Sebek只收集击键,否则将收集所有读到的数据。如果你想恢复SCP文件,必须设置成0。
    测试:如果设置了测试选项,那么首先内核模块不会隐藏,第二,模块将产生的额外调试信息,并且会发送到syslog。

    当在一个局域网里配置蜜罐的时候,它们必须使用相同的magic值和目标端口值,这样就能防止才一个蜜罐看到其它的Sebek数据包。配置IP和MAC地址的时候,请记住MAC地址是最重要的。如果你配置了错误的目标IP地址,但是MAC地址配置正确了,并且UDP端口也是正确的,那么Sebek记录就能发送到服务端。此外,当服务端运行在Honeywall网关的时候,网卡接口没有设置IP地址,所以必须把目标MAC地址设置成缺省网关或Honeywall的MAC地址。如果你要记录远程主机(不在同一个局域网内),那么目标IP必须设置成主机的IP,MAC地址要设置成局域网缺省网关的MAC地址。

9、如何恢复从客户端来的Sebek数据

    服务端提取网络上Sebek客户端数据有两个来源,一个是捕获所有网络数据的tcpdump日志文件,另外一个是直接从网卡捕获活动的数据传输。
    服务端有三个组成部分。第一个部分叫sbk_extract,它既可以像嗅探器一样直接从网卡捕获数据,也可以从tcpdump文件收集。使用这个工具你可以用这两种方法来恢复Sebek数据。用sbk_extract提取数据有两种方法:第一种是把它发送给一个叫sbk_ks_log.pl的脚本,这个 Perl脚本把攻击者的击键打印到标准输出上;第二种是发送给一个叫sbk_upload.pl,这个Perl脚本把Sebek数据装载到mysql数据库。

sbk_extract是一个从输入数据(网卡或抓包文件)提取Sebek记录的程序。sbk_extract有三个选项:
        -f 指定从pcap文件提取数据
        -I 定义监听的网卡
        -p 指定UDP目标端口
    把Sebek记录导入数据库:运行sbk_extract,并且把输出用管道传给sbk_upload.pl,如:
         sbk_extract | sbk_upload.pl
    监视命令行击键:  运行sbk_extract,并且把输出用管道传给sbk_ks_ log.pl,如:
         sbk_extract | sbk_ks_ log.pl
    定制分析:  运行sbk_extract,并且把输出用管道传给自己设计的程序来分析。

sbk_ks_log.pl可以让你在服务端命令行查看运行Sebek客户端主机的击键活动,它没有其它选项,需要读sbk_extract的输出,比如:
        sbk_extract –i eth0 –p 1101 | sbk_ks_log.pl
     在这个例子里,sbk_extract监听eth0,收集UDP端口1101上的数据,然后把这些记录传递给sbk_ks_log.pl来提取击键活动。sbk_ks_log.pl的输出如下面所示:
         [2003-07-23 20:03:45 10.0.0.13 6673 bash 500]whoami
         [2003-07-23 20:03:48 10.0.0.13 6673 bash 500]who
         [2003-07-23 20:03:50 10.0.0.13 6673 bash 500]su
         [2003-07-23 20:03:57 10.0.0.13 6886 bash 0]cd /var/log
  格式:[时间戳 IP地址 进程ID 命令 用户ID ] 文本

sbk_upload.pl是一个把记录导入到mysql数据库的perl脚本,这个脚本有以下几个选项:
    -u 数据库用户
    -s 数据库服务器,默认是localhost
    -d 数据库库名
    -p 数据库口令
    -P 数据库使用的端口
    执行例子:
    sbk_extract –i eth0 –p 1101 | sbk_upload.pl -u Sebek –p secret – d Sebek
    上面的例子sbk_extract监听eth0上UDP端口是1101的Sebek数据包,提取出来的数据发送给sbk_upload.pl,它把这些数据插入到用户名是“Sebek”、口令是“secret”、数据库名字叫“Sebek”的本地主机数据库。附录A定义了数据表结构,当数据记录插入到 mysql数据库后,就可以用Web接口来方便的查看这些Sebek数据。

    Sebek现在提供了一个基于Web的分析接口,这个接口给用户提供监视击键活动、搜索指定活动、获得SCP传送的文件的能力,并且使得数据更易浏览。这个接口用PHP实现,并且检查数据只能是在数据库内,而不能是其它如捕获的数据包或系统日志。它设计成支持调查取证的工作流程,可以像ethereal分析捕获数据包一样分析Sebek数据。这个接口有三个主要选项:查看击键、搜索、浏览。
    击键摘要提供所有击键活动的汇总。
    搜索运行用户查询指定信息的能力。
    浏览或表格提供了所有除击键以外所有的活动。

10、Sebek数据库

    Sebek数据库只使用一个简单的表,除了insert_time字段用于表示记录什么时候插入数据库,大部分字段和Sebek记录字段格式一模一样。
CREATE TABLE read_data (
id          INT         UNSIGNED AUTO_INCREMENT,
ip_addr     INT         UNSIGNED NOT NULL,
insert_time TIMESTAMP   default 'now()',
time        DATETIME    NOT NULL,
command     CHAR(20)    NOT NULL,
counter     INT         UNSIGNED NOT NULL,
filed       INT         UNSIGNED NOT NULL,
pid         INT         UNSIGNED NOT NULL,
uid         INT         UNSIGNED NOT NULL,
length      INT         UNSIGNED NOT NULL,
data        BLOB,
PRIMARY KEY ( id ),
INDEX time_idx( time ),
INDEX ip_idx ( ip_addr),
INDEX ip_time_idx(ip_addr, time),
INDEX ip_pid_idx ( ip_addr, pid)
);

参考:

Sebek蜜罐介绍: http://www.51cto.com/art/200510/7023.htm
了解你的敌人:Sebedhttp://wenku.baidu.com/view/5707c7d284254b35eefd3409.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章