Wi-Fi 迷你蜜罐

您是否有一个旧的、不用的无线路由器在积灰?找点乐子,用它制作一个 Wi-Fi 蜜罐吧!

最近,我一直在玩一些新的无线设备。没什么特别的:200mW 基于 Atheros 的收发器和 18dBi 八木天线。我住在一个约有 64 万人口的城市公寓里。我将天线指向窗外,被动地接收到大约 30 个无线 ESSID,其中三个是不安全的(开放的),六个是用 WEP 加密的(容易破解)。我当然没有连接到其中任何一个,但这给了我一些想法。

如果我部署一个故意开放的无线接入点会怎么样?有些人最终会连接并尝试使用它来访问互联网——有些人可能是恶意的,有些人可能认为这是一个热点。而且,如果我部署一个类似的接入点,但这次是用容易破解的 WEP 加密的呢?嗯,依我拙见,不可能在无意识的情况下破解 WEP。如果我不认识的人连接到这个 AP,我就受到了攻击。我所需要做的就是监控。

这正是无线蜜罐的本质:伪造的接入点,故意不安全或安全性差,并受到监控,这样你就可以获得尽可能多的关于攻击者的信息。这种蜜罐在大型网络中作为早期威胁指标尤其有用,但你也可以在你的家庭网络上玩玩,只是为了娱乐和研究。

你可以用旧硬件、一些空闲时间和,当然,一个基于 Linux 的解决方案来构建一个无线蜜罐。OpenWrtDD-WRT 是路由器上最流行的两个基于 Linux 的固件项目。我在本文中使用它们和一些旧的备用路由器来向您展示如何构建三种蜜罐:一种非常基本的蜜罐,它只记录用户发送到其内存中的数据包信息;一种稍微复杂一点的蜜罐,带有 USB 存储,它可以将关于恶意客户端的更多细节记录到存储中;最后,一种解决方案,它通过代理重定向 HTTP 流量,不仅可以记录,还可以干扰通信。

使用 DD-WRT 的基本蜜罐

构建一个非常基本的无线蜜罐不应该花费您超过一两个小时的时间。只需拿起您的旧路由器并选择固件。请务必查看 DD-WRT 和 OpenWrt 都支持的路由器。就我而言,结果是该路由器仅受 DD-WRT 支持,因为它具有 32MB 的 RAM 和 4MB 的闪存。OpenWrt 的硬件要求稍微高一些。

接下来,刷写您的路由器(这是有风险的部分)。基本上,您需要下载适用于您机器的固件并将其上传到内存中。在某些路由器上,这就像单击 Web 界面上的一个按钮一样简单。在其他路由器上,您必须通过串行电缆连接,例如。请记住,此步骤可能很危险。首先进行备份,并务必仔细阅读 DD-WRT/OpenWrt 网站上的说明。

成功刷写路由器后,您应该看到一个增强的(与原始路由器相比)Web 界面。现在,设置 SSH 访问和无线网络参数。如果您不知道如何操作,可以在 DD-WRT 主页上找到详细说明。因为它将是一个蜜罐,我建议使用 WEP,这应该会吸引潜在的攻击者。同时,它不会那么容易受到误报的影响——设备自动连接到开放网络的人。

如果您可以以 root 身份登录并看到提示符,那么您就可以进行下一步了:启用系统日志记录。您可以使用 Web 界面执行此操作:服务→服务→系统日志和安全→启用日志(图 1)。

图 1. 启用系统日志记录

您还可以设置几个 ESSID 而不是只有一个:无线→基本设置→虚拟接口。之后,您的蜜罐将被视为几个网络——至少乍一看是这样。这增加了攻击的可能性,尤其是在您的邻居中有很多其他网络的情况下。

请记住,您不必将蜜罐连接到互联网。事实上,您不应该这样做,因为您无法控制潜在用户可能使用互联网访问做什么。按照上述说明配置后,测试它是否记录您的连接。默认情况下,DD-WRT 将日志写入 /var/log/messages。您可以使用 SSH 检查它。这是一个此类日志的示例片段


Jan  1 00:43:03 orange user.warn kernel: ACCEPT IN=br0 
 ↪OUT= MAC=00:26:5a:a1:bc:86:00:0c:f1:11:43:0e:08:00 
 ↪SRC=192.168.2.2 DST=192.168.2.1 LEN=84 TOS=0x00 PREC=0x00 
 ↪TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=22535 SEQ=1 
Jan  1 00:43:04 orange user.warn kernel: ACCEPT IN=br0 
 ↪OUT= MAC=00:26:5a:a1:bc:86:00:0c:f1:11:43:0e:08:00 
 ↪SRC=192.168.2.2 DST=192.168.2.1 LEN=84 TOS=0x00 PREC=0x00 
 ↪TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=22535 SEQ=2 

