diff --git a/cli/cmd/root.go b/cli/cmd/root.go index f43acde..d562605 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -64,7 +64,7 @@ func parseGlobalOptions() (*libgobuster.Options, error) { } globalopts.Threads = threads - delay, err := rootCmd.Flags().GetInt("delay") + delay, err := rootCmd.Flags().GetDuration("delay") if err != nil { return nil, fmt.Errorf("invalid value for delay: %v", err) } @@ -119,7 +119,7 @@ func configureGlobalOptions() { } func init() { - rootCmd.PersistentFlags().IntP("delay", "d", 0, "Number of milliseconds each thread waits between requests") + rootCmd.PersistentFlags().DurationP("delay", "d", 0, "Time each thread waits between requests (e.g. 1500ms)") rootCmd.PersistentFlags().IntP("threads", "t", 10, "Number of concurrent threads") rootCmd.PersistentFlags().StringP("wordlist", "w", "", "Path to the wordlist") rootCmd.PersistentFlags().StringP("output", "o", "", "Output file to write results to (defaults to stdout)") diff --git a/gobusterdir/gobusterdir.go b/gobusterdir/gobusterdir.go index 23ca120..eb1b3c2 100644 --- a/gobusterdir/gobusterdir.go +++ b/gobusterdir/gobusterdir.go @@ -247,8 +247,10 @@ func (d *GobusterDir) GetConfigString() (string, error) { return "", err } - if _, err := fmt.Fprintf(tw, "[+] Delay:\t%dms\n", d.globalopts.Delay); err != nil { - return "", err + if d.globalopts.Delay > 0 { + if _, err := fmt.Fprintf(tw, "[+] Delay:\t%s\n", d.globalopts.Delay); err != nil { + return "", err + } } wordlist := "stdin (pipe)" diff --git a/gobusterdns/gobusterdns.go b/gobusterdns/gobusterdns.go index ac1b4a9..63cbf81 100644 --- a/gobusterdns/gobusterdns.go +++ b/gobusterdns/gobusterdns.go @@ -173,8 +173,10 @@ func (d *GobusterDNS) GetConfigString() (string, error) { return "", err } - if _, err := fmt.Fprintf(tw, "[+] Delay:\t%d\n", d.globalopts.Delay); err != nil { - return "", err + if d.globalopts.Delay > 0 { + if _, err := fmt.Fprintf(tw, "[+] Delay:\t%s\n", d.globalopts.Delay); err != nil { + return "", err + } } if o.Resolver != "" { diff --git a/gobustervhost/gobustervhost.go b/gobustervhost/gobustervhost.go index fe900d8..180482b 100644 --- a/gobustervhost/gobustervhost.go +++ b/gobustervhost/gobustervhost.go @@ -148,8 +148,10 @@ func (v *GobusterVhost) GetConfigString() (string, error) { return "", err } - if _, err := fmt.Fprintf(tw, "[+] Delay:\t%d\n", v.globalopts.Delay); err != nil { - return "", err + if v.globalopts.Delay > 0 { + if _, err := fmt.Fprintf(tw, "[+] Delay:\t%s\n", v.globalopts.Delay); err != nil { + return "", err + } } wordlist := "stdin (pipe)" diff --git a/libgobuster/libgobuster.go b/libgobuster/libgobuster.go index 8eb5ec6..323d775 100644 --- a/libgobuster/libgobuster.go +++ b/libgobuster/libgobuster.go @@ -115,7 +115,10 @@ func (g *Gobuster) worker(wordChan <-chan string, wg *sync.WaitGroup) { } } - time.Sleep(time.Duration(g.Opts.Delay) * time.Millisecond) + select { + case <-g.context.Done(): + case <-time.After(g.Opts.Delay): + } } } } diff --git a/libgobuster/options.go b/libgobuster/options.go index 11651b0..52a5b84 100644 --- a/libgobuster/options.go +++ b/libgobuster/options.go @@ -1,5 +1,7 @@ package libgobuster +import "time" + // Options helds all options that can be passed to libgobuster type Options struct { Threads int @@ -10,7 +12,7 @@ type Options struct { Quiet bool WildcardForced bool Verbose bool - Delay int + Delay time.Duration } // NewOptions returns a new initialized Options object