Skip to content

Commit 25e227c

Browse files
udp proxy now dials router directly for DNS requests in arpspoof mode
1 parent 587de6a commit 25e227c

File tree

3 files changed

+43
-36
lines changed

3 files changed

+43
-36
lines changed

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ 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.12
10+
github.com/shadowy-pycoder/mshark v0.0.13
1111
github.com/wzshiming/socks5 v0.5.2
1212
golang.org/x/sys v0.33.0
1313
golang.org/x/term v0.32.0
@@ -20,6 +20,7 @@ require (
2020
github.com/mattn/go-isatty v0.0.19 // indirect
2121
github.com/mdlayher/packet v1.1.2 // indirect
2222
github.com/mdlayher/socket v0.4.1 // indirect
23+
github.com/packetcap/go-pcap v0.0.0-20240528124601-8c87ecf5dbc5 // indirect
2324
github.com/pkg/errors v0.9.1 // indirect
2425
golang.org/x/net v0.40.0 // indirect
2526
golang.org/x/sync v0.16.0 // indirect

go.sum

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
88
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
99
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
1010
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
11+
github.com/gopacket/gopacket v1.2.0 h1:eXbzFad7f73P1n2EJHQlsKuvIMJjVXK5tXoSca78I3A=
12+
github.com/gopacket/gopacket v1.2.0/go.mod h1:BrAKEy5EOGQ76LSqh7DMAr7z0NNPdczWm2GxCG7+I8M=
1113
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
1214
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
1315
github.com/malfunkt/iprange v0.9.0 h1:VCs0PKLUPotNVQTpVNszsut4lP7OCGNBwX+lOYBrnVQ=
@@ -21,6 +23,8 @@ github.com/mdlayher/packet v1.1.2 h1:3Up1NG6LZrsgDVn6X4L9Ge/iyRyxFEFD9o6Pr3Q1nQY
2123
github.com/mdlayher/packet v1.1.2/go.mod h1:GEu1+n9sG5VtiRE4SydOmX5GTwyyYlteZiFU+x0kew4=
2224
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
2325
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
26+
github.com/packetcap/go-pcap v0.0.0-20240528124601-8c87ecf5dbc5 h1:p4VuaitqUAqSZSomd7Wb4BPV/Jj7Hno2/iqtfX7DZJI=
27+
github.com/packetcap/go-pcap v0.0.0-20240528124601-8c87ecf5dbc5/go.mod h1:zIAoVKeWP0mz4zXY50UYQt6NLg2uwKRswMDcGEqOms4=
2428
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
2529
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
2630
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -30,8 +34,8 @@ github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
3034
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
3135
github.com/shadowy-pycoder/colors v0.0.1 h1:weCj/YIOupqy4BSP8KuVzr20fC+cuAv/tArz7bhhkP4=
3236
github.com/shadowy-pycoder/colors v0.0.1/go.mod h1:lkrJS1PY2oVigNLTT6pkbF7B/v0YcU2LD5PZnss1Q4U=
33-
github.com/shadowy-pycoder/mshark v0.0.12 h1:1zPAQLhKu1pxAZTm5oqUahywJ7SIpx9ds9/ytz5TwaU=
34-
github.com/shadowy-pycoder/mshark v0.0.12/go.mod h1:FqbHFdsx0zMnrZZH0+oPzaFcleP4O+tUWv8i5gxo87k=
37+
github.com/shadowy-pycoder/mshark v0.0.13 h1:ROEuey/Th4YAmfRg8Xc17aboMs5fknQho4mNBC9h+KE=
38+
github.com/shadowy-pycoder/mshark v0.0.13/go.mod h1:FqbHFdsx0zMnrZZH0+oPzaFcleP4O+tUWv8i5gxo87k=
3539
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
3640
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
3741
github.com/wzshiming/socks5 v0.5.2 h1:LtoowVNwAmkIQSkP1r1Wg435xUmC+tfRxorNW30KtnM=

tproxy_udp_linux.go

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ const (
3131
udpBufferSize int = 4096
3232
)
3333

34-
var googleDNSAddr *net.UDPAddr = &net.UDPAddr{IP: net.ParseIP("8.8.8.8"), Port: 53}
35-
3634
type udpConn struct {
3735
*socks5.UDPConn
3836
srcAddr *net.UDPAddr
@@ -179,40 +177,44 @@ func newTproxyServerUDP(p *proxyapp) *tproxyServerUDP {
179177
tsu.p.logger.Fatal().Err(err).Msgf("[udp %s] Failed getting default interface", tsu.p.tproxyMode)
180178
}
181179
}
182-
gw, err := network.GetGatewayIPv4FromInterface(tsu.iface.Name)
183-
if err != nil {
184-
tsu.p.logger.Fatal().Err(err).Msgf("[udp %s] failed getting gateway from %s", tsu.p.tproxyMode, tsu.iface.Name)
185-
}
186-
tsu.gwDNS = &net.UDPAddr{IP: net.ParseIP(gw.String()), Port: 53}
187-
lc = net.ListenConfig{
188-
Control: func(network, address string, conn syscall.RawConn) error {
189-
var operr error
190-
if err := conn.Control(func(fd uintptr) {
191-
operr = unix.SetsockoptInt(int(fd), unix.SOL_IP, unix.IP_TRANSPARENT, 1)
192-
operr = unix.SetsockoptInt(int(fd), unix.SOL_IP, unix.IP_FREEBIND, 1)
193-
operr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1)
194-
}); err != nil {
195-
return err
196-
}
197-
return operr
198-
},
199-
}
200-
pconn, err = lc.ListenPacket(context.Background(), "udp4", tsu.gwDNS.String())
201-
if err != nil {
202-
tsu.p.logger.Fatal().Err(err).Msgf("[udp %s] failed listening on gateway DNS", tsu.p.tproxyMode)
180+
if tsu.p.arpspoofer != nil {
181+
gw, err := network.GetGatewayIPv4FromInterface(tsu.iface.Name)
182+
if err != nil {
183+
tsu.p.logger.Fatal().Err(err).Msgf("[udp %s] failed getting gateway from %s", tsu.p.tproxyMode, tsu.iface.Name)
184+
}
185+
tsu.gwDNS = &net.UDPAddr{IP: net.ParseIP(gw.String()), Port: 53}
186+
lc = net.ListenConfig{
187+
Control: func(network, address string, conn syscall.RawConn) error {
188+
var operr error
189+
if err := conn.Control(func(fd uintptr) {
190+
operr = unix.SetsockoptInt(int(fd), unix.SOL_IP, unix.IP_TRANSPARENT, 1)
191+
operr = unix.SetsockoptInt(int(fd), unix.SOL_IP, unix.IP_FREEBIND, 1)
192+
operr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1)
193+
}); err != nil {
194+
return err
195+
}
196+
return operr
197+
},
198+
}
199+
pconn, err = lc.ListenPacket(context.Background(), "udp4", tsu.gwDNS.String())
200+
if err != nil {
201+
tsu.p.logger.Fatal().Err(err).Msgf("[udp %s] failed listening on gateway DNS", tsu.p.tproxyMode)
202+
}
203+
tsu.gwConn = pconn.(*net.UDPConn)
203204
}
204-
tsu.gwConn = pconn.(*net.UDPConn)
205205
return tsu
206206
}
207207

