中文官網 https://ptorch.com/docs/10/mitmproxy-concepts-options
之前寫過一篇部落格介紹fiddler的 https://www.cnblogs.com/zichliang/p/16067941.html
今天來說說mitmproxy 也是一款不錯的抓包軟體,因為之前寫了 這篇文章對其再進行一些補充
mitmproxy 不僅可以抓包 還可以對包進行2次過濾 並且偽裝請求 與python 進行互動,相比fiddler 和charles 更為靈活。
mitmproxy抓包工具
1. mitmproxy 介紹與安裝
需要安裝python環境
1. mitmproxy 是什麼
mitmproxy是一組工具,可為HTTP/1,HTTP/2和WebSockets提供互動式的,具有SSL/TLS功能的攔截代理。
- 攔截HTTP和HTTPS請求和響應並即時修改它們;
- 儲存完整的HTTP對話以供以後重播和分析;
- 重播HTTP對話的客戶端;
- 重播先前記錄的伺服器的HTTP響應;
- 反向代理模式將流量轉發到指定的伺服器;
- macOS和Linux上的透明代理模式;
- 使用Python對HTTP流量進行指令碼化更改;
- 即時生成用於攔截的SSL/TLS證照
2. 安裝
直接開始安裝
mitmproxy 命令不支援在 windows 系統中執行,所以可以選擇linux虛擬機器來完成
在 linux 中:
sudo pip3 install mitmproxy
在 windows 中,以管理員身份執行 cmd 或 power shell:
pip3 install mitmproxy
安裝結束。
完成後,可以執行 mitmproxy 、 mitmdump 、 mitmweb 三個命令,我們可以拿 mitmdump 測試一下安裝是否成功,執行:
PS D:\kyls_working> mitmdump --version
Mitmproxy: 8.0.0
Python: 3.9.6
OpenSSL: OpenSSL 1.1.1m 14 Dec 2021
Platform: Windows-10-10.0.22000-SP0
執行
要啟動 mitmproxy 用
mitmproxy 、
mitmdump 、
mitmweb
這三個命令中的任意一個即可,這三個命令功能一致,且都可以載入自定義指令碼,唯一的區別是互動介面的不同。
!!!!在執行過程需要安裝mitmproxy 的安全證照
http://mitm.it/ 點選這個連結去選擇安裝安全證照
然後選擇響應的系統去下載安裝即可
安裝過程如下
然後下一步確定即可
記得一定要重啟瀏覽器
1. mitmproxy
使用SwitchyOmega
關注下 人家的github https://github.com/FelisCatus/SwitchyOmega
來設定代理伺服器
然後在瀏覽器上設定好 就可以使用mitmproxy
在mitmproxy 命令列中 透過
- 上下鍵 來選擇包
- 回車是進入
- tab 是切換 request response 和detail
- ESC+q 是退出
2. mitmdump
mitmdump -w test.txt
將抓到的資料 存入test.txt
然後就會發現 自己的檔案一堆亂碼
沒關係 我們之後用python去讀取 就行了
3.mitmweb(不推薦 很不好用)
直接在終端輸入 mitmweb 會發現會直接進入瀏覽器
然後重新整理你的網站 就會發現在web端抓到你的資料包了
和fidder一樣是一個展示視窗
2. mitmproxy 手機端抓包
mitmproxy
mitmdump
mitmweb
設定mitmproxy
在linux上啟動mitmproxy
會啟動8080埠
如果要改變埠號 使用如下命令
mitmproxy -p 8888
監聽的埠號就變成了8888
設定手機模擬器
在 夜神模擬器的手機中
長按wifi 修改 手機的代理伺服器的ip地址
修改為你的mitmproxy 的伺服器地址和設定的埠號
| 然後返回瀏覽器
輸入 mitm.it 安裝 安卓的證照
即可完成設定 |
---|
檢視證照
設定——> 安全——>受信任的憑據——>使用者
清除資料包
按鍵盤上的 z
1. 功能鍵
訪問瀏覽器
然後在我們的手機瀏覽器中輸入http://www.baidu.com
即可完成抓包
檢視某個資料包
上下鍵 選擇資料包 回車進入詳細資料包
退出某個資料包
q
清除資料包
z
退出
按下 q 然後再使用y完成退出
2. 資料包的過濾
啟動mitmproxy 並且啟動手機
開啟網址 www.baidu.com
就會發現我們抓到了很多資料包
然後我們 輸入字母 f
過濾表示式
光這個表格我就抄了好久... 不容易啊
mitmproxy
工具中的許多命令都使用過濾器表示式。過濾器表示式由以下運算子組成
命令 | 描述 |
---|---|
~a | 匹配響應資源: CSS,Javascript,Flash,images. |
~b regex | Body |
~bg regex | 請求的Body |
~bs regex | 響應的Body |
~c int | HTTP響應碼 |
~d regex | 域名 |
~dst regex | 匹配目標地址 |
~e | 匹配錯誤 |
~h regex | Header |
~hq regex | 請求Header |
~hs regex | 響應Header |
~http | 匹配HTTP流 |
~m regex | 方法 |
~marked | 匹配marked流 |
~q | 匹配無響應請求 |
~s | 匹配response響應 |
~src regex | 匹配來源地址 |
~t regex | Content-type header |
~tcp | 匹配TCP流 |
~tg regex | 請求Content-Type Header |
~ts regex | 響應Content-Type Header |
~u regex | 網址URL |
~websocket | 匹配WebSocket流(和HTTP-WebSocket握手流) |
! | 一元非 |
& | 和 |
| | 或 |
(...) | 分組 |
檢視流選擇器
在互動式上下文中,mitmproxy具有一組在當前檢視上執行的便捷流選擇器:
@all 所有流量
@focus 當前關注的流程
@shown 當前顯示的所有流
@hidden 當前隱藏所有流
@marked 所有標記的流
@unmarked 所有未標記的流
這些經常在命令和鍵繫結中使用
例子
- 篩選出非200的請求
set viewer_filter '!~c 200'
- 篩選出百度這個域名的所有請求
set viewer_filter '~d baidu.com'
- 篩選post請求且是百度的請求
set viewer_filter '~m post & ~d baidu.com'
set viewer_filter '~m post & ~u baidu.com'
3. mitm 設定斷點攔截
輸入字母 i 以此來 寫斷點條件
請求篡改
例:
- 斷點 百度域名且是 get的
set intercept '~d baidu.com & ~m get'
![斷點 百度域名且是 get的.png](../../_resources/斷點 百度域名且是 get的.png)
然後選擇紅色的資料包 點選回車進入
斷點輸入E修改詳細數值
然後修改 我們的url 修改為
https:xw.qq.com 並且刪除掉我們headers裡的hosts
然後按q退出到列表頁
按下 a 進行重新載入 即可完成請求篡改
響應篡改
進入 除錯介面 進入
我們進入 response.body 即可 完成響應篡改
3. mitmdump 的使用
!!!注意更換裝置就要再安裝一臺證照
mitmdump 非常重要 他可以和python指令碼進行互動
在windows下直接輸入
mitmdump
更換埠號
mitmdump -p 8888
載入自定義python指令碼
mitmdump -p 8888 -s test.py
指令碼有固定格式
# -*- coding: utf-8 -*-
# @Time : 2022/11/29 17:20
# @Author : lzc
# @Email : hybpjx@163.com
# @File : request.py
# @Software: PyCharm
# @blog : https://www.cnblogs.com/zichliang
# 必須這麼寫
def request(flow):
print(flow.request.headers)
我們設定好代理 安裝好安全證照後 訪問 http://httpbin.org/get
就會發現我們的服務端顯示 headers的全部內容
第一個是我們需要的資訊
然後我們會可以使用 mitmproxy 的ctx中的log日誌模組 來記錄我們的內容
# -*- coding: utf-8 -*-
# @Time : 2022/11/29 18:20
# @Author : lzc
# @Email : hybpjx@163.com
# @File : mitmproxy.py
# @Software: PyCharm
# @blog : https://www.cnblogs.com/zichliang
from mitmproxy import ctx
# 必須這麼寫
def request(flow):
# print(flow.request.headers)
# # 請求頭
# ctx.log.info(str(flow.request.headers))
# ctx.log.warn(str(flow.request.headers))
# ctx.log.error(str(flow.request.headers))
# # 請求的連結地址
# ctx.log.error(str(flow.request.url))
# # 請求的主機頭
# ctx.log.error(str(flow.request.host))
# # 請求的方法
ctx.log.error(str(flow.request.method))
# # 請求的路徑
# ctx.log.error(str(flow.request.path))
重新啟動我們的mitmproxy 並且重新訪問一下url就會得到……
這樣就能對顏色進行區分
也可以對響應內容進行訪問
# -*- coding: utf-8 -*-
# @Time : 2022/11/29 18:31
# @Author : lzc
# @Email : hybpjx@163.com
# @File : response.py
# @Software: PyCharm
# @blog : https://www.cnblogs.com/zichliang
def response(flow):
# 響應的狀態碼
ctx.log.error(str(flow.response.status_code))
# 響應的內容
ctx.log.error(str(flow.response.text))
使用mitmdump 代理
mitmdump -s test.py -p 8889 --mode upstream:https://xxx.xxx --stream-auth 通行證照+密碼 -p 8889