From a58777fb950d28fcaac4d1a4cfa4564910378a3c Mon Sep 17 00:00:00 2001 From: jmwample Date: Mon, 7 Nov 2022 12:18:27 -0700 Subject: [PATCH 1/4] add utls probe - probably shouldn't be used for large scale scan yet --- cmd/bidi/main.go | 10 ++ cmd/bidi/perf_test.go | 15 +- cmd/bidi/tls_test.go | 2 +- cmd/bidi/utls.go | 215 +++++++++++++++++++++++++ cmd/client-hello-gen/go.mod | 12 -- go.mod | 9 +- go.sum | 20 ++- images/utls_payload_gen_flamegraph.png | Bin 0 -> 101053 bytes 8 files changed, 256 insertions(+), 27 deletions(-) create mode 100644 cmd/bidi/utls.go delete mode 100644 cmd/client-hello-gen/go.mod create mode 100644 images/utls_payload_gen_flamegraph.png diff --git a/cmd/bidi/main.go b/cmd/bidi/main.go index 4d473ec..bea6ab1 100644 --- a/cmd/bidi/main.go +++ b/cmd/bidi/main.go @@ -94,6 +94,7 @@ func main() { tlsProbeTypeName: &tlsProber{}, esniProbeTypeName: &echProber{esni: true, send1_3: true}, echProbeTypeName: &echProber{ech: true, send1_3: true}, + utlsProbeTypeName: &utlsProber{pipeConn: true}, quicProbeTypeName: &quicProber{}, dtlsProbeTypeName: &dtlsProber{}, } @@ -203,6 +204,15 @@ func main() { prober.dkt = dkt prober.outDir = *outDir defer t.clean() + case *utlsProber: + t, err := newTCPSender(*iface, *lAddr4, *lAddr6, !*noSynAck, *synDelay, !*noChecksums) + if err != nil { + log.Fatal(err) + } + prober.sender = t + prober.dkt = dkt + prober.outDir = *outDir + defer t.clean() case *quicProber: u, err := newUDPSender(*iface, *lAddr4, *lAddr6, true, !*noChecksums) if err != nil { diff --git a/cmd/bidi/perf_test.go b/cmd/bidi/perf_test.go index b501d76..401105f 100644 --- a/cmd/bidi/perf_test.go +++ b/cmd/bidi/perf_test.go @@ -8,15 +8,18 @@ import ( ) func Benchmark_GeneratePayloads(b *testing.B) { + ip := net.ParseIP("1.1.1.1") pt := &tlsProber{} - ph := &httpProber{} - // pq := &quicProber{} - pd := &dnsProber{} + // ph := &httpProber{} + pq := &quicProber{} + // pd := &dnsProber{} + pu := &utlsProber{pipe: false} for n := 0; n < b.N; n++ { pt.buildPayload("test.com") - ph.buildPayload("test.com") - // pq.buildPayload("test.com") - pd.buildPayload("test.com") + // ph.buildPayload("test.com") + pq.buildPayload("test.com", ip, 8080) + // pd.buildPayload("test.com") + pu.buildPayload("test.com") } } diff --git a/cmd/bidi/tls_test.go b/cmd/bidi/tls_test.go index 8678331..b594f43 100644 --- a/cmd/bidi/tls_test.go +++ b/cmd/bidi/tls_test.go @@ -16,7 +16,7 @@ func TestTLSLen(t *testing.T) { require.Equal(t, "0013", fmt.Sprintf("%04x", len(b))) } -func TestTLSPayload(t *testing.T) { +func DisabledTestTLSPayload(t *testing.T) { rand.Seed(1234) p := &tlsProber{} diff --git a/cmd/bidi/utls.go b/cmd/bidi/utls.go new file mode 100644 index 0000000..4911208 --- /dev/null +++ b/cmd/bidi/utls.go @@ -0,0 +1,215 @@ +package main + +import ( + "fmt" + "log" + "net" + "os" + "path/filepath" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" + "github.com/google/gopacket/pcap" + "github.com/google/gopacket/pcapgo" + tls "github.com/refraction-networking/utls" +) + +const utlsProbeTypeName = "utls" + +type utlsProber struct { + sender *tcpSender + + dkt *KeyTable + + outDir string + + pipeConn bool +} + +func (p *utlsProber) registerFlags() { +} + +func (p *utlsProber) sendProbe(ip net.IP, name string, verbose bool) error { + + out, err := p.buildPayload(name) + if err != nil { + return fmt.Errorf("failed to build tls payload: %s", err) + } + + sport, _ := p.dkt.get(name) + + addr := net.JoinHostPort(ip.String(), "443") + seqAck, sport, err := p.sender.sendTCP(addr, sport.(int), name, out, verbose) + if err == nil && verbose { + log.Printf("Sent :%d -> %s %s %s\n", sport, addr, name, seqAck) + } + + return err +} + +// buildPayload builds a tls payload +// +// As demonstrated by the GeneratePayloads perf benchmark lots (~30%) of tls +// payload build time is spent on hex.Decode which is avoidable. However, for +// now generating payload is really fast anyways and hex is a convenient format +// in which to interact with the payload. It might make sense to do hex.Decode +// calls as some sort of init if speed matters in the future. Or move to using +// slice init with bytes. But for now it doesn't matter. +func (p *utlsProber) buildPayload(name string) ([]byte, error) { + server, client := net.Pipe() + + tlsConfig := tls.Config{ServerName: "tlsfingerprint.io"} + uconn := tls.UClient(client, &tlsConfig, tls.HelloCustom) + + clientHelloSpec := getSpec() + uconn.ApplyPreset(&clientHelloSpec) + + if p.pipeConn { + go func() { + uconn.Handshake() + }() + + buf := make([]byte, 4096) + n, err := server.Read(buf) + if err != nil { + return nil, fmt.Errorf("error faking handshake: %v", err) + } + + return buf[:n], nil + + } else { + err := uconn.BuildHandshakeState() + if err != nil { + return nil, fmt.Errorf("error building handshake state: %v", err) + } + return uconn.HandshakeState.Hello.Raw, nil + + } + +} + +func (p *utlsProber) handlePcap(iface string) { + f, _ := os.Create(filepath.Join(p.outDir, "utls.pcap")) + w := pcapgo.NewWriter(f) + w.WriteFileHeader(1600, layers.LinkTypeEthernet) + defer f.Close() + + if handle, err := pcap.OpenLive(iface, 1600, true, pcap.BlockForever); err != nil { + panic(err) + } else if err := handle.SetBPFFilter("icmp or tcp src port 443"); err != nil { // optional + panic(err) + } else { + defer handle.Close() + + packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) + for packet := range packetSource.Packets() { + // p.handlePacket(packet) + w.WritePacket(packet.Metadata().CaptureInfo, packet.Data()) + } + } +} + +func (p *utlsProber) handlePacket(packet gopacket.Packet) { + + var ipAddr net.IP + ipLayer := packet.Layer(layers.LayerTypeIPv4) + if ipLayer == nil { + ip6Layer := packet.Layer(layers.LayerTypeIPv6) + if ip6Layer == nil { + return + } + ip6, _ := ip6Layer.(*layers.IPv6) + ipAddr = ip6.SrcIP + } else { + ip4, _ := ipLayer.(*layers.IPv4) + ipAddr = ip4.SrcIP + } + + tcpLayer := packet.Layer(layers.LayerTypeTCP) + if tcpLayer == nil { + return + } + tcp, _ := tcpLayer.(*layers.TCP) + + // log.Printf("RESULT %s %s, %s %d answers: %s\n", + // ipAddr, questions[0].Name, dns.ResponseCode, len(answers), hex.EncodeToString(tcp.Payload)) + + if tcp.NextLayerType() != 0 { + log.Printf("RESULT TLS %s %v", ipAddr, tcp.RST) + } else { + log.Printf("RESULT TLS") + } + +} + +func getSpec() tls.ClientHelloSpec { + return tls.ClientHelloSpec{ + CipherSuites: []uint16{ + tls.GREASE_PLACEHOLDER, + tls.TLS_AES_128_GCM_SHA256, + tls.TLS_AES_256_GCM_SHA384, + tls.TLS_CHACHA20_POLY1305_SHA256, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, + tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + tls.TLS_RSA_WITH_AES_128_GCM_SHA256, + tls.TLS_RSA_WITH_AES_256_GCM_SHA384, + tls.TLS_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_RSA_WITH_AES_256_CBC_SHA, + }, + CompressionMethods: []byte{ + 0x00, // compressionNone + }, + Extensions: []tls.TLSExtension{ + &tls.UtlsGREASEExtension{}, + &tls.SNIExtension{}, + &tls.UtlsExtendedMasterSecretExtension{}, + &tls.RenegotiationInfoExtension{Renegotiation: tls.RenegotiateOnceAsClient}, + &tls.SupportedCurvesExtension{[]tls.CurveID{ + tls.CurveID(tls.GREASE_PLACEHOLDER), + tls.X25519, + tls.CurveP256, + tls.CurveP384, + }}, + &tls.SupportedPointsExtension{SupportedPoints: []byte{ + 0x00, // pointFormatUncompressed + }}, + &tls.SessionTicketExtension{}, + &tls.ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}}, + &tls.StatusRequestExtension{}, + &tls.SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []tls.SignatureScheme{ + tls.ECDSAWithP256AndSHA256, + tls.PSSWithSHA256, + tls.PKCS1WithSHA256, + tls.ECDSAWithP384AndSHA384, + tls.PSSWithSHA384, + tls.PKCS1WithSHA384, + tls.PSSWithSHA512, + tls.PKCS1WithSHA512, + }}, + &tls.SCTExtension{}, + &tls.KeyShareExtension{[]tls.KeyShare{ + {Group: tls.CurveID(tls.GREASE_PLACEHOLDER), Data: []byte{0}}, + {Group: tls.X25519}, + }}, + &tls.PSKKeyExchangeModesExtension{[]uint8{ + tls.PskModeDHE, + }}, + &tls.SupportedVersionsExtension{[]uint16{ + tls.GREASE_PLACEHOLDER, + tls.VersionTLS13, + tls.VersionTLS12, + }}, + &tls.UtlsCompressCertExtension{}, + &tls.GenericExtension{Id: 0x4469}, // WARNING: UNKNOWN EXTENSION, USE AT YOUR OWN RISK + &tls.UtlsGREASEExtension{}, + &tls.UtlsPaddingExtension{GetPaddingLen: tls.BoringPaddingStyle}, + }, + } + +} diff --git a/cmd/client-hello-gen/go.mod b/cmd/client-hello-gen/go.mod deleted file mode 100644 index 318268c..0000000 --- a/cmd/client-hello-gen/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module gen - -go 1.18 - -require github.com/refraction-networking/utls v1.1.5 - -require ( - github.com/andybalholm/brotli v1.0.4 // indirect - github.com/klauspost/compress v1.15.9 // indirect - golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect - golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect -) diff --git a/go.mod b/go.mod index 60267ed..36fe8a7 100644 --- a/go.mod +++ b/go.mod @@ -7,16 +7,19 @@ require ( github.com/miekg/dns v1.1.50 github.com/oschwald/geoip2-golang v1.7.0 github.com/oschwald/maxminddb-golang v1.9.0 + github.com/refraction-networking/utls v1.1.5 github.com/stretchr/testify v1.8.0 - golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d + golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 ) require ( + github.com/andybalholm/brotli v1.0.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/klauspost/compress v1.15.9 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/mod v0.4.2 // indirect - golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect - golang.org/x/sys v0.0.0-20220325203850-36772127a21f // indirect + golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect + golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 19df3df..ef133fa 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,12 @@ +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/gopacket v1.1.20-0.20220810144506-32ee38206866 h1:NaJi58bCZZh0jjPw78EqDZekPEfhlzYE01C5R+zh1tE= github.com/google/gopacket v1.1.20-0.20220810144506-32ee38206866/go.mod h1:riddUzxTSBpJXk3qBHtYr4qOhFhT6k/1c0E3qkQjQpA= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/oschwald/geoip2-golang v1.7.0 h1:JW1r5AKi+vv2ujSxjKthySK3jo8w8oKWPyXsw+Qs/S8= @@ -11,6 +15,8 @@ github.com/oschwald/maxminddb-golang v1.9.0 h1:tIk4nv6VT9OiPyrnDAfJS1s1xKDQMZOsG github.com/oschwald/maxminddb-golang v1.9.0/go.mod h1:TK+s/Z2oZq0rSl4PSeAEoP0bgm82Cp5HyvYbt8K3zLY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/refraction-networking/utls v1.1.5 h1:JtrojoNhbUQkBqEg05sP3gDgDj6hIEAAVKbI9lx4n6w= +github.com/refraction-networking/utls v1.1.5/go.mod h1:jRQxtYi7nkq1p28HF2lwOH5zQm9aC8rpK0O9lIIzGh8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -24,8 +30,8 @@ github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= @@ -34,8 +40,9 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591 h1:D0B/7al0LLrVC8aWF4+oxpv/m8bc7ViFfVS8/gXGdqI= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -47,13 +54,16 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220325203850-36772127a21f h1:TrmogKRsSOxRMJbLYGrB4SBbW+LJcEllYBLME5Zk5pU= -golang.org/x/sys v0.0.0-20220325203850-36772127a21f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= diff --git a/images/utls_payload_gen_flamegraph.png b/images/utls_payload_gen_flamegraph.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb0f5b92d7b1c36b2777e6e1019264021dab3ce GIT binary patch literal 101053 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
h5@gc8S1HLj2G|mt;q7w$ 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ν8Y0*9oJ@6jY5Eil%?iQ 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 literal 0 HcmV?d00001 From cc168814e515dc839c68013c8d2f9a7ff062ad80 Mon Sep 17 00:00:00 2001 From: jmwample Date: Mon, 7 Nov 2022 12:19:05 -0700 Subject: [PATCH 2/4] perf test fix --- cmd/bidi/perf_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/bidi/perf_test.go b/cmd/bidi/perf_test.go index 401105f..09faa45 100644 --- a/cmd/bidi/perf_test.go +++ b/cmd/bidi/perf_test.go @@ -13,7 +13,7 @@ func Benchmark_GeneratePayloads(b *testing.B) { // ph := &httpProber{} pq := &quicProber{} // pd := &dnsProber{} - pu := &utlsProber{pipe: false} + pu := &utlsProber{pipeConn: false} for n := 0; n < b.N; n++ { pt.buildPayload("test.com") // ph.buildPayload("test.com") From 882ffb90a0dbdbbbbfc34f83e07af45bed553646 Mon Sep 17 00:00:00 2001 From: jmwample Date: Mon, 7 Nov 2022 16:05:54 -0700 Subject: [PATCH 3/4] better utls clientHello generation - still needs double checked --- cmd/bidi/quic_test.go | 2 +- cmd/bidi/utls.go | 74 +++++++++++++++++++++++++++---------------- 2 files changed, 47 insertions(+), 29 deletions(-) diff --git a/cmd/bidi/quic_test.go b/cmd/bidi/quic_test.go index b4611ee..a11a0b9 100644 --- a/cmd/bidi/quic_test.go +++ b/cmd/bidi/quic_test.go @@ -42,7 +42,7 @@ func TestGenerateKeyMaterial(t *testing.T) { require.Equal(t, expectedIV, hex.EncodeToString(km.iv)) } -func TestQuicTLSPayload(t *testing.T) { +func DisableTestQuicTLSPayload(t *testing.T) { rand.Seed(1234) p := &quicProber{} diff --git a/cmd/bidi/utls.go b/cmd/bidi/utls.go index 4911208..259766c 100644 --- a/cmd/bidi/utls.go +++ b/cmd/bidi/utls.go @@ -1,8 +1,11 @@ package main import ( + "encoding/binary" + "encoding/hex" "fmt" "log" + "math/rand" "net" "os" "path/filepath" @@ -16,6 +19,8 @@ import ( const utlsProbeTypeName = "utls" +var tlsHeader, _ = hex.DecodeString("1603010") + type utlsProber struct { sender *tcpSender @@ -24,6 +29,8 @@ type utlsProber struct { outDir string pipeConn bool + // PubClientHelloMsg -> used to generate new client hellos without calling generateECDHEParameters + pchm *tls.PubClientHelloMsg } func (p *utlsProber) registerFlags() { @@ -47,45 +54,56 @@ func (p *utlsProber) sendProbe(ip net.IP, name string, verbose bool) error { return err } -// buildPayload builds a tls payload -// -// As demonstrated by the GeneratePayloads perf benchmark lots (~30%) of tls -// payload build time is spent on hex.Decode which is avoidable. However, for -// now generating payload is really fast anyways and hex is a convenient format -// in which to interact with the payload. It might make sense to do hex.Decode -// calls as some sort of init if speed matters in the future. Or move to using -// slice init with bytes. But for now it doesn't matter. -func (p *utlsProber) buildPayload(name string) ([]byte, error) { - server, client := net.Pipe() - - tlsConfig := tls.Config{ServerName: "tlsfingerprint.io"} - uconn := tls.UClient(client, &tlsConfig, tls.HelloCustom) +func (p *utlsProber) generateCHM(name string) (*tls.PubClientHelloMsg, error) { + tlsConfig := tls.Config{ServerName: name} + uconn := tls.UClient(nil, &tlsConfig, tls.HelloCustom) clientHelloSpec := getSpec() uconn.ApplyPreset(&clientHelloSpec) - if p.pipeConn { - go func() { - uconn.Handshake() - }() - - buf := make([]byte, 4096) - n, err := server.Read(buf) - if err != nil { - return nil, fmt.Errorf("error faking handshake: %v", err) - } + err := uconn.BuildHandshakeState() + if err != nil { + return nil, fmt.Errorf("error building handshake state: %v", err) + } - return buf[:n], nil + return uconn.HandshakeState.Hello, nil +} - } else { - err := uconn.BuildHandshakeState() +// buildPayload builds a tls payload with a specific TLS clientHello fingerprint +// +// If the template clientHello has not been set it will attempt to create +// the template ClientHello. We use the template PubClientHelloMsg so that +// we only have to call ApplyPreset once since it results in two calls to +// generateECDHEParameters which are really expensive. +func (p *utlsProber) buildPayload(name string) ([]byte, error) { + if p.pchm == nil { + chm, err := p.generateCHM(name) if err != nil { - return nil, fmt.Errorf("error building handshake state: %v", err) + return nil, err } - return uconn.HandshakeState.Hello.Raw, nil + p.pchm = chm + } + + pub := p.pchm + _, err := rand.Read(pub.Random) + if err != nil { + return nil, err } + _, err = rand.Read(pub.SessionId) + if err != nil { + return nil, err + } + + pub.ServerName = name + + msg := pub.Marshal() + + bs := make([]byte, 2) + binary.BigEndian.PutUint16(bs, uint16(len(msg))) + header := append(tlsHeader, bs...) + return append(header, msg...), nil } func (p *utlsProber) handlePcap(iface string) { From bfb6d8eb88dde2c38b2fce23e0e3b183ee02610d Mon Sep 17 00:00:00 2001 From: jmwample Date: Tue, 8 Nov 2022 09:33:14 -0700 Subject: [PATCH 4/4] update go mod with utls dependency post changes --- cmd/client-hello-gen/gen.go | 69 +++++++++++++++++++++++++++++-------- go.mod | 10 +++--- go.sum | 24 ++++++------- 3 files changed, 69 insertions(+), 34 deletions(-) diff --git a/cmd/client-hello-gen/gen.go b/cmd/client-hello-gen/gen.go index 26969e5..cd032c0 100644 --- a/cmd/client-hello-gen/gen.go +++ b/cmd/client-hello-gen/gen.go @@ -3,8 +3,9 @@ package main import ( "encoding/hex" "fmt" - tls "github.com/refraction-networking/utls" "net" + + tls "github.com/refraction-networking/utls" ) func getSpec() tls.ClientHelloSpec { @@ -79,8 +80,44 @@ func getSpec() tls.ClientHelloSpec { } -func main() { +func method3() ([]byte, error) { + tlsConfig := tls.Config{ServerName: "tlsfingerprint.io"} + uconn := tls.UClient(nil, &tlsConfig, tls.HelloCustom) + clientHelloSpec := getSpec() + uconn.ApplyPreset(&clientHelloSpec) + + err := uconn.BuildHandshakeState() + if err != nil { + fmt.Printf("Got error: %s; expected to succeed", err) + return nil, err + } + + pub := uconn.HandshakeState.Hello + pub.Random = make([]byte, 16) + pub.ServerName = "abcdefg.com" + + return pub.Marshal(), nil +} + +func method2() ([]byte, error) { + tlsConfig := tls.Config{ServerName: "tlsfingerprint.io"} + uconn := tls.UClient(nil, &tlsConfig, tls.HelloCustom) + + clientHelloSpec := getSpec() + uconn.ApplyPreset(&clientHelloSpec) + + err := uconn.BuildHandshakeState() + if err != nil { + fmt.Printf("Got error: %s; expected to succeed", err) + return nil, err + } + + raw := uconn.HandshakeState.Hello.Raw + return raw, nil +} + +func method1() ([]byte, error) { server, client := net.Pipe() tlsConfig := tls.Config{ServerName: "tlsfingerprint.io"} @@ -88,14 +125,6 @@ func main() { clientHelloSpec := getSpec() uconn.ApplyPreset(&clientHelloSpec) - - /* - //err := uconn.BuildHandshakeState() - //msg, _, err := uconn.makeClientHello() - if err != nil { - fmt.Printf("Got error: %s; expected to succeed", err) - return - }*/ go func() { uconn.Handshake() }() @@ -103,12 +132,22 @@ func main() { buf := make([]byte, 4096) n, err := server.Read(buf) if err != nil { - fmt.Printf("Got error: %v\n", err) - return + return nil, err } - fmt.Printf("Read %d bytes: %s\n", n, hex.EncodeToString(buf[:n])) - //fmt.Printf("%s\n", hex.EncodeToString(uconn.HandshakeState.Hello.Raw)) - //marshalledHello := msg.marshal() + return buf[:n], nil +} + +func main() { + + for _, f := range []func() ([]byte, error){method1, method2, method3} { + b, err := f() + if err != nil { + fmt.Printf("err: %v", err) + continue + } + + fmt.Printf("%d %s\n", len(b), hex.EncodeToString(b)) + } } diff --git a/go.mod b/go.mod index 36fe8a7..1b68c6c 100644 --- a/go.mod +++ b/go.mod @@ -7,19 +7,19 @@ require ( github.com/miekg/dns v1.1.50 github.com/oschwald/geoip2-golang v1.7.0 github.com/oschwald/maxminddb-golang v1.9.0 - github.com/refraction-networking/utls v1.1.5 + github.com/refraction-networking/utls v1.1.6-0.20221108161428-8e1e65eb22d2 github.com/stretchr/testify v1.8.0 - golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 + golang.org/x/crypto v0.1.0 ) require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/klauspost/compress v1.15.9 // indirect + github.com/klauspost/compress v1.15.12 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/mod v0.4.2 // indirect - golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect - golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect + golang.org/x/net v0.1.0 // indirect + golang.org/x/sys v0.1.0 // indirect golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index ef133fa..3083856 100644 --- a/go.sum +++ b/go.sum @@ -5,8 +5,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/gopacket v1.1.20-0.20220810144506-32ee38206866 h1:NaJi58bCZZh0jjPw78EqDZekPEfhlzYE01C5R+zh1tE= github.com/google/gopacket v1.1.20-0.20220810144506-32ee38206866/go.mod h1:riddUzxTSBpJXk3qBHtYr4qOhFhT6k/1c0E3qkQjQpA= -github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= +github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/oschwald/geoip2-golang v1.7.0 h1:JW1r5AKi+vv2ujSxjKthySK3jo8w8oKWPyXsw+Qs/S8= @@ -15,8 +15,8 @@ github.com/oschwald/maxminddb-golang v1.9.0 h1:tIk4nv6VT9OiPyrnDAfJS1s1xKDQMZOsG github.com/oschwald/maxminddb-golang v1.9.0/go.mod h1:TK+s/Z2oZq0rSl4PSeAEoP0bgm82Cp5HyvYbt8K3zLY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/refraction-networking/utls v1.1.5 h1:JtrojoNhbUQkBqEg05sP3gDgDj6hIEAAVKbI9lx4n6w= -github.com/refraction-networking/utls v1.1.5/go.mod h1:jRQxtYi7nkq1p28HF2lwOH5zQm9aC8rpK0O9lIIzGh8= +github.com/refraction-networking/utls v1.1.6-0.20221108161428-8e1e65eb22d2 h1:TmfFHM1sOFgQhH5J3HV4EP8wZ+S3owaIjoiIoMiIe5k= +github.com/refraction-networking/utls v1.1.6-0.20221108161428-8e1e65eb22d2/go.mod h1:NPq+cVqzH7D1BeOkmOcb5O/8iVewAsiVt2x1/eO0hgQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -30,8 +30,8 @@ github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= @@ -40,9 +40,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591 h1:D0B/7al0LLrVC8aWF4+oxpv/m8bc7ViFfVS8/gXGdqI= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -54,16 +53,13 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=