Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/mitm-socket/go/emulate_tls.go
1029 views
1
package main
2
3
import (
4
"io"
5
"net"
6
"os"
7
"strconv"
8
"strings"
9
10
tls "github.com/ulixee/utls"
11
)
12
13
var isInited = false
14
15
func EmulateTls(dialConn net.Conn, addr string, sessionArgs SessionArgs, connectArgs ConnectArgs) (*tls.UConn, error) {
16
if isInited == false {
17
tls.EnableWeakCiphers()
18
isInited = true
19
}
20
var err error
21
22
// Upgrade connection with correct TLS signature
23
var spec tls.ClientHelloSpec
24
if sessionArgs.ClientHelloId == "Safari13" {
25
spec = GetSafari13Spec()
26
} else if strings.HasPrefix(sessionArgs.ClientHelloId, "chrome-") {
27
chromeVersionBit := strings.Split(sessionArgs.ClientHelloId, "chrome-")[1]
28
chromeVersion, _ := strconv.ParseInt(chromeVersionBit, 10, 0)
29
// lowest supported is chrome 72, otherwise channel id extensions crop up
30
if chromeVersion < 83 {
31
spec, _ = tls.UtlsIdToSpec(tls.HelloChrome_72)
32
} else {
33
spec, _ = tls.UtlsIdToSpec(tls.HelloChrome_83)
34
}
35
} else {
36
// default to chrome83
37
spec, _ = tls.UtlsIdToSpec(tls.HelloChrome_83)
38
}
39
40
tlsConfig := tls.Config{
41
ServerName: connectArgs.Servername,
42
InsecureSkipVerify: !sessionArgs.RejectUnauthorized,
43
}
44
45
if connectArgs.KeylogPath != "" {
46
var keylog io.Writer
47
keylog, err = os.OpenFile(connectArgs.KeylogPath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0640)
48
if err != nil {
49
return nil, err
50
}
51
tlsConfig.KeyLogWriter = keylog
52
}
53
54
tlsConn := tls.UClient(dialConn, &tlsConfig, tls.HelloCustom)
55
56
if connectArgs.IsWebsocket {
57
tmp := spec.Extensions[:0]
58
for _, ext := range spec.Extensions {
59
if _, ok := ext.(*tls.ALPNExtension); !ok {
60
tmp = append(tmp, ext)
61
}
62
}
63
spec.Extensions = tmp
64
}
65
66
err = tlsConn.ApplyPreset(&spec)
67
if err != nil {
68
return nil, err
69
}
70
71
err = tlsConn.Handshake()
72
if err != nil {
73
return nil, err
74
}
75
76
return tlsConn, nil
77
}
78
79
func removeIndex(s []string, index int) []string {
80
return append(s[:index], s[index+1:]...)
81
}
82
83