From a8d34772728a7edd7a1354fd7cbcb51619c7700b Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Sat, 5 Jul 2025 14:19:16 +0300 Subject: [PATCH 1/5] made linter happy --- cmd/gohpts/cli.go | 57 +++++++++++++++++++------- gohpts.go | 100 ++++++++++++++++++++++++++++------------------ tproxy_linux.go | 26 ++++++++++-- 3 files changed, 125 insertions(+), 58 deletions(-) diff --git a/cmd/gohpts/cli.go b/cmd/gohpts/cli.go index e969a84..dc848d9 100644 --- a/cmd/gohpts/cli.go +++ b/cmd/gohpts/cli.go @@ -17,31 +17,32 @@ const ( addrHTTP string = "127.0.0.1:8080" tproxyOS string = "linux" ) -const usagePrefix string = ` _____ _ _ _____ _______ _____ + +const usagePrefix string = ` _____ _ _ _____ _______ _____ / ____| | | | | __ \__ __/ ____| - | | __ ___ | |__| | |__) | | | | (___ - | | |_ |/ _ \| __ | ___/ | | \___ \ + | | __ ___ | |__| | |__) | | | | (___ + | | |_ |/ _ \| __ | ___/ | | \___ \ | |__| | (_) | | | | | | | ____) | - \_____|\___/|_| |_|_| |_| |_____/ - -GoHPTS (HTTP(S) Proxy to SOCKS5 proxy) by shadowy-pycoder + \_____|\___/|_| |_|_| |_| |_____/ + +GoHPTS (HTTP(S) Proxy to SOCKS5 proxy) by shadowy-pycoder GitHub: https://github.com/shadowy-pycoder/go-http-proxy-to-socks -Usage: gohpts [OPTIONS] +Usage: gohpts [OPTIONS] Options: -h Show this help message and exit -v Show version and build information -D Run as a daemon (provide -logfile to see logs) Proxy: - -l Address of HTTP proxy server (default "127.0.0.1:8080") + -l Address of HTTP proxy server (default "127.0.0.1:8080") -s Address of SOCKS5 proxy server (default "127.0.0.1:1080") -c Path to certificate PEM encoded file -k Path to private key PEM encoded file -U User for HTTP proxy (basic auth). This flag invokes prompt for password (not echoed to terminal) -u User for SOCKS5 proxy authentication. This flag invokes prompt for password (not echoed to terminal) -f Path to server configuration file in YAML format (overrides other proxy flags) - + Logs: -d Show logs in DEBUG mode -j Show logs in JSON format @@ -53,6 +54,7 @@ Options: -snifflog Sniffed traffic log file path (Default: the same as -logfile) -body Collect request and response body for HTTP traffic (credentials, tokens, etc) ` + const usageTproxy string = ` TProxy: -t Address of transparent proxy server (it starts along with HTTP proxy server) @@ -66,12 +68,27 @@ func root(args []string) error { conf := gohpts.Config{} flags := flag.NewFlagSet(app, flag.ExitOnError) flags.StringVar(&conf.AddrSOCKS, "s", addrSOCKS, "Address of SOCKS5 proxy server") - flags.StringVar(&conf.User, "u", "", "User for SOCKS5 proxy authentication. This flag invokes prompt for password (not echoed to terminal)") + flags.StringVar( + &conf.User, + "u", + "", + "User for SOCKS5 proxy authentication. This flag invokes prompt for password (not echoed to terminal)", + ) flags.StringVar(&conf.AddrHTTP, "l", addrHTTP, "Address of HTTP proxy server") - flags.StringVar(&conf.ServerUser, "U", "", "User for HTTP proxy (basic auth). This flag invokes prompt for password (not echoed to terminal)") + flags.StringVar( + &conf.ServerUser, + "U", + "", + "User for HTTP proxy (basic auth). This flag invokes prompt for password (not echoed to terminal)", + ) flags.StringVar(&conf.CertFile, "c", "", "Path to certificate PEM encoded file") flags.StringVar(&conf.KeyFile, "k", "", "Path to private key PEM encoded file") - flags.StringVar(&conf.ServerConfPath, "f", "", "Path to server configuration file in YAML format (overrides other proxy flags)") + flags.StringVar( + &conf.ServerConfPath, + "f", + "", + "Path to server configuration file in YAML format (overrides other proxy flags)", + ) daemon := flags.Bool("D", false, "Run as a daemon (provide -logfile to see logs)") if runtime.GOOS == tproxyOS { flags.StringVar(&conf.TProxy, "t", "", "Address of transparent proxy server (it starts along with HTTP proxy server)") @@ -84,12 +101,22 @@ func root(args []string) error { conf.TProxyMode = flagValue return nil }) - flags.BoolVar(&conf.Auto, "auto", false, "Automatically setup iptables for transparent proxy (requires elevated privileges)") - flags.UintVar(&conf.Mark, "mark", 0, "Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100)") + flags.BoolVar( + &conf.Auto, + "auto", + false, + "Automatically setup iptables for transparent proxy (requires elevated privileges)", + ) + flags.UintVar( + &conf.Mark, + "mark", + 0, + "Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100)", + ) } flags.StringVar(&conf.LogFilePath, "logfile", "", "Log file path (Default: stdout)") flags.BoolVar(&conf.Debug, "d", false, "Show logs in DEBUG mode") - flags.BoolVar(&conf.Json, "j", false, "Show logs in JSON format") + flags.BoolVar(&conf.JSON, "j", false, "Show logs in JSON format") flags.BoolVar(&conf.Sniff, "sniff", false, "Enable traffic sniffing for HTTP and TLS") flags.StringVar(&conf.SniffLogFile, "snifflog", "", "Sniffed traffic log file path (Default: the same as -logfile)") flags.BoolVar(&conf.NoColor, "nocolor", false, "Disable colored output for logs (no effect if -j flag specified)") diff --git a/gohpts.go b/gohpts.go index b94da93..43fe4f5 100644 --- a/gohpts.go +++ b/gohpts.go @@ -1,3 +1,4 @@ +// Package gohpts transform SOCKS5 proxy into HTTP(S) proxy with support for Transparent Proxy (Redirect and TProxy), Proxychains and Traffic Sniffing package gohpts import ( @@ -52,11 +53,19 @@ var ( supportedChainTypes = []string{"strict", "dynamic", "random", "round_robin"} SupportedTProxyModes = []string{"redirect", "tproxy"} errInvalidWrite = errors.New("invalid write result") - ipPortPattern = regexp.MustCompile(`\b(?:\d{1,3}\.){3}\d{1,3}(?::(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4}))?\b`) - domainPattern = regexp.MustCompile(`\b(?:[a-zA-Z0-9-]{1,63}\.)+(?:com|net|org|io|co|uk|ru|de|edu|gov|info|biz|dev|app|ai)(?::(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4}))?\b`) - jwtPattern = regexp.MustCompile(`\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b`) - authPattern = regexp.MustCompile(`(?i)(?:"|')?(authorization|auth[_-]?token|access[_-]?token|api[_-]?key|secret|token)(?:"|')?\s*[:=]\s*(?:"|')?([^\s"'&]+)`) - credsPattern = regexp.MustCompile(`(?i)(?:"|')?(username|user|login|email|password|pass|pwd)(?:"|')?\s*[:=]\s*(?:"|')?([^\s"'&]+)`) + ipPortPattern = regexp.MustCompile( + `\b(?:\d{1,3}\.){3}\d{1,3}(?::(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4}))?\b`, + ) + domainPattern = regexp.MustCompile( + `\b(?:[a-zA-Z0-9-]{1,63}\.)+(?:com|net|org|io|co|uk|ru|de|edu|gov|info|biz|dev|app|ai)(?::(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4}))?\b`, + ) + jwtPattern = regexp.MustCompile(`\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b`) + authPattern = regexp.MustCompile( + `(?i)(?:"|')?(authorization|auth[_-]?token|access[_-]?token|api[_-]?key|secret|token)(?:"|')?\s*[:=]\s*(?:"|')?([^\s"'&]+)`, + ) + credsPattern = regexp.MustCompile( + `(?i)(?:"|')?(username|user|login|email|password|pass|pwd)(?:"|')?\s*[:=]\s*(?:"|')?([^\s"'&]+)`, + ) ) // Hop-by-hop headers @@ -90,7 +99,7 @@ type Config struct { Mark uint LogFilePath string Debug bool - Json bool + JSON bool Sniff bool SniffLogFile string NoColor bool @@ -152,12 +161,12 @@ func randColor() func(string) *colors.Color { return rColors[randIndex] } -func (p *proxyapp) getId() string { +func (p *proxyapp) getID() string { id := uuid.New() if p.nocolor { - return fmt.Sprintf("%s", colors.WrapBrackets(id.String())) + return colors.WrapBrackets(id.String()) } - return randColor()(fmt.Sprintf("%s", colors.WrapBrackets(id.String()))).String() + return randColor()(colors.WrapBrackets(id.String())).String() } func (p *proxyapp) colorizeStatus(code int, status string, bg bool) string { @@ -181,7 +190,13 @@ func (p *proxyapp) colorizeStatus(code int, status string, bg bool) string { return status } -func (p *proxyapp) colorizeHTTP(req *http.Request, resp *http.Response, reqBodySaved, respBodySaved *[]byte, id string, ts bool) string { +func (p *proxyapp) colorizeHTTP( + req *http.Request, + resp *http.Response, + reqBodySaved, respBodySaved *[]byte, + id string, + ts bool, +) string { var sb strings.Builder if ts { sb.WriteString(fmt.Sprintf("%s ", p.colorizeTimestamp())) @@ -190,7 +205,7 @@ func (p *proxyapp) colorizeHTTP(req *http.Request, resp *http.Response, reqBodyS sb.WriteString(id) sb.WriteString(fmt.Sprintf(" %s %s %s ", req.Method, req.URL, req.Proto)) if req.UserAgent() != "" { - sb.WriteString(fmt.Sprintf("%s", colors.WrapBrackets(req.UserAgent()))) + sb.WriteString(colors.WrapBrackets(req.UserAgent())) } if req.ContentLength > 0 { sb.WriteString(fmt.Sprintf(" Len: %d", req.ContentLength)) @@ -224,7 +239,7 @@ func (p *proxyapp) colorizeHTTP(req *http.Request, resp *http.Response, reqBodyS sb.WriteString(colors.YellowBg(fmt.Sprintf("%s ", req.URL)).String()) sb.WriteString(colors.BlueBg(fmt.Sprintf("%s ", req.Proto)).String()) if req.UserAgent() != "" { - sb.WriteString(colors.Gray(fmt.Sprintf("%s", colors.WrapBrackets(req.UserAgent()))).String()) + sb.WriteString(colors.Gray(colors.WrapBrackets(req.UserAgent())).String()) } if req.ContentLength > 0 { sb.WriteString(colors.BeigeBg(fmt.Sprintf(" Len: %d", req.ContentLength)).String()) @@ -814,7 +829,7 @@ func (p *proxyapp) handleForward(w http.ResponseWriter, r *http.Request) { } p.snifflogger.Log().Msg(fmt.Sprintf("[%s]", strings.Join(sniffheader, ","))) } else { - id := p.getId() + id := p.getID() p.snifflogger.Log().Msg(p.colorizeHTTP(req, resp, &reqBodySaved, &respBodySaved, id, false)) } } @@ -943,10 +958,13 @@ func (p *proxyapp) handleTunnel(w http.ResponseWriter, r *http.Request) { if p.sniff { wg.Add(1) sniffheader := make([]string, 0, 6) - id := p.getId() + id := p.getID() if p.json { - sniffheader = append(sniffheader, fmt.Sprintf("{\"connection\":{\"src_remote\":%s,\"src_local\":%s,\"dst_local\":%s,\"dst_remote\":%s}}", - srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr())) + sniffheader = append( + sniffheader, + fmt.Sprintf("{\"connection\":{\"src_remote\":%s,\"src_local\":%s,\"dst_local\":%s,\"dst_remote\":%s}}", + srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr()), + ) j, err := json.Marshal(&layers.HTTPMessage{Request: r}) if err == nil { sniffheader = append(sniffheader, string(j)) @@ -1009,7 +1027,7 @@ func (p *proxyapp) sniffreporter(wg *sync.WaitGroup, sniffheader *[]string, reqC if p.json { p.snifflogger.Log().Msg(fmt.Sprintf("[%s]", strings.Join(*sniffheader, ","))) } else { - p.snifflogger.Log().Msg(fmt.Sprintf("%s", strings.Join(*sniffheader, "\n"))) + p.snifflogger.Log().Msg(strings.Join(*sniffheader, "\n")) } } *sniffheader = (*sniffheader)[:sniffheaderlen] @@ -1089,7 +1107,13 @@ readLoop: return written, err } -func (p *proxyapp) transfer(wg *sync.WaitGroup, dst net.Conn, src net.Conn, destName, srcName string, msgChan chan<- layers.Layer) { +func (p *proxyapp) transfer( + wg *sync.WaitGroup, + dst net.Conn, + src net.Conn, + destName, srcName string, + msgChan chan<- layers.Layer, +) { defer func() { wg.Done() close(msgChan) @@ -1173,10 +1197,10 @@ func (p *proxyapp) applyRedirectRules() string { } cmdInit := exec.Command("bash", "-c", ` set -ex - iptables -t nat -N GOHPTS 2>/dev/null - iptables -t nat -F GOHPTS - - iptables -t nat -A GOHPTS -d 127.0.0.0/8 -j RETURN + iptables -t nat -N GOHPTS 2>/dev/null + iptables -t nat -F GOHPTS + + iptables -t nat -A GOHPTS -d 127.0.0.0/8 -j RETURN iptables -t nat -A GOHPTS -p tcp --dport 22 -j RETURN `) cmdInit.Stdout = os.Stdout @@ -1186,13 +1210,13 @@ func (p *proxyapp) applyRedirectRules() string { } if p.httpServerAddr != "" { _, httpPort, _ := net.SplitHostPort(p.httpServerAddr) - cmdHttp := exec.Command("bash", "-c", fmt.Sprintf(` + cmdHTTP := exec.Command("bash", "-c", fmt.Sprintf(` set -ex iptables -t nat -A GOHPTS -p tcp --dport %s -j RETURN `, httpPort)) - cmdHttp.Stdout = os.Stdout - cmdHttp.Stderr = os.Stderr - if err := cmdHttp.Run(); err != nil { + cmdHTTP.Stdout = os.Stdout + cmdHTTP.Stderr = os.Stderr + if err := cmdHTTP.Run(); err != nil { p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?") } } @@ -1241,7 +1265,7 @@ func (p *proxyapp) applyRedirectRules() string { for subnet in $(docker network inspect $(docker network ls -q) --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'); do iptables -t nat -A GOHPTS -d "$subnet" -j RETURN done - fi + fi iptables -t nat -A GOHPTS -p tcp -j REDIRECT --to-ports %s @@ -1514,7 +1538,7 @@ func getFullAddress(v string, all bool) (string, error) { if v == "" { return "", nil } - var ip string = "127.0.0.1" + ip := "127.0.0.1" if all { ip = "0.0.0.0" } @@ -1549,21 +1573,21 @@ func expandPath(p string) string { func New(conf *Config) *proxyapp { var logger, snifflogger zerolog.Logger var p proxyapp - var logfile *os.File = os.Stdout + logfile := os.Stdout var snifflog *os.File var err error p.sniff = conf.Sniff p.body = conf.Body - p.json = conf.Json + p.json = conf.JSON if conf.LogFilePath != "" { - f, err := os.OpenFile(conf.LogFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + f, err := os.OpenFile(conf.LogFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644) if err != nil { log.Fatalf("Failed to open log file: %v", err) } logfile = f } if conf.SniffLogFile != "" && conf.SniffLogFile != conf.LogFilePath { - f, err := os.OpenFile(conf.SniffLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + f, err := os.OpenFile(conf.SniffLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644) if err != nil { log.Fatalf("Failed to open sniff log file: %v", err) } @@ -1571,8 +1595,8 @@ func New(conf *Config) *proxyapp { } else { snifflog = logfile } - p.nocolor = conf.Json || conf.NoColor - if conf.Json { + p.nocolor = conf.JSON || conf.NoColor + if conf.JSON { log.SetFlags(0) jsonWriter := jsonLogWriter{file: logfile} log.SetOutput(jsonWriter) @@ -1597,7 +1621,7 @@ func New(conf *Config) *proxyapp { } s := i.(string) if p.nocolor { - return fmt.Sprintf("%s", s) + return s } result := ipPortPattern.ReplaceAllStringFunc(s, func(match string) string { return colors.Gray(match).String() @@ -1615,7 +1639,7 @@ func New(conf *Config) *proxyapp { output.FormatErrFieldValue = func(i any) string { s := i.(string) if p.nocolor { - return fmt.Sprintf("%s", s) + return s } result := ipPortPattern.ReplaceAllStringFunc(s, func(match string) string { return colors.Red(match).String() @@ -1624,7 +1648,6 @@ func New(conf *Config) *proxyapp { return colors.Red(match).String() }) return result - } logger = zerolog.New(output).With().Timestamp().Logger() sniffoutput := zerolog.ConsoleWriter{Out: snifflog, TimeFormat: time.RFC3339, NoColor: p.nocolor, PartsExclude: []string{"level"}} @@ -1648,7 +1671,7 @@ func New(conf *Config) *proxyapp { sniffoutput.FormatErrFieldValue = func(i any) string { s := i.(string) if p.nocolor { - return fmt.Sprintf("%s", s) + return s } result := ipPortPattern.ReplaceAllStringFunc(s, func(match string) string { return colors.Red(match).String() @@ -1657,7 +1680,6 @@ func New(conf *Config) *proxyapp { return colors.Red(match).String() }) return result - } snifflogger = zerolog.New(sniffoutput).With().Timestamp().Logger() } diff --git a/tproxy_linux.go b/tproxy_linux.go index d06a436..94db8ea 100644 --- a/tproxy_linux.go +++ b/tproxy_linux.go @@ -94,7 +94,15 @@ func (ts *tproxyServer) serve() { } func getsockopt(s int, level int, optname int, optval unsafe.Pointer, optlen *uint32) (err error) { - _, _, e := unix.Syscall6(unix.SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(optname), uintptr(optval), uintptr(unsafe.Pointer(optlen)), 0) + _, _, e := unix.Syscall6( + unix.SYS_GETSOCKOPT, + uintptr(s), + uintptr(level), + uintptr(optname), + uintptr(optval), + uintptr(unsafe.Pointer(optlen)), + 0, + ) if e != 0 { return e } @@ -181,10 +189,20 @@ func (ts *tproxyServer) handleConnection(srcConn net.Conn) { if ts.pa.sniff { wg.Add(1) sniffheader := make([]string, 0, 6) - id := ts.pa.getId() + id := ts.pa.getID() if ts.pa.json { - sniffheader = append(sniffheader, fmt.Sprintf("{\"connection\":{\"tproxy_mode\":%s,\"src_remote\":%s,\"src_local\":%s,\"dst_local\":%s,\"dst_remote\":%s,\"original_dst\":%s}}", - ts.pa.tproxyMode, srcConn.RemoteAddr(), srcConn.LocalAddr(), dstConn.LocalAddr(), dstConn.RemoteAddr(), dst)) + sniffheader = append( + sniffheader, + fmt.Sprintf( + "{\"connection\":{\"tproxy_mode\":%s,\"src_remote\":%s,\"src_local\":%s,\"dst_local\":%s,\"dst_remote\":%s,\"original_dst\":%s}}", + ts.pa.tproxyMode, + srcConn.RemoteAddr(), + srcConn.LocalAddr(), + dstConn.LocalAddr(), + dstConn.RemoteAddr(), + dst, + ), + ) } else { var sb strings.Builder if ts.pa.nocolor { From 0f1962fe534ba53836ab6025675191402850897f Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Sun, 6 Jul 2025 09:09:12 +0300 Subject: [PATCH 2/5] added check fot http response interface conversion --- gohpts.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gohpts.go b/gohpts.go index 43fe4f5..8a24387 100644 --- a/gohpts.go +++ b/gohpts.go @@ -401,7 +401,10 @@ func (p *proxyapp) colorizeTunnel(req, resp layers.Layer, sniffheader *[]string, switch reqt := req.(type) { case *layers.HTTPMessage: var reqBodySaved, respBodySaved []byte - rest := resp.(*layers.HTTPMessage) + rest, ok := resp.(*layers.HTTPMessage) + if !ok { + return fmt.Errorf("failed parsing HTTP response") + } if p.body { reqBodySaved, _ = io.ReadAll(reqt.Request.Body) respBodySaved, _ = io.ReadAll(rest.Response.Body) From 8b6cbe2d0e5a22976aec17c9ac157d0d5c35dfa0 Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Sun, 6 Jul 2025 09:54:33 +0300 Subject: [PATCH 3/5] updated layers pkg, added check for the number of records in tls to avoid false potitives --- go.mod | 2 +- go.sum | 4 ++-- gohpts.go | 38 +++++++++++++++++--------------------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index c779676..cdbcd2a 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/google/uuid v1.6.0 github.com/rs/zerolog v1.34.0 github.com/shadowy-pycoder/colors v0.0.1 - github.com/shadowy-pycoder/mshark v0.0.4 + github.com/shadowy-pycoder/mshark v0.0.5 golang.org/x/net v0.40.0 golang.org/x/sys v0.33.0 golang.org/x/term v0.32.0 diff --git a/go.sum b/go.sum index 6694189..992a941 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/shadowy-pycoder/colors v0.0.1 h1:weCj/YIOupqy4BSP8KuVzr20fC+cuAv/tArz7bhhkP4= github.com/shadowy-pycoder/colors v0.0.1/go.mod h1:lkrJS1PY2oVigNLTT6pkbF7B/v0YcU2LD5PZnss1Q4U= -github.com/shadowy-pycoder/mshark v0.0.4 h1:2yw6am1jt6n1GPHdLfFU1oDajv+zQ/23V0l0imFAeJY= -github.com/shadowy-pycoder/mshark v0.0.4/go.mod h1:fRWGQuU4BFjz9pTfrvwIT2AtmWWd99PEvdlgv+24vTE= +github.com/shadowy-pycoder/mshark v0.0.5 h1:D7L+vW6DsE/OMwxThQLenNJdHKHzufHFWGuL033GKhQ= +github.com/shadowy-pycoder/mshark v0.0.5/go.mod h1:fRWGQuU4BFjz9pTfrvwIT2AtmWWd99PEvdlgv+24vTE= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= diff --git a/gohpts.go b/gohpts.go index 8a24387..eadaa3a 100644 --- a/gohpts.go +++ b/gohpts.go @@ -433,31 +433,27 @@ func (p *proxyapp) colorizeTunnel(req, resp layers.Layer, sniffheader *[]string, case *layers.TLSMessage: var chs *layers.TLSClientHello var shs *layers.TLSServerHello - if len(reqt.Records) > 0 { - hsrec := reqt.Records[0] - if hsrec.ContentType == layers.HandshakeTLSVal { // TODO: add more cases, parse all records - switch parser := layers.HSTLSParserByType(hsrec.Data[0]).(type) { - case *layers.TLSClientHello: - err := parser.ParseHS(hsrec.Data) - if err != nil { - return err - } - chs = parser + hsrec := reqt.Records[0] // len(Records) > 0 after dispatch + if hsrec.ContentType == layers.HandshakeTLSVal { // TODO: add more cases, parse all records + switch parser := layers.HSTLSParserByType(hsrec.Data[0]).(type) { + case *layers.TLSClientHello: + err := parser.ParseHS(hsrec.Data) + if err != nil { + return err } + chs = parser } } rest := resp.(*layers.TLSMessage) - if len(rest.Records) > 0 { - hsrec := rest.Records[0] - if hsrec.ContentType == layers.HandshakeTLSVal { - switch parser := layers.HSTLSParserByType(hsrec.Data[0]).(type) { - case *layers.TLSServerHello: - err := parser.ParseHS(hsrec.Data) - if err != nil { - return err - } - shs = parser + hsrec = rest.Records[0] + if hsrec.ContentType == layers.HandshakeTLSVal { + switch parser := layers.HSTLSParserByType(hsrec.Data[0]).(type) { + case *layers.TLSServerHello: + err := parser.ParseHS(hsrec.Data) + if err != nil { + return err } + shs = parser } } if chs != nil && shs != nil { @@ -1045,7 +1041,7 @@ func dispatch(data []byte) (layers.Layer, error) { return h, nil } m := &layers.TLSMessage{} - if err := m.Parse(data); err == nil { + if err := m.Parse(data); err == nil && len(m.Records) > 0 { return m, nil } return nil, fmt.Errorf("failed sniffing traffic") From 7a8d380bf83574f77548055bb2b77baa8ef0bf02 Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Sun, 6 Jul 2025 15:00:33 +0300 Subject: [PATCH 4/5] added setup to handle ARP spoofed traffic --- README.md | 23 ++++++++++++++++++- cmd/gohpts/cli.go | 12 ++++++++++ gohpts.go | 55 ++++++++++++++++++++++++++++++++++++++++++++-- tproxy_linux.go | 22 +++++++++++++++++++ tproxy_nonlinux.go | 5 +++++ version.go | 2 +- 6 files changed, 115 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 62146b0..92e8b1e 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ - [Transparent proxy](#transparent-proxy) - [redirect (via NAT and SO_ORIGINAL_DST)](#redirect-via-nat-and-so_original_dst) - [tproxy (via MANGLE and IP_TRANSPARENT)](#tproxy-via-mangle-and-ip_transparent) + - [ARP spoofing](#arp-spoofing) - [Traffic sniffing](#traffic-sniffing) - [JSON format](#json-format) - [Colored format](#colored-format) @@ -97,7 +98,7 @@ You can download the binary for your platform from [Releases](https://github.com Example: ```shell -HPTS_RELEASE=v1.8.3; wget -v https://github.com/shadowy-pycoder/go-http-proxy-to-socks/releases/download/$HPTS_RELEASE/gohpts-$HPTS_RELEASE-linux-amd64.tar.gz -O gohpts && tar xvzf gohpts && mv -f gohpts-$HPTS_RELEASE-linux-amd64 gohpts && ./gohpts -h +HPTS_RELEASE=v1.8.4; wget -v https://github.com/shadowy-pycoder/go-http-proxy-to-socks/releases/download/$HPTS_RELEASE/gohpts-$HPTS_RELEASE-linux-amd64.tar.gz -O gohpts && tar xvzf gohpts && mv -f gohpts-$HPTS_RELEASE-linux-amd64 gohpts && ./gohpts -h ``` Alternatively, you can install it using `go install` command (requires Go [1.24](https://go.dev/doc/install) or later): @@ -164,6 +165,7 @@ Options: -T Address of transparent proxy server (no HTTP) -M Transparent proxy mode: (redirect, tproxy) -auto Automatically setup iptables for transparent proxy (requires elevated privileges) + -arp Automatically setup iptables to proxy ARP spoofed traffic (use tools like bettercap to perform actual attack) -mark Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100) ``` @@ -479,6 +481,25 @@ else fi ``` +### ARP spoofing + +`GoHPTS` can be used with tools like [Bettercap](https://github.com/bettercap/bettercap) to proxy ARP spoofed traffic. + +Run the proxy with `-arp` flag + +```shell +ssh remote -D 1080 -Nf +sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100 -arp +``` + +Run `bettercap` + +```shell +sudo bettercap -eval "set net.probe on;set net.recon on;arp.spoof on" +``` + +Check proxy logs for traffic from other devices from your LAN + ## Traffic sniffing [[Back]](#table-of-contents) diff --git a/cmd/gohpts/cli.go b/cmd/gohpts/cli.go index dc848d9..444e7ae 100644 --- a/cmd/gohpts/cli.go +++ b/cmd/gohpts/cli.go @@ -61,6 +61,7 @@ const usageTproxy string = ` -T Address of transparent proxy server (no HTTP) -M Transparent proxy mode: (redirect, tproxy) -auto Automatically setup iptables for transparent proxy (requires elevated privileges) + -arp Automatically setup iptables to proxy ARP spoofed traffic (use tools like bettercap to perform actual attack) -mark Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100) ` @@ -113,6 +114,12 @@ func root(args []string) error { 0, "Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100)", ) + flags.BoolVar( + &conf.ARP, + "arp", + false, + "Automatically setup iptables to proxy ARP spoofed traffic (use tools like bettercap to perform actual attack)", + ) } flags.StringVar(&conf.LogFilePath, "logfile", "", "Log file path (Default: stdout)") flags.BoolVar(&conf.Debug, "d", false, "Show logs in DEBUG mode") @@ -172,6 +179,11 @@ func root(args []string) error { return fmt.Errorf("-mark requires -t or -T flag") } } + if seen["arp"] { + if !seen["auto"] { + return fmt.Errorf("-arp requires -auto flag") + } + } if seen["f"] { for _, da := range []string{"s", "u", "U", "c", "k", "l"} { if seen[da] { diff --git a/gohpts.go b/gohpts.go index eadaa3a..1a58680 100644 --- a/gohpts.go +++ b/gohpts.go @@ -97,6 +97,7 @@ type Config struct { TProxyMode string Auto bool Mark uint + ARP bool LogFilePath string Debug bool JSON bool @@ -120,6 +121,7 @@ type proxyapp struct { tproxyMode string auto bool mark uint + arp bool user string pass string proxychain chain @@ -1361,10 +1363,53 @@ func (p *proxyapp) applyRedirectRules() string { cmdForward.Stdout = os.Stdout cmdForward.Stderr = os.Stderr _ = cmdForward.Run() + if p.arp { + cmdClear := exec.Command("bash", "-c", ` + set -ex + iptables -t filter -F GOHPTS 2>/dev/null || true + iptables -t filter -D FORWARD -j GOHPTS 2>/dev/null || true + iptables -t filter -X GOHPTS 2>/dev/null || true + `) + cmdClear.Stdout = os.Stdout + cmdClear.Stderr = os.Stderr + if err := cmdClear.Run(); err != nil { + p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?") + } + iface, err := getDefaultInterface() + if err != nil { + p.logger.Fatal().Err(err).Msg("failed getting default network interface") + } + cmdForward := exec.Command("bash", "-c", fmt.Sprintf(` + set -ex + iptables -t filter -N GOHPTS 2>/dev/null + iptables -t filter -F GOHPTS + iptables -t filter -A FORWARD -j GOHPTS + iptables -t filter -A GOHPTS -i %s -j ACCEPT + iptables -t filter -A GOHPTS -o %s -j ACCEPT + `, iface.Name, iface.Name)) + cmdForward.Stdout = os.Stdout + cmdForward.Stderr = os.Stderr + if err := cmdForward.Run(); err != nil { + p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?") + } + } return string(output) } func (p *proxyapp) clearRedirectRules(output string) error { + if p.arp { + cmdClear := exec.Command("bash", "-c", ` + set -ex + iptables -t filter -F GOHPTS 2>/dev/null || true + iptables -t filter -D FORWARD -j GOHPTS 2>/dev/null || true + iptables -t filter -X GOHPTS 2>/dev/null || true + `) + cmdClear.Stdout = os.Stdout + cmdClear.Stderr = os.Stderr + if err := cmdClear.Run(); err != nil { + p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?") + } + } var cmd *exec.Cmd switch p.tproxyMode { case "redirect": @@ -1701,7 +1746,7 @@ func New(conf *Config) *proxyapp { p.tproxyMode = conf.TProxyMode tproxyonly := conf.TProxyOnly != "" if tproxyonly { - if p.tproxyMode == "tproxy" { + if p.tproxyMode != "" { p.tproxyAddr, err = getFullAddress(conf.TProxyOnly, true) if err != nil { p.logger.Fatal().Err(err).Msg("") @@ -1713,7 +1758,7 @@ func New(conf *Config) *proxyapp { } } } else { - if p.tproxyMode == "tproxy" { + if p.tproxyMode != "" { p.tproxyAddr, err = getFullAddress(conf.TProxy, true) if err != nil { p.logger.Fatal().Err(err).Msg("") @@ -1739,6 +1784,12 @@ func New(conf *Config) *proxyapp { if p.mark == 0 && p.tproxyMode == "tproxy" { p.mark = 100 } + p.arp = conf.ARP + if p.arp && runtime.GOOS != "linux" { + p.logger.Fatal().Msg("ARP setup is available only for linux system") + } else if p.arp && !p.auto { + p.logger.Fatal().Msg("ARP setup requires auto configuration") + } var addrHTTP, addrSOCKS, certFile, keyFile string if conf.ServerConfPath != "" { var sconf serverConfig diff --git a/tproxy_linux.go b/tproxy_linux.go index 94db8ea..cab13ce 100644 --- a/tproxy_linux.go +++ b/tproxy_linux.go @@ -4,11 +4,13 @@ package gohpts import ( + "bufio" "context" "errors" "fmt" "net" "net/netip" + "os" "strings" "sync" "syscall" @@ -257,3 +259,23 @@ func getBaseDialer(timeout time.Duration, mark uint) *net.Dialer { } return dialer } + +func getDefaultInterface() (*net.Interface, error) { + f, err := os.Open("/proc/net/route") + if err != nil { + return nil, err + } + defer f.Close() + + defaultInterface := "" + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + fields := strings.Fields(line) + if len(fields) >= 2 && fields[1] == "00000000" { + defaultInterface = fields[0] + break + } + } + return net.InterfaceByName(defaultInterface) +} diff --git a/tproxy_nonlinux.go b/tproxy_nonlinux.go index 850883e..76cbaa2 100644 --- a/tproxy_nonlinux.go +++ b/tproxy_nonlinux.go @@ -4,6 +4,7 @@ package gohpts import ( + "fmt" "net" "sync" "syscall" @@ -46,3 +47,7 @@ func getBaseDialer(timeout time.Duration, mark uint) *net.Dialer { _ = mark return &net.Dialer{Timeout: timeout} } + +func getDefaultInterface() (*net.Interface, error) { + return nil, fmt.Errorf("not implemented") +} diff --git a/version.go b/version.go index ed72300..fdcff4e 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package gohpts -const Version string = "gohpts v1.8.3" +const Version string = "gohpts v1.8.4" From e3e436700cc11b88f04f4663af0fbb3d0a2810bd Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Sun, 6 Jul 2025 15:20:27 +0300 Subject: [PATCH 5/5] added small mr_gopher --- README.md | 2 +- resources/.gitignore | 2 +- resources/mr_gopher_small.png | Bin 0 -> 71977 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 resources/mr_gopher_small.png diff --git a/README.md b/README.md index 92e8b1e..8088f2d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ![GitHub Release](https://img.shields.io/github/v/release/shadowy-pycoder/go-http-proxy-to-socks) ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/shadowy-pycoder/go-http-proxy-to-socks/total) -

MrGopher +

MrGopher ## Table of contents diff --git a/resources/.gitignore b/resources/.gitignore index 9a964a5..262e398 100644 --- a/resources/.gitignore +++ b/resources/.gitignore @@ -1,4 +1,4 @@ * !example_gohpts.yaml !sniffing_color.png -!mr_gopher.png +!mr_gopher*.png diff --git a/resources/mr_gopher_small.png b/resources/mr_gopher_small.png new file mode 100644 index 0000000000000000000000000000000000000000..747c4a088d77c756ba3822e34fda64f50f401241 GIT binary patch literal 71977 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 t81D?!5<&�I^VcOD;mK@7*i#{{h3)>lKLXkBtBT002ovPDHLkV1hYhnQH(5 literal 0 HcmV?d00001