🧛‍♂️Mitmproxy 偷偷抓取你的信息
00 分钟
2024-4-18
2024-4-24
type
status
date
slug
summary
tags
category
icon
password
URL

Mitmproxy 功能介绍

  1. 实时拦截,修改 HTTP/HTTPS 请求和相应
  1. 可保存完整的 Http 会话,方便后续分析和重放
  1. 支持反向代理模拟将流量转发到指定服务器
  1. 支持 macOS 和 Linux 上的透明代理模式
  1. 支持用Python 脚本对 HTTP 通信进行修改
 

Mitmproxy 通信原理

一. 显示HTTP


配置客户端以使用mitmproxy作为显式代理是拦截流量的最简单,最可靠的方法。代理协议已在HTTP RFC中进行了编码,因此客户端和服务器的行为都得到了很好的定义,并且通常是可靠的。在与mitmproxy进行的最简单的交互中,客户端直接连接到代理,并发出如下所示的请求:
这是一个代理GET请求-原始HTTP GET请求的扩展形式,包括模式和主机规范,并且它包含所有需要继续进行的信息mitmproxy
notion image
客户端连接到代理并发出请求。
Mitmproxy连接到上游服务器,然后继续转发请求。

二. 显式HTTPS


显式代理HTTPS连接的过程是完全不同的。客户端连接到代理并发出如下请求:
传统的代理既不能查看也不能操纵TLS加密的数据流,因此CONNECT请求只是要求代理打开客户端和服务器之间的管道。这里的代理只是一个促进者-它在两个方向上都盲目转发数据,而对内容一无所知。TLS连接的协商是通过此管道进行的,随后的请求和响应流对于代理是完全不透明的。
notion image
1、客户端建立与mitmproxy的连接,并发出HTTP CONNECT请求。
2、Mitmproxy响应为200 Connection Established,就好像它已经设置了CONNECT管道一样。
3、客户端认为它正在与远程服务器通信,并启动TLS连接。它使用SNI指示要连接的主机名。
4、Mitmproxy连接到服务器,并使用客户端指示的SNI主机名建立TLS连接。
5、服务器以匹配的证书作为响应,该证书包含生成拦截证书所需的CN和SAN值。
6、Mitmproxy生成拦截证书,并继续在步骤3中暂停的客户端TLS握手。
7、客户端通过已建立的TLS连接发送请求。
8、Mitmproxy通过在步骤4中启动的TLS连接将请求传递到服务器。

三.透明HTTP

使用透明代理时,连接将重定向到网络层的代理中,而无需任何客户端配置。这使得透明代理非常适合那些您无法更改客户端行为的情况-代理不兼容的Android应用程序是一个常见示例。
为此,我们需要引入两个额外的组件。第一种是重定向机制,可以透明地将发往Internet上服务器的TCP连接重新路由到侦听代理服务器。这通常采用与代理服务器位于同一主机上的防火墙的形式-Linux上的iptablesOSX上的 pf。客户端启动连接后,它将发出原始的HTTP请求,该请求可能类似于以下内容:
请注意,此请求与显式代理变体不同,因为它忽略了方案和主机名。那么,我们如何知道将请求转发到哪个上游主机呢?执行重定向的路由机制为我们跟踪了原始目的地。每种路由机制都有一种公开此数据的不同方法,因此引入了透明代理工作所需的第二个组件:一个主机模块,该主机模块知道如何从路由器检索原始目标地址。在mitmproxy中,这采取一组内置模块的形式,这些 模块 知道如何与每个平台的重定向机制进行通信。一旦获得了这些信息,这个过程就很简单了。
  • 客户端与服务器建立连接。
  • 路由器将连接重定向到mitmproxy,后者通常在同一主机的本地端口上侦听。然后,Mitmproxy会咨询路由机制以建立原始目的地。
  • 现在,我们只需阅读客户的请求...
  • …并将其转发到上游。

四.透明的HTTPS

第一步是确定我们是否应将传入连接视为HTTPS。这样做的机制很简单-我们使用路由机制找出原始目标端口是什么。所有传入的连接都通过不同的层,这些层可以确定要使用的实际协议。通过在每个连接的开头查找ClientHello消息,自动TLS检测可用于SSLv3,TLS 1.0,TLS 1.1TLS 1.2。这独立于所使用的TCP端口起作用。
从这里开始,该过程是我们描述的透明代理HTTP显式代理HTTPS方法的合并。我们使用路由机制来建立上游服务器地址,然后像进行显式HTTPS连接一样建立CN和SAN,并处理SNI
notion image
  • 客户端与服务器建立连接。
  • 路由器将连接重定向到mitmproxy,后者通常在同一主机的本地端口上侦听。然后,Mitmproxy会咨询路由机制以建立原始目的地。
  • 客户端认为它正在与远程服务器通信,并启动TLS连接。它使用SNI指示要连接的主机名。
  • Mitmproxy连接到服务器,并使用客户端指示的SNI主机名建立TLS连接。
  • 服务器以匹配的证书作为响应,该证书包含生成拦截证书所需的CN和SAN值
  • Mitmproxy生成拦截证书,并继续在步骤3中暂停的客户端TLS握手。
  • 客户端通过已建立的TLS连接发送请求。
  • Mitmproxy通过在步骤4中启动的TLS连接将请求传递到服务器。

Mitmproxy 安装

PIP 安装

最简单的安装方式还是使用pip,直接执行如下命令即可安装:
这是最简单和通用的安装方式,执行完毕之后即可完成mitmproxy的安装,另外还附带安装了mitmdump和mitmweb这两个组件。如果不想用这种方式安装,也可以选择后面列出的专门针对各个平台的安装方式或者Docker安装方式。

Windows下的安装

可以到GitHub上的Releases页面(链接为:https://github.com/mitmproxy/mitmproxy/releases/)获取安装包,如图1-59所示。
图1-59 下载页面
notion image
 
比如,当前的最新版本为10.3.0,则可以选择下载Windows下的exe安装包mitmproxy-10.3.0-windows-installer.exe,下载后直接双击安装包即可安装。
注意,在Windows上不支持mitmproxy的控制台接口,但是可以使用mitmdump和mitmweb。

Mac 下安装

Mitmproxy 使用

一.启动服务

输入以下命令

二.配置代理

  1. 获取电脑IP
  1. 配置代理
notion image

三.配置证书

  1. 在 Safari 地址栏输入 mitm.it
notion image
  1. 点击 Get mitmproxy-ca-cert.pem 下载证书
  1. 设置 - 通用 - VPN 与设备管理 - 安装证书
  1. 设置 - 通用 - 关于本机 - 证书信任设置 - 勾选 mitmproxy

四.网络抓包

notion image

五.Mitmproxy 命令行方式

六.Docker 中抓包

  1. 下载证书: mitm.it
  1. 复制证书到docker
    3.登录容器
    1. 复制证书到对应目录
      1. 安装证书

        七.代码抓包

        1. 下载证书: mitm.it
        1. 将证书移动到公用文件夹, /opt/homebrew/etc/openssl@1.1
        1. PHP 抓包, 修改 php.ini
          1. NodeJS 抓包,导入全局变量

            常用技巧

            1. 功能页面说明
            notion image
            notion image
            notion image
            notion image
            notion image
            2.快捷键
            1. 数据包过滤
            当有很多数据包请求时,我们需要对数据包进行筛选。在界面中输入f,根据匹配规则进行筛选即可。如筛选所有域名blog.bbskali.cn的请求,我们需要输入规则~d blog.bbskali.cn
            notion image
            1. 常用过滤表达式
            notion image

            📎 参考文章