兩項基於網絡的“黑客”技術
軟件開發和測試中網絡環境遷移和數據分析
1 導讀
關於智能路由器的這兩項技術的介紹,想想還是搞個比較有噱頭的標題才能吸引人進來細看的。本文確實是介紹的兩個關於智能路由器的hack技術,但是卻是將這兩項技術用於軟件開發過程中的正途中的。當然如果有悟性,也可以將此技術用於不違法的惡作劇玩一下也無妨。
本文提到的兩個基於網絡的hack技術:
- DNS劫持
- 數據抓包
基本本質上就是路由器設備的兩個主要網絡功能:
- 網關配置功能
- 網關數據中轉功能
但是用於軟件開發的正途,就變換成下面的說法:
- 網絡環境遷移
- 數據監控
2 概述
OpenWrt 可以被描述為一個嵌入式的 Linux 發行版,(主流路由器固件有 dd-wrt,tomato,openwrt三類)而不是試圖建立一個單一的、靜態的系統。OpenWrt的包管理提供了一個完全可寫的文件系統,從應用程序供應商提供的選擇和配置,並允許您自定義的設備,以適應任何應用程序[1] 。
智能路由器也就是智能化管理的路由器,通常具有獨立的操作系統,可以由用戶自行安裝各種應用,自行控制帶寬、自行控制在線人數、自行控制瀏覽網頁、自行控制在線時間、同時擁有強大的USB共享功能,真正做到網絡和設備的智能化管理 [2]。
近幾年,智能硬件設備蓬勃發展,智能路由器也開始從實驗室走了出來,開始商業化,目前市場上已經出現了各種主流品牌廠商的智能路由器。例如國內的:極路由,小米路由器,華為智能路由系列……
用戶只需以較低的價格就可以入手體驗到硬件配置良好齊全的智能網絡硬件設備了。
| [1] | Openwrt-百度百科 |
| [2] | 智能路由器-百度百科 |
3 基本功能
基本上智能路由器能夠提供除了普通路由器所有的網絡功能外,還能提供基於Linux軟件應用服務。
普通路由器網絡功能如下:
- 支持PPPOE、動態IP、靜態IP等寬帶接入方式
- 支持TCP/IP、PPPOE、DHCP、ICMP、NAT等協議
- 內建DHCP服務器,同時進行靜態地址分配
- 內建防火牆,支持IP地址、MAC地址、域名地址過濾,可靈活控制上網權限與時間
- 支持Upnp、靜態路由
- 提供64/128位WEP加密,支持WPA、802.1X等高級加密及安全機制
- 支持遠程Web管理,全中文配置界面
- 支持MAC地址修改與克隆
由於智能路由器硬件之上搭載的是openwrt本質上是一個訂制的linux系統,所以還可以安裝一些應用程序,完成普通linux的一些應用擴展功能,例如:
- 安裝python,並運行其腳本
- 搭建nginx的web服務器
- 搭建git的服務器
- 搭建ftp服務器
- 搭建科學上網的代理服務器
備注
現在市場上的商用路由器,價格上遠低於一台主機電腦,然后網絡功能齊全,且帶有大容量的硬盤,只要刷成openwrt之后,就可以擁有自己的私有的git服務器或者文件服務器了。
4 准備工作
在正式開始實驗之前,要做一些准備工作:
- 一台支持openwrt的商用智能路由器硬件設備
- 將商用設備刷機成openwrt系統(替換原出廠訂制系統)
具體的openwrt支持硬件設備列表見 官方文檔 [3] 。
關於各種品牌的路由器如何刷ROM,可以到網上找各種教程,本文主要側重openwrt后的應用,故刷機過程略去。
備注
本文是在小米官網購買的 小米路由mini ,然后根據教程刷成基於 openwrt 訂制的 pandorabox
刷機成功后,就可以通過PC機遠程路由了,就像遠程一台普通的linux服務器一樣,遠程登錄后,路由器終端界面提示如下:

