家用路由器 實現 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上運行

  1. sudo gedit /etc/network/interfaces  
sudo gedit /etc/network/interfaces

插入以下內容

  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

  1. sudo gedit /etc/default/isc-dhcp-server  
sudo gedit /etc/default/isc-dhcp-server
增加如下內容

  1. INTERFACES=”eth0”  
INTERFACES="eth0"


編輯dhcpd.conf
  1. sudo gedit /etc/dhcp/dhcpd.conf  
sudo gedit /etc/dhcp/dhcpd.conf
增加如下內容

  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服務,運行:
  1. sudo service isc-dhcp-server start  
sudo service isc-dhcp-server start
如果終端中顯示如下形式消息則成功,否則啓動失敗。
  1. isc-dhcp-server start/running, process XXXX  
isc-dhcp-server start/running, process XXXX
如果啓動失敗,可以運行以下命令察看Log分析原因
  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轉發

  1. sudo gedit /etc/sysctl.conf  
sudo gedit /etc/sysctl.conf

找到net.ipv4.ip_forward= 1,取消這一行的註釋,保存後再運行

  1. sysctl -p  
sysctl -p

        設置規則

運行:

  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腳本,寫入以下內容:

  1. import web  
  2.   
  3. urls = (”/.*”“hello”)  
  4. app = web.application(urls, globals())  
  5.   
  6. class hello:  
  7.     def GET(self):  
  8.         return “”“ 
  9.         <html> 
  10.         <head> 
  11.         <meta http-equiv=”Content-Language” content=”zh-CN”> 
  12.         <meta HTTP-EQUIV=”Content-Type” CONTENT=”text/html; charset=gb2312”> 
  13.         <meta http-equiv=”refresh” content=”0.1;url=http://192.168.6.28:8888/login/hahaha/heheh”> 
  14.         <title></title> 
  15.         </head> 
  16.         <body> 
  17.         </body> 
  18.         </html> 
  19.         ”“”  
  20.   
  21. if __name__ == “__main__”:  
  22.     app.run()  
import web

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

class hello:
    def GET(self):
        return """
        <html>
        <head>
        <meta http-equiv="Content-Language" content="zh-CN">
        <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
        <meta http-equiv="refresh" content="0.1;url=http://192.168.6.28:8888/login/hahaha/heheh">
        <title></title>
        </head>
        <body>
        </body>
        </html>
        """

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

        再創建一個叫”s.py”的Python腳本,寫入以下內容:


  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.         <html> 
  11.         <head> 
  12.         <meta http-equiv=”Content-Language” content=”zh-CN”> 
  13.         <meta HTTP-EQUIV=”Content-Type” CONTENT=”text/html; charset=gb2312”> 
  14.         <title></title> 
  15.         </head> 
  16.         <body> 
  17.             <form action=”“ method=”post”> 
  18.               <p>username<input type=”text” name=”name” /></p> 
  19.               <p>password<input type=”text” name=”pwd” /></p> 
  20.               <input type=”submit” value=”Login” /> 
  21.             </form> 
  22.         </body> 
  23.         </html> 
  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  """
        <html>
        <head>
        <meta http-equiv="Content-Language" content="zh-CN">
        <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
        <title></title>
        </head>
        <body>
            <form action="" method="post">
              <p>username<input type="text" name="name" /></p>
              <p>password<input type="text" name="pwd" /></p>
              <input type="submit" value="Login" />
            </form>
        </body>
        </html>
        """

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

        執行

  1. python ./j.py 8886  
python ./j.py 8886

  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的轉發規則(就像下面那樣)。
  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服務,那樣子他們就能把用戶訪問的網站替換成黑客的釣魚網站。















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章