Skip to content

Go Catch Mitm

一个 开箱即用 的 HTTP(S) 流量截取工具,跨平台,上手简单,支持远程部署。

下载后的可执行文件 最好 放在一个 空白的文件夹 内再开始运行。运行后会自动生成配置文件,证书,数据库和响应体存储目录。

  • DirectoryNew Folder
    • go-catch-mitm.exe
    • Directoryresponsebody/
    • config.yaml
    • go-catch-ca.crt
    • go-catch-ca.key
    • traffic.db
Proxy:
HttpPort: 8080
PrivateIP: true
PublicIP: false
WebPanel:
Port: 61233
PrivateIP: true
PublicIP: false
SSL:
Path: 0eec2509418560869f50079092f4d233
Cert: go-catch-ca.crt
Key: go-catch-ca.key
  • Port: 代理服务器监听的端口,默认为 8080
  • PrivateIP: 是否允许局域网访问,默认为 true
  • PublicIP: 是否允许公网访问,默认为 false

该程序使用 Golang 的 net.IP 自带的方法来判断是否为 LoopbackIP, PrivateIPPublicIP,无论如何,程序将始终监听 LoopbackIP,可以根据实际需要来决定是否要监听 PublicIPPrivateIP

  • 本软件和被监听的软件运行在同一台电脑上,则只需要监听 LoopbackIP,可以将 PrivateIPPublicIP 设置为 false
  • 本软件无法与被监听的软件运行在同一台设备上,这是最常见的情况。启用 PrivateIP
  • 你准备把本软件运行在一台拥有公网 IP 的设备上。在大多数情况下不建议这么做。特别是当你的客户端和监听端可能位于不同的国家时,这有极大的风险导致公网 IP 被封禁。
  • Path: 这个 Path 决定了 WebPanel 启动时用来组合成证书的下载链接。比如:
Terminal window
http://127.0.0.1:61233/therewillbe32ramdomchars00000000/go-catch-ca.crt

为了方便,这个实际上也可以用来下载密钥,仅需修改后缀为.key

Terminal window
http://127.0.0.1:61233/therewillbe32ramdomchars00000000/go-catch-ca.key

使用这个主要是为了防止证书和密钥被窃取,实际上你可以把这个 Path 改成任意字符串。

  • 随机字符串代码: 为了安全起见,这里将展示生成随机字符串代码,此外,保存 responsebody 的路径字符串也是用这个方法生成