基本的文件操作,網絡操作等命令和普通Linux類似。同時openwrt也可以通過軟件倉庫安裝應用軟件,具體參見 openwrt軟件包管理 [4] 。
例如,安裝 nginx 應用程序:
opkg install nginx
上面對openwrt的基本知識進行了簡單介紹,后面開始一些綜合應用了。
| [3] | Openwrt Table of Hardware <http://wiki.openwrt.org/toh/start> |
| [4] | openwrt軟件包管理 <http://wiki.openwrt.org/doc/packages> |
5 軟件開發過程的應用
在本文中主要介紹兩種綜合應用:
-
- 網絡環境遷移變換
-
- 可以在不修改構建的代碼的前提下,靈活的進行 開發/測試/灰度/全網 不同階段的網絡環境的遷移變換
- 可以批量對N台機器進行統一的網絡環境配置(DHCP)
-
- 網絡數據監控
-
對於一些沒有好的抓包工具的平台,例如:移動設備,進行數據包分析。
6 網絡環境遷移變換
6.1 使用場景
典型的互聯網系統里面最基本的組成就是各種應用服務器及網絡設備。通過有效的網絡硬件架構和應用軟件架構進行部署,來對外提供正常的服務。一個典型的高性能web應用系統的架構精簡后如下圖:

主要結構為:
-
- 負載均衡 Nginx 服務器
-
對下屬集群機器分配權重進行負載均衡和災難熱備
-
- 多台 Web Server 服務器
-
對機器的增加或者減少來實現計算能力彈性伸縮
-
- 高速共享內存數據庫 Redis Server
-
在服務器集群機器之間形成快速的內存數據共享
-
- 持久化數據庫服務器 DB Server
-
數據庫應用系統的隔離存儲
為了簡化描述,網絡的拓撲結構可以簡化為,所有的這些機器連接在一台路由器上,機器之間通過網絡進行互訪。
6.2 基本需求
上一小節內容里面提到的網絡應用架構可以代表一種最終態的生產力架構。但是在軟件開發周期里面顯然一般不能直接在最終生產力服務器平台上進行操作的。一般情況下,從原型開發,到內部測試,到邀請公測(灰度),到全面開放發布,此架構的各部分會經過一些平滑的遷移。
開發階段的代碼一般是千瘡百孔的,所以必然會有一些錯誤的業務,產生垃圾數據,如果直接面向生產平台進行測試,無法必然的會污染現有的生產系統,這是應該盡量避免的。
所以一般情況下,上述的網絡架構體系需要進行三份拷貝:
- 開發組系統
- 測試組系統
- 生產組系統
對各種機器進行編號成:1~12號,如下圖:

那么在開發和測試的時候可以通過對網絡的修改形成比較平滑的遷移測試:
- 完全開發階段。1-2-3-4
- 開發測試階段。1-2-7-8 或者其它組合
- 完全測試階段。5-6-7-8
- 灰度發布階段。5-6-11-12 或者其它組合
- 完全發布階段。9-10-11-12
6.3 實現方法
所有的這些網絡遷移有個前置條件:在代碼中不要使用具體的IP,而是統一使用域名來定義機器名稱。
這樣的好處有:
- 可以方便的做負載均衡
- 可以通過修改DNS來做域名和機器的映射
關於DNS的定義,在此不再贅述。其功能簡單來說:就是網絡應用程序在向某個域名請求內容時,其實並不是直接向真實的主機發送,而是先向域名服務器進行查詢,得到對應的IP地址,然后才指向具體的主機上的服務進行請求。
基於以上的原理,如何進行網絡遷移就變得很容易了:只需要修改機器的DNS解析,就可以設計出自己想要的網絡集群組合了。
有兩種方式進行修改:
-
- 本機修改
-
修改本機hosts,不使用額外的DNS服務器
-
- 網關修改
-
建立DNS服務器並進行解析設置
6.3.1 本機修改
在linux機器下面, /etc/hosts 文件里面修改地址解析。
關於/etc/host,主機名和IP配置文件:
Hosts - The static table lookup for host name(主機名查詢靜態表)
vim /etc/hosts
進行了相應的修改的機器上面再對域名進行訪問時,就直接使用本機解析,不再向其它DNS服務器請求解析。
如果沒有做物理的分布式部署,所有的服務都搭建在本機上,那么可以直接使用此方法。但是如果是實現了物理分布式部署,則可以通過DNS服務器及網關配置,實現同一網關下所有機器的網絡統一配置。
6.3.2 網關修改
在linux系統中使用 dnsmasq 配置一台DNS應用服務器。
然后在網關上設置相應的DNS服務器,新的主機接入到此網關(物理表現為路由器)之后,由DHCP分配IP地址和DNS服務器地址。過程如下圖所示:

