我们将全面覆盖式讲解的第一技术是创建一个我们自己的“骗子”AP接入点,并操纵用户加入到这个无线网络中。一旦他们关联到我们的AP接入点,我们就可以很容易地将数据包注入到他们的浏览器中。虽然所有这些步骤都可以在一个标准的Linux发布版本上实现,但是Joshua Wright还是创建了一个小的虚拟机(virtual machine)。通过这个虚拟机,很多单调繁琐工作都可以自动完成,比如将一些必要的设置关联起来。这个虚拟机叫作“I-love-my-neighbors”(“我爱我的邻居们”)。读者如果想了解或使用这个工具,可以从下面的地址中下载:http://neighbor.willhackforsushi.com 。
注意
Joshua Wright创建这个虚拟机的目的,就是为了回应那些“蹭”他“Wi-Fi不安全测试网络”的邻居们。
一旦我们下载并开始运行这个虚拟机,你就可以以root身份登录到这台虚拟机上,登录时的用户名是root,密码是sec617。你会很快看到下面的欢迎提示信息。
看来该软件的操作很容易。那我们就按他指的方向,首先连接一个USB网卡,并确保通过这个网卡的eth0接口可以访问互联网,“欲先取之,必先与之”,毕竟我们这个虚拟机要以AP接入点的身份“骗”别的客户端连接后上互联网,所以必要的服务还是要提供的。下面看看我们是否可以重定向一些数据流。
操作的确是很容易,让我们看看这“I-love-my-neighbors”网络是不是在顺利地工作了。使用一个客户端连接到该AP接入点所提供的默认“服务集标识”“victor-timko”上,然后开始浏览任意一个网站。如果一切正常,你应该看到类似图5-3所示的画面。
图5-3 使用I-Love-my-neighbors网络
等一下!那只猫的图片是上下颠倒的,没关系,这是Wired网站的标志(logo)。至于为什么是颠倒的,下面我们就去看看neighbor.sh文件是怎么完成这个壮举的。
在neighbor.sh脚本中,我们创建了一个AP接入点,该接入点与用户提供的USB无线网卡相关联,并且需要在命令行中指定这个无线网卡使用接口wlan0,因为其他的配置就和一个普通的AP接入点一样,所以可以直接将某个AP接入点的配置模板与此合并,并创建一个类似下面的配置文件:
当neighbor.sh创建完这个AP接入点以后,只需要执行“hostapd/etc/hostapd/hostapd.conf”命令使AP接入点运行起来。
当有一个客户端和我们的AP接入点建立关联以后,该客户端要做得第一件事是试图申请一个符合该网络规则的IP地址。在大多数的无线网络中,IP地址的发放使用“动态主机配置协议”(Dynamic Host Configuration Protocol,DHCP)。具有这样功能的程序很多,比如isc-dhcp-server就是一款,“I-love-my-neighbors”虚拟机也包含了一个该软件的模板配置文件(template configuration file),其文件名为dhcpd.conf。具体描述如下。
文件中,关键的值都以粗体显示。值得注意的是,当一个客户端通过DHCP服务器申请IP地址时,DHCP服务器可以同时将默认的路由IP地址和“域名解析服务”(DNS)服务器的地址一并给客户端。路由地址可以使用美国的默认路由,DNS服务器可以使用Google公司的域名服务器IP地址。
很多人一提起“路由”(routing),通常马上会想到那些安装在机架上,价格昂贵的Cisco或Juniper设备。事实上,任何具有两个或两个以上的网络接口,可以进行路由的计算机都可以称作“路由器”。在我们的例子中,虚拟机就是从一个网络无线接口wlan0的“进接口”(inbound)接收到本地客户端数据,通过一个网络有线接口eth0“出接口”(outbound)中将数据发送到互联网Internet上,然后再将互联网返回的数据按相反的路径传送给本地客户端。下面的例子中,假设网络无线接口wlan0使用的IP地址是10.0.0.1。
在Linux操作系统上,我们要完成这个功能,只需要两个命令即可。第一个命令就是设置无线网络接口wlan0的地址;第二个命令就是启用“IP转发”(IP forwarding),即启动路由功能。
我们可以通过使用netstat命令检测“路由表”(routing table),在这里,我们可以看到无线接口wlan0的IP地址是10.0.0/24 [1] ,而有线以太网接口eth0的IP地址是10.0.1/24,默认的路由器地址是10.0.1.1,这是有线接口eth0提供互联网接入的路由地址。如果这种设置让你感觉到迷惑易混,那么记住一个原则:在地址中,“1”的数量越多,就离你越远,就越是属于更远一级的路由。
为了理解我们的路由表看上去是什么样子,我们现在可以想象一下,如果我们修改了客户端的HTTP数据流向,那么对于客户端会发生什么情况。在考虑这个问题之前,我们得想象一下有一个客户端的浏览器用户要访问wired.com网站时会发生什么情况。首先,客户端解析wired.com这个地址时,需要访问我们为他提供的DNS服务器,随后,DNS服务器会向该客户端的浏览器返回代表wired.com网站的IP地址。然后,这个客户端的浏览器又会与这个IP地址建立一个TCP连接,连接的端口是默认的80端口。连接成功以后,客户端的浏览器就会向这个IP地址发送“HTTP GET”请求。
现在,我们可以很容易地看到这个客户端的浏览器发出了HTTP请求,数据是从无线网络接口wlan0上接收到,无线网格接口的IP地址是10.0.0.1。但是这个HTTP请求的目的地并不是发给我们,这些TCP数据包只是从我们这里经过,换句话说,我们只是捕获到了这些数据包。我们可以尝试制作一个TCP数据包,并将其回送给这个客户端的浏览器,希望通过这种方式“击败”真正的服务器(就是wired.com网站的服务器),不过,还是先把这种想法雪藏起来,以备奇效。相反,在这里我们要做的只是通过使用“IP表”(iptable)来改变客户端浏览器的数据流向。
我们要做的第一件事就是清理我们的防火墙中现有的规则,以避免以前的配置项会对现在的修改有“后遗症”。下面的命令中,前三个命令把我们的防火墙恢复到正常启动状态,最后一个命令是确保任何来自wlan0的数据包,都必须通过防火墙。
在防火墙内核初始化结束后,要拿到有用的默认值,我们只需要改变一个规则,那就是重定向上面这个客户的数据流向。下面的规则设置就是将所有来自于wlan0的、绑定为TCP协议的80端口的所有TCP数据包统统都转到本地主机的3128端口中去。该命令的转发是针对任意IP址的。
这个时候,我们还需要再添加一个规则,那就是让所有从有线网络接口eth0发出的数据,进行一个“网络地址转换” [2] (Network Address Translation,NAT)转换。从技术的角度来说,这个规则不是必需的,我们可以没有这个规则,之所以要做这一个规则的原因是:如果不这样做,那些通过我们的AP接入点的客户端,其向互联网发送的各种HTTP请求的数据包的IP地址就是这些客户端的IP地址,这时我们AP接入点只起到了HTTP请求的“代理”(proxy)服务器的作用。而如果做了NAT转换,那么所有客户端向互联网发送的各种HTTP请求的数据包的IP地址都转换成了本AP接入点(或者说这个NAT转换服务器)的IP地址,这样从外面看起来所有通信数据的IP地址很一致。
总之,作为这两个规则的结果,来自无线网络接口wlan0的数据,将被透明地重定向到10.0.0.1:3128这个地址上。而所有从有线网络接口eth0发出的数据,其源IP地址都将是10.0.1.1。
聪明的读者可能注意到了这个计划的一个缺陷,那就是将客户端的数据重定向到我们的3128端口,可我们主机的这个端口上,根本也没有程序在监听,至于给客户端的请求进行回复,就更是缘木求鱼了。
我们需要做的最后一件事情,就是在上一节所说存在缺陷的这个地方放一个“东西”,这个“东西”将响应用户的“HTTP GET”请求,并且给这些客户端的浏览器他们想要的内容。比如说,他最初所请求的网页。这是一个“代理”服务器的工作职责,下面,我们选用现在世界上最流行的一款代理服务器软件,Squid。
在“I-love-my-neighbors”的虚拟机VM中就预装有Squid软件,并且该软件的配置中默认侦听的TCP端口是3128端口。下面我们就可以开始运行Squid软件以及启动它所需要的服务,要完成这样的操作,只需要运行脚本neighbor.sh即可。该脚本会让Squid运行正确的脚本,完成运行。
一旦Squid正常启动运行,并且通过我们AP接入点访问互联网的路是通的,那么Squid就可以“控制”(handle)这个客户端的所有访问互联网的通信数据包了。在上网方面,Squid程序也做了不少合法的优化,比如将客户端用户访问过的网页,在缓存(cache)中保存一份,当用户再次访问的时候,就直接给他缓存中的网页,以便通过使用本地的缓存将带宽(bandwidth)减到最小。再比如可以对客户端用户所下载的内容进行”防病毒”扫描(antivirus scan)。
不合法的方面也不少,而这恰恰是我们所感兴趣的。比如将某个客户端所申请的网站的所有图片都恶作剧地显示成上下倒置的效果,这个功能通过flipImages.pl这个脚本实现。或者,如果我们想稍显恶意地攻击一下用户,那么可以将这个客户端下载的任何可执行文件(executable file)直接替换成我们自己的可执行文件,这个功能通过replaceExes.pl这个脚本实现。读者如果好奇都有哪些脚本,以及这些脚本都能干什么,可以到/optjsquid/sbin目录中找到所有的答案。
提示
不要设置成静态的“服务集标识”,这样的好处是,一旦客户端通过“探测请求”式扫描器查找你的“服务集标识”,如果你设置为动态的“服务集标识”,那么就可以动态地响应对方!要做到这一点,你需要运行hostapd-wpe(注意,不是“stock hostapd”),并且通过“-k”的参数将其设置为“KARMA模式”。
现在,我们了解了当有客户端通过AP接入点上互联网时,我们可以透明地修改他们上网的内容的所有步骤。后面要学习的是对于那些通过别人的AP接入点上网的客户端,我们应该如何应用上面的技术。
[1] 这是一种IP地址和子网掩码地址同时表示的一种书写形式,比如要表示一个C类网络的地址,通常是“X.Y.Z.0/255.255.255.0”,既然这样写的时候,有几位是固定死的,那就可以省略掉,于是简化成“X.Y.Z/掩码中1的个数”,其中“掩码中1的位数”中,每1个255表示8位。所以上面“10.0.0/24”的全写格式其实就是“10.0.0.0/255.255.255.0”;“10.0.1/24”的全写格式其实就是“10.0.1.0/255.255.255.0”。——译者注
[2] 在NAT转换的网络中,内网的所有访问外网的数据,在经过NAT时,由NAT进行转换,换成由NAT所在IP发出的数据,在NAT接到互联网上返回的数据后,NAT再反向转换为内网所用的格式,并返回给内网提出申请的那台主机上。这样,从互联网看内网时,只看到一台NAT主机,而内网看互联网时,并不知道有NAT的存在。NAT技术不仅能解决lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。——译者注