Add HTTP proxy support

master
Defuse Venue 2021-06-24 04:50:52 +09:00
parent 01813b7cb0
commit 103553c3d0
4 changed files with 26 additions and 12 deletions

View File

@ -11,11 +11,11 @@ import (
) )
// EnumerateSubdomains enumerates all the subdomains for a given domain // EnumerateSubdomains enumerates all the subdomains for a given domain
func (a *Agent) EnumerateSubdomains(domain string, keys *subscraping.Keys, timeout int, maxEnumTime time.Duration) chan subscraping.Result { func (a *Agent) EnumerateSubdomains(domain string, keys *subscraping.Keys, proxy string, timeout int, maxEnumTime time.Duration) chan subscraping.Result {
results := make(chan subscraping.Result) results := make(chan subscraping.Result)
go func() { go func() {
session, err := subscraping.NewSession(domain, keys, timeout) session, err := subscraping.NewSession(domain, keys, proxy, timeout)
if err != nil { if err != nil {
results <- subscraping.Result{Type: subscraping.Error, Error: fmt.Errorf("could not init passive session for %s: %s", domain, err)} results <- subscraping.Result{Type: subscraping.Error, Error: fmt.Errorf("could not init passive session for %s: %s", domain, err)}
} }

View File

@ -37,7 +37,7 @@ func (r *Runner) EnumerateSingleDomain(ctx context.Context, domain string, outpu
// Run the passive subdomain enumeration // Run the passive subdomain enumeration
now := time.Now() now := time.Now()
passiveResults := r.passiveAgent.EnumerateSubdomains(domain, &keys, r.options.Timeout, time.Duration(r.options.MaxEnumerationTime)*time.Minute) passiveResults := r.passiveAgent.EnumerateSubdomains(domain, &keys, r.options.Proxy, r.options.Timeout, time.Duration(r.options.MaxEnumerationTime)*time.Minute)
wg := &sync.WaitGroup{} wg := &sync.WaitGroup{}
wg.Add(1) wg.Add(1)

View File

@ -39,7 +39,7 @@ type Options struct {
Resolvers string // Resolvers is the comma-separated resolvers to use for enumeration Resolvers string // Resolvers is the comma-separated resolvers to use for enumeration
ResolverList string // ResolverList is a text file containing list of resolvers to use for enumeration ResolverList string // ResolverList is a text file containing list of resolvers to use for enumeration
ConfigFile string // ConfigFile contains the location of the config file ConfigFile string // ConfigFile contains the location of the config file
Proxy string // HTTP proxy
YAMLConfig ConfigFile // YAMLConfig contains the unmarshalled yaml config file YAMLConfig ConfigFile // YAMLConfig contains the unmarshalled yaml config file
} }
@ -76,6 +76,7 @@ func ParseOptions() *Options {
flag.StringVar(&options.ResolverList, "rL", "", "Text file containing list of resolvers to use") flag.StringVar(&options.ResolverList, "rL", "", "Text file containing list of resolvers to use")
flag.BoolVar(&options.RemoveWildcard, "nW", false, "Remove Wildcard & Dead Subdomains from output") flag.BoolVar(&options.RemoveWildcard, "nW", false, "Remove Wildcard & Dead Subdomains from output")
flag.StringVar(&options.ConfigFile, "config", path.Join(config, "config.yaml"), "Configuration file for API Keys, etc") flag.StringVar(&options.ConfigFile, "config", path.Join(config, "config.yaml"), "Configuration file for API Keys, etc")
flag.StringVar(&options.Proxy, "proxy", "", "HTTP proxy")
flag.BoolVar(&options.Version, "version", false, "Show version of subfinder") flag.BoolVar(&options.Version, "version", false, "Show version of subfinder")
flag.Parse() flag.Parse()

View File

@ -14,15 +14,28 @@ import (
) )
// NewSession creates a new session object for a domain // NewSession creates a new session object for a domain
func NewSession(domain string, keys *Keys, timeout int) (*Session, error) { func NewSession(domain string, keys *Keys, proxy string, timeout int) (*Session, error) {
client := &http.Client{ Transport := &http.Transport{
Transport: &http.Transport{
MaxIdleConns: 100, MaxIdleConns: 100,
MaxIdleConnsPerHost: 100, MaxIdleConnsPerHost: 100,
TLSClientConfig: &tls.Config{ TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, InsecureSkipVerify: true,
}, },
}, }
// Add proxy
if proxy != "" {
proxyUrl, _ := url.Parse(proxy)
if proxyUrl == nil {
// Log warning but continue anyways
gologger.Warning().Msgf("Invalid proxy '%s' provided", proxy)
} else {
Transport.Proxy = http.ProxyURL(proxyUrl)
}
}
client := &http.Client{
Transport: Transport,
Timeout: time.Duration(timeout) * time.Second, Timeout: time.Duration(timeout) * time.Second,
} }