跳到主要内容

mitm

mitm 库是中间人代理(MITM)能力封装,启动一个 HTTP/HTTPS 代理,对经过的请求/响应进行劫持、查看、改写或 mock,是流量分析、被动扫描与交互式测试的核心。支持国密 TLS、透明代理、WebSocket 与 JA3 随机化。

典型使用场景:

  • 启动代理:mitm.Start(port, opts...) 启动 MITM,mitm.Bridge 串联下游代理。
  • 劫持改写:mitm.hijackHTTPRequest / mitm.hijackHTTPResponse 在回调里修改或丢弃报文,mitm.mockHTTPRequest 直接返回 mock 响应,mitm.callback 旁路观察全部流量。
  • 证书与传输:mitm.AddMITMRootCertIntoSystem / mitm.VerifyMITMRootCertInstalled 管理根证书,mitm.rootCA / mitm.gmtls / mitm.sni / mitm.randomJA3 控制 TLS 行为,mitm.wscallback 处理 WebSocket。

与相邻库的关系:mitm 是流量入口,常与 hook(驱动插件链处理流量)、fuzz/poc(对劫持到的请求做测试)、db(流量入库)协同,构成被动扫描与交互测试流水线。

共 30 个函数、1 个实例

实例

实例名类型说明
grpcMitmKeystring"grpc_mitm_extra_conn_key"

函数索引

函数参数返回值说明
mitm.AddMITMRootCertIntoSystem-error将 MITM 根证书添加到 Linux 系统信任库
mitm.GetDefaultExtraConnManager-*MitmExtraConnManager获取默认的 MITM 额外连接管理器,用于向运行中的 MITM 服务注入外部连接
mitm.QuickVerifyMITMRootCert-bool, error快速验证 MITM 根证书状态(不启动服务器,只检查系统证书池)
mitm.TestCertificateOperations-error完整测试 MITM 根证书的安装、验证和撤销操作流程(需要管理员权限)
mitm.VerifyMITMRootCertInstalled-error验证 MITM 根证书是否已正确安装到系统信任库
mitm.VerifyMITMRootCertNotInstalled-error验证 MITM 根证书是否已从系统信任库中移除
mitm.WithdrawMITMRootCertFromSystem-error从 Linux 系统信任库中移除 MITM 根证书
mitm.callbackf func(bool, string, *http.Request, *http.Response)MitmConfigOpt是一个选项函数,用于指定中间人代理服务器的回调函数,当接收到请求和响应后会调用该回调函数
mitm.contextctx context.ContextMitmConfigOpt是一个选项函数,用于指定中间人代理服务器的上下文,可通过取消上下文来停止服务
mitm.extraIncomingConnch anyMitmConfigOpt是一个选项函数,用于指定中间人代理服务器接受外部传入的连接通道
mitm.gmRootCAcert []byte, key []byteMitmConfigOpt是一个选项函数,用于指定中间人代理服务器的国密根证书和私钥
mitm.gmtlsb boolMitmConfigOpt是一个选项参数,用于指定中间人代理服务器是否开启 GMTLS 劫持模式,默认为false
mitm.gmtlsOnlyb boolMitmConfigOpt是一个选项参数,用于指定中间人代理服务器是否只使用 GMTLS 劫持模式,默认为false
mitm.gmtlsPreferb boolMitmConfigOpt是一个选项参数,用于指定中间人代理服务器是否优先使用 GMTLS 劫持模式,默认为false
mitm.hijackHTTPRequesth func(isHttps bool, u string, req []byte, modified func([]byte), dropped func())MitmConfigOpt是一个选项函数,用于指定中间人代理服务器的请求劫持函数,当接收到请求后,会调用该回调函数
mitm.hijackHTTPResponseh func(isHttps bool, u string, rsp []byte, modified func([]byte), dropped func())MitmConfigOpt是一个选项函数,用于指定中间人代理服务器的响应劫持函数,当接收到响应后,会调用该回调函数
mitm.hijackHTTPResponseExh func(bool, string, []byte, []byte, func([]byte), func())MitmConfigOpt是一个选项函数,用于指定中间人代理服务器的响应劫持函数,当接收到响应后,会调用该回调函数
mitm.hosthost stringMitmConfigOpt是一个选项函数,用于指定中间人代理服务器的监听地址,默认为空,即监听所有网卡
mitm.isTransparentb boolMitmConfigOpt是一个选项函数,用于指定中间人代理服务器是否开启透明劫持模式,默认为false
mitm.maxContentLengthi intMitmConfigOpt是一个选项函数,用于指定中间人代理服务器的最大请求和响应内容长度,默认为 10MB
mitm.mockHTTPRequesth func(isHttps bool, urlStr string, req []byte, mockResponse func(rsp any))MitmConfigOpt是一个选项函数,用于指定中间人代理服务器的请求 mock 函数
mitm.randomJA3b boolMitmConfigOpt是一个选项函数,用于指定中间人代理服务器是否开启随机 JA3 指纹模式,默认为 false
mitm.rootCAcert []byte, key []byteMitmConfigOpt是一个选项函数,用于指定中间人代理服务器的根证书和私钥
mitm.snisni string, overwrite boolMitmConfigOpt是一个选项函数,用于控制 MITM 代理连接目标服务器时的 SNI (Server Name Indication)
mitm.useDefaultCAt boolMitmConfigOpt是一个选项函数,用于指定中间人代理服务器是否使用内置的证书和私钥,默认为true
mitm.wscallbackf func([]byte, bool) anyMitmConfigOpt是一个选项函数,用于指定中间人代理服务器的 websocket 劫持函数,当接收到 websocket 请求或响应后,会调用该回调函数
mitm.wsforcetextb boolMitmConfigOpt是一个选项函数,用于强制将 websocket 劫持的数据帧转换为文本帧,默认为 false

