From c74b522710cd9635c99084ab10012f4ccd7179a6 Mon Sep 17 00:00:00 2001 From: Christian Bieg Date: Sat, 22 Jun 2019 17:13:17 +0200 Subject: [PATCH] Added an option to add a delay to threads --- cli/cmd/root.go | 11 +++++++++++ gobusterdir/gobusterdir.go | 5 +++++ gobusterdns/gobusterdns.go | 4 ++++ gobustervhost/gobustervhost.go | 5 +++++ libgobuster/libgobuster.go | 3 +++ libgobuster/options.go | 1 + 6 files changed, 29 insertions(+) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index d7c3366..f43acde 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -64,6 +64,16 @@ func parseGlobalOptions() (*libgobuster.Options, error) { } globalopts.Threads = threads + delay, err := rootCmd.Flags().GetInt("delay") + if err != nil { + return nil, fmt.Errorf("invalid value for delay: %v", err) + } + + if delay < 0 { + return nil, fmt.Errorf("delay must be positive") + } + globalopts.Delay = delay + globalopts.Wordlist, err = rootCmd.Flags().GetString("wordlist") if err != nil { return nil, fmt.Errorf("invalid value for wordlist: %v", err) @@ -109,6 +119,7 @@ func configureGlobalOptions() { } func init() { + rootCmd.PersistentFlags().IntP("delay", "d", 0, "Number of milliseconds each thread waits between requests") 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 9c23ca7..23ca120 100644 --- a/gobusterdir/gobusterdir.go +++ b/gobusterdir/gobusterdir.go @@ -242,10 +242,15 @@ func (d *GobusterDir) GetConfigString() (string, error) { if _, err := fmt.Fprintf(tw, "[+] Url:\t%s\n", o.URL); err != nil { return "", err } + if _, err := fmt.Fprintf(tw, "[+] Threads:\t%d\n", d.globalopts.Threads); err != nil { return "", err } + if _, err := fmt.Fprintf(tw, "[+] Delay:\t%dms\n", d.globalopts.Delay); err != nil { + return "", err + } + wordlist := "stdin (pipe)" if d.globalopts.Wordlist != "-" { wordlist = d.globalopts.Wordlist diff --git a/gobusterdns/gobusterdns.go b/gobusterdns/gobusterdns.go index 030e928..ac1b4a9 100644 --- a/gobusterdns/gobusterdns.go +++ b/gobusterdns/gobusterdns.go @@ -173,6 +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 o.Resolver != "" { if _, err := fmt.Fprintf(tw, "[+] Resolver:\t%s\n", o.Resolver); err != nil { return "", err diff --git a/gobustervhost/gobustervhost.go b/gobustervhost/gobustervhost.go index 6765961..fe900d8 100644 --- a/gobustervhost/gobustervhost.go +++ b/gobustervhost/gobustervhost.go @@ -143,10 +143,15 @@ func (v *GobusterVhost) GetConfigString() (string, error) { if _, err := fmt.Fprintf(tw, "[+] Url:\t%s\n", o.URL); err != nil { return "", err } + if _, err := fmt.Fprintf(tw, "[+] Threads:\t%d\n", v.globalopts.Threads); err != nil { return "", err } + if _, err := fmt.Fprintf(tw, "[+] Delay:\t%d\n", v.globalopts.Delay); err != nil { + return "", err + } + wordlist := "stdin (pipe)" if v.globalopts.Wordlist != "-" { wordlist = v.globalopts.Wordlist diff --git a/libgobuster/libgobuster.go b/libgobuster/libgobuster.go index f63ed3c..8eb5ec6 100644 --- a/libgobuster/libgobuster.go +++ b/libgobuster/libgobuster.go @@ -8,6 +8,7 @@ import ( "os" "strings" "sync" + "time" ) // SetupFunc is the "setup" function prototype for implementations @@ -113,6 +114,8 @@ func (g *Gobuster) worker(wordChan <-chan string, wg *sync.WaitGroup) { g.resultChan <- r } } + + time.Sleep(time.Duration(g.Opts.Delay) * time.Millisecond) } } } diff --git a/libgobuster/options.go b/libgobuster/options.go index dbffee2..11651b0 100644 --- a/libgobuster/options.go +++ b/libgobuster/options.go @@ -10,6 +10,7 @@ type Options struct { Quiet bool WildcardForced bool Verbose bool + Delay int } // NewOptions returns a new initialized Options object