From d8ce35ae3fea54b0ad67f2ce94fca8a0f99941ea Mon Sep 17 00:00:00 2001 From: Bluesaxorcist Date: Fri, 16 Aug 2019 16:10:27 -0500 Subject: made dispatcher operational for obfs4 --- modes/pt_socks5/pt_socks5.go | 102 +++++++------------------------ modes/stun_udp/stun_udp.go | 61 +----------------- modes/transparent_tcp/transparent_tcp.go | 84 +------------------------ modes/transparent_udp/transparent_udp.go | 92 ++++++---------------------- 4 files changed, 43 insertions(+), 296 deletions(-) (limited to 'modes') diff --git a/modes/pt_socks5/pt_socks5.go b/modes/pt_socks5/pt_socks5.go index 8ff2528..7b958de 100644 --- a/modes/pt_socks5/pt_socks5.go +++ b/modes/pt_socks5/pt_socks5.go @@ -30,6 +30,8 @@ package pt_socks5 import ( + "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras" + "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" "io" "net" "net/url" @@ -107,86 +109,12 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, con } } - var dialer func(address string) (net.Conn, error) + var dialer func() (net.Conn, error) // Deal with arguments. - switch name { - case "obfs2": - transport := obfs2.NewObfs2Transport() - dialer = transport.Dial - case "obfs4": - if cert, ok := args.Get("cert"); ok { - if iatModeStr, ok2 := args.Get("iatMode"); ok2 { - iatMode, err := strconv.Atoi(iatModeStr) - if err != nil { - transport := obfs4.NewObfs4Client(cert, iatMode) - dialer = transport.Dial - } else { - log.Errorf("obfs4 transport bad iatMode value: %s", iatModeStr) - socksReq.Reply(socks5.ReplyGeneralFailure) - return - } - } else { - log.Errorf("obfs4 transport missing cert argument: %s", args) - socksReq.Reply(socks5.ReplyGeneralFailure) - return - } - } else { - log.Errorf("obfs4 transport missing cert argument: %s", args) - socksReq.Reply(socks5.ReplyGeneralFailure) - return - } - //case "shadow": - // if password, ok := args["password"]; ok { - // if cipher, ok2 := args["cipherName"]; ok2 { - // transport := shadow.NewShadowClient(password[0], cipher[0]) - // dialer = transport.Dial - // } else { - // log.Errorf("shadow transport missing cipher argument: %s", args) - // socksReq.Reply(socks5.ReplyGeneralFailure) - // return - // } - // } else { - // log.Errorf("shadow transport missing password argument: %s", args) - // socksReq.Reply(socks5.ReplyGeneralFailure) - // return - // } - // case "Optimizer": - // if _, ok := args["transports"]; ok { - // if strategyName, ok2 := args["strategy"]; ok2 { - // var strategy Optimizer.Strategy = nil - // switch strategyName[0] { - // case "first": - // strategy = Optimizer.NewFirstStrategy() - // case "random": - // strategy = Optimizer.NewRandomStrategy() - // case "rotate": - // strategy = Optimizer.NewRotateStrategy() - // case "track": - // strategy = Optimizer.NewTrackStrategy() - // case "min": - // strategy = Optimizer.NewMinimizeDialDuration() - // } - //transports := []Optimizer.Transport{} - //transport := Optimizer.NewOptimizerClient(transports, strategy) - // return transport, nil - ////says too many arguments to return just like earlier. - // } else { - // log.Errorf("Optimizer transport missing transports argument: %s", args) - // socksReq.Reply(socks5.ReplyGeneralFailure) - // return - // } - //} else { - // log.Errorf("Optimizer transport missing strategy argument: %s", args) - // socksReq.Reply(socks5.ReplyGeneralFailure) - // return - //} - - default: - log.Errorf("Unknown transport: %s", name) - socksReq.Reply(socks5.ReplyGeneralFailure) - return - } + transport, _ := pt_extras.ArgsToDialer(socksReq.Target, name, args) + dialer = transport.Dial + f := dialer // Obtain the proxy dialer if any, and create the outgoing TCP connection. // dialFn := proxy.Direct.Dial @@ -204,9 +132,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, con // // fmt.Println("Got dialer", dialFn, proxyURI, proxy.Direct) - f := dialer - - remote, _ := f(socksReq.Target) + remote, _ := f() if err != nil { log.Errorf("%s(%s) - outgoing connection failed: %s", name, addrStr, log.ElideError(err)) socksReq.Reply(socks5.ErrorToReplyCode(err)) @@ -264,11 +190,25 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn log.Errorf("obfs4 transport missing cert argument: %s", args) return } + case "shadow": + password, ok := args.Get("password") + if !ok { + return false, nil + } + + cipherName, ok2 := args.Get("cipherName") + if !ok2 { + return false, nil + } + + transport := shadow.NewShadowServer(password, cipherName) + listen = transport.Listen default: log.Errorf("Unknown transport: %s", name) return } + f := listen transportLn := f(bindaddr.Addr.String()) diff --git a/modes/stun_udp/stun_udp.go b/modes/stun_udp/stun_udp.go index c9abcd6..f9d458f 100644 --- a/modes/stun_udp/stun_udp.go +++ b/modes/stun_udp/stun_udp.go @@ -31,6 +31,7 @@ package stun_udp import ( "fmt" + "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras" "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" "io" golog "log" @@ -169,39 +170,11 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt return } - var f func(address string) (net.Conn, error) - // Deal with arguments. - switch name { - case "obfs2": - transport := obfs2.NewObfs2Transport() - f = transport.Dial - case "obfs4": - if cert, ok := args["cert"]; ok { - if iatModeStr, ok2 := args["iatMode"]; ok2 { - iatMode, err := strconv.Atoi(iatModeStr[0]) - if err != nil { - transport := obfs4.NewObfs4Client(cert[0], iatMode) - f = transport.Dial - } else { - log.Errorf("obfs4 transport bad iatMode value: %s", iatModeStr) - return - } - } else { - log.Errorf("obfs4 transport missing cert argument: %s", args) - return - } - } else { - log.Errorf("obfs4 transport missing cert argument: %s", args) - return - } - default: - log.Errorf("Unknown transport: %s", name) - return - } + transport, _ := pt_extras.ArgsToDialer(target, name, args) fmt.Println("Dialing ", target) - remote, _ := f(target) + remote, _ := transport.Dial() // if err != nil { // fmt.Println("outgoing connection failed", err) // log.Errorf("(%s) - outgoing connection failed: %s", target, log.ElideError(err)) @@ -268,34 +241,6 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn log.Errorf("shadow transport missing password argument: %s", args) return } - // case "Optimizer": - // if _, ok := args["transports"]; ok { - // if strategyName, ok2 := args["strategy"]; ok2 { - // var strategy Optimizer.Strategy = nil - // switch strategyName[0] { - // case "first": - // strategy = Optimizer.NewFirstStrategy() - // case "random": - // strategy = Optimizer.NewRandomStrategy() - // case "rotate": - // strategy = Optimizer.NewRotateStrategy() - // case "track": - // strategy = Optimizer.NewTrackStrategy() - // case "min": - // strategy = Optimizer.NewMinimizeDialDuration() - // } - //transports := []Optimizer.Transport{} - //transport := Optimizer.NewOptimizerClient(transports, strategy) - // return transport, nil - ////says too many arguments to return just like earlier. tried autocorrecting and now it says transport is not type bool - // } else { - // log.Errorf("Optimizer transport missing transports argument: %s", args) - // return - // } - //} else { - // log.Errorf("Optimizer transport missing strategy argument: %s", args) - // return - //} default: log.Errorf("Unknown transport: %s", name) diff --git a/modes/transparent_tcp/transparent_tcp.go b/modes/transparent_tcp/transparent_tcp.go index d49bb32..a948d2d 100644 --- a/modes/transparent_tcp/transparent_tcp.go +++ b/modes/transparent_tcp/transparent_tcp.go @@ -30,19 +30,17 @@ package transparent_tcp import ( - "errors" "fmt" + "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras" "io" "net" "net/url" - "strconv" "strings" "sync" "github.com/OperatorFoundation/shapeshifter-dispatcher/common/log" "github.com/OperatorFoundation/shapeshifter-dispatcher/common/termmon" "github.com/OperatorFoundation/shapeshifter-ipc" - "github.com/OperatorFoundation/shapeshifter-transports/transports/Optimizer" //"github.com/OperatorFoundation/shapeshifter-transports/transports/obfs2" "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4" "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" @@ -99,7 +97,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt // Deal with arguments. - transport, _ := argsToDialer(target, name, args) + transport, _ := pt_extras.ArgsToDialer(target, name, args) dialer = transport.Dial f := dialer @@ -138,85 +136,7 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt return } -func argsToDialer(target string, name string, args pt.Args) (Optimizer.Transport, error) { - switch name { - //case "obfs2": - // transport := obfs2.NewObfs2Transport() - // dialer = transport.Dial - // return dialer, nil - case "obfs4": - if cert, ok := args["cert"]; ok { - if iatModeStr, ok2 := args["iatMode"]; ok2 { - iatMode, err := strconv.Atoi(iatModeStr[0]) - if err == nil { - transport := obfs4.Transport{ - CertString: cert[0], - IatMode: iatMode, - Address: target, - } - return transport, nil - } else { - log.Errorf("obfs4 transport bad iatMode value: %s %s", iatModeStr[0], err) - return nil, errors.New("obfs4 transport bad iatMode value") - } - } else { - log.Errorf("obfs4 transport missing iatMode argument: %s", args) - return nil, errors.New("obfs4 transport missing iatMode argument") - } - } else { - log.Errorf("obfs4 transport missing cert argument: %s", args) - return nil, errors.New("obfs4 transport missing cert argument") - } - case "shadow": - if password, ok := args["password"]; ok { - if cipher, ok2 := args["cipherName"]; ok2 { - transport := shadow.Transport{ - Password: password[0], - CipherName: cipher[0], - Address: target, - } - return transport, nil - } else { - log.Errorf("shadow transport missing cipher argument: %s", args) - return nil, errors.New("shadow transport missing cipher argument") - } - } else { - log.Errorf("shadow transport missing password argument: %s", args) - return nil, errors.New("shadow transport missing password argument") - } - case "Optimizer": - if _, ok := args["transports"]; ok { - if strategyName, ok2 := args["strategy"]; ok2 { - var strategy Optimizer.Strategy = nil - switch strategyName[0] { - case "first": - strategy = Optimizer.NewFirstStrategy() - case "random": - strategy = Optimizer.NewRandomStrategy() - case "rotate": - strategy = Optimizer.NewRotateStrategy() - case "track": - strategy = Optimizer.NewTrackStrategy() - case "min": - strategy = Optimizer.NewMinimizeDialDuration() - } - transports := []Optimizer.Transport{} - transport := Optimizer.NewOptimizerClient(transports, strategy) - return transport, nil - } else { - log.Errorf("Optimizer transport missing transports argument: %s", args) - return nil, errors.New("optimizer transport missing transports argument") - } - } else { - log.Errorf("Optimizer transport missing strategy argument: %s", args) - return nil, errors.New("optimizer transport missing strategy argument") - } - default: - log.Errorf("Unknown transport: %s", name) - return nil, errors.New("unknown transport") - } -} func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerInfo pt.ServerInfo, statedir string, options string) (launched bool, listeners []net.Listener) { // Launch each of the server listeners. diff --git a/modes/transparent_udp/transparent_udp.go b/modes/transparent_udp/transparent_udp.go index 58ef491..f32397f 100644 --- a/modes/transparent_udp/transparent_udp.go +++ b/modes/transparent_udp/transparent_udp.go @@ -33,6 +33,8 @@ import ( "bytes" "encoding/binary" "fmt" + "github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras" + "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow" "io" golog "log" "net" @@ -175,8 +177,6 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt fmt.Println("Dialing....") - var dialer func(address string) (net.Conn, error) - args, argsErr := pt.ParsePT2ClientParameters(options) if argsErr != nil { log.Errorf("Error parsing transport options: %s", options) @@ -184,80 +184,9 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt } // Deal with arguments. - switch name { - case "obfs2": - transport := obfs2.NewObfs2Transport() - dialer = transport.Dial - case "obfs4": - if cert, ok := args["cert"]; ok { - if iatModeStr, ok2 := args["iatMode"]; ok2 { - iatMode, err := strconv.Atoi(iatModeStr[0]) - if err != nil { - transport := obfs4.NewObfs4Client(cert[0], iatMode) - dialer = transport.Dial - } else { - log.Errorf("obfs4 transport bad iatMode value: %s", iatModeStr) - return - } - } else { - log.Errorf("obfs4 transport missing cert argument: %s", args) - return - } - } else { - log.Errorf("obfs4 transport missing cert argument: %s", args) - return - } - //case "shadow": - // if password, ok := args["password"]; ok { - // if cipher, ok2 := args["cipherName"]; ok2 { - //transport := shadow.NewShadowClient(password[0], cipher[0]) - //dialer = transport.Dial - ////transport.Dial isn't the right type somehow? - // } else { - // log.Errorf("shadow transport missing cipher argument: %s", args) - // return - // } - //} else { - // log.Errorf("shadow transport missing password argument: %s", args) - // return - //} - //case "Optimizer": - // if _, ok := args["transports"]; ok { - // if strategyName, ok2 := args["strategy"]; ok2 { - // var strategy Optimizer.Strategy = nil - // switch strategyName[0] { - // case "first": - // strategy = Optimizer.NewFirstStrategy() - // case "random": - // strategy = Optimizer.NewRandomStrategy() - // case "rotate": - // strategy = Optimizer.NewRotateStrategy() - // case "track": - // strategy = Optimizer.NewTrackStrategy() - // case "min": - // strategy = Optimizer.NewMinimizeDialDuration() - // } - //transports := []Optimizer.Transport{} - //transport := Optimizer.NewOptimizerClient(transports, strategy) - //return transport - ////says too many arguments to return? where is the return type specified? - // } else { - // log.Errorf("Optimizer transport missing transports argument: %s", args) - // return - // } - //} else { - // log.Errorf("Optimizer transport missing strategy argument: %s", args) - // return - //} - - default: - log.Errorf("Unknown transport: %s", name) - return - } - - f := dialer + transport, _ := pt_extras.ArgsToDialer(target, name, args) fmt.Println("Dialing ", target) - remote, _ := f(target) + remote, _ := transport.Dial() // if err != nil { // fmt.Println("outgoing connection failed", err) // log.Errorf("(%s) - outgoing connection failed: %s", target, log.ElideError(err)) @@ -311,6 +240,19 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn log.Errorf("obfs4 transport missing cert argument: %s", args) return } + case "shadow": + password, ok := args.Get("password") + if !ok { + return false, nil + } + + cipherName, ok2 := args.Get("cipherName") + if !ok2 { + return false, nil + } + + transport := shadow.NewShadowServer(password, cipherName) + listen = transport.Listen default: log.Errorf("Unknown transport: %s", name) return -- cgit v1.2.3