Mitmproxy プロキシ構成とインターフェイスの暗号化と復号化の詳細なチュートリアル
公式サイト:イベントフックと API (mitmproxy.org)
このセクションのカタログには以下が表示されます。
記事ディレクトリ
クライアントのダウンロード
方法 1
https://mitmproxy.org/downloads/
方法 2
mitmproxy をインストールする
pip install mitmproxy
mitmproxy
異なる起動モードを持つ 3 つのコマンドが提供されています。
mitmproxy
コマンド ライン インターフェイスを提供します (このコマンドは Windows をサポートしません)。
mitmdump
単純な端末出力を提供します。
mitmweb
ブラウザインターフェイスを提供します。
mitmproxy -p 指定的端口号
mitmdump -p 指定的端口号
mitmweb -p 指定的端口号
共通パラメータ
-h 帮助信息
-p 修改监听端口
-s 加载 python 脚本
証明書のインストール
注: インストールする前に、まずプロキシ接続を有効にする必要があります。
インストール用にプロキシを構成するか、mitmproxy のインストール ディレクトリに直接移動してインストール用の証明書を取得する必要があります。
mitmproxy に接続した後、電話またはデバイスはプロキシを設定する必要があります。http://mitm.it/ と入力して証明書をインストールしてください。
http://mitm.it/
mitmproxy プロキシ iOS デバイス
サービスを開始する
ポート8899を指定してサービスを開始します
mitmdump -p 8899
iOSデバイス構成エージェント
コンピューターと iOS デバイスが同じ LAN に接続されていることを確認してください。
1. コンピュータのIPを取得する
-
ipconfig (Windows) ifconfig (Mac/Linux)
2. iOS デバイスでエージェントを構成し、iOS デバイスで設定アプリケーションを開きます。
3. [Wi-Fi] をクリックし、接続している Wi-Fi ネットワークを見つけます。ネットワーク名の横にある「i」アイコンをクリックすると、ネットワークの詳細が表示されます。
4. ネットワークの詳細ページで、下にスクロールして「HTTP プロキシ」オプションを見つけます。「手動」を選択します。
5. [サーバー] フィールドに mitmproxy が実行されているコンピュータの IP アドレスを入力し、[ポート] フィールドに mitmproxy のリスニング ポートを入力します (デフォルトは 8080)。
6. 設定を保存し、設定アプリケーションを閉じます。
7. ブラウザに入力してhttp://mitm.it/
証明書をインストールします。
8. 証明書の信頼設定に移動します: [設定] -> [一般] -> [VPN とデバイス管理] -> [mitmproxy] をクリックしてインストールします。
9. インストール成功
10. 証明書を信頼します。[一般] -> [このマシンについて] -> [証明書の信頼設定] にプルダウンし、[mitmproxy] を見つけてクリックして信頼を切り替えます。
これで、iOS デバイスは mitmproxy を通過し、すべてのネットワーク要求と応答は mitmproxy 上で傍受および変更できるようになります。これらの要求と応答は、mitmproxy のインターフェイスで表示および操作できます。
Android は通常、セキュリティ - 暗号化と資格情報 - ユーザーに証明書をインストールしますが、場合によってはさらに多くの WLAN 設定をインストールします。
エラーを報告する
クライアントの TLS ハンドシェイクが失敗しました。クライアントと mitmproxy は、使用する TLS バージョンについて合意できません。mitmproxy の tls_version_client_min オプションを調整する必要がある場合があります。
次のコマンドを使用してください。無視してください。今のところ影響はありません。
mitmdump -p 8899 --set tls_version_client_min=SSL3
Webスクレイピングを使用する
mitmweb -p 8899
コードフィルタリング
コードのリスト mitmproxt_demo01.py
# -*- coding: utf-8 -*-
'''
@Time : 2023/8/7 18:16
@Email : [email protected]
@公众号 : 梦无矶的测试开发之路
@File : mitmproxy示列.py
'''
__author__ = "梦无矶小仔"
import mitmproxy
from mitmproxy import ctx,http
class Counter:
def __init__(self):
pass
# 所有发出的请求数据包都会被这个方法所处理
def request(self, flow: mitmproxy.http.HTTPFlow):
# 获取请求对象
request = flow.request
# 实例化输出类
info = ctx.log.info
# 打印请求的url
info(request.url)
# 打印请求方法
info(request.method)
# 打印host头
info(request.host)
# 打印请求端口
info(str(request.port))
# 打印所有请求头部
info(str(request.headers))
# 打印cookie头
info(str(request.cookies))
print("请求的参数data----------------------")
info(str(request.data))
print("请求的参数data----------------------")
# 所有服务器响应的数据包都会被这个方法处理
def response(self, flow: mitmproxy.http.HTTPFlow):
# 获取响应对象
response = flow.response
# 实例化输出类
info = ctx.log.info
# 打印响应码
info(str(response.status_code))
# 打印所有头部
info(str(response.headers))
# 打印cookie头部
info(str(response.cookies))
# 打印响应报文内容
info(str(response.text))
addons = [
Counter()
]
スクリプト経由で開始
mitmweb -p 8899 -s .\mitmproxy_demo01.py
暗号化と復号化
Python Windowsで AES を使用する場合は、pycryptodome モジュールをインストールする必要があります
pip install pycryptodome
Python Linuxで AES を使用する場合は、pycrypto モジュールをインストールする必要があります
pip install pycrypto
文字置換
aaa = '151691566822749_NEW_RDA_LOADOKaRgN'
これはSOH
ACCIC コード 1 に対応します。
# 所以可以这样进行替换
repl_aaa = aaa.replace(chr(1), " ")
文字列をバイナリに変換する
string = "Hello World"
binary = " ".join(format(ord(char), '08b') for char in string)
print(binary)
このコードを実行すると、01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100
「Hello World」のバイナリ表現である が出力されます。
この例では、format(ord(char), '08b')
各文字が 8 ビットのバイナリ文字列に変換され、join()
関数を使用して各文字のバイナリ表現がスペースで区切られ、文字列全体のバイナリ表現を含む文字列が生成されます。
文字列からバイトへ
Python では、stringencode()
メソッドを使用して、文字列をバイト (バイト) 型のデータに変換できます。文字エンコーディングを指定して、バイト表現で文字をエンコードする方法を決定できます。
以下は、文字列をバイトに変換する方法を示すサンプル コードです。
string = "Hello World"
bytes_data = string.encode('utf-8')
print(bytes_data)
このコードを実行するとb'Hello World'
、文字列「Hello World」のバイト表現である が出力されます。
この例では、encode()
メソッドは UTF-8 エンコーディングを使用して文字列をバイトに変換します。デフォルトでは、Python は文字エンコーディングとして UTF-8 を使用します。特定のニーズに応じて、「utf-16」、「latin-1」などの他の文字エンコード方法を選択できます。
なお、バイト型データはb
で始まる文字列で表され、通常の文字列ではなくバイトデータであることを示しています。
実践的なデモンストレーション
aaa = '151691566822749_NEW_RDA_LOADOKaRgNxBJEpvYo1FdZQu9d85ExmqB97SpGUPvMmSYZXIauvSu9IgrpJSK5PAs4DMMNONB2daybYwrdCjCWKUOPUb1KTPyiHYfo9EVg5jMXkDMT7xebOYk0x0loFWsSEKguYmVe5U2jAc5EDPn8nIBLTxGXSeL/S6ZbXJhEszrI1FJ/CYxjZfQKVQhMENxsN8O/yhK2AgXQe4CDQT3+sxlLCFw5XcG4IGoD8kyyHbpulwjOQW98orOf2DBZkHjxFqjFo6G/7SVZ3wr0ER05uAopJpc8XBJSTfhNAzKT2JwatMG7beFxUzrBeuNJp7MHKJUUYjfUNeqhGF1dKaya1HdOxfUoWuCMUV0XMroNItipbLj0ZX5ZfftN/eskoZjDvYDvU0Oyt6xC7RZVIOLbyOlmWQ8Pl7NHzqFeVUqViVyGIaA8HsivAw+lStBo+W6qDCbkgAAg6Z+8fsiSjgDSgpLJSwBqO75HzRUDRHhHc9/Wqqdeq2pE6PnlrJ6XWrXooBwg0bbecb50d88e230df396fb6a53532280;'
binary = aaa.encode('utf-8')
print(binary)
出力
b'1\x015\x011691566822749\x01_NEW_RDA_LOADOK\x01aRgNxBJEpvYo1FdZQu9d85ExmqB97SpGUPvMmSYZXIauvSu9IgrpJSK5PAs4DMMNONB2daybYwrdCjCWKUOPUb1KTPyiHYfo9EVg5jMXkDMT7xebOYk0x0loFWsSEKguYmVe5U2jAc5EDPn8nIBLTxGXSeL/S6ZbXJhEszrI1FJ/CYxjZfQKVQhMENxsN8O/yhK2AgXQe4CDQT3+sxlLCFw5XcG4IGoD8kyyHbpulwjOQW98orOf2DBZkHjxFqjFo6G/7SVZ3wr0ER05uAopJpc8XBJSTfhNAzKT2JwatMG7beFxUzrBeuNJp7MHKJUUYjfUNeqhGF1dKaya1HdOxfUoWuCMUV0XMroNItipbLj0ZX5ZfftN/eskoZjDvYDvU0Oyt6xC7RZVIOLbyOlmWQ8Pl7NHzqFeVUqViVyGIaA8HsivAw+lStBo+W6qDCbkgAAg6Z+8fsiSjgDSgpLJSwBqO75HzRUDRHhHc9/Wqqdeq2pE6PnlrJ6XWrXooBwg\x01\x010bbecb50d88e230df396fb6a53532280\x01;'
一見何のことはないように見えますが、実際の暗号化・復号化ではこの方法で一連の操作を行う必要があり、この工程が基本操作と言えます。
復号化コード
これには関連する秘密が含まれるため、表示できません。このインターフェイスが暗号化されている場合は、対応する秘密キーが存在します。
インターフェイスの作成後にこの部分を復号化する必要がある場合は、対応する開発者を見つけて秘密キーを提供してください。
この秘密キーは、django settings.py ファイルの SECRET_KEY フィールドに似ています。