Skip to content

Commit 8ba1d3c

Browse files
Merge pull request #12 from shadowy-pycoder/arpspoof
added arp spoofer
2 parents 197f4c8 + aab4830 commit 8ba1d3c

File tree

6 files changed

+146
-68
lines changed

6 files changed

+146
-68
lines changed

README.md

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ Specify http server in proxy configuration of Postman
6565
- **Traffic sniffing**\
6666
Proxy is able to parse HTTP headers and TLS handshake metadata
6767

68+
- **ARP spoofing**\
69+
Proxy entire subnets with ARP spoofing approach
70+
6871
- **DNS Leak Protection**\
6972
DNS resolution occurs on SOCKS5 server side.
7073

@@ -98,7 +101,7 @@ You can download the binary for your platform from [Releases](https://github.com
98101
Example:
99102

100103
```shell
101-
HPTS_RELEASE=v1.8.5; 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
104+
HPTS_RELEASE=v1.9.0; 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
102105
```
103106

104107
Alternatively, you can install it using `go install` command (requires Go [1.24](https://go.dev/doc/install) or later):
@@ -165,7 +168,7 @@ Options:
165168
-T Address of transparent proxy server (no HTTP)
166169
-M Transparent proxy mode: (redirect, tproxy)
167170
-auto Automatically setup iptables for transparent proxy (requires elevated privileges)
168-
-arp Automatically setup iptables to proxy ARP spoofed traffic (use tools like bettercap to perform actual attack)
171+
-arpspoof Enable ARP spoof proxy for selected targets (Example: "targets 10.0.0.1,10.0.0.5-10,192.168.1.*,192.168.10.0/24;fullduplex false;debug true")
169172
-mark Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100)
170173
```
171174
@@ -483,13 +486,28 @@ fi
483486
484487
### ARP spoofing
485488
486-
`GoHPTS` can be used with tools like [Bettercap](https://github.com/bettercap/bettercap) to proxy ARP spoofed traffic.
489+
`GoHPTS` has in-built ARP spoofer that can be used to make all TCP talking devices of your LAN to use proxy server to connect to the Internet.
490+
This is achieved by adding `-arpspoof` flag with couple of parameters, separated by semicolon.
491+
492+
Example:
493+
494+
```shell
495+
ssh remote -D 1080 -Nf
496+
sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100 -arpspoof "targets 192.168.10.0/24;fullduplex true;debug true"
497+
```
498+
499+
Proxy will scan for devices in subnet `192.168.10.0/24` and send them ARP packets to pretend to be a gateway, if `fullduplex` is true,
500+
proxy will send ARP packets to gateway as well to make it believe our proxy has each IP on the subnet.
501+
502+
After proxy is stopped with `Ctrl+C`, it will automatically unspoof all targets.
503+
504+
`GoHPTS` can also be used with tools like [Bettercap](https://github.com/bettercap/bettercap) to proxy ARP spoofed traffic.
487505
488-
Run the proxy with `-arp` flag
506+
Run the proxy:
489507
490508
```shell
491509
ssh remote -D 1080 -Nf
492-
sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100 -arp
510+
sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100
493511
```
494512
495513
Run `bettercap` with this command (see [documentation](https://www.bettercap.org/)):

cmd/gohpts/cli.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ const usageTproxy string = `
6161
-T Address of transparent proxy server (no HTTP)
6262
-M Transparent proxy mode: (redirect, tproxy)
6363
-auto Automatically setup iptables for transparent proxy (requires elevated privileges)
64-
-arp Automatically setup iptables to proxy ARP spoofed traffic (use tools like bettercap to perform actual attack)
64+
-arpspoof Enable ARP spoof proxy for selected targets (Example: "targets 10.0.0.1,10.0.0.5-10,192.168.1.*,192.168.10.0/24;fullduplex false;debug true")
6565
-mark Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100)
6666
`
6767

@@ -114,11 +114,11 @@ func root(args []string) error {
114114
0,
115115
"Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100)",
116116
)
117-
flags.BoolVar(
118-
&conf.ARP,
119-
"arp",
120-
false,
121-
"Automatically setup iptables to proxy ARP spoofed traffic (use tools like bettercap to perform actual attack)",
117+
flags.StringVar(
118+
&conf.ARPSpoof,
119+
"arpspoof",
120+
"",
121+
"Enable ARP spoof proxy for selected targets",
122122
)
123123
}
124124
flags.StringVar(&conf.LogFilePath, "logfile", "", "Log file path (Default: stdout)")
@@ -179,11 +179,6 @@ func root(args []string) error {
179179
return fmt.Errorf("-mark requires -t or -T flag")
180180
}
181181
}
182-
if seen["arp"] {
183-
if !seen["auto"] {
184-
return fmt.Errorf("-arp requires -auto flag")
185-
}
186-
}
187182
if seen["f"] {
188183
for _, da := range []string{"s", "u", "U", "c", "k", "l"} {
189184
if seen[da] {

go.mod

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@ require (
77
github.com/google/uuid v1.6.0
88
github.com/rs/zerolog v1.34.0
99
github.com/shadowy-pycoder/colors v0.0.1
10-
github.com/shadowy-pycoder/mshark v0.0.6
10+
github.com/shadowy-pycoder/mshark v0.0.7
1111
golang.org/x/net v0.40.0
1212
golang.org/x/sys v0.33.0
1313
golang.org/x/term v0.32.0
1414
)
1515

1616
require (
17+
github.com/josharian/native v1.1.0 // indirect
18+
github.com/malfunkt/iprange v0.9.0 // indirect
1719
github.com/mattn/go-colorable v0.1.13 // indirect
1820
github.com/mattn/go-isatty v0.0.19 // indirect
21+
github.com/mdlayher/packet v1.1.2 // indirect
22+
github.com/mdlayher/socket v0.4.1 // indirect
23+
github.com/pkg/errors v0.9.1 // indirect
24+
golang.org/x/sync v0.16.0 // indirect
1925
)

go.sum

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,24 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
44
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
55
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
66
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
7+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
8+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
79
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
810
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
11+
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
12+
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
13+
github.com/malfunkt/iprange v0.9.0 h1:VCs0PKLUPotNVQTpVNszsut4lP7OCGNBwX+lOYBrnVQ=
14+
github.com/malfunkt/iprange v0.9.0/go.mod h1:TRGqO/f95gh3LOndUGTL46+W0GXA91WTqyZ0Quwvt4U=
915
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
1016
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
1117
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
1218
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
1319
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
20+
github.com/mdlayher/packet v1.1.2 h1:3Up1NG6LZrsgDVn6X4L9Ge/iyRyxFEFD9o6Pr3Q1nQY=
21+
github.com/mdlayher/packet v1.1.2/go.mod h1:GEu1+n9sG5VtiRE4SydOmX5GTwyyYlteZiFU+x0kew4=
22+
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
23+
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
24+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
1425
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
1526
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1627
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -19,12 +30,14 @@ github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
1930
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
2031
github.com/shadowy-pycoder/colors v0.0.1 h1:weCj/YIOupqy4BSP8KuVzr20fC+cuAv/tArz7bhhkP4=
2132
github.com/shadowy-pycoder/colors v0.0.1/go.mod h1:lkrJS1PY2oVigNLTT6pkbF7B/v0YcU2LD5PZnss1Q4U=
22-
github.com/shadowy-pycoder/mshark v0.0.6 h1:XmIoj9+uHEwc8RmiPT2iMYEdTvyiJ+zBTRBhIkx9JTg=
23-
github.com/shadowy-pycoder/mshark v0.0.6/go.mod h1:Txx0p8JxYOGd+0V+6N9MeCUGtGdfHAATWE8KB1nd7H0=
33+
github.com/shadowy-pycoder/mshark v0.0.7 h1:iuCLxKXh0HhukrZOQIbXjGneTTOZSPIS0mkIBSJm/4U=
34+
github.com/shadowy-pycoder/mshark v0.0.7/go.mod h1:FqbHFdsx0zMnrZZH0+oPzaFcleP4O+tUWv8i5gxo87k=
2435
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
2536
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
2637
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
2738
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
39+
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
40+
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
2841
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
2942
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3043
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

gohpts.go

Lines changed: 94 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/google/uuid"
3535
"github.com/rs/zerolog"
3636
"github.com/shadowy-pycoder/colors"
37+
"github.com/shadowy-pycoder/mshark/arpspoof"
3738
"github.com/shadowy-pycoder/mshark/layers"
3839
"golang.org/x/net/proxy"
3940
)
@@ -66,6 +67,7 @@ var (
6667
credsPattern = regexp.MustCompile(
6768
`(?i)(?:"|')?(username|user|login|email|password|pass|pwd)(?:"|')?\s*[:=]\s*(?:"|')?([^\s"'&]+)`,
6869
)
70+
macPattern = regexp.MustCompile(`(?i)([a-z0-9_]+_[0-9a-f]{2}(?::[0-9a-f]{2}){2}|(?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2})`)
6971
)
7072

7173
// Hop-by-hop headers
@@ -97,7 +99,7 @@ type Config struct {
9799
TProxyMode string
98100
Auto bool
99101
Mark uint
100-
ARP bool
102+
ARPSpoof string
101103
LogFilePath string
102104
Debug bool
103105
JSON bool
@@ -121,7 +123,7 @@ type proxyapp struct {
121123
tproxyMode string
122124
auto bool
123125
mark uint
124-
arp bool
126+
arpspoofer *arpspoof.ARPSpoofer
125127
user string
126128
pass string
127129
proxychain chain
@@ -1396,52 +1398,48 @@ func (p *proxyapp) applyRedirectRules() string {
13961398
cmdForward.Stdout = os.Stdout
13971399
cmdForward.Stderr = os.Stderr
13981400
_ = cmdForward.Run()
1399-
if p.arp {
1400-
cmdClear := exec.Command("bash", "-c", `
1401-
set -ex
1402-
iptables -t filter -F GOHPTS 2>/dev/null || true
1403-
iptables -t filter -D FORWARD -j GOHPTS 2>/dev/null || true
1404-
iptables -t filter -X GOHPTS 2>/dev/null || true
1405-
`)
1406-
cmdClear.Stdout = os.Stdout
1407-
cmdClear.Stderr = os.Stderr
1408-
if err := cmdClear.Run(); err != nil {
1409-
p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?")
1410-
}
1411-
iface, err := getDefaultInterface()
1412-
if err != nil {
1413-
p.logger.Fatal().Err(err).Msg("failed getting default network interface")
1414-
}
1415-
cmdForward := exec.Command("bash", "-c", fmt.Sprintf(`
1416-
set -ex
1417-
iptables -t filter -N GOHPTS 2>/dev/null
1418-
iptables -t filter -F GOHPTS
1419-
iptables -t filter -A FORWARD -j GOHPTS
1420-
iptables -t filter -A GOHPTS -i %s -j ACCEPT
1421-
iptables -t filter -A GOHPTS -o %s -j ACCEPT
1422-
`, iface.Name, iface.Name))
1423-
cmdForward.Stdout = os.Stdout
1424-
cmdForward.Stderr = os.Stderr
1425-
if err := cmdForward.Run(); err != nil {
1426-
p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?")
1427-
}
1401+
cmdClearForward := exec.Command("bash", "-c", `
1402+
set -ex
1403+
iptables -t filter -F GOHPTS 2>/dev/null || true
1404+
iptables -t filter -D FORWARD -j GOHPTS 2>/dev/null || true
1405+
iptables -t filter -X GOHPTS 2>/dev/null || true
1406+
`)
1407+
cmdClearForward.Stdout = os.Stdout
1408+
cmdClearForward.Stderr = os.Stderr
1409+
if err := cmdClearForward.Run(); err != nil {
1410+
p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?")
1411+
}
1412+
iface, err := getDefaultInterface()
1413+
if err != nil {
1414+
p.logger.Fatal().Err(err).Msg("failed getting default network interface")
1415+
}
1416+
cmdForwardFilter := exec.Command("bash", "-c", fmt.Sprintf(`
1417+
set -ex
1418+
iptables -t filter -N GOHPTS 2>/dev/null
1419+
iptables -t filter -F GOHPTS
1420+
iptables -t filter -A FORWARD -j GOHPTS
1421+
iptables -t filter -A GOHPTS -i %s -j ACCEPT
1422+
iptables -t filter -A GOHPTS -o %s -j ACCEPT
1423+
`, iface.Name, iface.Name))
1424+
cmdForwardFilter.Stdout = os.Stdout
1425+
cmdForwardFilter.Stderr = os.Stderr
1426+
if err := cmdForwardFilter.Run(); err != nil {
1427+
p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?")
14281428
}
14291429
return string(output)
14301430
}
14311431

14321432
func (p *proxyapp) clearRedirectRules(output string) error {
1433-
if p.arp {
1434-
cmdClear := exec.Command("bash", "-c", `
1435-
set -ex
1436-
iptables -t filter -F GOHPTS 2>/dev/null || true
1437-
iptables -t filter -D FORWARD -j GOHPTS 2>/dev/null || true
1438-
iptables -t filter -X GOHPTS 2>/dev/null || true
1439-
`)
1440-
cmdClear.Stdout = os.Stdout
1441-
cmdClear.Stderr = os.Stderr
1442-
if err := cmdClear.Run(); err != nil {
1443-
p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?")
1444-
}
1433+
cmdClear := exec.Command("bash", "-c", `
1434+
set -ex
1435+
iptables -t filter -F GOHPTS 2>/dev/null || true
1436+
iptables -t filter -D FORWARD -j GOHPTS 2>/dev/null || true
1437+
iptables -t filter -X GOHPTS 2>/dev/null || true
1438+
`)
1439+
cmdClear.Stdout = os.Stdout
1440+
cmdClear.Stderr = os.Stderr
1441+
if err := cmdClear.Run(); err != nil {
1442+
p.logger.Fatal().Err(err).Msg("Failed while configuring iptables. Are you root?")
14451443
}
14461444
var cmd *exec.Cmd
14471445
switch p.tproxyMode {
@@ -1481,6 +1479,9 @@ func (p *proxyapp) Run() {
14811479
quit := make(chan os.Signal, 1)
14821480
p.closeConn = make(chan bool)
14831481
signal.Notify(quit, os.Interrupt)
1482+
if p.arpspoofer != nil {
1483+
go p.arpspoofer.Start()
1484+
}
14841485
var tproxyServer *tproxyServer
14851486
if p.tproxyAddr != "" {
14861487
tproxyServer = newTproxyServer(p)
@@ -1508,6 +1509,12 @@ func (p *proxyapp) Run() {
15081509
if p.httpServer != nil {
15091510
go func() {
15101511
<-quit
1512+
if p.arpspoofer != nil {
1513+
err := p.arpspoofer.Stop()
1514+
if err != nil {
1515+
p.logger.Error().Err(err).Msg("Failed stopping arp spoofer")
1516+
}
1517+
}
15111518
if p.auto {
15121519
err := p.clearRedirectRules(output)
15131520
if err != nil {
@@ -1550,6 +1557,12 @@ func (p *proxyapp) Run() {
15501557
} else {
15511558
go func() {
15521559
<-quit
1560+
if p.arpspoofer != nil {
1561+
err := p.arpspoofer.Stop()
1562+
if err != nil {
1563+
p.logger.Error().Err(err).Msg("Failed stopping arp spoofer")
1564+
}
1565+
}
15531566
if p.auto {
15541567
err := p.clearRedirectRules(output)
15551568
if err != nil {
@@ -1706,6 +1719,9 @@ func New(conf *Config) *proxyapp {
17061719
result = domainPattern.ReplaceAllStringFunc(result, func(match string) string {
17071720
return colors.Yellow(match).String()
17081721
})
1722+
result = macPattern.ReplaceAllStringFunc(result, func(match string) string {
1723+
return colors.Yellow(match).String()
1724+
})
17091725
return result
17101726
}
17111727

@@ -1819,11 +1835,41 @@ func New(conf *Config) *proxyapp {
18191835
if p.mark == 0 && p.tproxyMode == "tproxy" {
18201836
p.mark = 100
18211837
}
1822-
p.arp = conf.ARP
1823-
if p.arp && runtime.GOOS != "linux" {
1824-
p.logger.Fatal().Msg("ARP setup is available only for linux system")
1825-
} else if p.arp && !p.auto {
1826-
p.logger.Fatal().Msg("ARP setup requires auto configuration")
1838+
if conf.ARPSpoof != "" {
1839+
if runtime.GOOS != "linux" {
1840+
p.logger.Fatal().Msg("ARP spoof setup is available only for linux system")
1841+
}
1842+
if !p.auto {
1843+
p.logger.Warn().Msg("ARP spoof setup requires iptables configuration")
1844+
}
1845+
asc := &arpspoof.ARPSpoofConfig{Logger: p.logger}
1846+
errMsg := `Failed parsing arp options. Example: "targets 10.0.0.1,10.0.0.5-10,192.168.1.*,192.168.10.0/24;fullduplex false;debug true"`
1847+
for opt := range strings.SplitSeq(strings.ToLower(conf.ARPSpoof), ";") {
1848+
keyval := strings.SplitN(strings.Trim(opt, " "), " ", 2)
1849+
if len(keyval) < 2 {
1850+
p.logger.Fatal().Msg(errMsg)
1851+
}
1852+
key := keyval[0]
1853+
val := keyval[1]
1854+
switch key {
1855+
case "targets":
1856+
asc.Targets = val
1857+
case "fullduplex":
1858+
if val == "true" {
1859+
asc.FullDuplex = true
1860+
}
1861+
case "debug":
1862+
if val == "true" {
1863+
asc.Debug = true
1864+
}
1865+
default:
1866+
p.logger.Fatal().Msg(errMsg)
1867+
}
1868+
}
1869+
p.arpspoofer, err = arpspoof.NewARPSpoofer(asc)
1870+
if err != nil {
1871+
p.logger.Fatal().Err(err).Msg("Failed creating arp spoofer")
1872+
}
18271873
}
18281874
var addrHTTP, addrSOCKS, certFile, keyFile string
18291875
if conf.ServerConfPath != "" {

version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package gohpts
22

3-
const Version string = "gohpts v1.8.5"
3+
const Version string = "gohpts v1.9.0"

0 commit comments

Comments
 (0)