虚拟蜜罐软件 Honeyd(v1.0)简介、安装与使用文档
The Artemis Project/狩猎女神项目组
诸葛建伟,梁知音
1. Honeyd 软件简介
Honeyd 是一款非常优秀的开源虚拟蜜罐软件,由 Google 公司软件工程师 Niels Provos
于 2003 年开始研发,2005 年发布 v1.0 正式版,目前已发布了 v1.5b。
Honeyd能让一台主机在一个模拟的局域网环境中配有多个地址(曾测试过的最多可以
达到65536个),外界的主机可以对虚拟的蜜罐主机进行ping、traceroute等网络操作,虚拟
主机上任何类型的服务都可以依照一个简单的配置文件进行模拟,也可以为真实主机的服务
提供代理。
Honeyd可以通过提供威胁检测与评估机制来提高计算机系统的安全性,也可以通过将
真实系统隐藏在虚拟系统中来阻止外来的攻击者。因为Honeyd只能进行网络级的模拟,不
能提供真实的交互环境,能获取的有价值的攻击者的信息比较有限,所以Honeyd所模拟的
蜜罐系统常常是作为真实应用的网络中转移攻击者目标的设施,或者是与其他高交互的蜜罐
系统一起部署,组成功能强大但花费又相对较少的网络攻击信息收集系统。
2. Honeyd 的设计与实现
2.1. 网络数据收集
Honeyd 被设计用来应答目标地址属于模拟蜜罐范围之内的网络包。要让 Honeyd 能够
接受到发送给虚拟蜜罐的数据包,必须要正确的配置网络。有几种方法可以实现网络的配置,
如为指向 Honeyd 主机的虚拟 IP 建立特殊的路由、使用代理 ARP 或者使用网络隧道等。
这里我们假设 A 为网络路由器的 IP,B 是 Honeyd 主机的 IP,最简单的情形是,虚拟
蜜罐的 IP 位于局域网范围之内。我们标识他们为 V1,V2……Vn,当攻击者通过互联网发送一
个数据包给蜜罐 Vi,路由器 A 会接受到数据包并试图发送该数据包。路由器会查询路由表
来决定该将发送到 Vi 的包传递到哪里。数据会有 3 种处理方式:
当没有路由指向 Vi 时,路由器会丢弃该数据包;
路由器 A 将数据包转发到另一个路由器;
Vi 位于路由器所在的局域网范围之内,路由器 A 可以直接将数据包传送给 Vi.
图 1 路由方式
为了将到 Vi 的数据流导向 Honeyd 主机 B,我们可以使用下面两种方法:
最简单的方法是将到 Vi 的路由入口设置为指向 B,这样一来,路由器转发到虚拟蜜罐
的数据包将会直接发送到 Honeyd 主机。
如果我们没有配置特殊的路由,路由器会使用 ARP 指令来查询虚拟蜜罐的 MAC 地址。
但由于没有响应的虚拟主机,ARP 查询会得不到应答,路由器在重试几次后就会将数据包
丢弃。此时,我们可以配置让 Honeyd 主机利用自己的 MAC 地址去响应针对 Vi 的 ARP 查
询。这种方法就称之为代理 ARP。代理 ARP 允许路由器将发送到 Vi 的数据发送到 Honeyd
主机 B 的 MAC 地址。
在更复杂的环境下,可以将一段网络地址空间通过网络隧道连接到 Honeyd 主机。我们
可以使用一般路由封装(generic routing encapsulation,GRE)等隧道协议。
2.2. Honeyd 软件体系结构
Honeyd 体系由几个组件构成,这些组件是配置数据库、中央包分发器、协议处理器、
个性引擎和可选路由构件。如下图所示:
图 2 Honeyd 软件体系结构图
系统接受到的数据会由中央包分发器进行处理,首先中央包分发器进行处理会检查 IP
包的长度,修改包的校验和。Honeyd 框架响应的是最主要的 3 种互联网协议:ICMP, TCP
和 UDP,其他协议的包在被记入日志后会被悄悄丢弃。
在处理数据包之前,分发器会查询配置数据库以查找到一个符合目标地址的蜜罐配置。
如果没有特定的配置存在,系统会采用默认配置模板。给定配置后,数据包和相应的配置会
被转交给相应的协议处理器处理。
ICMP 协议处理器支持多数的 ICMP 查询。默认情况下,所有的蜜罐配置都会响应 echo
请求,并且处理“destination unreachable”消息。其他请求的处理主要依赖于个性引擎的配
置。
对于 TCP 和 UDP 包,Honeyd 可以建立到任意服务的连接。这些服务是外部的应用程
序,可以通过标准输入输出来接收和输出数据。不同于为每个连接创建一个新进程,Honeyd
支持子系统(subsystem)和内部服务(internal service), 子系统是一个运行在某个虚拟蜜罐的名
称空间下的应用程序,子系统的特定应用是在相应的虚拟蜜罐实例化的时候创建的。一个子
系统可以绑定端口、接收连接和创建网络连接。子系统是作为外部进程运行的,而内部服务
则是一个 Honeyd 内部运行的 python 的脚本。内部服务要求的资源比子系统更少,但只能接
收连接,不能创建网络连接。
UDP 数据报文会直接传递到应用程序,当接收到一个发送到关闭的端口的数据报文的
时候,如果个性化配置中没有设置禁止的话,系统会发送一个端口不可达消息。在发送端口
不可达消息的时候,系统允许网络映射工具如 traceroute 来查探网络路由。
除了可以建立到本地服务的连接外,Honeyd 还支持网络连接的重定向。这种重定向可
以是静态的,也可以是与网络连接的四个参数相关(源地址与源端口,目标地址与目标端口)。
重定向使得我们可以将一个到虚拟蜜罐上的服务的连接请求转发到一台真实服务器运行的
服务进程。
在发送数据到外部网络之前,数据包会经由个性引擎处理。个性引擎会修改数据包的内
容,使得数据包看上去和从指定配置的操作系统的网络栈中发出的一样。
2.3. 个性引擎
不同操作系统的网络栈处理各不相同,这导致他们所发送的数据包具有各自不同的特
点。网络攻击者常常会使用一些网络指纹识别工具,如 Xprobe、Nmap 等来分析接收到的数
据包的特点,从而达到收集目标系统信息的目的。
对 Honeyd 来说,在被指纹识别的时候不要暴露出来是非常重要的。为了使得虚拟蜜罐
在被探测得时候显得像真实主机一样,Honeyd 模拟给定的操作系统的网络栈行为,我们称
之为虚拟蜜罐的“个性”。不同的虚拟蜜罐可以被赋予不同的“个性”。“个性引擎”个性化
虚拟蜜罐的网络栈行为的方法就是:在每个发送出去的数据包的协议头中引入适当的修改,
使得数据包符合指纹识别软件预期的操作系统的特征。
Honeyd利用Nmap指纹库作为TCP连接和UDP连接个性化的参考,利用Xprobe指纹库作
为ICMP连接个性化的参考。
2.4. 路由拓扑的实现
Honeyd 可以模拟不同品牌和类型的路由器,也可以模拟网络连接的时延和丢包现象。
当我们使用 traceroute 等工具进行网路映射时,网络流会表现得与配置的路由器及网络结构
一致。当我们模拟路由拓扑时,是不可以使用代理 ARP 将数据包传递给 Honeyd 主机的,
我们必须要配置路由将虚拟蜜罐所在的网络空间指向 Honeyd 主机。
通常情况下,虚拟路由拓扑是一个树形结构,该树以数据包进入虚拟网络拓扑的入口作
为树根。树的每个内部节点代表一个路由器,每条边代表一个有时延和丢包现象的链路。树
的终端节点与网络上的主机节点相对应。Honeyd 架构支持平行共存的多个网络入口。
接收数据包的时候,系统会找到合适的入口路由,从根部开始,周游路由树,直到找到
包含数据包目标 IP 地址的节点。每条网络连路上的丢包率和时延会被累积计算以确定一个
包是否该被丢弃、该被推迟多长时间后再传递等。当数据包路由途中经过一个路由器时,
Honeyd 框架也会消耗该包的 TTL。当一个包的 TTL 变为 0 的时候,该包会被丢弃,系统会
发送一个 ICMP 的超时消息,该消息会包含使该包 TTL 减到 0 的路由器的 IP 地址。
在模拟网络时,我们也可以将真实的系统集成到虚拟路由拓扑中。当 Honeyd 框架系统
接收到一个发送给真实系统的数据包时,该数据包会同样的周游该网络拓扑,直到发现一个
可以直接响应该真实系统所处网络空间的虚拟路由器。需要的时候,Honeyd 框架系统会发
送 ARP 请求来确定真实系统的硬件地址,然后将该数据包封装在一个以太网帧里发送给该
地址。类似的,Honeyd 框架系统也可以利用相应的虚拟路由器来响应真实系统所发送的 ARP
请求。
我们也可以利用 GRE 通道来劈开路由拓扑,这样就可以用不同的 Honeyd 主机来代表
地址空间的不同部分,从而在几个 Honeyd 装置间取得负载均衡。使用 GRE 通道还可以将
属于分离的地址空间的网络委任给同一台 Honeyd 主机。
反向路由时,一个数据包出去的通道选择既与源地址有关也与目标地址有关。
2.5. 记录日志
Honeyd 软件框架支持多种记录网络活动日志的方法,Honeyd 可以记录并报告所有协
议的尝试连接与完成连接的日志,也可以配置成以人工可读的方式来存储蜜罐系统所接受到
所有数据包。同时,服务程序也可以通过标准错误输出向 Honeyd 报告它们收集到的网络信
息。Honeyd 还可以与网络入侵检测系统结合用来获取更多更全面的网络入侵的信息。
3. Honeyd 的安装
本文档中 Honeyd 安装基于 CentOS v4 Linux 平台。
3.1. Honeyd 软件的依赖库安装
Honeyd 软件依赖于 Libevent 事件处理 API、Libdnet 数据包构造与发送库、Libpcap 数
据包捕获库、Libdnsres DNS 反向解析函数库以及 Arpd 工具。本文撰写(2006/10/11)时 Honeyd
软件依赖的这五个共享库的项目站点及最新版本如下:
Libevent项目站点:http://www.monkey.org/~provos/libevent/
Libevent最新版本(2006/8/9):http://www.monkey.org/~provos/libevent-1.1b.tar.gz
Libdnet项目站点:http://libdnet.sourceforge.net/
Libdnet 最新版本(2005/1/19):
http://prdownloads.sourceforge.net/libdnet/libdnet-1.11.tar.gz?download
Libpcap项目站点:http://www.tcpdump.org/
Libpcap最新版本(2006/9/19):http://www.tcpdump.org/release/libpcap-0.9.5.tar.gz
Libdnsres项目站点:http://monkey.org/~provos/libdnsres
Libdnsres最新版本(2005/9/23):http://www.monkey.org/~provos/libdnsres-0.1a.tar.gz
Arpd最新版本:http://www.citi.umich.edu/u/provos/honeyd/arpd-0.2.tar.gz
Honeyd 软件依赖库的安装过程如下:
Libevent 库:
tar -zxf libevent-1.1b.tar.gz
cd libevent-1.1b
./configure
make
make install
Libdnet 库:
tar -zxf libdnet-1.11.tar.gz
cd libdnet-1.11
./configure
make
make install
ln -s /usr/local/lib/libnet.1 /lib/libnet.1
Libpcap 库:CentOS 4.0 中自带 Libpcap-0.8.3-10.RHEL4
rpm -q libpcap
Libdnsres 库:(依赖于 pcre,CentOS 4.0 中自带 pcre-4.5-3.2.RHEL4)
rpm -q pcre
tar -zxf libdnsres-0.1a.tar.gz
cd libdnsres-0.1a
./configure
make
make install
Arpd 安装:
tar -zxf arpd-0.2.tar.gz
cd arpd
./configure
patch arpd.c arpd.c.diff
make
make install
注:arpd.c 需用本文附件中的 arpd.c.diff 进行 patch,或手动修改
arpd.c 中的 268/285/294,295/297/426,427 行,将__FUNCTION__作为 syslog 函数的
一个参数,在引号内字符串内容前加%s。
3.2. Honeyd 软件的安装
honeyd 安装:
tar -zxf honeyd-1.0.tar.gz
cd honeyd-1.0
./configure
make
运行 honeyd 测试安装是否成功。
4. Honeyd 的使用
Honeyd 作为一个虚拟蜜罐构建框架工具,可根据配置灵活构建虚拟蜜罐主机及由虚拟
蜜罐主机构建的复杂诱骗网络。Honeyd 将模拟虚拟蜜罐主机的网络协议栈,以对针对这些
虚拟蜜罐主机的网络攻击进行响应,Honeyd 可以模拟任意的 TCP 和 UDP 服务,同时完全
支持 ICMP 协议。
Honeyd 可支持由一台单独的主机对局域网中未使用的 IP 地址进行模拟,honeyd 命令行
中的 net 参数可以包含多个 IP 地址和 IP 地址段。要使得 honeyd 对配置文件中配置的 IP 地
址进行响应,则这些 IP 地址必须包含在 net 参数中,honeyd 会对 net 中定义的所有 IP 地址
的 ICMP 请求做出响应,除非在配置文件中另外定义。
为了使得 honeyd 能够接收到其模拟 IP 地址的网络流量,必须通过显式指定路由将这些
IP 地址路由到 honeyd 主机,或使用 arpd 来劫持在一个共享式网络中未分配的 IP 地址。
4.1. Honeyd 软件的命令格式
Honeyd 软件的命令格式如下:
honeyd [-dP] [-l logfile] [-s servicelog] [-p fingerprints] [-0 p0f-file] [-x xprobe]
[-a assoc] [-f file] [-i interface] [-u uid] [-g gid]
[--webserver-address address] [--webserver-port port]
[--webserver-root path] [--rrdtool-path path]
[--disable-webserver] [--disable-update] [--verify-config]
[--fix-webserver-permissions] [-V|--version] [-h|--help] [--include-dir]
[--data-dir] [net ...]
其中较为重要常用的选项包括:
-d :非守护程序调试模式,允许冗长的调试信息。
-l logfile:将 honeyd 记录的数据包和日志写入指定的日志文件中。
-s servicelog:将 honeyd 记录的服务层日志写入到指定的服务日志文件中。
-f file:读取名为 file 的配置文件。
−i interface:指定侦听的接口,可以指定多个接口。
[--webserver-address address]
[--rrdtool-path path] [--fix-webserver-permissions]
指定 Honeyd 软件内建 Web 服务的地址、端口和根目录,以及 Web 服务依赖的
RRDTool 的位置,--fix-webserver-permissions 修正 Web 目录权限设置导致网页不可读
取问题。
net:指定IP地址或者网络或者IP地址范围,如果没有指定,honeyd将监视它能看见
的任何IP地址的流量。
[--webserver-port port]
[--webserver-root path]
4.2. Honeyd 的简单使用
在 Honeyd 软件宿主主机上运行 arpd 绑定同一网段中某个空闲 IP 地址,然后运行 Honeyd
软件在此空闲 IP 地址上构建虚拟蜜罐。
arpd 192.168.0.5
./honeyd -d -l /var/log/honeyd/honeyd.log -s /var/log/honeyd/service.log
–fix-webserver-permissions 192.168.0.5
图 3 Honeyd 软件的运行
图 4 Honeyd 软件提供的 Web 界面