208208
func (tsu *tproxyServerUDP) ListenAndServe() {
209209
tsu.startingFlag.Store(true)
210210
tsu.wg.Add(1)
211211
go tsu.clients.Cleanup()
212-
go func() {
213-
tsu.listenAndServeDNS()
214-
tsu.wg.Done()
215-
}()
212+
if tsu.p.arpspoofer != nil {
213+
go func() {
214+
tsu.listenAndServeDNS()
215+
tsu.wg.Done()
216+
}()
217+
}
216218
buf := make([]byte, udpBufferSize)
217219
oob := make([]byte, 1500)
218220
tsu.startingFlag.Store(false)
@@ -417,11 +419,11 @@ func (dc *dnsConn) close() error {
417419
return dc.Close()
418420
}
419421

420-
func newDNSConn(srcAddr *net.UDPAddr, mark uint) (*dnsConn, error) {
422+
func newDNSConn(srcAddr, dstAddr *net.UDPAddr, mark uint) (*dnsConn, error) {
421423
dialer := getBaseDialer(timeout, mark)
422424
ctx, cancel := context.WithTimeout(context.Background(), timeout)
423425
defer cancel()
424-
conn, err := dialer.DialContext(ctx, "udp4", googleDNSAddr.String())
426+
conn, err := dialer.DialContext(ctx, "udp4", dstAddr.String())
425427
if err != nil {
426428
return nil, err
427429
}
@@ -432,7 +434,7 @@ func newDNSConn(srcAddr *net.UDPAddr, mark uint) (*dnsConn, error) {
432434
return &dnsConn{
433435
UDPConn: udpConn,
434436
srcAddr: srcAddr,
435-
dstAddr: googleDNSAddr,
437+
dstAddr: dstAddr,
436438
reqChan: make(chan layers.Layer),
437439
respChan: make(chan layers.Layer),
438440
}, nil
@@ -456,9 +458,9 @@ func (tsu *tproxyServerUDP) listenAndServeDNS() {
456458
}
457459
n, srcAddr, er := tsu.gwConn.ReadFromUDP(buf)
458460
if n > 0 {
459-
conn, err := newDNSConn(srcAddr, tsu.p.mark)
461+
conn, err := newDNSConn(srcAddr, tsu.gwDNS, tsu.p.mark)
460462
if err != nil {
461-
tsu.p.logger.Error().Err(err).Msgf("[udp %s] Failed creating UDP connection %s→ %s", tsu.p.tproxyMode, srcAddr, googleDNSAddr)
463+
tsu.p.logger.Error().Err(err).Msgf("[udp %s] Failed creating UDP connection %s→ %s", tsu.p.tproxyMode, srcAddr, tsu.gwDNS)
462464
continue
463465
}
464466
srcConnStr := fmt.Sprintf("%s→ %s", srcAddr, tsu.gwConn.LocalAddr())

0 commit comments

Comments
 (0)