轉載需註明,本文地址: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服務器
就是將你的筆記本配置成DHCP服務器,在網絡中充當Router。
1、固定有線端口IP地址
在PC上運行
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”,各位應根據自己情況自行修改。
2、配置DHCP服務
編輯isc-dhcp-server
增加如下內容sudo gedit /etc/default/isc-dhcp-server
INTERFACES="eth0"
編輯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服務,運行:如果啓動失敗,可以運行以下命令察看Log分析原因isc-dhcp-server start/running, process XXXX
配置路由器B
開始這一步前應確保上一步已經配置成功了。然後打開路由器B的設置頁面,將“工作模式”改爲“無線AP”(如圖1-2),等待路由器重啓完成後再將“LAN口設置”中的“類型”改爲“動態IP(DHCP)”,如圖3-3-1。
圖3-3-1
修改完成後,在PC上打開瀏覽器訪問“192.168.4.10”,如果能打開路由器B的配置頁面則設置成功。如果設置成功,你可以嘗試使用手機通過wifi鏈接路由器B,此時在手機上只能打開路由器B的設置頁面,而不能訪問互聯網,要想能夠訪問互聯網還需設置轉發規則。
設置轉發規則(一)
開啓ip轉發
sudo gedit /etc/sysctl.conf
找到net.ipv4.ip_forward= 1,取消這一行的註釋,保存後再運行
sysctl -p
設置規則
運行:
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腳本,寫入以下內容:
再創建一個叫”s.py”的Python腳本,寫入以下內容:
- 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()
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()
- 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()
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()
執行
python ./j.py 8886
和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帳號被盜,重則被釣魚各種帳號外泄。
一些後續工作
iptables -t nat -D PREROUTING -s 192.168.4.11/32 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8886