如果您可以看到您的数据包信息被记录,只需离开路由器并等待,不时查看日志即可。

不幸的是,由于资源如此之少,您无法做更多的事情——至少在几个小时内是这样。这个基本的蜜罐只会记录数据包头、IP 地址和 MAC 地址。您可以在前面的示例中看到 ping 命令是如何被记录的。一般来说,您可以收集到的所有信息是具有指定 MAC 和 IP 的人尝试使用您的网络——这并不多。

将关联记录到使用 OpenWrt 的 USB 存储

您可以使用 OpenWrt 构建一个稍微更高级的无线蜜罐。使用它,您不仅可以记录数据包、MAC 地址和 IP 地址,还可以记录无线关联、身份验证、解除关联、取消身份验证和时间戳。稍加努力,您还可以扩展蜜罐的日志记录功能以使用 USB 存储——这为您提供了更多的日志空间。

我的第二个路由器有 32MB 的 RAM、8MB 的闪存和 USB 支持。在这样的硬件上,您可以像 DD-WRT 一样轻松地安装 OpenWrt。OpenWrt 网站上提供了详细说明。安装后,设置无线接入点并通过 SSH 以 root 身份登录后,您需要安装一些软件包。

首先,您需要 USB 存储支持


opkg update
opkg install kmod-usb-ohci
opkg install kmod-usb2
insmod usb-ohci
insmod usbcore
insmod ehci-hcd

现在,连接 U 盘后,dmesg 应该会向您显示它,例如,作为 /dev/sda。创建一个目录来挂载您的存储:mkdir /storage。然后挂载它:mount /dev/sda1 /storage。您稍后将使用它来存储收集的数据。

接下来,您必须决定要记录哪些流量。假设您要记录路由器转发的所有流量。为此,请使用 netfilter 和 iptables:iptables -I FORWARD -j LOG,就像您在典型的 Linux 发行版中所做的那样。

列表 1 显示了存储在 U 盘上的日志的示例片段。它是由用户关联、身份验证、通过 DHCP 请求 IP 和连接到 google.pl:80 生成的。

列表 1. 使用 OpenWrt 生成并存储在 U 盘上的示例日志

Oct 15 10:17:01 white daemon.info hostapd: wlan0: 
 ↪STA 00:0c:f1:11:43:0e IEEE 802.11: authenticated
Oct 15 10:17:01 white daemon.info hostapd: wlan0: 
 ↪STA 00:0c:f1:11:43:0e IEEE 802.11: associated (aid 1)
Oct 15 10:17:01 white daemon.info hostapd: wlan0: 
 ↪STA 00:0c:f1:11:43:0e WPA: pairwise key handshake completed (RSN)
Oct 15 10:17:03 white daemon.info dnsmasq-dhcp[1106]: 
 ↪DHCPDISCOVER(br-lan) 192.168.1.99 00:0c:f1:11:43:0e
Oct 15 10:17:03 white daemon.info dnsmasq-dhcp[1106]: 
 ↪DHCPOFFER(br-lan) 192.168.1.99 00:0c:f1:11:43:0e
Oct 15 10:17:03 white daemon.info dnsmasq-dhcp[1106]: 
 ↪DHCPREQUEST(br-lan) 192.168.1.99 00:0c:f1:11:43:0e
Oct 15 10:17:03 white daemon.info dnsmasq-dhcp[1106]: 
 ↪DHCPACK(br-lan) 192.168.1.99 00:0c:f1:11:43:0e red
Oct 15 10:17:14 white user.warn kernel: IN=br-lan OUT=eth0.2 
 ↪SRC=192.168.1.99 DST=209.85.148.105 LEN=60 TOS=0x00 
 ↪PREC=0x00 TTL=63 ID=59445 DF PROTO=TCP
 ↪SPT=49958 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0
Oct 15 10:17:14 white user.warn kernel: IN=eth0.2 OUT=br-lan 
 ↪SRC=209.85.148.105 DST=192.168.1.99 LEN=60 TOS=0x00 
 ↪PREC=0x00 TTL=51 ID=6488 PROTO=TCP SPT=80 DPT=49958 
 ↪WINDOW=5672 RES=0x00 ACK SYN URGP=0
Oct 15 10:17:14 white user.warn kernel: IN=br-lan 
 ↪OUT=eth0.2 SRC=192.168.1.99 DST=209.85.148.105 LEN=52 
 ↪TOS=0x00 PREC=0x00 TTL=63 ID=59446 DF PROTO=TCP
 ↪SPT=49958 DPT=80 WINDOW=229 RES=0x00 ACK URGP=0
