Skip to content

Commit 03034c5

Browse files
authored
Merge pull request #409 from projectdiscovery/dev
Bugfix release (kali / docker)
2 parents 0cb94f9 + 0d9a6e7 commit 03034c5

File tree

5 files changed

+249
-26
lines changed

5 files changed

+249
-26
lines changed

v2/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ require (
88
github.com/projectdiscovery/blackrock v0.0.0-20210903102120-5a9d2412d21d
99
github.com/projectdiscovery/cdncheck v0.0.4-0.20220322144854-b2d8ce308abb
1010
github.com/projectdiscovery/clistats v0.0.8
11-
github.com/projectdiscovery/dnsx v1.1.1-0.20220717105926-3bc1597b15c1
1211
github.com/projectdiscovery/fdmax v0.0.3
1312
github.com/projectdiscovery/fileutil v0.0.0-20220705195237-01becc2a8963
1413
github.com/projectdiscovery/goflags v0.0.9
@@ -26,6 +25,7 @@ require (
2625
github.com/logrusorgru/aurora v2.0.3+incompatible
2726
github.com/miekg/dns v1.1.50
2827
github.com/pkg/errors v0.9.1
28+
github.com/projectdiscovery/dnsx v1.1.1-0.20220726121728-699bed01313a
2929
github.com/projectdiscovery/ipranger v0.0.3-0.20220715104731-7638578d1725
3030
github.com/projectdiscovery/mapcidr v1.0.1
3131
github.com/projectdiscovery/retryablehttp-go v1.0.2
@@ -67,7 +67,7 @@ require (
6767
github.com/modern-go/reflect2 v1.0.2 // indirect
6868
github.com/pmezard/go-difflib v1.0.0 // indirect
6969
github.com/projectdiscovery/hmap v0.0.2 // indirect
70-
github.com/projectdiscovery/retryabledns v1.0.14-0.20220717105827-2d0b0e81dd89 // indirect
70+
github.com/projectdiscovery/retryabledns v1.0.14 // indirect
7171
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
7272
github.com/syndtr/goleveldb v1.0.0 // indirect
7373
github.com/yl2chen/cidranger v1.0.2 // indirect

v2/go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,8 @@ github.com/projectdiscovery/cdncheck v0.0.4-0.20220322144854-b2d8ce308abb h1:Q7t
244244
github.com/projectdiscovery/cdncheck v0.0.4-0.20220322144854-b2d8ce308abb/go.mod h1:EevMeCG1ogBoUJYaa0Mv9R1VUboDm/DiynId7DboKy0=
245245
github.com/projectdiscovery/clistats v0.0.8 h1:tjmWb15mqsPf/yrQXVHLe2ThZX/5+mgKSfZBKWWLh20=
246246
github.com/projectdiscovery/clistats v0.0.8/go.mod h1:lV6jUHAv2bYWqrQstqW8iVIydKJhWlVaLl3Xo9ioVGg=
247-
github.com/projectdiscovery/dnsx v1.1.1-0.20220717105926-3bc1597b15c1 h1:8XiVC4hJ17TXCZJ8erzVVzqwJo+vfvMlEbLfbGy/Ru8=
248-
github.com/projectdiscovery/dnsx v1.1.1-0.20220717105926-3bc1597b15c1/go.mod h1:zM2GaMs2sQYZIcFOQgXorqRC1blImu8TZeAswaQHSrU=
247+
github.com/projectdiscovery/dnsx v1.1.1-0.20220726121728-699bed01313a h1:x+/wTC4IEaSBtujl8JbdwWjprfAfLntSr8HTh7pPbbM=
248+
github.com/projectdiscovery/dnsx v1.1.1-0.20220726121728-699bed01313a/go.mod h1:jk2CjjLoxm5wZ14URcbi/OdvVy4MTtdpNAjDK3VWYF4=
249249
github.com/projectdiscovery/fdmax v0.0.3 h1:FM6lv9expZ/rEEBI9tkRh6tx3DV0gtpwzdc0h7bGPqg=
250250
github.com/projectdiscovery/fdmax v0.0.3/go.mod h1:NWRcaR7JTO7fC27H4jCl9n7Z+KIredwpgw1fV+4KrKI=
251251
github.com/projectdiscovery/fileutil v0.0.0-20210926202739-6050d0acf73c/go.mod h1:U+QCpQnX8o2N2w0VUGyAzjM3yBAe4BKedVElxiImsx0=
@@ -285,8 +285,8 @@ github.com/projectdiscovery/mapcidr v1.0.1/go.mod h1:/qxlpxXZQFFjHynSc9u5O0kUPzH
285285
github.com/projectdiscovery/networkpolicy v0.0.2-0.20220525172507-b844eafc878d h1:QXaK3yzoEWI8n+hLAqEgTJEWhkp1WZM8ThbKwrlXFks=
286286
github.com/projectdiscovery/networkpolicy v0.0.2-0.20220525172507-b844eafc878d/go.mod h1:asvdg5wMy3LPVMGALatebKeOYH5n5fV5RCTv6DbxpIs=
287287
github.com/projectdiscovery/reflectutil v0.0.0-20210804085554-4d90952bf92f/go.mod h1:3L0WfNIcVWXIDur8k+gKDLZLWY2F+rs0SQXtcn/3AYU=
288-
github.com/projectdiscovery/retryabledns v1.0.14-0.20220717105827-2d0b0e81dd89 h1:nxPe4Bze+LeAHWPPcObcDpp6Wv8hi26xAmVSmyOISVc=
289-
github.com/projectdiscovery/retryabledns v1.0.14-0.20220717105827-2d0b0e81dd89/go.mod h1:g+NlPMyYzoFuHZpJHNCYMpqHKQu/ov4aG/YTdd8oht8=
288+
github.com/projectdiscovery/retryabledns v1.0.14 h1:RX7thJK9q7sVQZOpc7Qv5Ts13AyZhJK5G6xFqTtRhWU=
289+
github.com/projectdiscovery/retryabledns v1.0.14/go.mod h1:g+NlPMyYzoFuHZpJHNCYMpqHKQu/ov4aG/YTdd8oht8=
290290
github.com/projectdiscovery/retryablehttp-go v1.0.2 h1:LV1/KAQU+yeWhNVlvveaYFsjBYRwXlNEq0PvrezMV0U=
291291
github.com/projectdiscovery/retryablehttp-go v1.0.2/go.mod h1:dx//aY9V247qHdsRf0vdWHTBZuBQ2vm6Dq5dagxrDYI=
292292
github.com/projectdiscovery/sliceutil v0.0.0-20220225084130-8392ac12fa6d/go.mod h1:QHXvznfPfA5f0AZUIBkbLapoUJJlsIDgUlkKva6dOr4=

v2/pkg/routing/router_linux.go

Lines changed: 235 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,251 @@
11
//go:build linux
22

3+
// Copyright 2012 Google, Inc. All rights reserved.
4+
//
5+
// Use of this source code is governed by a BSD-style license
6+
// that can be found in the LICENSE file in the root of the source
7+
// tree.
8+
9+
// Package routing provides a very basic but mostly functional implementation of
10+
// a routing table for IPv4/IPv6 addresses. It uses a routing table pulled from
11+
// the kernel via netlink to find the correct interface, gateway, and preferred
12+
// source IP address for packets destined to a particular location.
13+
//
14+
// The routing package is meant to be used with applications that are sending
15+
// raw packet data, which don't have the benefit of having the kernel route
16+
// packets for them.
317
package routing
418

519
import (
20+
"bytes"
21+
"errors"
22+
"fmt"
623
"net"
7-
8-
"github.com/google/gopacket/routing"
24+
"sort"
25+
"strings"
26+
"syscall"
27+
"unsafe"
928
)
1029

11-
// New creates a https://github.com/google/gopacket instance for Linux
12-
func New() (Router, error) {
13-
router, err := routing.New()
14-
if err != nil {
15-
return nil, err
30+
// Pulled from http://man7.org/linux/man-pages/man7/rtnetlink.7.html
31+
// See the section on RTM_NEWROUTE, specifically 'struct rtmsg'.
32+
type routeInfoInMemory struct {
33+
Family byte
34+
DstLen byte
35+
SrcLen byte
36+
TOS byte
37+
38+
Table byte
39+
Protocol byte
40+
Scope byte
41+
Type byte
42+
43+
Flags uint32
44+
}
45+
46+
// rtInfo contains information on a single route.
47+
type rtInfo struct {
48+
Src, Dst *net.IPNet
49+
Gateway, PrefSrc net.IP
50+
// We currently ignore the InputIface.
51+
InputIface, OutputIface uint32
52+
Priority uint32
53+
}
54+
55+
// routeSlice implements sort.Interface to sort routes by Priority.
56+
type routeSlice []*rtInfo
57+
58+
func (r routeSlice) Len() int {
59+
return len(r)
60+
}
61+
func (r routeSlice) Less(i, j int) bool {
62+
return r[i].Priority < r[j].Priority
63+
}
64+
func (r routeSlice) Swap(i, j int) {
65+
r[i], r[j] = r[j], r[i]
66+
}
67+
68+
type router struct {
69+
ifaces map[int]*net.Interface
70+
addrs map[int]ipAddrs
71+
v4, v6 routeSlice
72+
}
73+
74+
func (r *router) String() string {
75+
strs := []string{"ROUTER", "--- V4 ---"}
76+
for _, route := range r.v4 {
77+
strs = append(strs, fmt.Sprintf("%+v", *route))
1678
}
17-
return RouterLinux{router: router}, nil
79+
strs = append(strs, "--- V6 ---")
80+
for _, route := range r.v6 {
81+
strs = append(strs, fmt.Sprintf("%+v", *route))
82+
}
83+
return strings.Join(strs, "\n")
1884
}
1985

20-
type RouterLinux struct {
21-
router routing.Router
86+
type ipAddrs struct {
87+
v4, v6 net.IP
2288
}
2389

24-
func (r RouterLinux) Route(dst net.IP) (iface *net.Interface, gateway, preferredSrc net.IP, err error) {
25-
return r.router.Route(dst)
90+
func (r *router) Route(dst net.IP) (iface *net.Interface, gateway, preferredSrc net.IP, err error) {
91+
return r.RouteWithSrc(nil, nil, dst)
2692
}
2793

28-
func (r RouterLinux) RouteWithSrc(input net.HardwareAddr, src, dst net.IP) (iface *net.Interface, gateway, preferredSrc net.IP, err error) {
29-
return r.router.RouteWithSrc(input, src, dst)
94+
func (r *router) RouteWithSrc(input net.HardwareAddr, src, dst net.IP) (iface *net.Interface, gateway, preferredSrc net.IP, err error) {
95+
var ifaceIndex int
96+
switch {
97+
case dst.To4() != nil:
98+
ifaceIndex, gateway, preferredSrc, err = r.route(r.v4, input, src, dst)
99+
case dst.To16() != nil:
100+
ifaceIndex, gateway, preferredSrc, err = r.route(r.v6, input, src, dst)
101+
default:
102+
err = errors.New("IP is not valid as IPv4 or IPv6")
103+
}
104+
105+
if err != nil {
106+
return
107+
}
108+
109+
iface = r.ifaces[ifaceIndex]
110+
111+
if preferredSrc == nil {
112+
switch {
113+
case dst.To4() != nil:
114+
preferredSrc = r.addrs[ifaceIndex].v4
115+
case dst.To16() != nil:
116+
preferredSrc = r.addrs[ifaceIndex].v6
117+
}
118+
}
119+
return
120+
}
121+
122+
func (r *router) route(routes routeSlice, input net.HardwareAddr, src, dst net.IP) (iface int, gateway, preferredSrc net.IP, err error) {
123+
var inputIndex uint32
124+
if input != nil {
125+
for i, iface := range r.ifaces {
126+
if bytes.Equal(input, iface.HardwareAddr) {
127+
inputIndex = uint32(i)
128+
break
129+
}
130+
}
131+
}
132+
var defaultGateway *rtInfo = nil
133+
for _, rt := range routes {
134+
if rt.InputIface != 0 && rt.InputIface != inputIndex {
135+
continue
136+
}
137+
if rt.Src == nil && rt.Dst == nil {
138+
defaultGateway = rt
139+
continue
140+
}
141+
if rt.Src != nil && !rt.Src.Contains(src) {
142+
continue
143+
}
144+
if rt.Dst != nil && !rt.Dst.Contains(dst) {
145+
continue
146+
}
147+
return int(rt.OutputIface), rt.Gateway, rt.PrefSrc, nil
148+
}
149+
150+
if defaultGateway != nil {
151+
return int(defaultGateway.OutputIface), defaultGateway.Gateway, defaultGateway.PrefSrc, nil
152+
}
153+
err = fmt.Errorf("no route found for %v", dst)
154+
return
155+
}
156+
157+
// New creates a new router object. The router returned by New currently does
158+
// not update its routes after construction... care should be taken for
159+
// long-running programs to call New() regularly to take into account any
160+
// changes to the routing table which have occurred since the last New() call.
161+
func New() (Router, error) {
162+
rtr := &router{
163+
ifaces: make(map[int]*net.Interface),
164+
addrs: make(map[int]ipAddrs),
165+
}
166+
tab, err := syscall.NetlinkRIB(syscall.RTM_GETROUTE, syscall.AF_UNSPEC)
167+
if err != nil {
168+
return nil, err
169+
}
170+
msgs, err := syscall.ParseNetlinkMessage(tab)
171+
if err != nil {
172+
return nil, err
173+
}
174+
loop:
175+
for _, m := range msgs {
176+
switch m.Header.Type {
177+
case syscall.NLMSG_DONE:
178+
break loop
179+
case syscall.RTM_NEWROUTE:
180+
rt := (*routeInfoInMemory)(unsafe.Pointer(&m.Data[0]))
181+
routeInfo := rtInfo{}
182+
attrs, err := syscall.ParseNetlinkRouteAttr(&m)
183+
if err != nil {
184+
return nil, err
185+
}
186+
switch rt.Family {
187+
case syscall.AF_INET:
188+
rtr.v4 = append(rtr.v4, &routeInfo)
189+
case syscall.AF_INET6:
190+
rtr.v6 = append(rtr.v6, &routeInfo)
191+
default:
192+
continue loop
193+
}
194+
for _, attr := range attrs {
195+
switch attr.Attr.Type {
196+
case syscall.RTA_DST:
197+
routeInfo.Dst = &net.IPNet{
198+
IP: net.IP(attr.Value),
199+
Mask: net.CIDRMask(int(rt.DstLen), len(attr.Value)*8),
200+
}
201+
case syscall.RTA_SRC:
202+
routeInfo.Src = &net.IPNet{
203+
IP: net.IP(attr.Value),
204+
Mask: net.CIDRMask(int(rt.SrcLen), len(attr.Value)*8),
205+
}
206+
case syscall.RTA_GATEWAY:
207+
routeInfo.Gateway = net.IP(attr.Value)
208+
case syscall.RTA_PREFSRC:
209+
routeInfo.PrefSrc = net.IP(attr.Value)
210+
case syscall.RTA_IIF:
211+
routeInfo.InputIface = *(*uint32)(unsafe.Pointer(&attr.Value[0]))
212+
case syscall.RTA_OIF:
213+
routeInfo.OutputIface = *(*uint32)(unsafe.Pointer(&attr.Value[0]))
214+
case syscall.RTA_PRIORITY:
215+
routeInfo.Priority = *(*uint32)(unsafe.Pointer(&attr.Value[0]))
216+
}
217+
}
218+
}
219+
}
220+
sort.Sort(rtr.v4)
221+
sort.Sort(rtr.v6)
222+
ifaces, err := net.Interfaces()
223+
if err != nil {
224+
return nil, err
225+
}
226+
for _, tmp := range ifaces {
227+
iface := tmp
228+
rtr.ifaces[iface.Index] = &iface
229+
var addrs ipAddrs
230+
ifaceAddrs, err := iface.Addrs()
231+
if err != nil {
232+
return nil, err
233+
}
234+
for _, addr := range ifaceAddrs {
235+
if inet, ok := addr.(*net.IPNet); ok {
236+
// Go has a nasty habit of giving you IPv4s as ::ffff:1.2.3.4 instead of 1.2.3.4.
237+
// We want to use mapped v4 addresses as v4 preferred addresses, never as v6
238+
// preferred addresses.
239+
if v4 := inet.IP.To4(); v4 != nil {
240+
if addrs.v4 == nil {
241+
addrs.v4 = v4
242+
}
243+
} else if addrs.v6 == nil {
244+
addrs.v6 = inet.IP
245+
}
246+
}
247+
}
248+
rtr.addrs[iface.Index] = addrs
249+
}
250+
return rtr, nil
30251
}

v2/pkg/runner/banners.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ const banner = `
1313
__
1414
___ ___ ___ _/ / __ __
1515
/ _ \/ _ \/ _ \/ _ \/ // /
16-
/_//_/\_,_/\_,_/_.__/\_,_/ v2.0.9
16+
/_//_/\_,_/\_,_/_.__/\_,_/ v2.1.0
1717
`
1818

1919
// Version is the current version of naabu
20-
const Version = `2.0.9`
20+
const Version = `2.1.0`
2121

2222
// showBanner is used to show the banner to the user
2323
func showBanner() {

v2/pkg/runner/util_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ func Test_host2ips(t *testing.T) {
1515
wantErr bool
1616
}{
1717
{"10.10.10.10", []string{"10.10.10.10"}, nil, false},
18-
{"localhost", []string{"127.0.0.1"}, []string{"::1"}, false},
18+
{"localhost", []string{"127.0.0.1"}, []string{"::1"}, false}, // some linux distribution don't have ::1 in /etc/hosts
1919
{"aaaa", nil, nil, true},
2020
{"10.10.10.0/24", nil, nil, true},
2121
}
2222

23-
r, err := NewRunner(&Options{IPVersion: []string{"4", "6"}})
23+
r, err := NewRunner(&Options{IPVersion: []string{"4", "6"}, Retries: 1})
2424
assert.Nil(t, err)
2525
if dnsclient, err := dnsx.New(dnsx.DefaultOptions); err != nil {
2626
assert.Error(t, err)
@@ -39,8 +39,10 @@ func Test_host2ips(t *testing.T) {
3939
assert.Nil(t, err)
4040
}
4141
assert.Equal(t, tt.want, got)
42-
assert.Equal(t, tt.wantV6, gotV6)
43-
42+
// As some distributions don't handle correctly ipv6 we compare results only if necessary
43+
if len(gotV6) > 0 && len(tt.wantV6) > 0 {
44+
assert.Equal(t, tt.wantV6, gotV6)
45+
}
4446
})
4547
}
4648
}

0 commit comments

Comments
 (0)