Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions cmd/subfinder/main.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package main

import (
"github.com/projectdiscovery/subfinder/v2/pkg/runner"
"github.com/ducksify/subfinder/v2/pkg/runner"
// Attempts to increase the OS file descriptors - Fail silently
_ "github.com/projectdiscovery/fdmax/autofdmax"
"github.com/projectdiscovery/gologger"
)

func main() {
opt := &runner.Options{}
// Parse the command line flags and read config files
options := runner.ParseOptions()
options := runner.ParseOptions(opt)

newRunner, err := runner.NewRunner(options)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion examples/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"io"
"log"

"github.com/projectdiscovery/subfinder/v2/pkg/runner"
"github.com/ducksify/subfinder/v2/pkg/runner"
)

func main() {
Expand Down
8 changes: 3 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
module github.com/projectdiscovery/subfinder/v2
module github.com/ducksify/subfinder/v2

go 1.24.0

toolchain go1.24.1
go 1.24.3

require (
github.com/corpix/uarand v0.2.0
Expand Down Expand Up @@ -73,7 +71,7 @@ require (
github.com/minio/selfupdate v0.6.1-0.20230907112617-f11e74f84ca7 // indirect
github.com/muesli/reflow v0.3.0 // indirect
github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a // indirect
github.com/nwaples/rardecode/v2 v2.0.0-beta.4.0.20241112120701-034e449c6e78 // indirect
github.com/nwaples/rardecode/v2 v2.2.0 // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/projectdiscovery/blackrock v0.0.1 // indirect
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,8 @@ github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg=
github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ=
github.com/nwaples/rardecode/v2 v2.0.0-beta.4.0.20241112120701-034e449c6e78 h1:MYzLheyVx1tJVDqfu3YnN4jtnyALNzLvwl+f58TcvQY=
github.com/nwaples/rardecode/v2 v2.0.0-beta.4.0.20241112120701-034e449c6e78/go.mod h1:yntwv/HfMc/Hbvtq9I19D1n58te3h6KsqCf3GxyfBGY=
github.com/nwaples/rardecode/v2 v2.2.0 h1:4ufPGHiNe1rYJxYfehALLjup4Ls3ck42CWwjKiOqu0A=
github.com/nwaples/rardecode/v2 v2.2.0/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw=
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
Expand Down
2 changes: 1 addition & 1 deletion pkg/passive/passive.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
"time"

"github.com/projectdiscovery/ratelimit"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping"
"github.com/ducksify/subfinder/v2/pkg/subscraping"
)

type EnumerationOptions struct {
Expand Down
88 changes: 44 additions & 44 deletions pkg/passive/sources.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,50 +8,50 @@ import (
"golang.org/x/exp/maps"

"github.com/projectdiscovery/gologger"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/alienvault"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/anubis"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/bevigil"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/bufferover"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/builtwith"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/c99"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/censys"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/certspotter"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/chaos"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/chinaz"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/commoncrawl"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/crtsh"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/digitalyama"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/digitorus"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/dnsdb"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/dnsdumpster"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/dnsrepo"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/driftnet"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/facebook"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/fofa"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/fullhunt"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/github"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/hackertarget"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/hudsonrock"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/hunter"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/intelx"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/leakix"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/netlas"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/pugrecon"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/quake"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/rapiddns"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/redhuntlabs"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/robtex"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/rsecloud"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/securitytrails"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/shodan"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/sitedossier"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/threatbook"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/threatcrowd"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/virustotal"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/waybackarchive"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/whoisxmlapi"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/zoomeyeapi"
"github.com/ducksify/subfinder/v2/pkg/subscraping"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/alienvault"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/anubis"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/bevigil"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/bufferover"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/builtwith"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/c99"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/censys"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/certspotter"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/chaos"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/chinaz"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/commoncrawl"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/crtsh"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/digitalyama"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/digitorus"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/dnsdb"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/dnsdumpster"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/dnsrepo"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/driftnet"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/facebook"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/fofa"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/fullhunt"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/github"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/hackertarget"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/hudsonrock"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/hunter"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/intelx"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/leakix"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/netlas"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/pugrecon"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/quake"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/rapiddns"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/redhuntlabs"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/robtex"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/rsecloud"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/securitytrails"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/shodan"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/sitedossier"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/threatbook"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/threatcrowd"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/virustotal"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/waybackarchive"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/whoisxmlapi"
"github.com/ducksify/subfinder/v2/pkg/subscraping/sources/zoomeyeapi"
mapsutil "github.com/projectdiscovery/utils/maps"
)

Expand Down
2 changes: 1 addition & 1 deletion pkg/passive/sources_w_auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
"github.com/projectdiscovery/gologger"
"github.com/projectdiscovery/gologger/levels"
"github.com/projectdiscovery/ratelimit"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping"
"github.com/ducksify/subfinder/v2/pkg/subscraping"
)

func TestSourcesWithKeys(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/passive/sources_wo_auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
"github.com/projectdiscovery/gologger"
"github.com/projectdiscovery/gologger/levels"
"github.com/projectdiscovery/ratelimit"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping"
"github.com/ducksify/subfinder/v2/pkg/subscraping"
)

func TestSourcesWithoutKeys(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/runner/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"gopkg.in/yaml.v3"

"github.com/projectdiscovery/gologger"
"github.com/projectdiscovery/subfinder/v2/pkg/passive"
"github.com/ducksify/subfinder/v2/pkg/passive"
fileutil "github.com/projectdiscovery/utils/file"
)

Expand Down
6 changes: 3 additions & 3 deletions pkg/runner/enumerate.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import (

"github.com/projectdiscovery/gologger"

"github.com/projectdiscovery/subfinder/v2/pkg/passive"
"github.com/projectdiscovery/subfinder/v2/pkg/resolve"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping"
"github.com/ducksify/subfinder/v2/pkg/passive"
"github.com/ducksify/subfinder/v2/pkg/resolve"
"github.com/ducksify/subfinder/v2/pkg/subscraping"
)

const maxNumCount = 2
Expand Down
4 changes: 2 additions & 2 deletions pkg/runner/initialize.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import (
"strings"

"github.com/projectdiscovery/dnsx/libs/dnsx"
"github.com/projectdiscovery/subfinder/v2/pkg/passive"
"github.com/projectdiscovery/subfinder/v2/pkg/resolve"
"github.com/ducksify/subfinder/v2/pkg/passive"
"github.com/ducksify/subfinder/v2/pkg/resolve"
)

// initializePassiveEngine creates the passive engine and loads sources etc
Expand Down
85 changes: 4 additions & 81 deletions pkg/runner/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import (
"github.com/projectdiscovery/chaos-client/pkg/chaos"
"github.com/projectdiscovery/goflags"
"github.com/projectdiscovery/gologger"
"github.com/projectdiscovery/subfinder/v2/pkg/passive"
"github.com/projectdiscovery/subfinder/v2/pkg/resolve"
"github.com/ducksify/subfinder/v2/pkg/passive"
"github.com/ducksify/subfinder/v2/pkg/resolve"
fileutil "github.com/projectdiscovery/utils/file"
folderutil "github.com/projectdiscovery/utils/folder"
logutil "github.com/projectdiscovery/utils/log"
Expand Down Expand Up @@ -73,79 +73,9 @@ type Options struct {
type OnResultCallback func(result *resolve.HostEntry)

// ParseOptions parses the command line flags provided by a user
func ParseOptions() *Options {
func ParseOptions(options *Options) *Options {
logutil.DisableDefaultLogger()

options := &Options{}

var err error
flagSet := goflags.NewFlagSet()
flagSet.SetDescription(`Subfinder is a subdomain discovery tool that discovers subdomains for websites by using passive online sources.`)

flagSet.CreateGroup("input", "Input",
flagSet.StringSliceVarP(&options.Domain, "domain", "d", nil, "domains to find subdomains for", goflags.NormalizedStringSliceOptions),
flagSet.StringVarP(&options.DomainsFile, "list", "dL", "", "file containing list of domains for subdomain discovery"),
)

flagSet.CreateGroup("source", "Source",
flagSet.StringSliceVarP(&options.Sources, "sources", "s", nil, "specific sources to use for discovery (-s crtsh,github). Use -ls to display all available sources.", goflags.NormalizedStringSliceOptions),
flagSet.BoolVar(&options.OnlyRecursive, "recursive", false, "use only sources that can handle subdomains recursively rather than both recursive and non-recursive sources"),
flagSet.BoolVar(&options.All, "all", false, "use all sources for enumeration (slow)"),
flagSet.StringSliceVarP(&options.ExcludeSources, "exclude-sources", "es", nil, "sources to exclude from enumeration (-es alienvault,zoomeyeapi)", goflags.NormalizedStringSliceOptions),
)

flagSet.CreateGroup("filter", "Filter",
flagSet.StringSliceVarP(&options.Match, "match", "m", nil, "subdomain or list of subdomain to match (file or comma separated)", goflags.FileNormalizedStringSliceOptions),
flagSet.StringSliceVarP(&options.Filter, "filter", "f", nil, " subdomain or list of subdomain to filter (file or comma separated)", goflags.FileNormalizedStringSliceOptions),
)

flagSet.CreateGroup("rate-limit", "Rate-limit",
flagSet.IntVarP(&options.RateLimit, "rate-limit", "rl", 0, "maximum number of http requests to send per second (global)"),
flagSet.RateLimitMapVarP(&options.RateLimits, "rate-limits", "rls", defaultRateLimits, "maximum number of http requests to send per second for providers in key=value format (-rls hackertarget=10/m)", goflags.NormalizedStringSliceOptions),
flagSet.IntVar(&options.Threads, "t", 10, "number of concurrent goroutines for resolving (-active only)"),
)

flagSet.CreateGroup("update", "Update",
flagSet.CallbackVarP(GetUpdateCallback(), "update", "up", "update subfinder to latest version"),
flagSet.BoolVarP(&options.DisableUpdateCheck, "disable-update-check", "duc", false, "disable automatic subfinder update check"),
)

flagSet.CreateGroup("output", "Output",
flagSet.StringVarP(&options.OutputFile, "output", "o", "", "file to write output to"),
flagSet.BoolVarP(&options.JSON, "json", "oJ", false, "write output in JSONL(ines) format"),
flagSet.StringVarP(&options.OutputDirectory, "output-dir", "oD", "", "directory to write output (-dL only)"),
flagSet.BoolVarP(&options.CaptureSources, "collect-sources", "cs", false, "include all sources in the output (-json only)"),
flagSet.BoolVarP(&options.HostIP, "ip", "oI", false, "include host IP in output (-active only)"),
)

flagSet.CreateGroup("configuration", "Configuration",
flagSet.StringVar(&options.Config, "config", defaultConfigLocation, "flag config file"),
flagSet.StringVarP(&options.ProviderConfig, "provider-config", "pc", defaultProviderConfigLocation, "provider config file"),
flagSet.StringSliceVar(&options.Resolvers, "r", nil, "comma separated list of resolvers to use", goflags.NormalizedStringSliceOptions),
flagSet.StringVarP(&options.ResolverList, "rlist", "rL", "", "file containing list of resolvers to use"),
flagSet.BoolVarP(&options.RemoveWildcard, "active", "nW", false, "display active subdomains only"),
flagSet.StringVar(&options.Proxy, "proxy", "", "http proxy to use with subfinder"),
flagSet.BoolVarP(&options.ExcludeIps, "exclude-ip", "ei", false, "exclude IPs from the list of domains"),
)

flagSet.CreateGroup("debug", "Debug",
flagSet.BoolVar(&options.Silent, "silent", false, "show only subdomains in output"),
flagSet.BoolVar(&options.Version, "version", false, "show version of subfinder"),
flagSet.BoolVar(&options.Verbose, "v", false, "show verbose output"),
flagSet.BoolVarP(&options.NoColor, "no-color", "nc", false, "disable color in output"),
flagSet.BoolVarP(&options.ListSources, "list-sources", "ls", false, "list all available sources"),
flagSet.BoolVar(&options.Statistics, "stats", false, "report source statistics"),
)

flagSet.CreateGroup("optimization", "Optimization",
flagSet.IntVar(&options.Timeout, "timeout", 30, "seconds to wait before timing out"),
flagSet.IntVar(&options.MaxEnumerationTime, "max-time", 10, "minutes to wait for enumeration results"),
)

if err := flagSet.Parse(); err != nil {
fmt.Println(err.Error())
os.Exit(1)
}

// set chaos mode
chaos.IsSDK = false
Expand All @@ -156,13 +86,7 @@ func ParseOptions() *Options {
}
}

if options.Config != defaultConfigLocation {
// An empty source file is not a fatal error
if err := flagSet.MergeConfigFile(options.Config); err != nil && !errors.Is(err, io.EOF) {
gologger.Fatal().Msgf("Could not read config: %s\n", err)
}
}

var err error
// Default output is stdout
options.Output = os.Stdout

Expand All @@ -178,7 +102,6 @@ func ParseOptions() *Options {
options.preProcessDomains()

options.ConfigureOutput()
showBanner()

if !options.DisableUpdateCheck {
latestVersion, err := updateutils.GetToolVersionCallback("subfinder", version)()
Expand Down
2 changes: 1 addition & 1 deletion pkg/runner/outputter.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

jsoniter "github.com/json-iterator/go"

"github.com/projectdiscovery/subfinder/v2/pkg/resolve"
"github.com/ducksify/subfinder/v2/pkg/resolve"
)

// OutputWriter outputs content to writers.
Expand Down
Loading