可变参数函数索引

函数参数返回值说明
mitm.Bridgeport any, downstreamProxy string, opts ...MitmConfigOpterror启动一个 MITM (中间人)代理服务器,与 Start 类似但可指定下游代理服务器地址,并默认在收到请求和响应时打印到标准输出
mitm.Startport int, opts ...MitmConfigOpterror启动一个 MITM (中间人)代理服务器,可接收零个到多个选项函数影响其行为
mitm.extraIncomingConnChanWithStrongLocalHostlocalAddr any, ch any, kv ...anyMitmConfigOpt是一个选项函数,用于指定中间人代理服务器接受外部传入的连接通道

函数详情

AddMITMRootCertIntoSystem

AddMITMRootCertIntoSystem() error

将 MITM 根证书添加到 Linux 系统信任库 支持多个发行版的证书安装路径

返回值

序号类型说明
r1error

GetDefaultExtraConnManager

GetDefaultExtraConnManager() *MitmExtraConnManager

获取默认的 MITM 额外连接管理器,用于向运行中的 MITM 服务注入外部连接

返回值

序号类型说明
r1*MitmExtraConnManager默认的额外连接管理器实例

示例

// 获取默认额外连接管理器,此处仅作示意
manager = mitm.GetDefaultExtraConnManager()
println(manager)

QuickVerifyMITMRootCert

QuickVerifyMITMRootCert() (bool, error)

快速验证 MITM 根证书状态(不启动服务器,只检查系统证书池)

返回值

序号类型说明
r1bool证书是否被系统信任
r2error错误信息,获取或解析证书失败时返回非空

示例

// 快速检查 MITM 根证书是否被信任,此处仅作示意
trusted, err = mitm.QuickVerifyMITMRootCert()
println(trusted)

TestCertificateOperations

TestCertificateOperations() error

完整测试 MITM 根证书的安装、验证和撤销操作流程(需要管理员权限)

返回值

序号类型说明
r1error错误信息,测试流程中任一步骤失败时返回非空

示例

// 测试证书安装/验证/撤销全流程,需要权限,此处仅作示意
mitm.TestCertificateOperations()~

VerifyMITMRootCertInstalled

VerifyMITMRootCertInstalled() error

验证 MITM 根证书是否已正确安装到系统信任库

返回值

序号类型说明
r1error错误信息,证书未安装或验证失败时返回非空,安装正确时返回 nil

示例

// 验证 MITM 根证书是否已安装,此处仅作示意
mitm.VerifyMITMRootCertInstalled()~

