• 沒有找到結果。

在接下来的两节中,我们将探讨建立 Honeyd 两种常用的方案。第一种是描述如何本地运行 Honeyd,而不需要网络。第二种展示了一种简单的方法,利用 Honeyd 把虚拟蜜罐集成到现有生产 网络中。本地设置非常适合对 Honeyd 的首次探索,因为失误不会导致对你的网络灾难性的破坏。

通过本地接口,除了那些与以太网级模拟相关的功能,几乎所有的功能都可用。

4.6.1 本地 Honeyd 实验

图 4.9 显示了在私有 IP 网络 10.1.0.0/24 上包括两个虚拟蜜罐的一个完整的 Honeyd 配置。配置 指定了通过网络可以访问的两个模板,分别对应 IP 地址 10.1.0.1 和 10.1.0.134。请记住,在 Honeyd 上下文中,一个模板是一个完整的蜜罐配置,可以被配置成在多个 IP 地址上可用。在一个 IP 地址 上建立一个模板的过程,在 Honeyd 术语中称为 binding(绑定)。我们有一个用于路由器的模板,

模拟了 Cisco 7206 路由器的网络堆栈,它只能通过 telnet 访问。另一个模板指定一个运行两个服务 的蜜罐:一个简单的 Web 服务器和一个 SSH 连接的转发器,在这个例子中,转发器重定向 SSH 连 接到连接发起者。仅当你的本地网络不包括在 10/8 地址范围内时,这个例子才可以在你的方案中 工作。如果是在上述网络中,只需用 192.168 或 127.0 替换所有的 10.1。

create routerone

set routerone personality "Cisco 7206 running IOS 11.1(24)"

set routerone default tcp action reset

add routerone tcp port 23 "scripts/router-telnet.pl"

create netbsd

set netbsd personality "NetBSD 1.5.2 running on a Commodore Amiga (68040 processor)"

set netbsd default tcp action reset add netbsd tcp port 22 proxy \$ipsrc:22 add netbsd tcp port 80 "scripts/web.sh"

bind 10.1.0.1 routerone bind 10.1.0.134 netbsd

图 4.9 Honeyd 一个示例配置。配置语言是上下文无关语法,这个例子定义了两个模板:一个可以通过 telnet 访问的路由器和一个运行 Web 服务器的主机

Honeyd—基 础 篇 第 4 章

route -n add -net 10.0.0.0/8 127.0.0.1

在 Linux 上,需要输入:

route -n add -net 10.0.0.0/8 gw 127.0.0.1

当然,这需要 root 权限,sudo 命令在这里会对你有所帮助。

(2)启动 Honeyd,在回环接口上监听 10/8 网络。不同操作系统之间的主要区别是回环接口 的名称,BSD 系统可以有多个回环接口,127.0.0.1 通常分配给 lo0,而 Linux 只支持一个称为 lo 的 回环接口。假设读者根据她的操作系统替换了正确的名称,则使用下面的命令启动 Honeyd:

honeyd -d -i lo -f config.book 10.0.0.0/8

(3)向一个虚拟蜜罐发送 ping 命令,以验证 Honeyd 正在运行,而且接收到了我们的网络流量:

ping -n -c1 10.1.0.1

如果一切工作正确,应该看到如下信息:

PING 10.1.0.1 (10.1.0.1): 56 data bytes

64 bytes from 10.1.0.1: icmp_seq=0 ttl=64 time=1.294 ms --- 10.1.0.1 ping statistics ---

1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/std-dev = 1.294/1.294/1.294/0.000 ms

否则,核对 Honeyd 调试日志的输出,看看 Honeyd 是否收到了 ping 命令的 ICMP 数据包。通常,

可能是路由表设置不正确。

如果你做完了这些步骤,现在应该能够与虚拟蜜罐交互了。例如,尝试 telnet 10.1.0.1,你应该 看到路由器的登录界面,警告你未授权访问是被禁止的;之后从 Honeyd 的控制台输出,告诉你一 个连接已经建立,也会通知你失败的登录尝试:

Connection established: tcp (127.0.0.1:4245 - 10.1.0.1:23) <->

scripts/router-telnet.pl

E(127.0.0.1:4245 - 10.1.0.1:23): Attempted login: root/test