randomBytes := make([]byte, 16)
if _, err := rand.Read(randomBytes); err != nil {
return fmt.Errorf("生成随机串失败: %v", err)
}
randomStr := hex.EncodeToString(randomBytes)
  1. 获取到前文中提到的 .crt 文件后双击开始安装
  2. 第一个页面选择 install certificate / 安装证书
  3. 第二页里的 storelocation / 存储位置 选择 current user / 当前用户
  4. 第三页选择第二个 place all certificates in the following store,然后点 browse / 浏览,选择 Trusted root certification authorities,如下图 image
  5. 然后一路 next / 下一步 直到弹出安装成功的提示
  6. 为了保证软件结束时终端不会立刻消失,需要在软件所在目录右键,然后点击 open in terminal / 在终端打开 然后输入
    Terminal window
    .\gocatch-windows-amd64.exe
  7. 观察输出
    Terminal window
    SQLite 数据库加载成功
    配置加载成功
    详细信息请查看 go-catch 官方文档:https://docs.wepayto.win/application/gocatch
    证书状态检查通过
    WebPanel 初始化成功
    HTTP(S) Proxy 监听在回环 IP: http://127.0.0.1:8080
    HTTP(S) Proxy 监听在私有 IP: http://10.37.26.126:8080
    HTTP(S) Proxy 监听在私有 IP: http://192.168.137.1:8080
    HTTP(S) Proxy 监听在私有 IP: http://[fdfe:dcba:9876::1]:8080
    WebPanel 监听在回环 IP: http://[::1]:61233
    WebPanel 监听在私有 IP: http://[fdfe:dcba:9876::1]:61233
    WebPanel 证书下载地址: http://[fdfe:dcba:9876::1]:61233/0a31b4d11055e53332ea062759363cff/go-catch-ca.crt
    HTTP(S) Proxy 监听在回环 IP: http://[::1]:8080
    WebPanel 监听在私有 IP: http://192.168.137.1:61233
    WebPanel 证书下载地址: http://192.168.137.1:61233/0a31b4d11055e53332ea062759363cff/go-catch-ca.crt
    WebPanel 监听在私有 IP: http://10.37.26.126:61233
    WebPanel 监听失败: listen tcp 192.168.137.1:61233: bind: The requested address is not valid in its context.
    WebPanel 监听在回环 IP: http://127.0.0.1:61233
    HTTP(S) Proxy 监听失败: listen tcp 192.168.137.1:8080: bind: The requested address is not valid in its context.
    WebPanel 证书下载地址: http://10.37.26.126:61233/0a31b4d11055e53332ea062759363cff/go-catch-ca.crt
    其中有两条监听失败
    Terminal window
    WebPanel 监听失败: listen tcp 192.168.137.1:61233: bind: The requested address is not valid in its context.
    HTTP(S) Proxy 监听失败: listen tcp 192.168.137.1:8080: bind: The requested address is not valid in its context.
    证书下载依赖于 WebPanel,所以这个没有提示失败,但实际上也是无效的链接
    Terminal window
    WebPanel 证书下载地址: http://192.168.137.1:61233/0a31b4d11055e53332ea062759363cff/go-catch-ca.crt
    不要担心,这是正常的,因为 192.168.137.1 是开启 Windows 热点时自动创建的一张虚拟网卡所自动配置的 IP 地址,这种情况是由于这台电脑曾经开启过热点但是现在没有开启热点,Windows 不允许其他程序绑定到这个地址上
  8. 现在打开浏览器输入 WebPanel 监听的私有地址
    Terminal window
    http://10.37.26.126:61233
    现在这个页面是空的,因为 traffic.db 是空的,尝试为一些软件配置代理,比如 微信 image 点击save / 保存后就能看到终端里不断有请求记录刷出,回到前端页面点刷新就可以看到抓取到了好多微信的网络请求。但不要高兴的太早,仅靠这些想逆向微信是远远不够的。点击单个条目以展开,可以看到 RequestResponse 的详细内容,以微信为例,RequestResponsecontent-Type 大多数时候为 octet-stream,是一种二进制的数据流。在网页中的预览如下
    00000000: 19 f1 04 00 a2 00 00 00 9e 01 04 f1 01 00 a8 4c ...............L
    00000010: 51 50 b3 44 2f 3d ba 79 88 cf ce 82 c4 b6 63 86 QP.D/=.y......c.
    00000020: 4e 50 9f fe 63 5f 64 bc fb 58 10 52 d6 f8 da 69 NP..c_d..X.R...i
    00000030: c9 1a 9a 00 00 00 70 01 00 00 00 6b 00 0f 01 00 ......p....k....
    00000040: 00 00 64 01 00 09 3a 80 00 00 00 00 00 3d 00 0c ..d...:......=..
    00000050: aa 7c 1a ce a0 0e 41 76 9d 1f 16 64 00 49 20 d2 .|....Av...d.I .
    00000060: 22 91 7a ab 4d 86 2d 3f 10 9d e4 46 97 39 c9 ec ".z.M.-?...F.9..
    00000070: 66 8f aa 69 ab f7 ba 96 04 e0 fa 01 e5 47 05 f5 f..i.........G..
    00000080: cf a5 f0 60 72 05 1b 65 99 86 2e 66 8d b4 6a db ...`r..e...f..j.
    00000090: 45 8b 39 12 02 91 ea 4c f7 48 ec 1b 7d e9 ab db E.9....L.H..}...
    000000a0: 2f 0c a7 1c 4a 71 3b 19 f1 04 00 24 5c 81 7f 04 /...Jq;....$\..
    000000b0: d0 ac 35 f3 a1 fc 26 57 02 61 56 9d 30 04 76 9c ..5...&W.aV.0.v.
    000000c0: 81 58 71 68 b2 3d d4 d6 42 c7 e3 24 1b 92 ee 1d .Xqh.=..B..$....
    000000d0: 17 f1 04 01 2b 49 eb c6 97 09 5e 73 69 aa 3f e5 ....+I....^si.?.
    000000e0: ee b7 43 78 69 f4 ce b6 cb 3c ff fc 85 25 3f 85 ..Cxi....<...%?.
    也有这种的
    {"data": [
    {"data": "a very large encrypted string"},
    {"data": "also a very large encrpyted string"}
    ]}
    想要解密这样的加密数据需要更加深入的研究,本文档不再讨论。
  1. 使用经典的 Win + r 快捷键打开一个窗口并输入 certmgr.msc
  2. 打开 Root Trusted Certification authorities/Certificates 并在右侧找到 Golang Cache Trusted CA,如下图 image
  3. 右键,删除,确认,一气呵成。
  4. 删除整个路径即可清空软件所有数据和痕迹

traffic.db 是标准的 sqlite 数据库,在代码 sqlmanage.go 中创建,其中有一个 traffic 表,等价于

CREATE TABLE IF NOT EXISTS traffic (
created_at TEXT NOT NULL,
method TEXT,
src_ip TEXT,
dst_host TEXT,
dst_ip TEXT,
url TEXT,
status INTEGER,
req_headers TEXT,
req_body BLOB,
resp_headers TEXT,
resp_body_path TEXT PRIMARY KEY,
user_agent TEXT
)
  • 许多软件在 https 之下有额外的加密,需要额外的手段以破解。
  • 如微信这样的软件使用了自制的传输协议和加密协议,数据里看到关于微信的大多数 http 请求都是明文的二进制数据流,尽管我们可以看见完整的 headers,但仍需大量工作来破解真正的内容。
  • 软件自己把证书编译进了可执行文件里,而不是使用系统的证书,导致无法建立 https 链接,不过主流证书颁发机构都在缩短证书有效期,这种情况较为少见