作為一個前端,都2023年了你還不會抓包嗎?
theme: awesome-green highlight: agate
你好,我是黃勇超,一個深耕前端的工程師;本文將帶你深入抓包原理,通過抓包工具 whistle 做到攔截線上頁面請求資料,再響應原生代碼
## 1. 什麼是抓包?
抓包就是將網路傳輸傳送與接收的資料包進行截獲、重發、編輯、轉存等操作,通過抓包可以:
- 分析網路問題
- 業務分析
- 分析網路資訊流通量
- 網路大資料金融風險控制
- 探測企圖入侵網路的攻擊
- 探測由內部和外部的使用者濫用網路資源
- 探測網路入侵後的影響
- 監測連結網際網路寬頻流量
- 監測網路使用流量(包括內部使用者,外部使用者和系統)
- 監測網際網路和使用者電腦的安全狀態
- 滲透與欺騙
- ...
回顧下計算機網路知識,資料在網路上是以很小的幀
的單位傳輸的,幀通過特定的稱為網路驅動程式的程式進行成型,然後通過網絡卡傳送到網線上,通過網線到達目的機器,在目的機器的一端執行相反的過程
接收端機器的乙太網捕獲到這些幀,並告訴作業系統幀已到達,然後對其進行儲存;在這個傳輸和接收的過程,就可以使用抓包工具(Sniffers)進行抓包
作為前端開發者,通常是抓取應用層的 HTTP / HTTPS 的包
2. HTTP / HTTPS 抓包原理
HTTP / HTTPS 是應用層使用的通訊協議,常見的應用層體系結構是客戶端-伺服器體系
那麼對執行在不同端系統上的客戶端程式和服務端程式是如何互相通訊的?
實際上,在作業系統上的術語中,進行通訊的實際上是程序
而不是程式,一個程序可以被認為是執行在端系統中的一個程式
在 web 應用程式中,一個客戶瀏覽器程序與一臺伺服器程序進行會話交換報文;瀏覽器程序需要知道接收程序的主機地址,以及定義在目的主機中的接收程序的識別符號,也就是目的埠
多數應用程式由通訊程序對組成,每對中的兩個程序互相傳送報文。程序通過一個稱為套接字的軟體介面向網路傳送報文和從網路接收報文;程序可以類比一座房子,而它的套接字可以是它的門,套接字
是應用層與運輸層之間的埠
知道了兩個程序的通訊流程,我們要怎麼抓包呢?
舉一個生活中的例子
小明暗戀小雯,於是他寫了一封情書,但他有點害羞,找了小雯的好朋友小花幫忙傳遞情書
這個時候,小花可以負責小雯與小明之間的情書傳遞
作為中間人,她可以偷偷檢視他們的情書內容
思路就是設定一箇中間人程序負責抓包,每次目標程序之間的會話都先與中間人程序通訊,再進行轉發
2-1. HTTP 抓包原理
在 http 標準中,沒有對通訊端身份驗證的標準。對於伺服器來說,它接收的 HTTP 請求報文只要格式符合規範,就傳送響應報文
對於客戶端來說也是如此,它無法校驗伺服器的身份,比如它連線的 http://www.jecyu.com
的主機,但由於中間節點的存在,最終連線的可能是 http://www.jerry.com
的主機
因此,對於 HTTP 抓包,無需做過多的處理,只需要讓中間人負責轉發客戶端和服務端的資料包
2-2. HTTPS 抓包原理
HTTP 是明文傳輸,容易受到中間人攻擊,不安全
HTTPS 語義仍然是 HTTP,只不過是在 HTTP 協議棧中 http 與 tcp 之間插入安全層 SSL/TSL
安全層採用對稱加密的方式加密傳輸資料和非對稱加密的方式來傳輸對稱金鑰,解決 http 資料沒有加密、無法驗證身份、資料容易纂改三個核心問題
HTTP + 加密 + 認證 + 完整性保護 = HTTPS
其中驗證身份問題是通過驗證伺服器的證書來實現的,證書是第三方組織(CA 證書籤發機構)使用數字簽名技術管理的,包括建立證書、儲存證書、更新證書、撤銷證書
瀏覽器連線至一個 HTTPS 網站,伺服器傳送的不僅僅只是伺服器實體證書,而是一個證書鏈,但不包含根證書,根證書會被內嵌在 Windows, Linux, macOS, Android, iOS 這些作業系統裡
其中校驗證書分為兩步,證書的簽發者校驗和伺服器實體證書校驗
1. 證書鏈校驗:
- 瀏覽器從伺服器實體證書的上一級證書(比如 B 證書)獲取公鑰,用來校驗伺服器實體證書的簽名(簽名是通過 CA 機構的私鑰簽名的),校驗成功則繼續,否則證書校驗失敗
-
瀏覽器從 B 證書的上一級證書(比如 C 證書)獲取公鑰,用來校驗 B 證書的簽名,校驗成功則繼續,否則證書校驗失敗
-
瀏覽器迭代校驗每張證書的簽名,最後會找到自簽名的根證書(簽發者和使用者是同一個人),由於瀏覽器已經集成了根證書,可以充分信任根證書的公鑰,完成最後的簽名
2. 伺服器實體證書校驗:
訪問的域名資訊是否與證書一致、日期、證書擴充套件校驗等
瞭解完證書校驗後,我們來看看具體的 https 通訊流程:
- 首先是 tcp 的三次握手建立連線
- 接著是非對稱加密的握手過程
- client 傳送隨機數 random1 + 支援的加密演算法集合
- server 收到資訊,返回選擇的一個加密演算法+ 證書 (包含S_公鑰) + random2
- client 驗證證書有效性,並用 random1 + random2 生成 pre-master-secure,通過服務端公鑰加密傳送給 server
- server 收到 pre-master-secure,根據約定的演算法使用S_私鑰對 pre-master-secure 解密,
- 然後用加密演算法生成 master-secure(對稱加密的金鑰),然後傳送給 client
- client 收到生成的 master-secure,對稱加密金鑰傳輸完畢
- 最後,就可以使用 master-secure 進行真正的資料對稱加密傳輸
中間人想要抓包,需在 HTTPS 加密通訊之前:
- 擷取客戶端傳送的包含證書的報文,偽裝成服務端,把自己的證書發給客戶端,然後拿到【客戶端返回的包含對稱加密通訊金鑰的報文】,生成中間人與客戶端對稱加密的金鑰
- 同樣偽裝成客戶端,以服務端自己的非對稱公鑰加密【客戶端返回的包含對稱加密通訊金鑰的報文】發給服務端,獲得服務端生成的對稱加密金鑰
- 這樣一來,加密通訊建立完成,而中間人拿到了通訊的資料金鑰,可以檢視、修改 HTTPS 的通訊報文
- 這裡客戶端與中間人通訊、中間人與服務端通訊,都是正常建立了 HTTPS 加密連線的
其中很重要的一步是瀏覽器的根證書校驗,CA 機構不可能隨便給一箇中間人簽發不屬於它的域名證書,也就不在客戶端的作業系統上了,因此只能把中間人的根證書,匯入到客戶端的作業系統了,以此完成建立加密通訊時對中間人證書的驗證
3. 電腦如何抓手機的包
要想通過電腦端獲取手機 Web 應用的資料包,根據前面所學,就需要中間人策略
PC 端建立一個伺服器中間人程序,偽裝為 web 應用的目標伺服器。手機端 web 應用傳送的請求資料先經過中間人,中間人進行攔截處理再發送給目標伺服器。反過來,目標伺服器傳送的資料包先通過中間人,再由中間人響應給瀏覽器客戶端
這裡要注意的是,無論是個人電腦PC,還是移動端手機,都需要接入網際網路網路,可以相互找到對方才能建立通訊
一般對開發來說,個人電腦本地起的伺服器程序,在公網上是訪問不到的。一般是無線區域網,個人電腦與手機端連線同一個路由器發出的 Wi-Fi,就可以相互通訊
具體步驟:
- 在 PC 電腦本地起一個伺服器程序,監聽一個埠比如 8899
- 在手機上連線同一個區域網,配置網路代理,指向 PC 端的 IP 地址和 8899 埠
- 這樣一來,手機上所有的網路通訊都會被先轉發到 PC 端的 8899 埠,就可以對資料包進行分析處理
拿訪問 youtuBe 來說,比如電腦已經使用【伺服器軟體】成功訪問,此時只要手機配置代理指向電腦 ip 地址和指定埠,手機就可以同樣訪問 youtuBe了
4. whistle 是什麼
Whistle 是基於 Node 實現的跨平臺抓包免費除錯工具,其主要特點:
- 完全跨平臺:支援 Mac、Windows 等桌面系統,且支援服務端等命令列系統
-
功能強大:
-
支援作為 HTTP、HTTPS、SOCKS 代理及反向代理
- 支援抓包及修改 HTTP、HTTPS、HTTP2、WebSocket、TCP 請求
- 支援重放及構造 HTTP、HTTPS、HTTP2、WebSocket、TCP 請求
- 支援設定上游代理、PAC 指令碼、Hosts、延遲(限速)請求響應等
- 支援檢視遠端頁面的 console 日誌及 DOM 節點
-
支援用 Node 開發外掛擴充套件功能,也可以作為獨立 npm 包引用
-
操作簡單
-
直接通過瀏覽器檢視抓包、修改請求
- 所有修改操作都可以通過配置方式實現(類似系統 Hosts),並支援分組管理
- 專案可以自帶代理規則並一鍵配置到本地 Whistle 代理,也可以通過定製外掛簡化操作
如何快速使用 whistle
- 先安裝 node,建議用 nvm 管理
- 全域性安裝 whistle
npm i -g whistle & w2 start
安裝後,可以在電腦上設定全域性代理,代理的埠為 8899.
``` w2 proxy // 設定全域性代理
w2 proxy off // 關閉全域性代理 ```
就可以通過瀏覽器訪問 http://127.0.0.1:8899/
檢視抓包、修改請求等
如果你不想使用全域性代理,就可以安裝 SwitchyOmega
外掛,按需對某些網站設定 whistle 代理
- 選擇 Whistle 代理
- 設定 Whistle 代理
5. whistle 可以做的事情
whistle 可以做的事情很多,以下是官網圖:
一些例子配置如下圖所示:
6. whistle 實戰案例
6-1. 原生 app 載入 PC原生代碼開發
在原生 app 上已經通過 h5 域名載入了 web 頁面,但是本地開發時不想每次都走流水線或本地打包上傳程式碼;需要把原生 app 的請求代理到本地伺服器上來,前提條件是 wifi 手機與電腦可相互訪問
也就是前面提到的電腦抓 pc 的包
因為我的 web 服務端是 https 應用,因此需要下載 whistle 提供的根證書,手動匯入到手機上;點選 HTTPS 選單,然後使用手機掃描二維碼,使用手機瀏覽器開啟即可下載,在手機證書中設定進行匯入並且設定信任
此時,再在手機上配置代理指向 PC 電腦的 IP和 whistle 監聽的埠即可在電腦上截獲資料包
我本地webpack 啟動的伺服器應用訪問地址為:xxx.xxx.xxx.xxx:8080
whistle 的配置規則:
```
Rules
訪問首頁走本地
jecyu.com/webs/short-transport http://xxx.xxx.xxx.xxx:8080?deptCode=755DL # 首頁路徑
後續的請求都使用原生代碼
jecyu.com http://xxx.xxx.xxx.xxx:8080?deptCode=755DL ```
其中試過在原生 app 訪問本地應用時出現錯誤“ webpack 會提示 invalid host header”,解決方案是在 devServer 配置新增即可:
``` devServer: {
allowedHosts: 'all',
} ```
至此,成功讓原生 app 訪問PC 端本地的開發程式碼
6-2. 檢視移動端的 DOM 樣式
Whistle 能夠通過內建的 Weinre 去實現檢視移動端的 DOM
樣式,配置規則如下
```
設定 weinre
https://juejin.cn weinre://test ```
手機上重新訪問 juejin.cn 網站,然後開啟 weinre 可以看到如下,綠色表示遠端連線成功。
可以點選 Element 檢視手機上網頁 DOM 結構、樣式等資訊
也可以在 console 控制檯中,執行程式碼,比如 alert ,手機應用上會顯示彈框
7. 總結
學會抓包是軟體開發人員必須掌握的除錯技能,本文先介紹抓包的原理,再介紹抓包工具 whistle 的使用,whistle 非常強大,本文只是粗略的介紹,更多的使用技巧,大家可以檢視官方文件 whistle
作者:黃勇超
崗位:技術部門主管 | 前端開發工程師
團隊:奇霖開發團隊