VerifyMITMRootCertNotInstalled

VerifyMITMRootCertNotInstalled() error

验证 MITM 根证书是否已从系统信任库中移除

返回值

序号类型说明
r1error错误信息,证书仍被信任或验证异常时返回非空,已移除时返回 nil

示例

// 验证 MITM 根证书是否已移除,此处仅作示意
mitm.VerifyMITMRootCertNotInstalled()~

WithdrawMITMRootCertFromSystem

WithdrawMITMRootCertFromSystem() error

从 Linux 系统信任库中移除 MITM 根证书

返回值

序号类型说明
r1error

callback

callback(f func(bool, string, *http.Request, *http.Response)) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的回调函数,当接收到请求和响应后会调用该回调函数

参数

参数名类型说明
ffunc(bool, string, *http.Request, *http.Response)回调函数,参数依次为是否 HTTPS、URL、请求对象、响应对象

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.callback(func(isHttps, urlStr, req, rsp) { http.dump(req); http.dump(rsp)  }))

context

context(ctx context.Context) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的上下文,可通过取消上下文来停止服务

参数

参数名类型说明
ctxcontext.Context上下文对象

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.context(context.Background()))

extraIncomingConn

extraIncomingConn(ch any) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器接受外部传入的连接通道

通过该选项,可以将外部的 net.Conn 连接注入到 MITM 服务器中进行劫持处理

参数

参数名类型说明
chany连接通道(chan net.Conn 或 chan interface{})

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

connChan = make(chan any) // 元素为 net.Conn
mitm.Start(8080, mitm.extraIncomingConn(connChan))

gmRootCA

gmRootCA(cert []byte, key []byte) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的国密根证书和私钥

参数

参数名类型说明
cert[]bytePEM 格式的国密根证书
key[]bytePEM 格式的国密私钥

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.gmRootCA(cert, key))

gmtls

gmtls(b bool) MitmConfigOpt

是一个选项参数,用于指定中间人代理服务器是否开启 GMTLS 劫持模式,默认为false

在开启 GMTLS 劫持模式下,中间人代理服务器会劫持所有的 GMTLS 流量

参数

参数名类型说明
bbool是否开启 GMTLS 劫持模式

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.gmtls(true))

gmtlsOnly

gmtlsOnly(b bool) MitmConfigOpt

是一个选项参数,用于指定中间人代理服务器是否只使用 GMTLS 劫持模式,默认为false

在开启 GMTLS 劫持模式下,中间人代理服务器只会使用 GMTLS 劫持模式

参数

参数名类型说明
bbool是否只使用 GMTLS 劫持模式

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.gmtlsOnly(true))

gmtlsPrefer

gmtlsPrefer(b bool) MitmConfigOpt

是一个选项参数,用于指定中间人代理服务器是否优先使用 GMTLS 劫持模式,默认为false

在开启 GMTLS 劫持模式下,中间人代理服务器会优先使用 GMTLS 劫持模式

参数

参数名类型说明
bbool是否优先使用 GMTLS 劫持模式

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.gmtlsPrefer(true))

hijackHTTPRequest

hijackHTTPRequest(h func(isHttps bool, u string, req []byte, modified func([]byte), dropped func())) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的请求劫持函数,当接收到请求后,会调用该回调函数

通过调用该回调函数的第四个参数,可以修改请求内容,通过调用该回调函数的第五个参数,可以丢弃请求

参数

参数名类型说明
hfunc(isHttps bool, u string, req []byte, modified func([]byte), dropped func())请求劫持回调,参数依次为是否 HTTPS、URL、请求报文、修改函数、丢弃函数

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.hijackHTTPRequest(func(isHttps, urlStr, req, modified, dropped) {
// 添加一个额外的请求头
req = poc.ReplaceHTTPPacketHeader(req, "AAA", "BBB")
modified(req)
}
))

hijackHTTPResponse

hijackHTTPResponse(h func(isHttps bool, u string, rsp []byte, modified func([]byte), dropped func())) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的响应劫持函数,当接收到响应后,会调用该回调函数

通过调用该回调函数的第四个参数,可以修改响应内容,通过调用该回调函数的第五个参数,可以丢弃响应

参数

