家用路由器 实现 Web认证

转载需注明,本文地址: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

准备工作

        本文介绍的方法是在Ubuntu12.04下实现的,需要用到以下设备和工具:
        0、一台笔记本(或台式)电脑,要求电脑有一个无线网卡和一个有线网卡。
        1、两个普通无线路由器,网线两三根。
        2、iptables
        3、dhcp3-server
        4、Apache
        5、python2.7
        6、webpy(一个python库,django也可以)
        7、一只闲的蛋疼的程序猿


        其中电脑用于充当路由器,一个无线路由器用于提供互联网接入,另一个用于伪装热点,iptables用于实现转发功能,dhcp3-server是DHCP服务器,Apache用于充当web服务器,python2.7和webpy用于实现一些简单的登录网页,一只闲的蛋疼的程序猿用于完成这些工作。各位看官自行准备这些东西。


配置DHCP服务器

        就是将你的笔记本配置成DHCP服务器,在网络中充当Router。

        1、固定有线端口IP地址

在PC上运行

[plain] view plain copy
print ?
  1. sudo gedit /etc/network/interfaces  
sudo gedit /etc/network/interfaces

插入以下内容

[plain] view plain copy
print ?
  1. auto eth0  
  2.     iface eth0 inet static  
  3.     address 192.168.4.5  
  4.     netmask 255.255.255.0  
  5.     network 192.168.4.0  
  6.     broadcast 192.168.1.255  
  7.     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”,各位应根据自己情况自行修改。

        2、配置DHCP服务

编辑isc-dhcp-server

[plain] view plain copy
print ?
  1. sudo gedit /etc/default/isc-dhcp-server  
sudo gedit /etc/default/isc-dhcp-server
增加如下内容

[plain] view plain copy
print ?
  1. INTERFACES=”eth0”  
INTERFACES="eth0"


编辑dhcpd.conf
[html] view plain copy
print ?
  1. sudo gedit /etc/dhcp/dhcpd.conf  
sudo gedit /etc/dhcp/dhcpd.conf
增加如下内容

[html] view plain copy
print ?
  1. ddns-update-style interim;  
  2. ignore client-updates;  
  3. allow bootp;  
  4. allow booting;  
  5.   
  6. subnet 192.168.4.0 netmask 255.255.255.0 {  
  7.   
  8.     option routers 192.168.4.5;  
  9.     option subnet-mask 255.255.255.0;  
  10.     next-server 192.168.4.5;  
  11.     filename=“pxelinux.0”;  
  12.     option time-offset -18000; # Eastern Standard Time  
  13.   
  14.     range 192.168.4.10 192.168.4.100;#子网ip从192.168.4.10到192.168.4.100  
  15.     default-lease-time 21600;  
  16.     max-lease-time 43200;  
  17. }  
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服务,运行:
[plain] view plain copy
print ?
  1. sudo service isc-dhcp-server start  
sudo service isc-dhcp-server start
如果终端中显示如下形式消息则成功,否则启动失败。
[plain] view plain copy
print ?
  1. isc-dhcp-server start/running, process XXXX  
isc-dhcp-server start/running, process XXXX
如果启动失败,可以运行以下命令察看Log分析原因
[plain] view plain copy
print ?
  1. sudo tail -f /var/log/syslog | grep dhcpd  
sudo tail -f /var/log/syslog | grep dhcpd


配置路由器B

开始这一步前应确保上一步已经配置成功了。
然后打开路由器B的设置页面,将“工作模式”改为“无线AP”(如图1-2),等待路由器重启完成后再将“LAN口设置”中的“类型”改为“动态IP(DHCP)”,如图3-3-1。

                                                图3-3-1

修改完成后,在PC上打开浏览器访问“192.168.4.10”,如果能打开路由器B的配置页面则设置成功。

如果设置成功,你可以尝试使用手机通过wifi链接路由器B,此时在手机上只能打开路由器B的设置页面,而不能访问互联网,要想能够访问互联网还需设置转发规则。

设置转发规则(一)

        开启ip转发

[html] view plain copy
print ?
  1. sudo gedit /etc/sysctl.conf  
sudo gedit /etc/sysctl.conf

找到net.ipv4.ip_forward= 1,取消这一行的注释,保存后再运行

[html] view plain copy
print ?
  1. sysctl -p  
sysctl -p

        设置规则

运行:

[plain] view plain copy
print ?
  1. sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE  
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE


这时再回到手机上,打开浏览器应该就可以正常访问互联网了,但是我们离要实现web验证的目标还差那么一丢丢。


设置转发规则(二)

        要想实现web验证功能,我们就要让未经验证的终端不能上网,同样我们也使用iptables的转发功能,运行:

        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都进行转发,这样他们就都不能上网了。


使用webpy完成web验证功能

        创建一个叫”j.py“的Python脚本,写入以下内容:

[python] view plain copy
print ?
  1. import web  
  2.   
  3. urls = (”/.*”“hello”)  
  4. app = web.application(urls, globals())  
  5.   
  6. class hello:  
  7.     def GET(self):  
  8.         return “”“ 
  9.          
  10.          
  11.          
  12.          
  13.          
  14.          
  15.          
  16.          
  17.          
  18.          
  19.         ”“”  
  20.   
  21. if __name__ == “__main__”:  
  22.     app.run()  
import web

urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
    def GET(self):
        return """
        
        
        
        
        
        
        
        
        
        
        """

if __name__ == "__main__":
    app.run()

        再创建一个叫”s.py”的Python脚本,写入以下内容:


[python] view plain copy
print ?
  1. import web  
  2. import os  
  3. urls = (”/.*”“hello”)  
  4. app = web.application(urls, globals())  
  5.   
  6. class hello:  
  7.     def GET(self):  
  8.         #f = open(“login.html”)  
  9.         return  “”“ 
  10.          
  11.          
  12.          
  13.          
  14.          
  15.          
  16.          
  17.              
  18.               

    username

     
  19.               

    password

     
  20.                
  21.              
  22.          
  23.          
  24.         ”“”  
  25.   
  26. if __name__ == “__main__”:  
  27.     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()

        执行

[plain] view plain copy
print ?
  1. python ./j.py 8886  
python ./j.py 8886

[html] view plain copy
print ?
  1. python ./s.py 8888  
python ./s.py 8888



        这回在链接路由器B的其他终端上无论打开一个什么网址都会显示如图7-1-1的网页。

        

                      图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帐号被盗,重则被钓鱼各种帐号外泄。


一些后续工作

前面的操作只实现了显示web认证页面的功能,我们还可以在”s.py”的hello类里实现POST方法,获取终端提交的表单,验证其账户合法性,并通过web.ctx.ip获取终端ip,再通过subprocess执行语句删除针对该IP的转发规则(就像下面那样)。
[plain] view plain copy
print ?
  1. iptables -t nat -D PREROUTING -s 192.168.4.11/32 -i eth0 -p tcp –dport 80 -j REDIRECT –to-port 8886  
iptables -t nat -D PREROUTING -s 192.168.4.11/32 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8886

还需要说明的是本文中使用的只是一个测试的方法,实际操作中应将所有端口都转发,而不是仅仅转发80端口。而且还可以将PC配置为DNS服务器,这样就可以完全控制网络了。我觉得现实中的黑客有可能就是在PC上配置了DNS服务,那样子他们就能把用户访问的网站替换成黑客的钓鱼网站。















你可能感兴趣的:(计算机安全)