Oct 15 10:17:14 white user.warn kernel: IN=br-lan 
 ↪OUT=eth0.2 SRC=192.168.1.99 DST=209.85.148.105 
 ↪LEN=200 TOS=0x00 PREC=0x00 TTL=63 ID=59447 DF PROTO=TCP
 ↪SPT=49958 DPT=80 WINDOW=229 RES=0x00 ACK PSH URGP=0
Oct 15 10:17:15 white user.warn kernel: IN=eth0.2 OUT=br-lan 
 ↪SRC=209.85.148.105 DST=192.168.1.99 LEN=52 TOS=0x00 
 ↪PREC=0x00 TTL=51 ID=6489 PROTO=TCP SPT=80
 ↪DPT=49958 WINDOW=106 RES=0x00 ACK URGP=0
Oct 15 10:17:15 white user.warn kernel: IN=eth0.2 OUT=br-lan 
 ↪SRC=209.85.148.105 DST=192.168.1.99 LEN=561 TOS=0x00 
 ↪PREC=0x00 TTL=51 ID=6490 PROTO=TCP SPT=80
 ↪DPT=49958 WINDOW=106 RES=0x00 ACK PSH URGP=0

这个蜜罐稍微高级一点,尽管您仍然对用户在互联网上的活动没有太多控制权。您要么不应该将路由器连接到互联网,要么使用 iptables 过滤流量,和/或在您的路由器和互联网之间设置代理。或者,您可以在您的路由器上设置代理!

OpenWrt 和 Tinyproxy

如果您的机器有足够的资源,您可以更进一步,在您的路由器上使用代理。有了这个,您将能够监视、过滤和修改 HTTP 流量。Squid 是一个成熟的代理解决方案的示例。如果您的路由器能够运行它,请继续。如果您(像我一样)不能,您将不得不坚持使用要求较低的解决方案。这种解决方案的一个例子是 tinyproxy。要在您的 OpenWrt 中安装 tinyproxy,请运行


opkg update
opkg install tinyproxy luci-app-tinyproxy

然后,使用以下命令配置并运行它


uci set tinyproxy.@tinyproxy[0].enable=1
uci commit
/etc/init.d/tinyproxy enable
/etc/init.d/tinyproxy restart

从现在开始,您的 tinyproxy 应该默认监听您本地主机上的端口 8888。您可以使用 netstat 命令检查这一点。由于您希望不仅接受来自本地主机的连接,还接受来自 LAN 的连接,因此您必须稍微更改配置。此外,在我们的例子中,最好在所谓的隐身模式下运行它——这意味着 HTTP 中没有添加标头。您可以在 /etc/config/tinyproxy 文件中找到 tinyproxy 配置。列表 2 显示了这样一个配置的示例。请注意,logfile 被指定为位于 /storage 目录中,这是我们的 U 盘。另一个重要的选项是 list 'Allow'。这些是允许连接到 tinyproxy 的 IP。您应该指定您的 LAN 网络或其中的一部分。

列表 2. 具有域过滤、隐身模式和自定义日志位置的 Tinyproxy 配置

config 'tinyproxy'
        option 'User' 'nobody'
        option 'Group' 'nogroup'
        option 'Port' '8888'
        option 'Listen' '192.168.1.1'
        option 'Timeout' '600'
        option 'DefaultErrorFile' '/usr/share/tinyproxy/default.html'
        option 'StatFile' '/usr/share/tinyproxy/stats.html'
        option 'Logfile' '/storage/tinyproxy.log'
        option 'LogLevel' 'Connect'
        option 'MaxClients' '100'
        option 'MinSpareServers' '5'
        option 'MaxSpareServers' '20'
        option 'StartServers' '10'
        option 'MaxRequestsPerChild' '0'
        list 'Allow' '192.168.1.0/24'
        list 'Allow' '127.0.0.1'
        option 'ViaProxyName' 'tinyproxy'
        option 'DisableViaHeader' '1'
        option 'FilterDefaultDeny' '1'
        option 'Filter' '/storage/filter'
        list 'ConnectPort' '443'
        list 'ConnectPort' '563'
        option 'enable' '1'

Tinyproxy 还允许您按域过滤请求。您可以在 Filter 文件中指定域的黑名单或白名单。在我们的配置中,这是 '/storage/filter'。此外,在这里我们通知 tinyproxy 将此文件视为白名单 (FilterDefaultDeny 1),这意味着只允许对指定域的请求。这样,您可以禁止攻击者使用他们的浏览器访问互联网,或者让他们只访问指定的域。/storage/filter 文件的示例可以是