参数名类型说明
hfunc(isHttps bool, u string, rsp []byte, modified func([]byte), dropped func())响应劫持回调,参数依次为是否 HTTPS、URL、响应报文、修改函数、丢弃函数

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.hijackHTTPResponse(func(isHttps, urlStr, rsp, modified, dropped) {
// 修改响应体为hijacked
rsp = poc.ReplaceBody(rsp, b"hijacked", false)
modified(rsp)
}
))

hijackHTTPResponseEx

hijackHTTPResponseEx(h func(bool, string, []byte, []byte, func([]byte), func())) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的响应劫持函数,当接收到响应后,会调用该回调函数

通过调用该回调函数的第五个参数,可以修改响应内容,通过调用该回调函数的第六个参数,可以丢弃响应

它与 hijackHTTPResponse 的区别在于,它可以获取到原始请求报文

参数

参数名类型说明
hfunc(bool, string, []byte, []byte, func([]byte), func())响应劫持回调,参数依次为是否 HTTPS、URL、请求报文、响应报文、修改函数、丢弃函数

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.hijackHTTPResponseEx(func(isHttps, urlStr, req, rsp, modified, dropped) {
// 修改响应体为hijacked
rsp = poc.ReplaceBody(rsp, b"hijacked", false)
modified(rsp)
}
))

host

host(host string) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的监听地址,默认为空,即监听所有网卡

参数

参数名类型说明
hoststring监听地址

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.host("127.0.0.1"))

isTransparent

isTransparent(b bool) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器是否开启透明劫持模式,默认为false

在开启透明模式下,所有流量都会被默认转发,所有的回调函数都会被忽略

参数

参数名类型说明
bbool是否开启透明劫持

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.isTransparent(true))

maxContentLength

maxContentLength(i int) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的最大请求和响应内容长度,默认为 10MB

参数

参数名类型说明
iint最大内容长度,单位为字节

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.maxContentLength(100 * 1000 * 1000))

mockHTTPRequest

mockHTTPRequest(h func(isHttps bool, urlStr string, req []byte, mockResponse func(rsp any))) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的请求 mock 函数

当接收到请求后,会调用该回调函数,通过调用 mockResponse 函数可以直接返回自定义响应,跳过真实的网络请求

mockResponse 接受一个响应(字符串或字节数组),会自动修复响应格式,如果修复失败则返回 502 Bad Gateway

参数

参数名类型说明
hfunc(isHttps bool, urlStr string, req []byte, mockResponse func(rsp any))请求 mock 回调,参数依次为是否 HTTPS、URL、请求报文、mockResponse 函数

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.mockHTTPRequest(func(isHttps, urlStr, req, mockResponse) {

if str.Contains(urlStr, "test") {
mockResponse("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nMocked Response")
}

}))

randomJA3

randomJA3(b bool) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器是否开启随机 JA3 指纹模式,默认为 false

参数

参数名类型说明
bbool是否开启随机 JA3 指纹

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.randomJA3(true))

rootCA

rootCA(cert []byte, key []byte) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的根证书和私钥

参数

参数名类型说明
cert[]bytePEM 格式的根证书
key[]bytePEM 格式的私钥

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.rootCA(cert, key))

sni

sni(sni string, overwrite bool) MitmConfigOpt

是一个选项函数,用于控制 MITM 代理连接目标服务器时的 SNI (Server Name Indication)

这在测试 CDN、WAF 或进行域前置 (Domain Fronting) 测试时非常有用

支持三种模式:

  1. 自动模式(默认):不调用此函数,根据请求的 Host 自动推断 SNI

  2. 强制模式:mitm.sni("custom.domain.com", true),总是使用指定的 SNI

  3. 清空模式:mitm.sni("", true),不发送 SNI

参数

参数名类型说明
snistring要使用的 SNI 域名
overwritebool是否强制覆盖(true 时总是使用指定 SNI,false 时为自动模式)

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

// 强制模式:总是使用指定的 SNI
mitm.Start(8080, mitm.sni("admin.example.com", true))

// 清空模式:不发送 SNI
mitm.Start(8080, mitm.sni("", true))

// 自动模式:根据 Host 自动推断(默认行为)
mitm.Start(8080) // 或 mitm.sni("", false)

