mitmproxy

快速开启一个反代克隆站点
mitmproxy --mode reverse:目标 --listen-host 0.0.0.0 --listen-port 端口 --set block_global=false

mitm过滤表达式

表达式 作用
~a 匹配响应中的CSS、JS、图片、字体
~all 匹配所有流
~b body
~bq 请求body
~bs 响应body
~c http响应码
~comment 流注释
~d
~dns 匹配dns流
~dst 匹配目标地址
~e 匹配错误
~h header
~hq 请求header
~hs 响应header
~http 匹配http流
~m 方法
~marked 匹配被标记的流
~marker 匹配被特殊标记标记的流
~meta 流元数据
~q 匹配没有响应的请求
~replay 匹配重放的流
~replayq 匹配重放的客户端请求
~replays 匹配重放的服务端响应
~s 匹配响应
~src 匹配源地址
~t 匹配Content-Type header
~tcp 匹配tcp流
~tq 匹配请求中的Content-Type
~ts 匹配响应中的Content-Type
~u url
~websocket 匹配ws流
!
&
|
(…) 分组

mitm查看流选择器

选择器 作用
@all 所有流
@focus 当前关注的流
@shown 所有当前展示的流
@hidden 所有当前隐藏的流
@marked 所有标记的流
@unmarked 所有没标记的流

mitm http生命周期

编写mitmproxy脚本

编写一个 py 文件供 mitmproxy 加载,文件定义了变量 addons,addons 是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的方法。这些类,称为一个个 addon,比如一个叫 Counter 的 addon:

import mitmproxy.http
from mitmproxy import ctx

class Counter:
  def __init__(self):
      self.num = 0

  def request(self, flow: mitmproxy.http.HTTPFlow):
      self.num = self.num + 1
      ctx.log.info("We've seen %d flows" % self.num)

addons = [
    Counter()
]

编写能够在mitmproxy控制台中使用的命令

"""Handle flows as command arguments."""
from collections.abc import Sequence

from mitmproxy import command
from mitmproxy import ctx
from mitmproxy import flow
from mitmproxy import http


class MyAddon:
    @command.command("myaddon.addheader") #command修饰器
    def addheader(self, flows: Sequence[flow.Flow]) -> None: #->None表示这个函数返回的类型为None
        for f in flows:
            if isinstance(f, http.HTTPFlow): #HTTPFlow 是表示单个 HTTP 事务的对象集合
                f.request.headers["myheader"] = "value"
        ctx.log.alert("done")


addons = [MyAddon()]

在mitmproxy控制台中,使用myaddon.addheader来调用命令

证书相关

cloudflare

下载cloudflare的源服务器证书,在中间件配置中使用,然后在dns模块中将cdn代理打开,就能够提供https服务了

mitm

在/root/.mitmproxy下将对应证书复制到/usr/share/ca-certificates里,然后使用dpkg-reconfigure ca-certificates导入
如果出现curl能访问目标但是mitimproxy报证书错误的,尝试添加–ssl-insecure

Caddy相关

占位符

简写 替换
dir http.request.uri.path.dir
file http.request.uri.path.file
header.* http.request.header.*
host http.request.host
labels.* http.request.host.labels.*
hostport http.request.hostport
port http.request.port
method http.request.method
path http.request.uri.path
path.* http.request.uri.path.*
query http.request.uri.query
query.* http.request.uri.query.*
re.. http.regexp..
remote http.request.remote
remote_host http.request.remote.host
remote_port http.request.remote.port
scheme http.request.scheme
uri http.request.uri
tls_cipher http.request.tls.cipher_suite
tls_version http.request.tls.version
tls_client_fingerprint http.request.tls.client.fingerprint
tls_client_issuer http.request.tls.client.issuer
tls_client_serial http.request.tls.client.serial
tls_client_subject http.request.tls.client.subject
tls_client_certificate_pem http.request.tls.client.certificate_pem
tls_client_certificate_der_base64 http.request.tls.client.certificate_der_base64
upstream_hostport http.reverse_proxy.upstream.hostport