linuxjournal.com

这将让他们只能访问 Linux Journal 网站。

请记住,这将只阻止 HTTP 请求;如果您没有在其他地方阻止它,所有其他流量将被允许。

最后,您必须告诉您的路由器将所有 HTTP 流量转发到您的新代理。像往常一样,您可以使用 iptables 执行此操作,但首先您需要安装 iptables-mod-nat-extra 软件包


opkg install iptables-mod-nat-extra
iptables -A PREROUTING -t nat -p tcp --destination-port 80 
 ↪-j REDIRECT --to-port 8888

从现在开始,所有 HTTP 请求都应该通过 tinyproxy 转发并记录到 /storage/tinyproxy.log。列表 3 显示了这样一个日志的片段。您可以看到用户尝试建立哪些连接以及代理过滤了哪些连接。

列表 3. tinyproxy.log

CONNECT   Oct 22 16:17:59 [1242]: Connect (file descriptor 7): 
 ↪crimson.lan [192.168.1.200]
CONNECT   Oct 22 16:17:59 [1242]: Request (file descriptor 7): 
 ↪GET / HTTP/1.1
NOTICE    Oct 22 16:17:59 [1242]: Proxying refused on filtered 
 ↪domain "www.google.com"
CONNECT   Oct 22 16:18:05 [1243]: Connect (file descriptor 7): 
 ↪crimson.lan [192.168.1.200]
CONNECT   Oct 22 16:18:05 [1243]: Request (file descriptor 7): 
 ↪GET / HTTP/1.1
CONNECT   Oct 22 16:18:05 [1243]: Established connection to host
 ↪"www.linuxjournal.com" using file descriptor 8.
CONNECT   Oct 22 16:18:06 [1244]: Connect (file descriptor 7): 
 ↪crimson.lan [192.168.1.200]
CONNECT   Oct 22 16:18:06 [1244]: Request (file descriptor 7): 
 ↪GET /pixel/p-a3K3N6enFe9wA.gif HTTP/1.1
NOTICE    Oct 22 16:18:06 [1244]: Proxying refused on filtered 
 ↪domain "pixel.quantserve.com"
CONNECT   Oct 22 16:25:52 [1246]: Connect (file descriptor 7): 
 ↪crimson.lan [192.168.1.200]
CONNECT   Oct 22 16:25:52 [1246]: Request (file descriptor 7): 
 ↪GET / HTTP/1.1
NOTICE    Oct 22 16:25:52 [1246]: Proxying refused on filtered 
 ↪domain "www.google.com"

当 tinyproxy 过滤连接请求时,它会显示一个信息页面,描述发生了什么。您也可以利用这一点来隐藏 tinyproxy 的存在,或者告知或欺骗您的攻击者(或开个玩笑)。网站模板位于 /usr/share/tinyproxy/default.html 中。您可以在列表 4 和图 2 中看到此模板的稍微修改过的版本。这不会告诉用户关于 tinyproxy 以及看到此页面的原因;相反,它礼貌地告知他们不应该使用此网络访问互联网。

图 2. 网站模板

列表 4. tinyproxy.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 ↪"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<h3>Information</h3>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Information</h1>
{clienthost} <br /><br />
You shouldn't use this network for web access.
</body>
</html>
与进化同行

进化的下一步将是成熟的无线蜜罐。您可以使用可以运行典型 Linux 发行版的机器来制作一个。然后安装,例如,dionaea,使用配置为作为接入点运行的无线网卡,并将所有流量转发到您的本地主机,攻击者将在其上看到虚假服务。

请记住,如果您想要一个真正好的蜜罐,请确保它看起来尽可能接近现实。这意味着,例如,您可以使用一些虚拟客户端来模拟流量。或者,使用 WPA 而不是 WEP。这一切都取决于您的环境。

此外,熟悉您所在国家/地区的法律非常重要。确保嗅探攻击者的数据不被禁止。考虑一下为他们提供互联网连接是否明智。也许最好根本不要将路由器的 WAN 端口连接到任何东西,将其连接到您的机器模拟互联网,或者将其连接到互联网但使用 iptables 过滤流量?

最后,不要被 DD-WRT 或 OpenWrt 系统吓倒。它们基于 Linux,并且在使用上非常相似,但由于可用资源较少,它们被精简了。没有手册页和略有不同的实用程序,您可能从您的 Linux 发行版中知道,即使它们的名字相同。而且,文档并不总是准确的。如果您有任何问题,这两个项目的 Wiki 都非常有帮助。

最后但并非最不重要的一点,享受构建您的解决方案以及(尤其是)浏览收集到的数据的乐趣!

加载 Disqus 评论