1. 程式人生 > >抓包那些事——四大抓包神器簡介

抓包那些事——四大抓包神器簡介

文章目錄

一、概述

無論是開發還是測試,在工作中經常會遇到需要抓包的時候。本篇部落格主要介紹如何在各個平臺下,高效的抓包。目前的抓包軟體總體可以分為兩類,一種是設定代理抓取http包,比如Charles、mitmproxy這些軟體。另一種是直接抓取經過網絡卡的所有協議包,其中最出名就是大名鼎鼎的wireshark以及linux自帶的抓包軟體tcpdump。下面重點介紹一下這四個抓包工具的特點以及使用

二、Wireshark

wireshark想必大多數程式設計師都不會陌生。wireshark在各個平臺都可以安裝使用,它可以抓取經過指定網絡卡的所有協議。wireshark雖然很強大,但是對初學者其實不是很友好。這也正是由於它太強大,它可以抓取所有包,所以初學者在使用時面對茫茫資料流不知所措。初學者需要認真的去學習怎麼過濾得到自己感興趣的包,但是如果不熟悉wireshark的過濾語法,要過濾資料包將舉步維艱。

過濾語法簡單介紹

wireshark的過濾語法總結起來其實也很簡單,就是以協議開頭,後面可以跟著協議的屬性,然後加上一些判斷符號,比如contains、==、>、<等等。比如只想展示http的協議內容,則直接在過濾器輸入框中輸入http即可。如下圖:
在這裡插入圖片描述
比如我只想看http協議的請求頭中uri包含’/api’的協議,就可以這麼寫:

在這裡插入圖片描述

如果想通過目標ip或者來源ip來過濾包,就不可以以http協議為字首了,因為這些是ip協議的相關屬性。通過目標ip來過濾可以這麼寫:

在這裡插入圖片描述

上面表示目標機器的ip是61.135.217.100並且協議是http的包。

wireshark支援很多種協議,我們可以通過右上角的expression來開啟搜尋支援的協議,還可以找出協議支援的屬性,然後填入期待的值,軟體會自動為我們構建過濾語句。

在這裡插入圖片描述

在這裡插入圖片描述

優缺點

優點:

  1. 功能強大,可以抓取所有協議的包
  2. 抓到的包容易分析

缺點:

  1. 由於線上伺服器沒有GUI,只有命令列,因此無法在線上伺服器使用
  2. 無法分析https資料包,由於wireshark是在鏈路層獲取的資料包資訊,所以獲取到的https包是加密後的資料,因此無法分析包內容。當然,我們可以對https資料包進行解密, 但是操作具有一定的複雜度,可能要消耗很多時間。

三、Tcpdump

tcpdump是linux上自帶的一個抓包軟體(mac也有),功能強大,也可以抓取經過指定網絡卡的所有協議包。由於是命令列工具,tcpdump抓取到的包不易於分析,一個常見的做法是將tcpdump抓到的包輸出到某個檔案,然後將檔案拷貝下來用wireshark分析。

tcpdump的簡單使用介紹

下面的語句參考文章:https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

一些簡單的過濾引數:

# -i 引數表示抓取指定網絡卡的內容。具體網絡卡可以通過 ifconfig 命令檢視
# 如果不指定網絡卡,預設tcpdump只會監視第一個網路介面
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資料包
tcpdump ip host nn1 and not nn2
# 傳送者是nn1的資料包
tcpdump -i eth0 src host nn1
# 接受者是nn1的資料包
tcpdump -i eth0 dst host nn1
# 指定tcp埠是23以及host是210.27.48.1資料包
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

優缺點

優點:

  1. 功能強大,可以抓所有協議的包
  2. linux自帶,直接在所有的伺服器上面抓包,這是其他抓包軟體不具備的

缺點:

  1. 資料包分析困難,需要配合wireshark使用
  2. 和wireshark一樣,無法分析https資料包

四、Charles

Charles是一款http抓包工具,它是通過代理來實現的抓包。也就是我們在訪問網頁時需要配置代理,將代理指向Charles監聽的埠,之後我們的http請求都會發向Charles的埠,之後Charles會幫我們轉發並記錄協議內容。

Charles的使用非常簡單,配置好代理後,Charles就開始抓包了。我們可以直接通過Charles的GUi檢視包的內容:

在這裡插入圖片描述

上圖中的unknown表示https加密後的資料,所以看到不協議的具體內容。我們可以通過安裝Charles的證書,讓Charles也可以檢視https協議的具體內容。

在這裡插入圖片描述

優缺點

優點:

  1. 使用簡單,只需配置一下代理地址就可以
  2. 要抓取https協議的配置也很簡單,只要安裝下charles的證書就可以了

缺點:

  1. 只支援抓取http協議

五、mitmproxy