当然,我们也感兴趣这个配置在欺骗 Nmap 的工作上有多好,nmap -sS -o -F 10.1.0.1 的输出应 该如下所示:

代码浏览:

(The 1216 ports scanned but not shown below are in state: filtered) PORT STATE SERVICE

23/tcp open telnet

4 Chapter

Device type: router Running: Cisco IOS 11.X

OS details: Cisco 7206 running IOS 11.1(24), Cisco 7206 router (IOS 11.1(17)

确实,这验证了 Honeyd 正确模拟了分配给路由器模板的网络堆栈行为。对 netbsd 模板做同样 的事情,它运行在 IP 地址 10.1.0.134 上,再一次地,Nmap 应该证实了我们在配置文件中所指定的,

它应列出开放的 Web 和 SSH 端口,也应告诉我们,在 Amiga 平台上运行操作系统 NetBSD。

4.6.2 把 Honeyd 整合到生产网络中

在很多状况下,并不容易做到把对一个不用的网络的访问路由到一台 Honeyd 机器上。取而代 之,我们更愿意使用 Honeyd 在现存的生产网络中创建虚拟蜜罐,我们希望真实的机器和 Honeyd 虚拟蜜罐和谐共处,也就是说,Honeyd 最好不要扰乱生产网络的流量。我们可以通过创建一个不 响应任何网络流量的默认的模板实现这一目标。为了避免代理 ARP 的复杂配置,我们决定使用 Honeyd 内置的以太网功能。通过为每一个模板分配一个以太网地址,Honeyd 将自动响应模板已经 绑定的任何 IP 地址的 ARP 请求。我们仍然需要知道哪些 IP 地址没有使用,以便可以选择一个空 闲的。然而,如果没有对整个网络的管理控制权,给 Honeyd 分配静态 IP 地址是不现实的。

幸运的是,我们可以使用 dhcp 命令获取动态 IP 地址,语法已经在 4.5.4 节中介绍了。当通过 DHCP 配置 IP 地址时,就不会出现意外地使用已经分配给其他机器的 IP 地址的情况了。图 4.10 给出了一个带动态 IP 地址的虚拟蜜罐实例配置。

create default

set default default tcp action block set default default udp action block set default default icmp action block

create linux

set linux personality "Linux 2.4.20"

set linux ethernet "dell"

set linux default tcp action reset add linux tcp port 80 "scripts/web.sh"

dhcp linux on eth0

图 4.10 将 Honeyd 整合到一个生产网络非常简单。我们需要确保不会干扰现存机器,然后使用 DHCP 为该 蜜罐取得一个 IP 地址。为了 DHCP 能够工作,我们需要为每一个想要使用 DHCP 的模板分配一个以太网地址

使用 Honeyd 的 DHCP 功能可能是启动和运行一个虚拟蜜罐的最简单的方法,这个方法最大的 缺陷就是我们不知道该蜜罐的 IP 地址是多少。尽管 DHCP 服务器通常是尽量为同一主机分配同一 地址,但这个特征要求该主机的 MAC 地址不能改变。不幸的是,当 Honeyd 重新启动时,每个虚 拟蜜罐接受一个新的随机 MAC 地址。为了避免这种情况发生,可以使用可选的以太网变量为蜜罐

Honeyd—基 础 篇 第 4 章

91

4

Chapter

分配静态 MAC 地址。这个 MAC 地址在 Honeyd 重新启动后不会改变,DHCP 服务器就更可能为 蜜罐又重新分发相同的 IP 地址。当已知一台主机 MAC 地址时,很多 DHCP 服务器支持将固定 IP 地址分配给该主机。当通过 DHCP 获得 IP 地址时 Honeyd 调试输出如图 4.11 所示。

honeyd[12915]: [fxp0] trying DHCP

honeyd[12915]: [fxp0] got DHCP offer: 192.168.1.38

honeyd[12915]: Updating ARP binding: 00:10:11:b1:b1:97 -> 192.168.1.38

图 4.11 当通过 DHCP 获得 IP 地址时 Honeyd 调试输出。当一个模板收到来自 DHCP 服务器的 IP 地址时,

Honeyd 自动更新 ARP 表,以使得可以在新 IP 地址下访问蜜罐

在实例化多个蜜罐时,dhcp 命令可以重复使用。尽管 Honeyd 内部限制 65535 个 DHCP 主机,

但是在正常使用情况中很难达到这个上限,大多数 DHCP 服务器不能处理这么多租约。在使用这 种特性做下一步实验前,一定要保证为其他正常用户预留了可用 IP 地址。

4.7 服务

尽管 Honeyd 已经提供了复杂的方法响应网络流量,但是一个蜜罐的现实功能还是体现在敌手 能够对话的服务上。为了提供一个现实的服务所付出的努力,可以直接通过接收来自敌手的更多信 息得到回报。下面我们给出一些简单的例子,说明如何配置和编写自己的服务。

在最简单的情况下,一个服务就是一个应用程序,它从 stdin 中读取输入并把输出写到 stdout 中。通过 Inetd 开始的 Internet 服务就是一个例子。

假设我们只想创建一个非常简单的服务,对用户说“hello”,并且回送用户发送的所有输入。

可以使用如图 4.12 所示的 shell 脚本实现这一服务。

#!/bin/sh echo "Hello you!"

while read data do

echo "$data"

done

图 4.12 Honeyd 简单服务脚本,回送连接用户的网络输入。该脚本通过 stdin 接收网络输入,通过 stdout 发 送网络输出

将该文件命名为 hello.sh 并保存在 Honeyd 的脚本目录下。接下来,需要已经建立了 Honeyd,

使得你通过回环接口可以访问虚拟蜜罐。

如图 4.13 所示的配置文件创建了一个带有 hello.sh 的模板,配置运行在 TCP 端口 23 上,这是 telnet 使用的端口。保存该配置文件为 test.config,然后使用以下命令启动 Honeyd:

honeyd -d -i lo -f test.config

4 Chapter

create test

add test tcp port 23 "scripts/hello.sh"

bind 10.1.0.2 test

图 4.13 简单的 Honeyd 配置,测试 hello.sh 服务脚本。该配置指示 Honeyd 创建一个虚拟蜜罐响应 telnet 连接

重要的是脚本必须是可执行的,并在 Honeyd 配置文件中指定正确的路径,否则会收到错误信 息。如果所有都正确建立,应该可以连接到 10.1.0.2 上的虚拟蜜罐了,只要输入以下命令:

telnet 10.1.0.2

现在应该可以看到一行信息——“Hello you!”,接下来你键入控制台的每一行输入信息都会被 回显。因为我们正在调试模式下运行 Honeyd,在正在运行 Honeyd 的终端窗口中你将看到有关建 立的连接的额外信息。如果看不到任何信息,通常情况下表明 Honeyd 看不到你的网络数据包,那 样的话,你需要回到前面的一节,确保你的路由建立正确。

无论何时 Honeyd 收到该端口的连接,它启动一个新进程执行指定脚本。如果你打算将 Honeyd 部署在一个繁忙的网络上,可能导致数百个新建进程被启动,从而可能使你的系统性能显著下降。

幸运的是,有一些其他办法创建服务,而且有更好的性能,可以在第 5 章中找到更多有关这方面的 信息以及如何创建更真实的服务。

需要提醒的是:Shell 脚本因命令注入攻击问题而臭名昭著,执行脚本前适当地去除和引用输 入是很重要的。

4.8 日志

Honeyd 的框架支持几种记录网络活动的方法,它可以创建连接日志,报告对所有协议尝试和 完成的连接。要获得更详细的信息,通过 stderr 服务可以记录到 Honeyd 的任意信息。该框架也使 用 syslog 日志记录通信警告或系统级错误。在大多数情况下,我们期望 Honeyd 与网络入侵检测系 统(NIDS)或者一组自定义脚本配合使用,用于解析和分析日志文件。

4.8.1 数据包级日志

通过-l 命令行选项可以启用数据包级日志,它将一个文件名作为输入参数。该文件被创建的目 录,对 Honeyd 运行用户(通常是 nobody)是可写的。分析数据包日志是观察蜜罐收到的流量的最 简单的方法,该日志文件包含有关源和目标 IP 地址、正在使用的协议和端口号等信息。如果一个 连接被建立,日志文件还包含该连接何时开始、何时结束以及传输了多少字节等信息。图 4.14 包 含来自一个日志文件的例子,以表格格式描述。

相關文件