diff --git a/v2/pkg/runner/ips_test.go b/v2/pkg/runner/ips_test.go index 85de6c6e..a7d34614 100644 --- a/v2/pkg/runner/ips_test.go +++ b/v2/pkg/runner/ips_test.go @@ -1,6 +1,7 @@ package runner import ( + "net" "os" "strings" "testing" @@ -40,3 +41,60 @@ func TestIsIpOrCidr(t *testing.T) { require.False(t, isIpOrCidr(invalidItem)) } } + +// Helper function for the following 3 tests +func testIps(testIps []string) func() ([]*net.IPNet, []string) { + ips := []*net.IPNet{} + + for _, ip := range testIps { + _, net, _ := net.ParseCIDR(ip) + ips = append(ips, net) + } + + return func() ([]*net.IPNet, []string) { + return ips, []string{} + } +} + +func TestIpV4Only(t *testing.T) { + ips := []string{"1.1.1.1/32", "2.2.2.2/32", "1.1.1.0/24", "fe80::623e:5fff:fe76:7d82/64", "100.121.237.116/32", "fd7a:115c:a1e0::fb01:ed74/48"} + + r, err := NewRunner(&Options{ + IPVersion: []string{"4"}, + }) + require.Nil(t, err) + + targets, targetsV4, targetsV6, _, err := r.GetTargetIps(testIps(ips)) + require.Nil(t, err) + require.Equal(t, targets, targetsV4) + require.Empty(t, targetsV6) +} + +func TestIpV6Only(t *testing.T) { + ips := []string{"1.1.1.1/32", "2.2.2.2/32", "1.1.1.0/24", "fe80::623e:5fff:fe76:7d82/64", "100.121.237.116/32", "fd7a:115c:a1e0::fb01:ed74/48"} + + r, err := NewRunner(&Options{ + IPVersion: []string{"6"}, + }) + require.Nil(t, err) + + targets, targetsV4, targetsV6, _, err := r.GetTargetIps(testIps(ips)) + require.Nil(t, err) + require.Equal(t, targets, targetsV6) + require.Empty(t, targetsV4) +} + +func TestIpV4AndV6(t *testing.T) { + ips := []string{"1.1.1.1/32", "2.2.2.2/32", "1.1.1.0/24", "fe80::623e:5fff:fe76:7d82/64", "100.121.237.116/32", "fd7a:115c:a1e0::fb01:ed74/48"} + + r, err := NewRunner(&Options{ + IPVersion: []string{"4", "6"}, + }) + require.Nil(t, err) + + targets, targetsV4, targetsV6, _, err := r.GetTargetIps(testIps(ips)) + expected := append(targetsV4, targetsV6...) + + require.Nil(t, err) + require.EqualValues(t, expected, targets) +} diff --git a/v2/pkg/runner/nmap.go b/v2/pkg/runner/nmap.go index 7ddc0b35..04d184d9 100644 --- a/v2/pkg/runner/nmap.go +++ b/v2/pkg/runner/nmap.go @@ -107,7 +107,7 @@ func (r *Runner) handleNmap() error { err := cmd.Run() if err != nil { errMsg := errors.Wrap(err, "Could not run nmap command") - gologger.Error().Msgf("%v", errMsg.Error()) + gologger.Error().Msg(errMsg.Error()) return errMsg } } else { diff --git a/v2/pkg/runner/options.go b/v2/pkg/runner/options.go index 3053f21b..5f513367 100644 --- a/v2/pkg/runner/options.go +++ b/v2/pkg/runner/options.go @@ -8,6 +8,7 @@ import ( "github.com/projectdiscovery/naabu/v2/pkg/result" "github.com/projectdiscovery/naabu/v2/pkg/scan" fileutil "github.com/projectdiscovery/utils/file" + sliceutil "github.com/projectdiscovery/utils/slice" "github.com/projectdiscovery/goflags" "github.com/projectdiscovery/gologger" @@ -283,3 +284,11 @@ func (options *Options) hasProbes() bool { func (options *Options) shouldUseRawPackets() bool { return isOSSupported() && privileges.IsPrivileged && options.ScanType == SynScan && scan.PkgRouter != nil } + +func (options *Options) ShouldScanIPv4() bool { + return sliceutil.Contains(options.IPVersion, "4") +} + +func (options *Options) ShouldScanIPv6() bool { + return sliceutil.Contains(options.IPVersion, "6") +} diff --git a/v2/pkg/runner/output.go b/v2/pkg/runner/output.go index d4ffa335..b79edaeb 100644 --- a/v2/pkg/runner/output.go +++ b/v2/pkg/runner/output.go @@ -167,7 +167,7 @@ func writeCSVHeaders(data *Result, writer *csv.Writer) { if err := writer.Write(headers); err != nil { errMsg := errors.Wrap(err, "Could not write headers") - gologger.Error().Msgf("%v", errMsg.Error()) + gologger.Error().Msg(errMsg.Error()) } } @@ -179,6 +179,6 @@ func writeCSVRow(data *Result, writer *csv.Writer) { } if err := writer.Write(rowData); err != nil { errMsg := errors.Wrap(err, "Could not write row") - gologger.Error().Msgf("%v", errMsg.Error()) + gologger.Error().Msg(errMsg.Error()) } } diff --git a/v2/pkg/runner/runner.go b/v2/pkg/runner/runner.go index a7c2ad60..864c965d 100644 --- a/v2/pkg/runner/runner.go +++ b/v2/pkg/runner/runner.go @@ -648,15 +648,29 @@ func (r *Runner) getPreprocessedIps() (cidrs []*net.IPNet, ipsWithPort []string) return } -func (r *Runner) GetTargetIps(ipsCallback func() ([]*net.IPNet, []string)) (targets, targetsV4, targetsv6 []*net.IPNet, targetsWithPort []string, err error) { +func (r *Runner) GetTargetIps(ipsCallback func() ([]*net.IPNet, []string)) (targets, targetsV4, targetsV6 []*net.IPNet, targetsWithPort []string, err error) { targets, targetsWithPort = ipsCallback() // shrinks the ips to the minimum amount of cidr - targetsV4, targetsv6 = mapcidr.CoalesceCIDRs(targets) - if len(targetsV4) == 0 && len(targetsv6) == 0 && len(targetsWithPort) == 0 { + targetsV4, targetsV6 = mapcidr.CoalesceCIDRs(targets) + if len(targetsV4) == 0 && len(targetsV6) == 0 && len(targetsWithPort) == 0 { return nil, nil, nil, nil, errors.New("no valid ipv4 or ipv6 targets were found") } - return targets, targetsV4, targetsv6, targetsWithPort, nil + + targets = make([]*net.IPNet, 0, len(targets)) + if r.options.ShouldScanIPv4() { + targets = append(targets, targetsV4...) + } else { + targetsV4 = make([]*net.IPNet, 0) + } + + if r.options.ShouldScanIPv6() { + targets = append(targets, targetsV6...) + } else { + targetsV6 = make([]*net.IPNet, 0) + } + + return targets, targetsV4, targetsV6, targetsWithPort, nil } func (r *Runner) ShowScanResultOnExit() {