對於智能路由器來說,本身就相當於一台linux主機,所以可以直接在本機上安裝DNS服務器,並設置DHCP。 一般情況下,openwrt里面天然集成了dnsmasq。
對 /etc/config/network 文件進行編輯,就可以設置DHCP,修改相應的代碼段:
config interface 'lan'
……
option dns '127.0.0.1 223.5.5.5 223.6.6.6'
當然對於不熟悉linux的同學來說,也可以通過openwrt提供的web管理界面進行設置,在此略去不表。
6.4 網絡統一配置
經過上述配置,后續所有連接到此路由下面的設備,都由路由統一分配DNS服務器了。
所有連接在此路由器上的設備,不管是移動設備,還是服務器還是PC都有統一的網絡配置。

如果要對整個局域網進行網絡修改,只需登錄DNS服務器(此處就是智能路由器)。
修改 /etc/hosts 加上域名IP映射記錄,然后執行下述命令重啟dnsmasq服務即可:
/etc/init.d/dnsmqsq restart
在客戶機上執行 ping命令檢查一下相應的域名,經過特殊指向的域名返回的都是路由器配置的IP地址了(非特殊設定的,由備用DNS服務器來進行解析,所以其它公網服務仍然正常)。
這個功能在某些場合是相當有用的,比如:前端兼容性測試。
一個帶客戶端的web應用程序,有很強的兼容性要求的時候,就必須要在各種平台下面進行打開測試。而平台的分類是很多的,不同PC操作系統,不同的瀏覽器平台,不同的移動端設備。像PC端平台測試舊版本的IE,一般需要每個版本的IE都建立一個虛擬機,而移動端則由於差異化和碎片化更嚴重,會直接使用N台真實設備。這樣一個完整的兼容性測試就會涉及十幾台甚至幾十台設備。如果第一次網絡環境的遷移都需要在每個設備上修改網絡配置,這個工作量和出錯率都是相當大的。通過路由器的對子網的網絡配置功能,可以很高效的解決這個問題。 節約了時間,減少了出錯率,這就是技術帶來的生產力。
說明
其實對於喜歡hack技術的人來說,上面的技術其實就是 ”DNS劫持技術“ 了。稍微再加一點東西,就可以做成偽裝度很高的釣魚網站,再加一點社會工程學和人類心理學的知識(將上網設備引誘到你的網絡領域來),就能產生比較強的破壞力了。所以懂技術的同學請不要做違法的事;不懂技術的同學請注意防范此類的hack技術,不要輕易將設備接入陌生人的網絡領地。
6.5 DNS劫持釣魚手段簡介
技術加一點社會工程學,hack做如下事情:
盜取支付信息
-
- 將支付寶登錄頁面復制一份,做一些修改
-
例如:將提交密碼的服務器修改成hack服務器
-
- 引誘小白到自己的路由器網絡下,進行DNS劫持
-
免費WIFI,無密碼
-
- 誘導用戶進行支付登錄
-
即使用戶不是小白,是IT從業人員,記得支付寶的域名,然后輸入了域名,確認進入了一模一樣的支付頁面,進行登錄
-
用戶發現進入支付寶頁面后,即使輸入正確的密碼也無法登錄進去,於是放棄
-
然后hacker已經獲取了用戶的相應的用戶名及密碼了,進行后續工作
DNS劫持和頁面復制,可以讓用戶在瀏覽器輸入了正確的域名,而且瀏覽器顯示了一模一樣的 真實 頁面,只是你輸入賬號密碼后,不能登錄而已。
QQ詐騙
- 前面的手段和上面的例子一樣,偽照QQ空間登錄頁面,獲取QQ賬號密碼
- 給好友發詐騙匯款信息
- 后續其它操作。。。。
可能大家覺得手段比較低端,但是作為一個還算資深的IT從業人員,個人還是有過相應的經歷。
事件1
有人在QQ上發消息,說QQ空間有不可思議的照片,習慣性點擊過去,是QQ空間相冊界面,和登錄彈出框。相冊封面內容很吸引人,但是我還是出於職業習慣,看了一下瀏覽器的域名,發現不是QQ空間域名,於是笑了笑,關閉了窗口。
事件2
很久沒有聯系的一個朋友,在QQ突然向我發消息:麻煩你給我爸爸打個電話說我手機掉廁所了,讓他給我匯500塊錢過來一下,急。首先這不是讓我直接匯款,緊急間,我差點給打了電話,差點成為對方作為博取別人信任的籌碼了。還好,我並不知道他的爸爸的電話,遲疑的一瞬間讓我清醒了一下,讓他說他爸爸的名字,結果他說不出來。。。。
所以,上述方法其實不一定低端,一旦加入高深的社會工程學和人類心理學的知識,產生的社會危害還是蠻大的。還有,上面的那些信息的分析和收集過程,是可以通過編程自動化實現的,線下只需要不斷的設局,就會有一定的轉化率的。
其它的也不再說,偏離本文主旨了,希望能夠引起大家的網絡安全意識就好了吧。
7 網絡數據監控
智能路由器作為網關除了網絡配置功能外,還有網絡數據轉發的功能。由於openwrt是基於linux的,上面有比較良好的抓包應用程序 tcpdump,再配合 wireshark 的可視化工具,可以達到對所有通過此路由的數據進行監控的能力。
關於tcpdump和wireshark的使用方法,不是本文的重點,故不展開,默認讀者具有一定這方面的基礎知識了。
下面的例子是實現遠程機器通過可視化工具 wireshark 對所有經過路由器的數據進行監控的實驗。
7.1 原理和方法
基本的網絡結構圖如下:

主要操作原理是:
-
將上網設備連接到路由器
-
- 在路由器上使用tcpdump對網卡進行數據抓包
-
截至此處已經達到了監控要求,但是不夠直觀,需要一些可視化的工具,比如wireshark
-
- 在同一網絡內的Linux桌面系統上運行wireshark對路由器上的tcpdump數據進行導入
-
通過ssh遠程執行tcpdump命令,將數據輸入到desktop,然后作為wireshark的輸入數據源
在桌面系統終端里面執行下列命令:
ssh root@mitest "tcpdump -s 0 -U -n -w - -i br-lan not port 22" | wireshark -k -i -
然后輸入相應的賬號密碼就可以監控了。
7.2 工具小技巧
前面講述了基本的原理和操作手段,但是缺點是每次都需要輸入長串命令行和密碼,可以利用linux的一些小操作技巧,簡化此過程,做成一個命令工具。
基本原理:
- 使用 sshpass 工具來做名密碼輸入
- 使用 alias 別名來做成命令語句
自動登錄語句實現:
sshpass -p 'route-pass-world' ssh -o StrictHostKeyChecking=no root@mitest 'tcpdump -s 0 -U -n -w - -i br-lan not port 22' | wireshark -k -i -
編輯~/.bash_alias文件,自定義命令行的別名:
alias zshark="sshpass -p 'route-pass-world' ssh -o StrictHostKeyChecking=no root@mitest 'tcpdump -s 0 -U -n -w - -i br-lan not port 22' | wireshark -k -i -"
后面只需要在shell里面輸入zshark就可以完成命令的啟動了。
7.3 結果效果展示和應用
然后啟動抓包工具,使用小米4手機連接路由器,打開UC瀏覽器訪問 www.baidu.com ,抓包效果圖如下:

