diff --git a/cli/options.go b/cli/options.go index 7f035744..9820e72b 100644 --- a/cli/options.go +++ b/cli/options.go @@ -226,6 +226,7 @@ func GlobalOptions() []cli.Flag { &cli.StringFlag{Name: "discover-pattern", Aliases: []string{"pd"}, Usage: "File containing replacement patterns applied to successful guesses"}, &cli.BoolFlag{Name: "no-color", Aliases: []string{"nc"}, Value: false, Usage: "Disable color output"}, &cli.BoolFlag{Name: "debug", Value: false, Usage: "enable debug output"}, + &cli.BoolFlag{Name: "stop-on-rate-limit", Value: false, Usage: "When enabled exits when a rate limit is detected"}, } } @@ -253,6 +254,7 @@ func ParseGlobalOptions(c *cli.Context) (libgobuster.Options, error) { opts.NoProgress = c.Bool("no-progress") opts.NoError = c.Bool("no-error") opts.PatternFile = c.String("pattern") + opts.StopOnRateLimit = c.Bool("stop-on-rate-limit") if opts.PatternFile != "" { if _, err := os.Stat(opts.PatternFile); os.IsNotExist(err) { return opts, fmt.Errorf("pattern file %q does not exist: %w", opts.PatternFile, err) diff --git a/gobusterdir/gobusterdir.go b/gobusterdir/gobusterdir.go index 4f1d8f37..431e39b3 100644 --- a/gobusterdir/gobusterdir.go +++ b/gobusterdir/gobusterdir.go @@ -277,6 +277,11 @@ func (d *GobusterDir) ProcessWord(ctx context.Context, word string, progress *li } return nil, err } + if statusCode == http.StatusTooManyRequests && d.globalopts.StopOnRateLimit { + fmt.Println("Rate limit reached, exiting...") + os.Exit(0) + + } break } diff --git a/gobusterfuzz/gobusterfuzz.go b/gobusterfuzz/gobusterfuzz.go index a5cb028f..19de03c0 100644 --- a/gobusterfuzz/gobusterfuzz.go +++ b/gobusterfuzz/gobusterfuzz.go @@ -182,6 +182,10 @@ func (d *GobusterFuzz) ProcessWord(ctx context.Context, word string, progress *l return nil, err } } + if statusCode == http.StatusTooManyRequests && d.globalopts.StopOnRateLimit { + fmt.Println("Rate limit reached, exiting...") + os.Exit(0) + } break } diff --git a/gobustervhost/gobustervhost.go b/gobustervhost/gobustervhost.go index f2bae76d..3a8f8d39 100644 --- a/gobustervhost/gobustervhost.go +++ b/gobustervhost/gobustervhost.go @@ -194,6 +194,10 @@ func (v *GobusterVhost) ProcessWord(ctx context.Context, word string, progress * return nil, err } } + if statusCode == http.StatusTooManyRequests && v.globalopts.StopOnRateLimit { + fmt.Println("Rate limit reached, exiting...") + os.Exit(0) + } break } diff --git a/libgobuster/options.go b/libgobuster/options.go index 3054aebf..6df1b668 100644 --- a/libgobuster/options.go +++ b/libgobuster/options.go @@ -19,4 +19,5 @@ type Options struct { NoError bool Quiet bool Delay time.Duration + StopOnRateLimit bool }