转载需注明,本文地址:http://blog.csdn.net/btyh17mxy/article/details/17281781
上个月跟某神秘部门一小哥吃饭时听说有人将wifi热点伪装成公共wifi(也叫Wlan,例如移动联通电信的CMCC、China-Unicom、China-Net等)来盗取用户数据,很好奇其实现方式。Google一番后发现,Wlan是基于Web认证实现的。简单说就是通过在路由器上一番设置,让未登录用户无论访问什么网址都显示登录页面,只有登录成功后才能正常上网。然而家庭用的路由器通常不具有那些复杂的功能,似乎只有上千块的路由器才有这些功能。但本文给出了一种使用家用路由器实现web认证的简单方法。
原理的话还比较简单,无线路由器A(下简称路由器A)连接互联网,笔记本(下简称PC)通过wifi连接路由器A,无线路由器B(下简称路由器B)通过网线连接PC(如图1-1)。将路由器B的工作模式设成“无线AP”(如图1-2)。由PC合路由器B组成一个内网,在该内网中PC充当Router,路由器B只是一个无线交换机,因此PC便可完全控制该子网。
图1-1
图1-2
0、一台笔记本(或台式)电脑,要求电脑有一个无线网卡和一个有线网卡。1、两个普通无线路由器,网线两三根。2、iptables3、dhcp3-server4、Apache5、python2.76、webpy(一个python库,django也可以)7、一只闲的蛋疼的程序猿
其中电脑用于充当路由器,一个无线路由器用于提供互联网接入,另一个用于伪装热点,iptables用于实现转发功能,dhcp3-server是DHCP服务器,Apache用于充当web服务器,python2.7和webpy用于实现一些简单的登录网页,一只闲的蛋疼的程序猿用于完成这些工作。各位看官自行准备这些东西。
就是将你的笔记本配置成DHCP服务器,在网络中充当Router。
在PC上运行
- sudo gedit /etc/network/interfaces
sudo gedit /etc/network/interfaces
插入以下内容
- auto eth0
- iface eth0 inet static
- address 192.168.4.5
- netmask 255.255.255.0
- network 192.168.4.0
- broadcast 192.168.1.255
- gateway 192.168.4.1
auto eth0 iface eth0 inet static address 192.168.4.5 netmask 255.255.255.0 network 192.168.4.0 broadcast 192.168.1.255 gateway 192.168.4.1
这里应注意我的有线端口叫“eth0”,各位应根据自己情况自行修改。
编辑isc-dhcp-server
- sudo gedit /etc/default/isc-dhcp-server
增加如下内容sudo gedit /etc/default/isc-dhcp-server
- INTERFACES=”eth0”
INTERFACES="eth0"
编辑dhcpd.conf
- sudo gedit /etc/dhcp/dhcpd.conf
增加如下内容sudo gedit /etc/dhcp/dhcpd.conf
- ddns-update-style interim;
- ignore client-updates;
- allow bootp;
- allow booting;
- subnet 192.168.4.0 netmask 255.255.255.0 {
- option routers 192.168.4.5;
- option subnet-mask 255.255.255.0;
- next-server 192.168.4.5;
- filename=“pxelinux.0”;
- option time-offset -18000; # Eastern Standard Time
- range 192.168.4.10 192.168.4.100;#子网ip从192.168.4.10到192.168.4.100
- default-lease-time 21600;
- max-lease-time 43200;
- }
ddns-update-style interim; ignore client-updates; allow bootp; allow booting; subnet 192.168.4.0 netmask 255.255.255.0 { option routers 192.168.4.5; option subnet-mask 255.255.255.0; next-server 192.168.4.5; filename="pxelinux.0"; option time-offset -18000; # Eastern Standard Time range 192.168.4.10 192.168.4.100;#子网ip从192.168.4.10到192.168.4.100 default-lease-time 21600; max-lease-time 43200; }
启动DHCP服务,运行:
- sudo service isc-dhcp-server start
如果终端中显示如下形式消息则成功,否则启动失败。sudo service isc-dhcp-server start
- isc-dhcp-server start/running, process XXXX
如果启动失败,可以运行以下命令察看Log分析原因isc-dhcp-server start/running, process XXXX
- sudo tail -f /var/log/syslog | grep dhcpd
sudo tail -f /var/log/syslog | grep dhcpd
开始这一步前应确保上一步已经配置成功了。然后打开路由器B的设置页面,将“工作模式”改为“无线AP”(如图1-2),等待路由器重启完成后再将“LAN口设置”中的“类型”改为“动态IP(DHCP)”,如图3-3-1。
图3-3-1
修改完成后,在PC上打开浏览器访问“192.168.4.10”,如果能打开路由器B的配置页面则设置成功。如果设置成功,你可以尝试使用手机通过wifi链接路由器B,此时在手机上只能打开路由器B的设置页面,而不能访问互联网,要想能够访问互联网还需设置转发规则。
- sudo gedit /etc/sysctl.conf
sudo gedit /etc/sysctl.conf
找到net.ipv4.ip_forward= 1,取消这一行的注释,保存后再运行
- sysctl -p
sysctl -p
运行:
- sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
这时再回到手机上,打开浏览器应该就可以正常访问互联网了,但是我们离要实现web验证的目标还差那么一丢丢。
iptables -t nat -A PREROUTING -s 192.168.4.11/32 -i eth0 -p tcp –dport 80 -j REDIRECT –to-port 8886
这行命令实现的是将ip地址为192.168.4.11的终端80端口的通讯转发到PC的8086端口,这样该终端就不能正常上网了,由于子网ip范围是从192.168.4.10到192.168.4.100,其中192.168.4.10是路由器B,那么我们就应该对192.168.4.11到192.168.4.100的所有ip都进行转发,这样他们就都不能上网了。
创建一个叫”j.py“的Python脚本,写入以下内容:
再创建一个叫”s.py”的Python脚本,写入以下内容:
- import web
- urls = (”/.*”, “hello”)
- app = web.application(urls, globals())
- class hello:
- def GET(self):
- return “”“
- ”“”
- if __name__ == “__main__”:
- app.run()
import web urls = ("/.*", "hello") app = web.application(urls, globals()) class hello: def GET(self): return """
""" if __name__ == "__main__": app.run()
- import web
- import os
- urls = (”/.*”, “hello”)
- app = web.application(urls, globals())
- class hello:
- def GET(self):
- #f = open(“login.html”)
- return “”“
username
password
- ”“”
- if __name__ == “__main__”:
- app.run()
import web import os urls = ("/.*", "hello") app = web.application(urls, globals()) class hello: def GET(self): #f = open("login.html") return """
""" if __name__ == "__main__": app.run()
执行
- python ./j.py 8886
python ./j.py 8886
和
- python ./s.py 8888
python ./s.py 8888
图7-1-1
如果你感觉太麻烦的话,完全可以不用理会“j.py”,只需要执行“python ./s.py 8886”也行(注意是8886)。
还是简单解释一下吧,iptables将80端口的所有通讯全部转发到了8886端口上,也就是说无论链接路由器B的终端通过80端口访问什么网址,都会指向PC的8886端口。我们在PC上开一个Python的web应用监听8886端口,无论其访问什么url都打开同样的一个登陆页面,这样就实现了简单的web验证功能。至于为什么要用j.py跳转一下,是因为如果不跳转的话即使浏览器中打开了我们设定的登陆页面,但是地址栏里还是会显示用户打开的原始网址,感觉不爽(说的不清楚,诸位自己体验下吧)。
当然如果要伪装成CMCC的话,你可以将路由器B的SSID修改成“CMCC“,再将登陆页面写成跟CMCC的登陆页面一样的样式。这样一般用户是无法识别的,造成的后果就是轻则wifi帐号被盗,重则被钓鱼各种帐号外泄。
iptables -t nat -D PREROUTING -s 192.168.4.11/32 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8886