From 2ae7e58c83d07c8ab246b84d5bd82915a75403fb Mon Sep 17 00:00:00 2001 From: xixijun Date: Mon, 22 Aug 2022 17:48:45 +0800 Subject: [PATCH] Fix socks5 proxy not working on tor proxy (#2455) * fix: socks5 proxy not working on tor proxy * fix: socks5 proxy not working on tor proxy * minor refactoring Co-authored-by: Sandeep Singh Co-authored-by: Mzack9999 --- v2/pkg/protocols/headless/engine/http_client.go | 17 ++++++++--------- .../protocols/http/httpclientpool/clientpool.go | 17 ++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/v2/pkg/protocols/headless/engine/http_client.go b/v2/pkg/protocols/headless/engine/http_client.go index 89e7eafa4..ea32aa5e3 100644 --- a/v2/pkg/protocols/headless/engine/http_client.go +++ b/v2/pkg/protocols/headless/engine/http_client.go @@ -3,18 +3,16 @@ package engine import ( "context" "crypto/tls" - "fmt" "net" "net/http" "net/http/cookiejar" "net/url" "time" - "github.com/projectdiscovery/nuclei/v2/pkg/protocols/utils" - "golang.org/x/net/proxy" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/protocolstate" + "github.com/projectdiscovery/nuclei/v2/pkg/protocols/utils" "github.com/projectdiscovery/nuclei/v2/pkg/types" ) @@ -53,14 +51,15 @@ func newHttpClient(options *types.Options) (*http.Client, error) { transport.Proxy = http.ProxyURL(proxyURL) } } else if types.ProxySocksURL != "" { - var proxyAuth *proxy.Auth socksURL, proxyErr := url.Parse(types.ProxySocksURL) - if proxyErr == nil { - proxyAuth = &proxy.Auth{} - proxyAuth.User = socksURL.User.Username() - proxyAuth.Password, _ = socksURL.User.Password() + if proxyErr != nil { + return nil, err } - dialer, proxyErr := proxy.SOCKS5("tcp", fmt.Sprintf("%s:%s", socksURL.Hostname(), socksURL.Port()), proxyAuth, proxy.Direct) + dialer, err := proxy.FromURL(socksURL, proxy.Direct) + if err != nil { + return nil, err + } + dc := dialer.(interface { DialContext(ctx context.Context, network, addr string) (net.Conn, error) }) diff --git a/v2/pkg/protocols/http/httpclientpool/clientpool.go b/v2/pkg/protocols/http/httpclientpool/clientpool.go index ff53d54a4..393f70c06 100644 --- a/v2/pkg/protocols/http/httpclientpool/clientpool.go +++ b/v2/pkg/protocols/http/httpclientpool/clientpool.go @@ -3,7 +3,6 @@ package httpclientpool import ( "context" "crypto/tls" - "fmt" "net" "net/http" "net/http/cookiejar" @@ -13,14 +12,13 @@ import ( "sync" "time" - "github.com/projectdiscovery/nuclei/v2/pkg/protocols/utils" - "github.com/pkg/errors" "golang.org/x/net/proxy" "golang.org/x/net/publicsuffix" "github.com/projectdiscovery/fastdialer/fastdialer" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/protocolstate" + "github.com/projectdiscovery/nuclei/v2/pkg/protocols/utils" "github.com/projectdiscovery/nuclei/v2/pkg/types" "github.com/projectdiscovery/rawhttp" "github.com/projectdiscovery/retryablehttp-go" @@ -210,14 +208,15 @@ func wrappedGet(options *types.Options, configuration *Configuration) (*retryabl transport.Proxy = http.ProxyURL(proxyURL) } } else if types.ProxySocksURL != "" { - var proxyAuth *proxy.Auth socksURL, proxyErr := url.Parse(types.ProxySocksURL) - if proxyErr == nil { - proxyAuth = &proxy.Auth{} - proxyAuth.User = socksURL.User.Username() - proxyAuth.Password, _ = socksURL.User.Password() + if proxyErr != nil { + return nil, proxyErr } - dialer, proxyErr := proxy.SOCKS5("tcp", fmt.Sprintf("%s:%s", socksURL.Hostname(), socksURL.Port()), proxyAuth, proxy.Direct) + dialer, err := proxy.FromURL(socksURL, proxy.Direct) + if err != nil { + return nil, err + } + dc := dialer.(interface { DialContext(ctx context.Context, network, addr string) (net.Conn, error) })