mitmproxy是python寫的一款http抓包工具,雖然只支援http抓包,但是它的特性非常強大,它不僅可以抓包,還可以對請求進行攔截、重現等操作。和Charles一樣,它的原理也是基於代理,使用的時候需要設定代理指向它。

mitmproxy是命令列工具,但是也自帶了mitmweb工具,可以讓使用者在網頁上操作。另外,mitmproxy還支援使用者自行編寫外掛,可以編寫指令碼對請求進行處理,然後把修改後的請求發出去。

安裝

首先需要在機器安裝python3以及pip3.之後通過pip3安裝

pip3 install mitmproxy

安裝python3的教程可以看我的部落格:

Centos 安裝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後再執行pip3 install mitmproxy

使用

安裝後,直接在命令列輸入mitmproxy就會進入它的互動介面:

在這裡插入圖片描述

這時候mitmproxy已經開始監聽8080埠(預設),接著,我們可以去瀏覽器設定代理。瀏覽器設定代理的方式有很多,這裡不多做介紹。

設定完代理後,訪問瀏覽器的請求都會被髮到mitmproxy上,mitmproxy根據規則對請求進行攔截(不配置攔截規則的話則都不攔截),所有經過的請求都會被輸出:

在這裡插入圖片描述

在互動介面上可以通過快捷鍵操作請求。輸入問號’?’,可以檢視快捷鍵的文件。

在這裡插入圖片描述

下面介紹一些常用的快捷鍵和功能

1. 請求過濾

在請求列表互動介面,按下f鍵後,可以輸入一些過濾規則:

在這裡插入圖片描述

具體的過濾語法可以按下’?‘鍵後,再按下方向鍵右’—>'或者l鍵。

在這裡插入圖片描述

2. 請求攔截

按下i鍵後,可以對指定的請求進行攔截。按mitmproxy收到指定條件的請求時,不會立馬把它轉發出去,而是等待我們執行resume操作後,才會把請求轉發出去——在這期間我們甚至可以對請求進行手動修改。

在這裡插入圖片描述

紅色字體表示該請求被攔截

之後我們可以按入a鍵來恢復該請求,可以輸入A鍵恢復所有被攔截的請求。

3. 檢視/編輯請求

把指示游標移動到某個請求上,按回車可以檢視請求的內容。或者滑鼠直接點選請求也可以。

在這裡插入圖片描述

之後通過左右方向鍵可以檢視request、response、detail等資訊。

如果要編輯請求,可以在這個介面輸入e,然後會讓我們選擇編輯哪塊內容:

在這裡插入圖片描述
之後就會進入vim編輯介面編輯相應的內容了(儲存後會生效)。

4. 重發請求

mitmproxy的游標指向某個請求時,按下r鍵可以重發這個請求(重發前可以對該請求進行編輯)。

在這裡插入圖片描述

按下’:'鍵後,可以輸入命令,這樣我們就可以通過過濾規則批量的重發請求

在這裡插入圖片描述

replay.client是mitmproxy內建的一個命令,我們也可以自行編寫命令。命令的編寫可以參考官網文件,這裡不做介紹。

5. 外掛開發

我們可以編寫外掛,然後再啟動的時候指定外掛,mitmproxy處理請求的時候會執行一個外掛的鏈,這樣我們就可以對請求進行編輯然後再發送出去了。

借用官網的外掛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. 儲存抓到的請求資料

通過w快捷鍵我們可以把這次抓到的請求包儲存到檔案上。

通過mitmproxy -r file可以讀取以前抓取的請求資訊進行分析。

優缺點

優點:

  1. 命令列操作,可以在無GUI介面的伺服器上使用
  2. 安裝好mitmproxy提供的證書後,也可以分析https請求
  3. 不僅可以抓包,還支援對包的攔截、修改、重複,這是常規抓包軟體不具備的

缺點:

  1. 僅支援http協議的抓包

附錄

mitmproxy官方文件地址:

https://docs.mitmproxy.org/stable/

六、總結

對於這幾個抓包神器,我總結了下使用場景:

  1. 只抓http協議的話,推薦使用mitmproxy。mitmproxy豐富的功能不僅可以滿足我們的抓包需求,還可以提升我們的工作效率。比如測試可以抓包後一鍵重發請求來重現bug,開發除錯的時候可以修改請求內容等等。
  2. 如果是在線上的沒有GUI的伺服器,推薦使用tcpdump,雖然mitmproxy也可以支援命令列抓包,但是生產環境的伺服器最好不要亂安裝第三方外掛。另外,大多數伺服器都有裝tcpdump。我們可以通過把請求的內容輸出到檔案,然後拷貝會自己的電腦用wireshark分析。
  3. 想要抓取http以外的協議的話,直接上wireshark。功能強大
  4. 對於Charles,感覺用了mitmproxy之後,就基本用不上Charles了。Charles好像也可以編輯後再發送,但是感覺不是很好用,可能我用的不是很熟吧。