mitmproxy如何自动绕过所有产生连接错误的主机
mitmproxy 没有内置「遇连接错误自动永久绕过对应主机」的开箱功能,但可以通过以下两种无需提前枚举报错主机的方案实现需求,不需要手动维护--ignore-hosts列表:
方案1:运行时钩子动态更新忽略列表(最匹配需求)
通过mitmproxy的插件钩子,在触发TLS握手失败、证书校验错误(包含客户端Certificate Pinning校验失败场景)、服务端连接失败时,自动将对应目标主机加入运行时忽略列表,后续该主机流量直接透传,不经过中间人解密,不会再触发同类错误。
操作步骤:
- 新建插件文件
auto_ignore.py,写入以下代码:
from mitmproxy import ctx from mitmproxy.addonmanager import Loader from mitmproxy.connection import Server from mitmproxy.tls import TlsData runtime_ignored = set() def load(loader: Loader): # 加载启动时已配置的ignore_hosts规则,避免覆盖原有配置 for rule in ctx.options.ignore_hosts: runtime_ignored.add(rule) def tls_failed_client(data: TlsData): # TLS握手失败(含证书pinning错误)时自动加忽略规则 server_addr = data.context.server.address if not server_addr: return host = server_addr[0] if host in runtime_ignored: return rule = f"^{host}:.*$" runtime_ignored.add(rule) ctx.options.ignore_hosts = list(runtime_ignored) ctx.log.info(f"Auto bypass host due to TLS error: {host}") def server_connect_error(data: Server): # 服务端连接失败场景同步处理 if not data.address: return host = data.address[0] if host in runtime_ignored: return rule = f"^{host}:.*$" runtime_ignored.add(rule) ctx.options.ignore_hosts = list(runtime_ignored) ctx.log.info(f"Auto bypass host due to connection error: {host}")
- 启动mitmproxy时加载该插件即可:
mitmproxy -s auto_ignore.py
说明:该方案下首次访问报错主机时会触发一次连接失败,之后同主机的所有请求都会被自动透传。如果需要避免首次连接报错,可以搭配方案2使用。如果需要持久化忽略规则,在插件里加几行文件读写逻辑,把触发过的主机存入本地文本、启动时自动加载即可。
方案2:透明代理默认透传模式
如果采用透明代理部署(无需客户端手动配置代理地址),可以直接配置默认透传策略,仅对需要抓包的目标主机启用中间人解密,从根源避免证书绑定类错误,完全不需要维护忽略列表。
启动命令参考:mitmproxy --mode transparent --ssl-insecure --set connection_strategy=lazy
该模式下所有流量默认直接转发,只有你主动在mitmproxy控制台或通过插件标记需要拦截的主机才会进行TLS中间人解密,其余流量不会触发证书校验相关错误。
注意事项
单独使用--ssl-insecure参数无法解决证书pinning问题:该参数仅控制mitmproxy是否校验上游服务端的证书有效性,证书pinning是客户端本地校验mitmproxy伪造的证书与本地预置证书是否匹配,这类错误必须通过透传对应主机流量才能绕过。
内容的提问来源于stack exchange,提问作者M9A

