From 6e222dcdadff50e749725a71e579a917ad26a34f Mon Sep 17 00:00:00 2001 From: Knaps Date: Sun, 25 Sep 2016 19:32:18 +1000 Subject: [PATCH 1/9] Added ability to save results to a file (-o option). Also added ability to print CNAME records for identified subdomains - useful for finding subdomains that could be used in subdomain hijacking attacks (-C option). --- main.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 56ef1b6b..e4152b14 100644 --- a/main.go +++ b/main.go @@ -77,6 +77,7 @@ type State struct { Quiet bool Setup SetupFunc ShowIPs bool + ShowCNAME bool StatusCodes IntSet Threads int Url string @@ -85,6 +86,8 @@ type State struct { Username string Verbose bool Wordlist string + OutputFileName string + OutputFile *os.File IsWildcard bool WildcardForced bool WildcardIps StringSet @@ -239,6 +242,7 @@ func ParseCmdLine() *State { flag.StringVar(&s.Mode, "m", "dir", "Directory/File mode (dir) or DNS mode (dns)") flag.StringVar(&s.Wordlist, "w", "", "Path to the wordlist") flag.StringVar(&codes, "s", "200,204,301,302,307", "Positive status codes (dir mode only)") + flag.StringVar(&s.OutputFileName, "o", "", "Output file to write results to (defaults to stdout)") flag.StringVar(&s.Url, "u", "", "The target URL or Domain") flag.StringVar(&s.Cookies, "c", "", "Cookies to use for the requests (dir mode only)") flag.StringVar(&s.Username, "U", "", "Username for Basic Auth (dir mode only)") @@ -248,6 +252,7 @@ func ParseCmdLine() *State { flag.StringVar(&proxy, "p", "", "Proxy to use for requests [http(s)://host:port] (dir mode only)") flag.BoolVar(&s.Verbose, "v", false, "Verbose output (errors)") flag.BoolVar(&s.ShowIPs, "i", false, "Show IP addresses (dns mode only)") + flag.BoolVar(&s.ShowCNAME, "C", false, "Show CNAME records (dns mode only, cannot be used with '-i' option)") flag.BoolVar(&s.FollowRedirect, "r", false, "Follow redirects") flag.BoolVar(&s.Quiet, "q", false, "Don't print the banner and other noise") flag.BoolVar(&s.Expanded, "e", false, "Expanded mode, print full URLs") @@ -466,6 +471,17 @@ func Process(s *State) { scanner = bufio.NewScanner(wordlist) } + var outputFile *os.File + if s.OutputFileName != "" { + outputFile, err := os.Create(s.OutputFileName) + if err != nil { + fmt.Printf("[!] Unable to write to %s, falling back to stdout.\n", s.OutputFileName) + s.OutputFileName = "" + } else { + s.OutputFile = outputFile + } + } + for scanner.Scan() { if s.Terminate { break @@ -482,6 +498,9 @@ func Process(s *State) { processorGroup.Wait() close(resultChan) printerGroup.Wait() + if s.OutputFileName != "" { + outputFile.Close() + } Ruler(s) } @@ -526,6 +545,11 @@ func ProcessDnsEntry(s *State, word string, resultChan chan<- Result) { } if s.ShowIPs { result.Extra = strings.Join(ips, ", ") + } else if s.ShowCNAME { + cname, err := net.LookupCNAME(subdomain) + if err == nil { + result.Extra = cname + } } resultChan <- result } @@ -570,12 +594,20 @@ func ProcessDirEntry(s *State, word string, resultChan chan<- Result) { } func PrintDnsResult(s *State, r *Result) { + output := "" if r.Status == 404 { - fmt.Printf("Missing: %s\n", r.Entity) + output += fmt.Sprintf("Missing: %s\n", r.Entity) } else if s.ShowIPs { - fmt.Printf("Found: %s [%s]\n", r.Entity, r.Extra) + output += fmt.Sprintf("Found: %s [%s]\n", r.Entity, r.Extra) + } else if s.ShowCNAME { + output += fmt.Sprintf("Found: %s [%s]\n", r.Entity, r.Extra) } else { - fmt.Printf("Found: %s\n", r.Entity) + output += fmt.Sprintf("Found: %s\n", r.Entity) + } + fmt.Printf(output) + + if s.OutputFileName != "" { + WriteToFile(output, s) } } @@ -606,8 +638,19 @@ func PrintDirResult(s *State, r *Result) { if r.Size != nil { output += fmt.Sprintf(" [Size: %d]", *r.Size) } + output += "\n" + + fmt.Printf(output) + if s.OutputFileName != "" { + WriteToFile(output, s) + } + } +} - fmt.Println(output) +func WriteToFile(output string, s *State) { + _, err := s.OutputFile.WriteString(output) + if err != nil { + panic("[!] Unable to write to file " + s.OutputFileName) } } @@ -680,6 +723,10 @@ func ShowConfig(state *State) { } fmt.Printf("[+] Wordlist : %s\n", wordlist) + if state.OutputFileName != "" { + fmt.Printf("[+] Output file : %s\n", state.OutputFileName) + } + if state.Mode == "dir" { fmt.Printf("[+] Status codes : %s\n", state.StatusCodes.Stringify()) From e92eb98133f30b4dd7392a0a01fac64806572114 Mon Sep 17 00:00:00 2001 From: Sebastian Gehaxelt Date: Fri, 30 Sep 2016 10:59:07 +0200 Subject: [PATCH 2/9] Implemented wildcard dir detection using the uuid approach as discussed in #26 --- main.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 56ef1b6b..67caccde 100644 --- a/main.go +++ b/main.go @@ -254,7 +254,7 @@ func ParseCmdLine() *State { flag.BoolVar(&s.NoStatus, "n", false, "Don't print status codes") flag.BoolVar(&s.IncludeLength, "l", false, "Include the length of the body in the output (dir mode only)") flag.BoolVar(&s.UseSlash, "f", false, "Append a forward-slash to each directory request (dir mode only)") - flag.BoolVar(&s.WildcardForced, "fw", false, "Force continued operation when wildcard found (dns mode only)") + flag.BoolVar(&s.WildcardForced, "fw", false, "Force continued operation when wildcard found") flag.Parse() @@ -512,6 +512,18 @@ func SetupDns(s *State) bool { } func SetupDir(s *State) bool { + guid := uuid.NewV4() + wildcardResp, _ := GoGet(s, s.Url, fmt.Sprintf("%s", guid), s.Cookies) + + if s.StatusCodes.Contains(*wildcardResp) { + s.IsWildcard = true + fmt.Println("[-] Wildcard response found:",fmt.Sprintf("%s%s", s.Url, guid), "=>", *wildcardResp) + if !s.WildcardForced { + fmt.Println("[-] To force processing of Wildcard responses, specify the '-fw' switch.") + } + return s.WildcardForced + } + return true } From db4d7ff94c25b8808b2ea22b453bf2460b792ac9 Mon Sep 17 00:00:00 2001 From: Robin Verton Date: Wed, 19 Oct 2016 09:48:45 +0200 Subject: [PATCH 3/9] Add cli flag to skip ssl verification --- README.md | 1 + main.go | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7257a7cb..c3907334 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Yes, you're probably correct. Feel free to: * `-x ` - list of extensions to check for, if any. * `-P ` - HTTP Authorization password (Basic Auth only, prompted if missing). * `-U ` - HTTP Authorization username (Basic Auth only). +* `-is` - Skip verification of SSL certificates. ### Building diff --git a/main.go b/main.go index 56ef1b6b..d56984d4 100644 --- a/main.go +++ b/main.go @@ -91,6 +91,7 @@ type State struct { SignalChan chan os.Signal Terminate bool StdIn bool + InsecureSSL bool } type RedirectHandler struct { @@ -187,6 +188,11 @@ func MakeRequest(s *State, fullUrl, cookie string) (*int, *int64) { if err != nil { if ue, ok := err.(*url.Error); ok { + + if strings.HasPrefix(ue.Err.Error(), "x509") { + fmt.Println("[-] Invalid certificate") + } + if re, ok := ue.Err.(*RedirectError); ok { return &re.StatusCode, nil } @@ -255,6 +261,7 @@ func ParseCmdLine() *State { flag.BoolVar(&s.IncludeLength, "l", false, "Include the length of the body in the output (dir mode only)") flag.BoolVar(&s.UseSlash, "f", false, "Append a forward-slash to each directory request (dir mode only)") flag.BoolVar(&s.WildcardForced, "fw", false, "Force continued operation when wildcard found (dns mode only)") + flag.BoolVar(&s.InsecureSSL, "is", false, "Skip SSL certificate verification") flag.Parse() @@ -372,7 +379,7 @@ func ParseCmdLine() *State { Transport: &http.Transport{ Proxy: proxyUrlFunc, TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, + InsecureSkipVerify: s.InsecureSSL, }, }, }} From 9dbedd489b16935c710cbdaf67fcb5157d46bb5e Mon Sep 17 00:00:00 2001 From: OJ Date: Fri, 27 Jan 2017 12:34:44 +1000 Subject: [PATCH 4/9] Add smarter scheme defaults --- main.go | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 56ef1b6b..13efdc21 100644 --- a/main.go +++ b/main.go @@ -29,6 +29,7 @@ import ( "net/url" "os" "os/signal" + "regexp" "strconv" "strings" "sync" @@ -310,7 +311,24 @@ func ParseCmdLine() *State { } if strings.HasPrefix(s.Url, "http") == false { - s.Url = "http://" + s.Url + // check to see if a port was specified + re := regexp.MustCompile(`^[^/]+:(\d+)`) + match := re.FindStringSubmatch(s.Url) + + if len(match) < 2 { + // no port, default to http on 80 + s.Url = "http://" + s.Url + } else { + port, err := strconv.Atoi(match[1]) + if err != nil || (port != 80 && port != 443) { + fmt.Println("[!] Url/Domain (-u): Scheme not specified.") + valid = false + } else if port == 80 { + s.Url = "http://" + s.Url + } else { + s.Url = "https://" + s.Url + } + } } // extensions are comma separated From 50a14eb75e2f95faec7e0cf7eb03e70aa59d6ddf Mon Sep 17 00:00:00 2001 From: root Date: Wed, 1 Mar 2017 18:57:41 +1100 Subject: [PATCH 5/9] Fixed format string vuln Renamed CNAME flag Improved checks for output file existence --- main.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index e4152b14..0acff392 100644 --- a/main.go +++ b/main.go @@ -252,7 +252,7 @@ func ParseCmdLine() *State { flag.StringVar(&proxy, "p", "", "Proxy to use for requests [http(s)://host:port] (dir mode only)") flag.BoolVar(&s.Verbose, "v", false, "Verbose output (errors)") flag.BoolVar(&s.ShowIPs, "i", false, "Show IP addresses (dns mode only)") - flag.BoolVar(&s.ShowCNAME, "C", false, "Show CNAME records (dns mode only, cannot be used with '-i' option)") + flag.BoolVar(&s.ShowCNAME, "cn", false, "Show CNAME records (dns mode only, cannot be used with '-i' option)") flag.BoolVar(&s.FollowRedirect, "r", false, "Follow redirects") flag.BoolVar(&s.Quiet, "q", false, "Don't print the banner and other noise") flag.BoolVar(&s.Expanded, "e", false, "Expanded mode, print full URLs") @@ -477,6 +477,7 @@ func Process(s *State) { if err != nil { fmt.Printf("[!] Unable to write to %s, falling back to stdout.\n", s.OutputFileName) s.OutputFileName = "" + s.OutputFile = nil } else { s.OutputFile = outputFile } @@ -498,7 +499,7 @@ func Process(s *State) { processorGroup.Wait() close(resultChan) printerGroup.Wait() - if s.OutputFileName != "" { + if s.OutputFile != nil { outputFile.Close() } Ruler(s) @@ -604,9 +605,9 @@ func PrintDnsResult(s *State, r *Result) { } else { output += fmt.Sprintf("Found: %s\n", r.Entity) } - fmt.Printf(output) + fmt.Printf("%s", output) - if s.OutputFileName != "" { + if s.OutputFile != nil { WriteToFile(output, s) } } @@ -641,7 +642,7 @@ func PrintDirResult(s *State, r *Result) { output += "\n" fmt.Printf(output) - if s.OutputFileName != "" { + if s.OutputFile != nil { WriteToFile(output, s) } } From af303c577886ea801e673260b9a3c7c932a2b61c Mon Sep 17 00:00:00 2001 From: root Date: Wed, 1 Mar 2017 19:03:55 +1100 Subject: [PATCH 6/9] Fixed format string vuln Renamed CNAME flag Improved checks for output file existence --- main.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index e4152b14..0acff392 100644 --- a/main.go +++ b/main.go @@ -252,7 +252,7 @@ func ParseCmdLine() *State { flag.StringVar(&proxy, "p", "", "Proxy to use for requests [http(s)://host:port] (dir mode only)") flag.BoolVar(&s.Verbose, "v", false, "Verbose output (errors)") flag.BoolVar(&s.ShowIPs, "i", false, "Show IP addresses (dns mode only)") - flag.BoolVar(&s.ShowCNAME, "C", false, "Show CNAME records (dns mode only, cannot be used with '-i' option)") + flag.BoolVar(&s.ShowCNAME, "cn", false, "Show CNAME records (dns mode only, cannot be used with '-i' option)") flag.BoolVar(&s.FollowRedirect, "r", false, "Follow redirects") flag.BoolVar(&s.Quiet, "q", false, "Don't print the banner and other noise") flag.BoolVar(&s.Expanded, "e", false, "Expanded mode, print full URLs") @@ -477,6 +477,7 @@ func Process(s *State) { if err != nil { fmt.Printf("[!] Unable to write to %s, falling back to stdout.\n", s.OutputFileName) s.OutputFileName = "" + s.OutputFile = nil } else { s.OutputFile = outputFile } @@ -498,7 +499,7 @@ func Process(s *State) { processorGroup.Wait() close(resultChan) printerGroup.Wait() - if s.OutputFileName != "" { + if s.OutputFile != nil { outputFile.Close() } Ruler(s) @@ -604,9 +605,9 @@ func PrintDnsResult(s *State, r *Result) { } else { output += fmt.Sprintf("Found: %s\n", r.Entity) } - fmt.Printf(output) + fmt.Printf("%s", output) - if s.OutputFileName != "" { + if s.OutputFile != nil { WriteToFile(output, s) } } @@ -641,7 +642,7 @@ func PrintDirResult(s *State, r *Result) { output += "\n" fmt.Printf(output) - if s.OutputFileName != "" { + if s.OutputFile != nil { WriteToFile(output, s) } } From a6f4d772a497f4655490a1a73c636ca1977822b7 Mon Sep 17 00:00:00 2001 From: OJ Date: Wed, 1 Mar 2017 18:32:03 +1000 Subject: [PATCH 7/9] Change 'is' to 'k' to match curl --- README.md | 2 +- main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c3907334..3ef1e080 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ Yes, you're probably correct. Feel free to: * `-c ` - use this to specify any cookies that you might need (simulating auth). * `-e` - specify extended mode that renders the full URL. * `-f` - append `/` for directory brute forces. +* `-k` - Skip verification of SSL certificates. * `-l` - show the length of the response. * `-n` - "no status" mode, disables the output of the result's status code. * `-p ` - specify a proxy to use for all requests (scheme much match the URL scheme) @@ -55,7 +56,6 @@ Yes, you're probably correct. Feel free to: * `-x ` - list of extensions to check for, if any. * `-P ` - HTTP Authorization password (Basic Auth only, prompted if missing). * `-U ` - HTTP Authorization username (Basic Auth only). -* `-is` - Skip verification of SSL certificates. ### Building diff --git a/main.go b/main.go index 4f755b7f..35b390c8 100644 --- a/main.go +++ b/main.go @@ -262,7 +262,7 @@ func ParseCmdLine() *State { flag.BoolVar(&s.IncludeLength, "l", false, "Include the length of the body in the output (dir mode only)") flag.BoolVar(&s.UseSlash, "f", false, "Append a forward-slash to each directory request (dir mode only)") flag.BoolVar(&s.WildcardForced, "fw", false, "Force continued operation when wildcard found (dns mode only)") - flag.BoolVar(&s.InsecureSSL, "is", false, "Skip SSL certificate verification") + flag.BoolVar(&s.InsecureSSL, "k", false, "Skip SSL certificate verification") flag.Parse() From 4ea33f8eb703a25516aef772cba4e158fbecec5b Mon Sep 17 00:00:00 2001 From: OJ Date: Wed, 1 Mar 2017 18:43:55 +1000 Subject: [PATCH 8/9] Subtle tweaks to the output generation --- README.md | 6 ++++-- main.go | 13 +++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 83ab795d..cc11a5ec 100644 --- a/README.md +++ b/README.md @@ -39,18 +39,20 @@ Yes, you're probably correct. Feel free to: ### Command line options for `dns` mode +* `-cn` - show CNAME records (cannot be used with '-i' option). * `-i` - show all IP addresses for the result. ### Command line options for `dir` mode -* `-a ` - specify a user agent string to send in the request header +* `-a ` - specify a user agent string to send in the request header. * `-c ` - use this to specify any cookies that you might need (simulating auth). * `-e` - specify extended mode that renders the full URL. * `-f` - append `/` for directory brute forces. * `-k` - Skip verification of SSL certificates. * `-l` - show the length of the response. * `-n` - "no status" mode, disables the output of the result's status code. -* `-p ` - specify a proxy to use for all requests (scheme much match the URL scheme) +* `-o ` - specify a file name to write the output to. +* `-p ` - specify a proxy to use for all requests (scheme much match the URL scheme). * `-r` - follow redirects. * `-s ` - comma-separated set of the list of status codes to be deemed a "positive" (default: `200,204,301,302,307`). * `-x ` - list of extensions to check for, if any. diff --git a/main.go b/main.go index 8a10b932..bb5dd481 100644 --- a/main.go +++ b/main.go @@ -634,13 +634,13 @@ func ProcessDirEntry(s *State, word string, resultChan chan<- Result) { func PrintDnsResult(s *State, r *Result) { output := "" if r.Status == 404 { - output += fmt.Sprintf("Missing: %s\n", r.Entity) + output = fmt.Sprintf("Missing: %s\n", r.Entity) } else if s.ShowIPs { - output += fmt.Sprintf("Found: %s [%s]\n", r.Entity, r.Extra) + output = fmt.Sprintf("Found: %s [%s]\n", r.Entity, r.Extra) } else if s.ShowCNAME { - output += fmt.Sprintf("Found: %s [%s]\n", r.Entity, r.Extra) + output = fmt.Sprintf("Found: %s [%s]\n", r.Entity, r.Extra) } else { - output += fmt.Sprintf("Found: %s\n", r.Entity) + output = fmt.Sprintf("Found: %s\n", r.Entity) } fmt.Printf("%s", output) @@ -655,9 +655,9 @@ func PrintDirResult(s *State, r *Result) { // Prefix if we're in verbose mode if s.Verbose { if s.StatusCodes.Contains(r.Status) { - output += "Found : " + output = "Found : " } else { - output += "Missed: " + output = "Missed: " } } @@ -679,6 +679,7 @@ func PrintDirResult(s *State, r *Result) { output += "\n" fmt.Printf(output) + if s.OutputFile != nil { WriteToFile(output, s) } From 2c3a57c1d4857a2187efc66a6dee718d2d07f8ff Mon Sep 17 00:00:00 2001 From: OJ Date: Wed, 1 Mar 2017 18:47:03 +1000 Subject: [PATCH 9/9] Fix version in code and readme, update THANKS --- README.md | 20 ++++++++++---------- THANKS | 3 +++ main.go | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index cc11a5ec..205cd347 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Gobuster v1.2 (OJ Reeves @TheColonial) +Gobuster v1.3 (OJ Reeves @TheColonial) ====================================== Gobuster is a tool used to brute-force: @@ -97,7 +97,7 @@ Default options looks like this: ``` $ gobuster -u http://buffered.io/ -w words.txt -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dir [+] Url/Domain : http://buffered.io/ @@ -114,7 +114,7 @@ Default options with status codes disabled looks like this: ``` $ gobuster -u http://buffered.io/ -w words.txt -n -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dir [+] Url/Domain : http://buffered.io/ @@ -132,7 +132,7 @@ Verbose output looks like this: ``` $ gobuster -u http://buffered.io/ -w words.txt -v -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dir [+] Url/Domain : http://buffered.io/ @@ -151,7 +151,7 @@ Example showing content length: ``` $ gobuster -u http://buffered.io/ -w words.txt -l -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dir [+] Url/Domain : http://buffered.io/ @@ -183,7 +183,7 @@ Normal sample run goes like this: ``` $ gobuster -m dns -w subdomains.txt -u google.com -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dns [+] Url/Domain : google.com @@ -214,7 +214,7 @@ Show IP sample run goes like this: ``` $ gobuster -m dns -w subdomains.txt -u google.com -i -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dns [+] Url/Domain : google.com @@ -246,7 +246,7 @@ Base domain validation warning when the base domain fails to resolve. This is a ``` $ gobuster -m dns -w subdomains.txt -u yp.to -i -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dns [+] Url/Domain : yp.to @@ -261,7 +261,7 @@ Wildcard DNS is also detected properly: ``` $ gobuster -w subdomainsbig.txt -u doesntexist.com -m dns -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dns [+] Url/Domain : doesntexist.com @@ -276,7 +276,7 @@ If the user wants to force processing of a domain that has wildcard entries, use ``` $ gobuster -w subdomainsbig.txt -u doesntexist.com -m dns -fw -Gobuster v1.2 OJ Reeves (@TheColonial) +Gobuster v1.3 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dns [+] Url/Domain : doesntexist.com diff --git a/THANKS b/THANKS index 14b76d9f..44b99a1d 100644 --- a/THANKS +++ b/THANKS @@ -1,8 +1,11 @@ @0x42424242 - initial DNS support @averagesecurityguy - quiet mode support @g0tmi1k - content length, wordlist and command line parsing fixes +@gehaxelt - DIR mode UUID wildcard detection @justinsteven - HTTP basic auth support @kevinnz - custom user agent support +@knapsy - saving output to file, and CNAME resolution for DNS mode +@rverton - CLI flag to skip SSL verification @viaMorgoth - base domain validation for DNS mode @UID1K - initial DNS wildcard check support @Ne0nd0g - STDIN support for wordlists diff --git a/main.go b/main.go index bb5dd481..6032ad5c 100644 --- a/main.go +++ b/main.go @@ -742,7 +742,7 @@ func Banner(state *State) { } fmt.Println("") - fmt.Println("Gobuster v1.2 OJ Reeves (@TheColonial)") + fmt.Println("Gobuster v1.3 OJ Reeves (@TheColonial)") Ruler(state) }