青

一言

获取并保存设备通过HTTPS请求的指定数据

获取并保存设备通过HTTPS请求的指定数据

获取并保存设备通过 HTTPS 请求的指定数据

1. 生成一个可用的证书

生成证书看似不复杂,也有大量工具和例子帮助,但生成过程需要注意的细节很多,如果配置不当,可能会导致证书无法使用。

在本需求下,由于需要解析设备的 HTTPS 请求,而不是为设备提供某个 URL 的服务,所以需要一个 CA 证书,不仅仅是一个域名证书。

默认情况下,自生成证书不受信任,难以维护,但作为个人调试使用,在可信任的网络环境下是便捷的选择。

特别针对 iOS 系统,不符合要求的证书可以正常安装,但无法被系统信任(在设置-通用-关于本机-证书信任设置中无法找到),导致无法正常使用。

在仅有的尝试中,多次遇到了这个问题,由于各方面限制,同时对个人使用影响不大,就没有深入研究,但给出测试过程中可用的方案。

  • 借助外部工具
    通过一些外部工具,如 Azure Application Gateway 提供的工具
    只需要给出证书名称就可以下载到一整套证书,包括 CA 证书、域名证书、私钥等。

  • 使用 openssl 生成证书

1
2
3
openssl ecparam -out contoso.key -name prime256v1 -genkey
openssl req -new -sha256 -key contoso.key -out contoso.csr
openssl x509 -req -sha256 -days 365 -in contoso.csr -signkey contoso.key -out contoso.crt

2. 实现或者使用一个 HTTP 代理

在 AI 的加持下,实现一个 HTTP 代理并不是一件麻烦事,在过程中大概需要有以下流程:

  • 处理、分析请求,对数据进行分流,如果不是对所有数据都感兴趣,只是希望获取某些数据,在这里可以按条件进行过滤
  • 如果是 HTTPS 请求,并且需要对其进行解密,则需要和目标服务器进行 TLS 握手,建立连接,同时使用 CA 证书完成和客户端的 TLS 握手
  • 转发、处理数据,在客户端和目标服务器之间建立数据传输,在传输过程中,可以对数据进行处理,如保存、修改等

这里实现的功能和 Filter 功能几乎相同,但可以更加灵活多种形式地处理数据。

3. 实现

利用现有的第三方库 github.com/elazarl/goproxy,快速实现一个 HTTP 代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main

import (
"bytes"
"crypto/tls"
"crypto/x509"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"time"

"github.com/elazarl/goproxy"
)

func main() {
proxy := goproxy.NewProxyHttpServer()
proxy.Logger = log.New(io.Discard, "", 0)
proxy.Verbose = true

caCert, err := os.ReadFile("root.cer")
caKey, err := os.ReadFile("root.key")
if err != nil {
log.Fatalf("Failed to set MITM certificate: %v", err)
}
if err := setCA(caCert, caKey); err != nil {
log.Fatalf("Failed to set MITM certificate: %v", err)
}

proxy.OnRequest().HandleConnect(goproxy.AlwaysMitm)
proxy.OnRequest().DoFunc(func(req *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) {
return req, nil
})

// 拦截响应并记录
proxy.OnResponse().DoFunc(func(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
if resp != nil {
mime := resp.Header.Get("Content-Type")
if mime == "" {
mime = "application/octet-stream"
}
// 当请求数据为图片的时候进行保存
if mime[:6] == "image/" {
buf := bytes.Buffer{}
teeReader := io.TeeReader(resp.Body, &buf)
file_ext := mime[6:]
if err := os.MkdirAll("logs", 0755); err != nil {
log.Printf("Failed to create logs directory: %v", err)
}
fileName := fmt.Sprintf("logs/response-%d.%s", timeNow(), file_ext)
f, err := os.Create(fileName)
if err != nil {
log.Printf("Failed to create response log file: %v", err)
}
defer f.Close()
resp.Body = io.NopCloser(&buf)
io.Copy(f, teeReader)
fmt.Println("文件已保存: ", fileName)
}
}
return resp
})

log.Println("Proxy server running on :8080")
log.Fatal(http.ListenAndServe(":8080", proxy))
}

func timeNow() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}

func setCA(caCert, caKey []byte) error {
goproxyCa, err := tls.X509KeyPair(caCert, caKey)
if err != nil {
return err
}
if goproxyCa.Leaf, err = x509.ParseCertificate(goproxyCa.Certificate[0]); err != nil {
return err
}
goproxy.GoproxyCa = goproxyCa
goproxy.OkConnect = &goproxy.ConnectAction{Action: goproxy.ConnectAccept, TLSConfig: goproxy.TLSConfigFromCA(&goproxyCa)}
goproxy.MitmConnect = &goproxy.ConnectAction{Action: goproxy.ConnectMitm, TLSConfig: goproxy.TLSConfigFromCA(&goproxyCa)}
goproxy.HTTPMitmConnect = &goproxy.ConnectAction{Action: goproxy.ConnectHTTPMitm, TLSConfig: goproxy.TLSConfigFromCA(&goproxyCa)}
goproxy.RejectConnect = &goproxy.ConnectAction{Action: goproxy.ConnectReject, TLSConfig: goproxy.TLSConfigFromCA(&goproxyCa)}
return nil
}

将证书在目标设备上安装并信任,设置代理(对于不支持代理的设备,可通过第三方软件建立虚拟 VPN 通道来转发数据或通过路由器进行数据转发),即可获取到设备的 HTTPS 请求数据,并将所有图片保存到本地。

4. 结语

这里只是一个简单的实现,会对正常网络连接造成较大影响,如果需要在复杂网络环境下使用会遇到更多的问题,仅适合作为测试、学习或简单需求下使用。

同时,还可能存在其他一些问题,例如设备明明看到了某图片,但实际没有被保存,这也可能存在多种情况,例如:

  1. 设备在请求图片时,没有通过支持的 HTTP 方法进行请求,例如直接使用 TCP、WebSocket 连接等;
  2. 设备在传输过程中,对其进行了额外的加密;
  3. 设备上的软件内置了服务器证书,而不信任系统证书,导致无法解析连接数据;

这些情况较为少见,但每一种处理起来都不简单,甚至设计逆向分析的操作,往往也伴随着一定的法律风险,需要谨慎对待

P.S 本文的封面图某天被迫打工的过程中意外发现的,阳光正好,刚浇过水的花能暂时忘记烦人的事情,希望你也能喜欢。

本文作者:
本文链接:https://tdh6.top/%E6%9D%82%E9%A1%B9/get-and-download-https-image/
版权声明:本站文章采用 CC BY-NC-SA 3.0 CN 协议进行许可,翻译文章遵循原文协议。
图片来源:本站部分图像来源于网络,前往查看 相关说明。