已經可以看到設備的相應的網絡IO訪問內容了。
這個功能的可以用於對一些沒有抓包應用的平台上的網絡數據監控分析。例如:分析手機上的網絡通訊情況。
在軟件開發的時候,緩存往往很容易造成一些不正確的假象,這些假象非常容易影響軟件調試過程中的分析判斷。比如,在網絡環境遷移的過程中,不同的設備有不同的DNS或者靜態文件的緩存機制,特別是手機終端瀏覽器都有一些 雲加速 功能,這些功能的加入已經改變了以前大家理解的網絡請求過程,如果不了解這個影響,應用程序往往會呈現出一些令人費解或者令人誤解的現象。所以必須要借助網絡監控工具來確認設備的網絡環境得到了正確的遷移,才能保證開發人員看到的一些現象是可信的。
比如:UC和QQ手機瀏覽器有 雲加速 功能,但是好歹在設置中可以進行關閉,但是微信內置瀏覽器其實也有此功能,而且沒有任何地方能夠設置關閉,這點在web開發調試過程中很容易讓人費解或者誤解。
7.4 網絡安全隨想
在前面的內容已經介紹了如何抓包了,顯然已經在PC上看到了接入的手機上的相關訪問信息:
-
- 非敏感信息
-
- 手機型號
- 操作系統
- 瀏覽器標識
- 訪問頁面內容和時間
-
- 敏感信息
-
- 如果是http協議,頁面提交的表單內容也會明文被查看到
對於非敏感信息,其實有些時候也比較敏感,這是對隱私的一種侵犯,畢竟沒有誰希望自己的一切網絡行為習慣被別人窺探無遺。
例如,wireshark可以對某個設備的訪問記錄進行統計:

這只是剛才的實驗短時間訪問了一下baidu.com,如果長時間對網絡出口進行監控,那么這個很容易根據瀏覽器的網站的內容類別,可以將設備持有人的喜好和特征分析得八九不離十。比如,發現大量的女性衣服購物鏈接就可以判別此人是年輕女性;如果發現大量科技論文檢索頁面,則可以判別為科研工作者。
再多一些數據,就會分析更多一些內容。比如,你拿着手機偷偷在搜索引擎里面搜索 白血病的治療方法 ,很小心的你以為別人不知道,但是其實別人什么都知道了,你想通過搜索引擎知道更多,就會搜索輸入得越多,然后產生的網絡行為越多,別人就會知道的更多了。
當然所幸的是 國內最大的搜索引擎 百度 ,大概在2015年終於使用了 https 的搜索服務了,在此之前是非加密的 http 協議。其它的搜索引擎,例如 搜狗 截至目前為止仍然使用的是非加密的 http 協議。
對於敏感信息,比如登錄名和密碼,如果是在 http 協議下傳輸,這些內容是可以直接在路由器上抓包看見的。這部分內容的影響就可大可小了。
所以安全總結如下:
-
- 非敏感信息被窺探
-
成規模產生統計價值,會暴露個人特征和喜好等等隱私
-
- 敏感信息被窺探
-
直接涉及到賬號密碼時,產生的后果可能很嚴重
注意
https 協議傳輸的屬於加密內容,即使路由器抓包了,也看不到明文。像目前大型的互聯網公司的敏感數據傳輸部分基本上都是基於 https 了,但是仍然有很多中小型互聯網公司還沒有注意到這一點,仍然使用未加密的 http 協議,像用戶名密碼這些東西在路由器上傳輸的時候,抓包都可以看到明文。
8 公共WIFI安全警示
經過如下的方法闡述,應該能夠引起一部分用戶對公共WIFI的安全意識的重視吧。如果對方是路由器的管理員,然后終端用戶又將設備連接到路由器上了(被釣魚),那么:
-
- DNS劫持
-
本來用戶訪問A網站,但是卻被導向一個偽裝好的惡意的B網站,那么用戶的登錄賬號密碼等敏感信息甚至銀行信息都有可以被截取
-
- 通訊數據被監視
-
- 用戶訪問的網絡地址都被獲知(用戶的習慣被掌控了)
- http的請求的數據內容都會被明文截獲
當然一般的有明確來源的的WIFI還是可以抱可信的態度的(畢竟現在各大商家都有免費WIFI,不能因噎廢食),但是未知WIFI盡量不要輕易連接,否則會有不可預知的風險。
9 最后總結
上面介紹的智能路由器的兩種玩法,本意還是希望大家能夠盡量將其用於正途,用於生產中,用來提升軟件的生產力吧。請勿亂用。
| 作者: | Harmo哈莫 |
|---|---|
| 作者介紹: | https://zhengwh.github.io |
| 技術博客: | http://www.cnblogs.com/beer |
| Email: | dreamzsm@gmail.com |
| QQ: | 1295351490 |
| 時間: | 2015-10 |
| 版權聲明: | 歡迎以學習交流為目的讀者隨意轉載,但是請 【注明出處】 |
| 支持本文: | 如果文章對您有啟發,可以點擊博客右下角的按鈕進行 【推薦】 |
