From bf83273f6ee41bcf3246c118fe0139ad86b53e76 Mon Sep 17 00:00:00 2001 From: Qian Wang Date: Sat, 3 Aug 2019 13:26:57 +0100 Subject: [PATCH] Fix redirection --- cmd/ck-server/ck-server.go | 6 +++++- internal/server/TLS.go | 36 ++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/cmd/ck-server/ck-server.go b/cmd/ck-server/ck-server.go index 4dfdd3a..8de6533 100644 --- a/cmd/ck-server/ck-server.go +++ b/cmd/ck-server/ck-server.go @@ -69,7 +69,10 @@ func dispatchConnection(conn net.Conn, sta *server.State) { log.Errorf("Making connection to redirection server: %v", err) return } - webConn.Write(data) + _, err = webConn.Write(data) + if err != nil { + log.Error("Failed to send first packet to redirection server", err) + } go pipe(webConn, conn) go pipe(conn, webConn) } @@ -191,6 +194,7 @@ func dispatchConnection(conn net.Conn, sta *server.State) { localConn, err := net.Dial("tcp", sta.ProxyBook[proxyMethod]) if err != nil { log.Errorf("Failed to connect to %v: %v", proxyMethod, err) + sesh.Close() continue } go pipe(localConn, newStream) diff --git a/internal/server/TLS.go b/internal/server/TLS.go index c234f7f..e8c96d2 100644 --- a/internal/server/TLS.go +++ b/internal/server/TLS.go @@ -91,12 +91,6 @@ func AddRecordLayer(input []byte, typ []byte, ver []byte) []byte { return ret } -// PeelRecordLayer peels off the record layer -func PeelRecordLayer(data []byte) []byte { - ret := data[5:] - return ret -} - // ParseClientHello parses everything on top of the TLS layer // (including the record layer) into ClientHello type func ParseClientHello(data []byte) (ret *ClientHello, err error) { @@ -105,45 +99,47 @@ func ParseClientHello(data []byte) (ret *ClientHello, err error) { err = errors.New("Malformed ClientHello") } }() - data = PeelRecordLayer(data) + + peeled := make([]byte, len(data)-5) + copy(peeled, data[5:]) pointer := 0 // Handshake Type - handshakeType := data[pointer] + handshakeType := peeled[pointer] if handshakeType != 0x01 { return ret, errors.New("Not a ClientHello") } pointer += 1 // Length - length := int(u32(append([]byte{0x00}, data[pointer:pointer+3]...))) + length := int(u32(append([]byte{0x00}, peeled[pointer:pointer+3]...))) pointer += 3 - if length != len(data[pointer:]) { + if length != len(peeled[pointer:]) { return ret, errors.New("Hello length doesn't match") } // Client Version - clientVersion := data[pointer : pointer+2] + clientVersion := peeled[pointer : pointer+2] pointer += 2 // Random - random := data[pointer : pointer+32] + random := peeled[pointer : pointer+32] pointer += 32 // Session ID - sessionIdLen := int(data[pointer]) + sessionIdLen := int(peeled[pointer]) pointer += 1 - sessionId := data[pointer : pointer+sessionIdLen] + sessionId := peeled[pointer : pointer+sessionIdLen] pointer += sessionIdLen // Cipher Suites - cipherSuitesLen := int(u16(data[pointer : pointer+2])) + cipherSuitesLen := int(u16(peeled[pointer : pointer+2])) pointer += 2 - cipherSuites := data[pointer : pointer+cipherSuitesLen] + cipherSuites := peeled[pointer : pointer+cipherSuitesLen] pointer += cipherSuitesLen // Compression Methods - compressionMethodsLen := int(data[pointer]) + compressionMethodsLen := int(peeled[pointer]) pointer += 1 - compressionMethods := data[pointer : pointer+compressionMethodsLen] + compressionMethods := peeled[pointer : pointer+compressionMethodsLen] pointer += compressionMethodsLen // Extensions - extensionsLen := int(u16(data[pointer : pointer+2])) + extensionsLen := int(u16(peeled[pointer : pointer+2])) pointer += 2 - extensions, err := parseExtensions(data[pointer:]) + extensions, err := parseExtensions(peeled[pointer:]) ret = &ClientHello{ handshakeType, length,