useDefaultCA

useDefaultCA(t bool) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器是否使用内置的证书和私钥,默认为true

默认的证书与私钥路径:~/yakit-projects/yak-mitm-ca.crt 和 ~/yakit-projects/yak-mitm-ca.key

参数

参数名类型说明
tbool是否使用内置证书和私钥

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.useDefaultCA(true))

wscallback

wscallback(f func([]byte, bool) any) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器的 websocket 劫持函数,当接收到 websocket 请求或响应后,会调用该回调函数

该回调函数的第一个参数是请求或响应的内容

第二个参数是一个布尔值,用于指示该内容是请求还是响应,true 表示请求,false 表示响应

通过该回调函数的返回值,可以修改请求或响应的内容

参数

参数名类型说明
ffunc([]byte, bool) anywebsocket 劫持回调,第一个参数为数据内容,第二个参数为是否为请求,返回修改后的内容

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.wscallback(func(data, isRequest) { println(data); return data }))

wsforcetext

wsforcetext(b bool) MitmConfigOpt

是一个选项函数,用于强制将 websocket 劫持的数据帧转换为文本帧,默认为 false

! 已弃用

参数

参数名类型说明
bbool是否强制转换为文本帧

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

mitm.Start(8080, mitm.wsforcetext(true))

可变参数函数详情

Bridge

Bridge(port any, downstreamProxy string, opts ...MitmConfigOpt) error

启动一个 MITM (中间人)代理服务器,与 Start 类似但可指定下游代理服务器地址,并默认在收到请求和响应时打印到标准输出

如果没有指定 CA 证书和私钥,那么将使用内置的证书和私钥

必填参数

参数名类型说明
portany代理服务器监听端口
downstreamProxystring下游代理服务器地址,多个用逗号分隔,可为空字符串

可选参数

参数名类型说明
opts...MitmConfigOpt可选配置,例如 mitm.host、mitm.callback

返回值

序号类型说明
r1error错误信息,启动失败或服务异常退出时返回非空

示例

mitm.Bridge(8080, "", mitm.host("127.0.0.1"), mitm.callback(func(isHttps, urlStr, req, rsp) { http.dump(req); http.dump(rsp)  })) // 启动一个中间人代理服务器,并将请求和响应打印到标准输出

Start

Start(port int, opts ...MitmConfigOpt) error

启动一个 MITM (中间人)代理服务器,可接收零个到多个选项函数影响其行为

如果没有指定 CA 证书和私钥,那么将使用内置的证书和私钥

必填参数

参数名类型说明
portint代理服务器监听端口

可选参数

参数名类型说明
opts...MitmConfigOpt可选配置,例如 mitm.host、mitm.callback、mitm.hijackHTTPRequest

返回值

序号类型说明
r1error错误信息,启动失败或服务异常退出时返回非空

示例

mitm.Start(8080, mitm.host("127.0.0.1"), mitm.callback(func(isHttps, urlStr, req, rsp) { http.dump(req); http.dump(rsp)  })) // 启动一个中间人代理服务器,并将请求和响应打印到标准输出

extraIncomingConnChanWithStrongLocalHost

extraIncomingConnChanWithStrongLocalHost(localAddr any, ch any, kv ...any) MitmConfigOpt

是一个选项函数,用于指定中间人代理服务器接受外部传入的连接通道

强制要求设置强主机模式的本地地址,用于透明劫持 TUN 生成的流量

必填参数

参数名类型说明
localAddrany强主机模式的本地地址
chany连接通道(chan net.Conn、chan interface{} 或 chan *WrapperedConn)

可选参数

参数名类型说明
kv...any可选的元数据键值对

返回值

序号类型说明
r1MitmConfigOpt一个 MITM 配置选项,作为可变参数传入 mitm.Start / mitm.Bridge

示例

connChan = make(chan any) // 元素为 net.Conn
mitm.Start(8080, mitm.extraIncomingConnChanWithStrongLocalHost("192.168.1.100", connChan)) // 设置强主机模式本地地址
mitm.Start(8080, mitm.extraIncomingConnChanWithStrongLocalHost("192.168.1.100", connChan, {"key": "value"})) // 设置强主机模式本地地址并设置元数据