From d8216f776d02533f8a08189793a11247215a8039 Mon Sep 17 00:00:00 2001 From: 9seconds Date: Thu, 7 Nov 2019 13:55:41 +0300 Subject: [PATCH] First version of website cloaking --- faketls/client_protocol.go | 45 ++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/faketls/client_protocol.go b/faketls/client_protocol.go index 6102b88..9acdbd3 100644 --- a/faketls/client_protocol.go +++ b/faketls/client_protocol.go @@ -6,9 +6,13 @@ import ( "errors" "fmt" "io" + "net" + "strconv" + "sync" "time" "github.com/9seconds/mtg/antireplay" + "github.com/9seconds/mtg/config" "github.com/9seconds/mtg/conntypes" "github.com/9seconds/mtg/obfuscated2" "github.com/9seconds/mtg/protocol" @@ -27,8 +31,10 @@ func (c *ClientProtocol) Handshake(socket conntypes.StreamReadWriteCloser) (conn for _, expected := range faketlsStartBytes { if actual, err := bufferedReader.ReadByte(); err != nil || actual != expected { - fmt.Println("!!!!!!!!!!!! ERROR !!!!!!!!!!!!", err) - return nil, errors.New("qqq") + rewinded.Rewind() + c.cloakHost(rewinded) + + return nil, errors.New("failed first bytes of tls handshake") } } @@ -36,8 +42,10 @@ func (c *ClientProtocol) Handshake(socket conntypes.StreamReadWriteCloser) (conn rewinded = stream.NewRewind(rewinded) if err := c.tlsHandshake(rewinded); err != nil { - fmt.Println("!!!!!!!!!!!! ERROR !!!!!!!!!!!!", err) - return nil, errors.New("qqq") + rewinded.Rewind() + c.cloakHost(rewinded) + + return nil, fmt.Errorf("failed tls handshake: %w", err) } conn := stream.NewFakeTLS(socket) @@ -98,6 +106,35 @@ func (c *ClientProtocol) tlsHandshake(conn io.ReadWriter) error { return nil } +func (c *ClientProtocol) cloakHost(clientConn io.ReadWriteCloser) { + addr := net.JoinHostPort(config.C.CloakHost, strconv.Itoa(config.C.CloakPort)) + hostConn, err := net.Dial("tcp", addr) + + if err != nil { + return + } + + defer hostConn.Close() + + wg := &sync.WaitGroup{} + wg.Add(2) + + go c.pipe(hostConn, clientConn, wg) + + go c.pipe(clientConn, hostConn, wg) + + wg.Wait() +} + +func (c *ClientProtocol) pipe(dst io.WriteCloser, src io.Reader, wg *sync.WaitGroup) { + defer func() { + wg.Done() + dst.Close() + }() + + io.Copy(dst, src) // nolint: errcheck +} + func MakeClientProtocol() protocol.ClientProtocol { return &ClientProtocol{} }