圖片看不到的話可以看我CSDN上的鏈接:
https://blog.csdn.net/u013332124/article/details/84112926
一志秃、概述
無論是開發(fā)還是測試捡絮,在工作中經常會遇到需要抓包的時候考润。本篇博客主要介紹如何在各個平臺下,高效的抓包锐借。目前的抓包軟件總體可以分為兩類鞋诗,一種是設置代理抓取http包,比如Charles关噪、mitmproxy這些軟件。另一種是直接抓取經過網卡的所有協(xié)議包乌妙,其中最出名就是大名鼎鼎的wireshark以及l(fā)inux自帶的抓包軟件tcpdump使兔。下面重點介紹一下這四個抓包工具的特點以及使用
二、Wireshark
wireshark想必大多數(shù)程序員都不會陌生藤韵。wireshark在各個平臺都可以安裝使用虐沥,它可以抓取經過指定網卡的所有協(xié)議。wireshark雖然很強大泽艘,但是對初學者其實不是很友好欲险。這也正是由于它太強大,它可以抓取所有包匹涮,所以初學者在使用時面對茫茫數(shù)據(jù)流不知所措天试。初學者需要認真的去學習怎么過濾得到自己感興趣的包,但是如果不熟悉wireshark的過濾語法焕盟,要過濾數(shù)據(jù)包將舉步維艱秋秤。
過濾語法簡單介紹
wireshark的過濾語法總結起來其實也很簡單宏粤,就是以協(xié)議開頭,后面可以跟著協(xié)議的屬性灼卢,然后加上一些判斷符號绍哎,比如contains、==鞋真、>崇堰、<等等。比如只想展示http的協(xié)議內容涩咖,則直接在過濾器輸入框中輸入http即可海诲。如下圖:
比如我只想看http協(xié)議的請求頭中uri包含'/api'的協(xié)議,就可以這么寫:
如果想通過目標ip或者來源ip來過濾包檩互,就不可以以http協(xié)議為前綴了特幔,因為這些是ip協(xié)議的相關屬性。通過目標ip來過濾可以這么寫:
上面表示目標機器的ip是61.135.217.100并且協(xié)議是http的包闸昨。
wireshark支持很多種協(xié)議蚯斯,我們可以通過右上角的expression來打開搜索支持的協(xié)議,還可以找出協(xié)議支持的屬性,然后填入期待的值饵较,軟件會自動為我們構建過濾語句拍嵌。
優(yōu)缺點
優(yōu)點:
- 多平臺支持,開源免費
- 功能強大循诉,可以抓取所有協(xié)議的包
- 抓到的包容易分析
缺點:
- 由于線上服務器沒有GUI横辆,只有命令行,因此無法在線上服務器使用
- 無法分析https數(shù)據(jù)包茄猫,由于wireshark是在鏈路層獲取的數(shù)據(jù)包信息狈蚤,所以獲取到的https包是加密后的數(shù)據(jù),因此無法分析包內容募疮。當然炫惩,我們可以對https數(shù)據(jù)包進行解密僻弹, 但是操作具有一定的復雜度阿浓,可能要消耗很多時間。
三蹋绽、Tcpdump
tcpdump是linux上自帶的一個抓包軟件(mac也有)芭毙,功能強大,也可以抓取經過指定網卡的所有協(xié)議包卸耘。由于是命令行工具退敦,tcpdump抓取到的包不易于分析,一個常見的做法是將tcpdump抓到的包輸出到某個文件蚣抗,然后將文件拷貝下來用wireshark分析侈百。
tcpdump的簡單使用介紹
下面的語句參考文章:https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
一些簡單的過濾參數(shù):
# -i 參數(shù)表示抓取指定網卡的內容。具體網卡可以通過 ifconfig 命令查看
# 如果不指定網卡,默認tcpdump只會監(jiān)視第一個網絡接口
tcpdump -i eth1
# 打印所有www.baidu.com相關的包,這個host后面可以填 域名钝域,也可以填ip
tcpdump host www.baidu.com
tcpdump host 192.168.0.1
# 打印 nn1和nn2或nn3 主機間通信的包讽坏,這里可以替換成ip
tcpdump host nn1 and \( nn2 or nn3 \)
# 打印nn1和非nn2之間的ip數(shù)據(jù)包
tcpdump ip host nn1 and not nn2
# 發(fā)送者是nn1的數(shù)據(jù)包
tcpdump -i eth0 src host nn1
# 接受者是nn1的數(shù)據(jù)包
tcpdump -i eth0 dst host nn1
# 指定tcp端口是23以及host是210.27.48.1數(shù)據(jù)包
tcpdump tcp port 23 and host 210.27.48.1
抓包內容輸出到文件:
# 抓取指定網卡的包輸出到test.cap
tcpdump -i en0 -w test.cap
之后我們可以把test.cap直接用wireshark打開,就可以很直觀的分析包了例证。
用tcpdump輸出cap文件包:
tcpdump -r test.cap
優(yōu)缺點
優(yōu)點:
- 功能強大路呜,可以抓所有協(xié)議的包
- linux自帶,直接在所有的服務器上面抓包织咧,這是其他抓包軟件不具備的
缺點:
- 數(shù)據(jù)包分析困難胀葱,需要配合wireshark使用
- 和wireshark一樣,無法分析https數(shù)據(jù)包
四笙蒙、Charles
Charles是一款http抓包工具抵屿,它是通過代理來實現(xiàn)的抓包。也就是我們在訪問網頁時需要配置代理捅位,將代理指向Charles監(jiān)聽的端口晌该,之后我們的http請求都會發(fā)向Charles的端口,之后Charles會幫我們轉發(fā)并記錄協(xié)議內容绿渣。
Charles的使用非常簡單朝群,配置好代理后,Charles就開始抓包了中符。我們可以直接通過Charles的GUi查看包的內容:
上圖中的unknown表示https加密后的數(shù)據(jù)姜胖,所以看到不協(xié)議的具體內容。我們可以通過安裝Charles的證書淀散,讓Charles也可以查看https協(xié)議的具體內容右莱。
優(yōu)缺點
優(yōu)點:
- 使用簡單,只需配置一下代理地址就可以
- 要抓取https協(xié)議的配置也很簡單档插,只要安裝下charles的證書就可以了
缺點:
- 只支持抓取http協(xié)議
五慢蜓、mitmproxy
mitmproxy是python寫的一款http抓包工具,雖然只支持http抓包郭膛,但是它的特性非常強大晨抡,它不僅可以抓包,還可以對請求進行攔截则剃、重現(xiàn)等操作耘柱。和Charles一樣,它的原理也是基于代理棍现,使用的時候需要設置代理指向它调煎。
mitmproxy是命令行工具,但是也自帶了mitmweb工具己肮,可以讓用戶在網頁上操作士袄。另外悲关,mitmproxy還支持用戶自行編寫插件,可以編寫腳本對請求進行處理娄柳,然后把修改后的請求發(fā)出去坚洽。
安裝
首先需要在機器安裝python3以及pip3.之后通過pip3安裝
pip3 install mitmproxy
安裝python3的教程可以看我的博客:
如果安裝mitmproxy過程中報錯ModuleNotFoundError: No module named '_ssl'
,就需要安裝一下OpenSSL西土,然后再重新編譯安裝一下python3
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++
# 去Python3的安裝目錄再次安裝編譯一次python3
make && make install
安裝好openSSL后再執(zhí)行pip3 install mitmproxy
使用
安裝后讶舰,直接在命令行輸入mitmproxy
就會進入它的交互界面:
這時候mitmproxy已經開始監(jiān)聽8080端口(默認),接著,我們可以去瀏覽器設置代理需了。瀏覽器設置代理的方式有很多,這里不多做介紹跳昼。
設置完代理后,訪問瀏覽器的請求都會被發(fā)到mitmproxy上肋乍,mitmproxy根據(jù)規(guī)則對請求進行攔截(不配置攔截規(guī)則的話則都不攔截)鹅颊,所有經過的請求都會被輸出:
在交互界面上可以通過快捷鍵操作請求。輸入問號'?'墓造,可以查看快捷鍵的文檔堪伍。
下面介紹一些常用的快捷鍵和功能
1. 請求過濾
在請求列表交互界面,按下f鍵后觅闽,可以輸入一些過濾規(guī)則:
具體的過濾語法可以按下'?'鍵后帝雇,再按下方向鍵右'—>'或者l鍵。
2. 請求攔截
按下i鍵后蛉拙,可以對指定的請求進行攔截尸闸。按mitmproxy收到指定條件的請求時,不會立馬把它轉發(fā)出去孕锄,而是等待我們執(zhí)行resume操作后吮廉,才會把請求轉發(fā)出去——在這期間我們甚至可以對請求進行手動修改。
紅色字體表示該請求被攔截
之后我們可以按入a鍵來恢復該請求畸肆,可以輸入A鍵恢復所有被攔截的請求宦芦。
3. 查看/編輯請求
把指示光標移動到某個請求上,按回車可以查看請求的內容轴脐〉鞅埃或者鼠標直接點擊請求也可以。
之后通過左右方向鍵可以查看request豁辉、response令野、detail等信息舀患。
如果要編輯請求徽级,可以在這個界面輸入e,然后會讓我們選擇編輯哪塊內容:
之后就會進入vim編輯界面編輯相應的內容了(保存后會生效)聊浅。
4. 重發(fā)請求
mitmproxy的光標指向某個請求時餐抢,按下r鍵可以重發(fā)這個請求(重發(fā)前可以對該請求進行編輯)现使。
按下':'鍵后,可以輸入命令旷痕,這樣我們就可以通過過濾規(guī)則批量的重發(fā)請求
replay.client
是mitmproxy內置的一個命令碳锈,我們也可以自行編寫命令。命令的編寫可以參考官網文檔欺抗,這里不做介紹售碳。
5. 插件開發(fā)
我們可以編寫插件,然后再啟動的時候指定插件绞呈,mitmproxy處理請求的時候會執(zhí)行一個插件的鏈贸人,這樣我們就可以對請求進行編輯然后再發(fā)送出去了。
借用官網的插件demo:
from mitmproxy import ctx
class Counter:
def __init__(self):
self.num = 0
def request(self, flow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
addons = [
Counter()
]
這個方法對每一個請求進行處理佃声,然后打印序號艺智。通過mitmproxy -s test.py
來讓插件生效。通過插件可以綁定各種連接事件圾亏。感興趣的朋友可以自行去mitmproxy官網看文檔十拣,這里不多做介紹。
6. 保存抓到的請求數(shù)據(jù)
通過w快捷鍵我們可以把這次抓到的請求包保存到文件上志鹃。
通過mitmproxy -r file
可以讀取以前抓取的請求信息進行分析夭问。
優(yōu)缺點
優(yōu)點:
- 命令行操作,可以在無GUI界面的服務器上使用
- 安裝好mitmproxy提供的證書后曹铃,也可以分析https請求
- 不僅可以抓包甲喝,還支持對包的攔截、修改铛只、重復埠胖,這是常規(guī)抓包軟件不具備的
缺點:
- 僅支持http協(xié)議的抓包
附錄
mitmproxy官方文檔地址:
https://docs.mitmproxy.org/stable/
六、總結
對于這幾個抓包神器淳玩,我總結了下使用場景:
- 只抓http協(xié)議的話直撤,推薦使用mitmproxy。mitmproxy豐富的功能不僅可以滿足我們的抓包需求蜕着,還可以提升我們的工作效率谋竖。比如測試可以抓包后一鍵重發(fā)請求來重現(xiàn)bug,開發(fā)調試的時候可以修改請求內容等等承匣。
- 如果是在線上的沒有GUI的服務器蓖乘,推薦使用tcpdump,雖然mitmproxy也可以支持命令行抓包韧骗,但是生產環(huán)境的服務器最好不要亂安裝第三方插件嘉抒。另外,大多數(shù)服務器都有裝tcpdump袍暴。我們可以通過把請求的內容輸出到文件些侍,然后拷貝會自己的電腦用wireshark分析隶症。
- 想要抓取http以外的協(xié)議的話,直接上wireshark岗宣。功能強大
- 對于Charles蚂会,感覺用了mitmproxy之后,就基本用不上Charles了耗式。Charles好像也可以編輯后再發(fā)送胁住,但是感覺不是很好用,可能我用的不是很熟吧刊咳。