From be57e620f01aec131b9282efdb2a5fc1c87d7582 Mon Sep 17 00:00:00 2001 From: cortantief Date: Mon, 20 Sep 2021 07:00:39 +0200 Subject: [PATCH 01/91] Correcting error when extensions are used with word that start with two slashes The cause of that error was the fact that the check was made inside a chain of if-else-if conditions, since the extension are tested before the slashes resulting to not check correctly the word. --- src/url.rs | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/url.rs b/src/url.rs index d771fb6..b21ae2b 100644 --- a/src/url.rs +++ b/src/url.rs @@ -98,12 +98,17 @@ impl FeroxUrl { }; // extensions and slashes are mutually exclusive cases - let word = if extension.is_some() { + let mut word = if extension.is_some() { format!("{}.{}", word, extension.unwrap()) } else if self.handles.config.add_slash && !word.ends_with('/') { // -f used, and word doesn't already end with a / format!("{}/", word) - } else if word.starts_with("//") { + } else { + String::from(word) + }; + + // We check seperatly if wordlist contains words that begin with 2 forward slashes + if word.starts_with("//") { // bug ID'd by @Sicks3c, when a wordlist contains words that begin with 2 forward slashes // i.e. //1_40_0/static/js, it gets joined onto the base url in a surprising way // ex: https://localhost/ + //1_40_0/static/js -> https://1_40_0/static/js @@ -111,11 +116,8 @@ impl FeroxUrl { // and simply removes prefixed forward slashes if there are two of them. Additionally, // trim_start_matches will trim the pattern until it's gone, so even if there are more than // 2 /'s, they'll still be trimmed - word.trim_start_matches('/').to_string() - } else { - String::from(word) + word = word.trim_start_matches('/').to_string(); }; - let base_url = Url::parse(&url)?; let joined = base_url.join(&word)?; @@ -451,6 +453,20 @@ mod tests { ); } + #[test] + /// word with two prepended slashes and extensions doesn't discard the entire domain + fn format_url_word_with_two_prepended_slashes_and_extensions(){ + let handles = Arc::new(Handles::for_testing(None, None).0); + let url = FeroxUrl::from_string("http://localhost", handles); + for ext in ["rocks", "fun"] { + let to_check = format!("http://localhost/upload/ferox.{}", ext); + assert_eq!( + url.format("//upload/ferox", Some(ext)).unwrap(), + reqwest::Url::parse(&to_check[..]).unwrap() + ); + } + } + #[test] /// word that is a fully formed url, should return an error fn format_url_word_that_is_a_url() { From c89453c5c3903dd7d7e8538fdba97da43e05e4ce Mon Sep 17 00:00:00 2001 From: cortantief Date: Mon, 20 Sep 2021 10:00:48 +0200 Subject: [PATCH 02/91] Adding support for slash and extensions at the same time. Support for the extensions and slash where added by using a special condition inside the format function allowing us to treat slash as an extension with a particular format. We had to modify other place to propagate the changes like in make_wildcard_request for example. Ofcourse we had to delete the limitation inside the arg parser. A test was added to ensure the validity of the implementation. --- src/heuristics.rs | 8 +++++++- src/parser.rs | 1 - src/url.rs | 43 +++++++++++++++++++++++++++++++++---------- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/heuristics.rs b/src/heuristics.rs index 026e699..900a197 100644 --- a/src/heuristics.rs +++ b/src/heuristics.rs @@ -156,7 +156,13 @@ impl HeuristicTests { log::trace!("enter: make_wildcard_request({}, {})", target, length); let unique_str = self.unique_string(length); - let nonexistent_url = target.format(&unique_str, None)?; + // To take care of slash when needed + let slash = if self.handles.config.add_slash { + Some("/") + } else { + None + }; + let nonexistent_url = target.format(&unique_str, slash)?; let response = logged_request(&nonexistent_url.to_owned(), self.handles.clone()).await?; diff --git a/src/parser.rs b/src/parser.rs index d241a73..4663701 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -265,7 +265,6 @@ pub fn initialize() -> App<'static, 'static> { .short("f") .long("add-slash") .takes_value(false) - .conflicts_with("extensions") .help("Append / to each request") ) .arg( diff --git a/src/url.rs b/src/url.rs index b21ae2b..9a5f38b 100644 --- a/src/url.rs +++ b/src/url.rs @@ -41,8 +41,12 @@ impl FeroxUrl { log::trace!("enter: formatted_urls({})", word); let mut urls = vec![]; - - match self.format(word, None) { + let slash = if self.handles.config.add_slash { + Some("/") + } else { + None + }; + match self.format(word, slash) { // default request, i.e. no extension Ok(url) => urls.push(url), Err(_) => self.handles.stats.send(AddError(UrlFormat))?, @@ -55,7 +59,6 @@ impl FeroxUrl { Err(_) => self.handles.stats.send(AddError(UrlFormat))?, } } - log::trace!("exit: formatted_urls -> {:?}", urls); Ok(urls) } @@ -97,13 +100,17 @@ impl FeroxUrl { self.target.to_string() }; - // extensions and slashes are mutually exclusive cases + // extensions and slashes are now not mutually exclusive cases let mut word = if extension.is_some() { - format!("{}.{}", word, extension.unwrap()) - } else if self.handles.config.add_slash && !word.ends_with('/') { - // -f used, and word doesn't already end with a / - format!("{}/", word) - } else { + // We handle the special case of forward slash + // That allow us to treat it as an extension with a particular format + let ext = extension.unwrap(); + if ext == "/" { + format!("{}/", word) + } else { + format!("{}.{}", word, ext) + } + } else { String::from(word) }; @@ -455,7 +462,7 @@ mod tests { #[test] /// word with two prepended slashes and extensions doesn't discard the entire domain - fn format_url_word_with_two_prepended_slashes_and_extensions(){ + fn format_url_word_with_two_prepended_slashes_and_extensions() { let handles = Arc::new(Handles::for_testing(None, None).0); let url = FeroxUrl::from_string("http://localhost", handles); for ext in ["rocks", "fun"] { @@ -476,4 +483,20 @@ mod tests { assert!(formatted.is_err()); } + #[test] + /// word with extension AND slash are correctly handled + fn format_url_word_with_postslash_and_extensions() { + let config = Configuration { + add_slash: true, + extensions: vec!["rocks".to_string(), "fun".to_string()], + ..Default::default() + }; + let handles = Arc::new(Handles::for_testing(None, Some(Arc::new(config))).0); + let url = FeroxUrl::from_string("http://localhost", handles); + match url.formatted_urls("ferox") { + Ok(urls) => assert_eq!(urls.len(), 3), // 3 = One for the main word + slash and for the two extensions + Err(err) => panic!("{}", err.to_string()), + } + + } } From 9a3754a31d7a8ebe6078a0439c5a91311a8d126c Mon Sep 17 00:00:00 2001 From: cortantief Date: Mon, 20 Sep 2021 10:56:19 +0200 Subject: [PATCH 03/91] Cargo fmt formating --- src/heuristics.rs | 2 +- src/url.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/heuristics.rs b/src/heuristics.rs index 900a197..6004e17 100644 --- a/src/heuristics.rs +++ b/src/heuristics.rs @@ -162,7 +162,7 @@ impl HeuristicTests { } else { None }; - let nonexistent_url = target.format(&unique_str, slash)?; + let nonexistent_url = target.format(&unique_str, slash)?; let response = logged_request(&nonexistent_url.to_owned(), self.handles.clone()).await?; diff --git a/src/url.rs b/src/url.rs index 9a5f38b..16a3ae9 100644 --- a/src/url.rs +++ b/src/url.rs @@ -497,6 +497,5 @@ mod tests { Ok(urls) => assert_eq!(urls.len(), 3), // 3 = One for the main word + slash and for the two extensions Err(err) => panic!("{}", err.to_string()), } - } } From d4a69fa2ecce6dbe691fe05dff3c6b1a83b95b5a Mon Sep 17 00:00:00 2001 From: cortantief Date: Mon, 20 Sep 2021 10:58:53 +0200 Subject: [PATCH 04/91] clippy plus cargo fmt --- src/url.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/url.rs b/src/url.rs index 16a3ae9..87919d3 100644 --- a/src/url.rs +++ b/src/url.rs @@ -101,10 +101,9 @@ impl FeroxUrl { }; // extensions and slashes are now not mutually exclusive cases - let mut word = if extension.is_some() { + let mut word = if let Some(ext) = extension { // We handle the special case of forward slash // That allow us to treat it as an extension with a particular format - let ext = extension.unwrap(); if ext == "/" { format!("{}/", word) } else { From 0b75e1a548350c955c241e87f3ae736a7c55c452 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Sun, 19 Sep 2021 18:18:18 -0500 Subject: [PATCH 05/91] Implement random user agent flag --- ferox-config.toml.example | 1 + src/banner/container.rs | 12 +++++++++++- src/config/container.rs | 11 +++++++++++ src/config/tests.rs | 7 +++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/ferox-config.toml.example b/ferox-config.toml.example index cf8396d..c14ecf7 100644 --- a/ferox-config.toml.example +++ b/ferox-config.toml.example @@ -27,6 +27,7 @@ # output = "/targets/ellingson_mineral_company/gibson.txt" # debug_log = "/var/log/find-the-derp.log" # user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0" +# random_agent = false # redirects = true # insecure = true # extensions = ["php", "html"] diff --git a/src/banner/container.rs b/src/banner/container.rs index c01f426..92d35cf 100644 --- a/src/banner/container.rs +++ b/src/banner/container.rs @@ -50,6 +50,9 @@ pub struct Banner { /// represents Configuration.user_agent user_agent: BannerEntry, + /// represents Configuration.random_agent + random_agent: BannerEntry, + /// represents Configuration.config config: BannerEntry, @@ -276,6 +279,7 @@ impl Banner { let wordlist = BannerEntry::new("📖", "Wordlist", &config.wordlist); let timeout = BannerEntry::new("💥", "Timeout (secs)", &config.timeout.to_string()); let user_agent = BannerEntry::new("🦡", "User-Agent", &config.user_agent); + let random_agent = BannerEntry::new("🦡", "User-Agent", "(Random)"); let extract_links = BannerEntry::new("🔎", "Extract Links", &config.extract_links.to_string()); let json = BannerEntry::new("🧔", "JSON Output", &config.json.to_string()); @@ -304,6 +308,7 @@ impl Banner { filter_status, timeout, user_agent, + random_agent, auto_bail, auto_tune, proxy, @@ -437,7 +442,12 @@ by Ben "epi" Risher {} ver: {}"#, } writeln!(&mut writer, "{}", self.timeout)?; - writeln!(&mut writer, "{}", self.user_agent)?; + + if config.random_agent { + writeln!(&mut writer, "{}", self.random_agent)?; + } else { + writeln!(&mut writer, "{}", self.user_agent)?; + } // followed by the maybe printed or variably displayed values if !config.config.is_empty() { diff --git a/src/config/container.rs b/src/config/container.rs index 014772a..df2bb76 100644 --- a/src/config/container.rs +++ b/src/config/container.rs @@ -154,6 +154,10 @@ pub struct Configuration { #[serde(default = "user_agent")] pub user_agent: String, + /// Use random User-Agent + #[serde(default)] + pub random_agent: bool, + /// Follow redirects #[serde(default)] pub redirects: bool, @@ -295,6 +299,7 @@ impl Default for Configuration { redirects: false, no_recursion: false, extract_links: false, + random_agent: false, save_state: true, proxy: String::new(), config: String::new(), @@ -344,6 +349,7 @@ impl Configuration { /// - **auto_bail**: `false` /// - **save_state**: `true` /// - **user_agent**: `feroxbuster/VERSION` + /// - **random_agent**: `false` /// - **insecure**: `false` (don't be insecure, i.e. don't allow invalid certs) /// - **extensions**: `None` /// - **url_denylist**: `None` @@ -647,6 +653,10 @@ impl Configuration { update_config_if_present!(&mut config.user_agent, args, "user_agent", String); update_config_if_present!(&mut config.timeout, args, "timeout", u64); + if args.is_present("random_agent") { + config.random_agent = true; + } + if args.is_present("redirects") { config.redirects = true; } @@ -824,6 +834,7 @@ impl Configuration { update_if_not_default!(&mut conf.timeout, new.timeout, timeout()); update_if_not_default!(&mut conf.user_agent, new.user_agent, user_agent()); + update_if_not_default!(&mut conf.random_agent, new.random_agent, false); update_if_not_default!(&mut conf.threads, new.threads, threads()); update_if_not_default!(&mut conf.depth, new.depth, depth()); update_if_not_default!(&mut conf.wordlist, new.wordlist, wordlist()); diff --git a/src/config/tests.rs b/src/config/tests.rs index daeaddb..7896acc 100644 --- a/src/config/tests.rs +++ b/src/config/tests.rs @@ -81,6 +81,7 @@ fn default_configuration() { assert!(!config.auto_bail); assert_eq!(config.requester_policy, RequesterPolicy::Default); assert!(!config.no_recursion); + assert!(!config.random_agent); assert!(!config.json); assert!(config.save_state); assert!(!config.stdin); @@ -383,6 +384,12 @@ fn config_reads_queries() { assert_eq!(config.queries, queries); } +#[test] +fn config_default_not_random_agent() { + let config = setup_config_test(); + assert!(!config.random_agent); +} + #[test] #[should_panic] /// test that an error message is printed and panic is called when report_and_exit is called From 83ba49a48674062cfabde0961febe16c00e44184 Mon Sep 17 00:00:00 2001 From: epi Date: Tue, 21 Sep 2021 20:49:31 -0500 Subject: [PATCH 06/91] added test for formatted_urls when both extension and slash are set --- src/url.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/url.rs b/src/url.rs index 87919d3..9140b5b 100644 --- a/src/url.rs +++ b/src/url.rs @@ -251,6 +251,29 @@ mod tests { assert_eq!(urls, [Url::parse("http://localhost/turbo").unwrap()]) } + #[test] + /// sending url + word with both an extension and add-slash should get back + /// two urls, one with '/' appended to the word, and the other with the extension + /// appended + fn formatted_urls_extensions_with_add_slash_returns_two_urls_with_extensions() { + let config = Configuration { + extensions: vec![String::from("js")], + add_slash: true, + ..Default::default() + }; + + let handles = Arc::new(Handles::for_testing(None, Some(Arc::new(config))).0); + let url = FeroxUrl::from_string("http://localhost", handles); + let urls = url.formatted_urls("turbo").unwrap(); + assert_eq!( + urls, + [ + Url::parse("http://localhost/turbo/").unwrap(), + Url::parse("http://localhost/turbo.js").unwrap() + ] + ) + } + #[test] /// sending url + word + 1 extension should get back two urls, one base and one with extension fn formatted_urls_one_extension_returns_two_urls() { From d36379ba1bafff25e12bff2c6293f83bb6bc50ff Mon Sep 17 00:00:00 2001 From: epi Date: Wed, 22 Sep 2021 07:28:57 -0500 Subject: [PATCH 07/91] nitpickery stuff; removed the test i added cuz it's a duplicate --- src/heuristics.rs | 2 ++ src/url.rs | 54 +++++++++++++++++++++++------------------------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/heuristics.rs b/src/heuristics.rs index 6004e17..ec7b5c0 100644 --- a/src/heuristics.rs +++ b/src/heuristics.rs @@ -156,12 +156,14 @@ impl HeuristicTests { log::trace!("enter: make_wildcard_request({}, {})", target, length); let unique_str = self.unique_string(length); + // To take care of slash when needed let slash = if self.handles.config.add_slash { Some("/") } else { None }; + let nonexistent_url = target.format(&unique_str, slash)?; let response = logged_request(&nonexistent_url.to_owned(), self.handles.clone()).await?; diff --git a/src/url.rs b/src/url.rs index 9140b5b..aea222f 100644 --- a/src/url.rs +++ b/src/url.rs @@ -41,11 +41,13 @@ impl FeroxUrl { log::trace!("enter: formatted_urls({})", word); let mut urls = vec![]; + let slash = if self.handles.config.add_slash { Some("/") } else { None }; + match self.format(word, slash) { // default request, i.e. no extension Ok(url) => urls.push(url), @@ -100,7 +102,11 @@ impl FeroxUrl { self.target.to_string() }; - // extensions and slashes are now not mutually exclusive cases + // As of version 2.3.4, extensions and trailing slashes are no longer mutually exclusive. + // Trailing slashes are now treated as just another extension, which is pretty clever. + // + // In addition to the change above, @cortantief ID'd a bug here that incorrectly handled + // 2 leading forward slashes when extensions were used. This block addresses the bugfix. let mut word = if let Some(ext) = extension { // We handle the special case of forward slash // That allow us to treat it as an extension with a particular format @@ -113,7 +119,7 @@ impl FeroxUrl { String::from(word) }; - // We check seperatly if wordlist contains words that begin with 2 forward slashes + // We check separately if the current word begins with 2 forward slashes if word.starts_with("//") { // bug ID'd by @Sicks3c, when a wordlist contains words that begin with 2 forward slashes // i.e. //1_40_0/static/js, it gets joined onto the base url in a surprising way @@ -124,6 +130,7 @@ impl FeroxUrl { // 2 /'s, they'll still be trimmed word = word.trim_start_matches('/').to_string(); }; + let base_url = Url::parse(&url)?; let joined = base_url.join(&word)?; @@ -251,29 +258,6 @@ mod tests { assert_eq!(urls, [Url::parse("http://localhost/turbo").unwrap()]) } - #[test] - /// sending url + word with both an extension and add-slash should get back - /// two urls, one with '/' appended to the word, and the other with the extension - /// appended - fn formatted_urls_extensions_with_add_slash_returns_two_urls_with_extensions() { - let config = Configuration { - extensions: vec![String::from("js")], - add_slash: true, - ..Default::default() - }; - - let handles = Arc::new(Handles::for_testing(None, Some(Arc::new(config))).0); - let url = FeroxUrl::from_string("http://localhost", handles); - let urls = url.formatted_urls("turbo").unwrap(); - assert_eq!( - urls, - [ - Url::parse("http://localhost/turbo/").unwrap(), - Url::parse("http://localhost/turbo.js").unwrap() - ] - ) - } - #[test] /// sending url + word + 1 extension should get back two urls, one base and one with extension fn formatted_urls_one_extension_returns_two_urls() { @@ -505,9 +489,12 @@ mod tests { assert!(formatted.is_err()); } + #[test] - /// word with extension AND slash are correctly handled - fn format_url_word_with_postslash_and_extensions() { + /// sending url + word with both an extension and add-slash should get back + /// two urls, one with '/' appended to the word, and the other with the extension + /// appended + fn formatted_urls_with_postslash_and_extensions() { let config = Configuration { add_slash: true, extensions: vec!["rocks".to_string(), "fun".to_string()], @@ -516,7 +503,18 @@ mod tests { let handles = Arc::new(Handles::for_testing(None, Some(Arc::new(config))).0); let url = FeroxUrl::from_string("http://localhost", handles); match url.formatted_urls("ferox") { - Ok(urls) => assert_eq!(urls.len(), 3), // 3 = One for the main word + slash and for the two extensions + Ok(urls) => { + // 3 = One for the main word + slash and for the two extensions + assert_eq!(urls.len(), 3); + assert_eq!( + urls, + [ + Url::parse("http://localhost/ferox/").unwrap(), + Url::parse("http://localhost/ferox.rocks").unwrap(), + Url::parse("http://localhost/ferox.fun").unwrap(), + ] + ) + } Err(err) => panic!("{}", err.to_string()), } } From 42c06c87cc7b991b2061679dc516ebf8d4fa5dfd Mon Sep 17 00:00:00 2001 From: epi Date: Wed, 22 Sep 2021 07:29:14 -0500 Subject: [PATCH 08/91] bumped version to 2.3.4 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76383a8..0397dd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -596,7 +596,7 @@ dependencies = [ [[package]] name = "feroxbuster" -version = "2.3.3" +version = "2.3.4" dependencies = [ "anyhow", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index b2ef130..9e574ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "feroxbuster" -version = "2.3.3" +version = "2.3.4" authors = ["Ben 'epi' Risher "] license = "MIT" edition = "2018" From dd1c824d9800cb6d0784f51eb6f228ce1f40e6cb Mon Sep 17 00:00:00 2001 From: epi Date: Wed, 22 Sep 2021 07:30:38 -0500 Subject: [PATCH 09/91] updated shell completions that care about mutual exclusion --- shell_completions/_feroxbuster | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell_completions/_feroxbuster b/shell_completions/_feroxbuster index 42b3552..e18af9d 100644 --- a/shell_completions/_feroxbuster +++ b/shell_completions/_feroxbuster @@ -78,8 +78,8 @@ _feroxbuster() { '--insecure[Disables TLS certificate validation]' \ '-n[Do not scan recursively]' \ '--no-recursion[Do not scan recursively]' \ -'(-x --extensions)-f[Append / to each request]' \ -'(-x --extensions)--add-slash[Append / to each request]' \ +'-f[Append / to each request]' \ +'--add-slash[Append / to each request]' \ '(-u --url)--stdin[Read url(s) from STDIN]' \ '-e[Extract links from response body (html, javascript, etc...); make new requests based on findings (default: false)]' \ '--extract-links[Extract links from response body (html, javascript, etc...); make new requests based on findings (default: false)]' \ From 28f63aae94d330801caf5037c55cb75c415797b0 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 22 Sep 2021 17:09:11 -0500 Subject: [PATCH 10/91] Test --- tests/test_banner.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/test_banner.rs b/tests/test_banner.rs index e1a3299..1f4b373 100644 --- a/tests/test_banner.rs +++ b/tests/test_banner.rs @@ -143,6 +143,31 @@ fn banner_prints_denied_urls() { ); } +#[test] +/// test allows non-existent wordlist to trigger the banner printing to stderr +/// expect to see all mandatory prints + multiple headers +fn banner_prints_random_agent() { + Command::cargo_bin("feroxbuster") + .unwrap() + .arg("--url") + .arg("http://localhost") + .arg("--random-agent") + .assert() + .success() + .stderr( + predicate::str::contains("─┬─") + .and(predicate::str::contains("Target Url")) + .and(predicate::str::contains("http://localhost")) + .and(predicate::str::contains("Threads")) + .and(predicate::str::contains("Wordlist")) + .and(predicate::str::contains("Status Codes")) + .and(predicate::str::contains("Timeout (secs)")) + .and(predicate::str::contains("User-Agent")) + .and(predicate::str::contains("(Random)")) + .and(predicate::str::contains("─┴─")), + ); +} + #[test] /// test allows non-existent wordlist to trigger the banner printing to stderr /// expect to see all mandatory prints + multiple size filters From 40fccb97611e8226b009fbf1221b8a3c041804cb Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 22 Sep 2021 19:14:07 -0500 Subject: [PATCH 11/91] Bump minor version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76383a8..596dc0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -596,7 +596,7 @@ dependencies = [ [[package]] name = "feroxbuster" -version = "2.3.3" +version = "2.4.0" dependencies = [ "anyhow", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index b2ef130..0eddae1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "feroxbuster" -version = "2.3.3" +version = "2.4.0" authors = ["Ben 'epi' Risher "] license = "MIT" edition = "2018" From 8d11bb1800776680a7bc7d4b23fe60571a282dd8 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 22 Sep 2021 19:21:07 -0500 Subject: [PATCH 12/91] README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 6499f96..137ef99 100644 --- a/README.md +++ b/README.md @@ -482,6 +482,9 @@ FLAGS: -V, --version Prints version information + -A, --random-agent + Use a random User-Agent + -v, --verbosity Increase verbosity level (use -vv or more for greater effect. [CAUTION] 4 -v's is probably too much) From bce55e77f32452413c7a7a2c1d0bbfe6d558aada Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 22 Sep 2021 19:41:52 -0500 Subject: [PATCH 13/91] Add arg --- shell_completions/_feroxbuster | 2 ++ shell_completions/_feroxbuster.ps1 | 2 ++ shell_completions/feroxbuster.bash | 2 +- shell_completions/feroxbuster.fish | 1 + src/parser.rs | 9 +++++++++ 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/shell_completions/_feroxbuster b/shell_completions/_feroxbuster index 42b3552..dba5517 100644 --- a/shell_completions/_feroxbuster +++ b/shell_completions/_feroxbuster @@ -72,6 +72,8 @@ _feroxbuster() { '--json[Emit JSON logs to --output and --debug-log instead of normal text]' \ '-D[Don'\''t auto-filter wildcard responses]' \ '--dont-filter[Don'\''t auto-filter wildcard responses]' \ +'-A[Use a random User-Agent]' \ +'--random-agent[Use a random User-Agent]' \ '-r[Follow redirects]' \ '--redirects[Follow redirects]' \ '-k[Disables TLS certificate validation]' \ diff --git a/shell_completions/_feroxbuster.ps1 b/shell_completions/_feroxbuster.ps1 index 81539c5..bad2b9c 100644 --- a/shell_completions/_feroxbuster.ps1 +++ b/shell_completions/_feroxbuster.ps1 @@ -77,6 +77,8 @@ Register-ArgumentCompleter -Native -CommandName 'feroxbuster' -ScriptBlock { [CompletionResult]::new('--json', 'json', [CompletionResultType]::ParameterName, 'Emit JSON logs to --output and --debug-log instead of normal text') [CompletionResult]::new('-D', 'D', [CompletionResultType]::ParameterName, 'Don''t auto-filter wildcard responses') [CompletionResult]::new('--dont-filter', 'dont-filter', [CompletionResultType]::ParameterName, 'Don''t auto-filter wildcard responses') + [CompletionResult]::new('-A', 'A', [CompletionResultType]::ParameterName, 'Use a random User-Agent') + [CompletionResult]::new('--random-agent', 'random-agent', [CompletionResultType]::ParameterName, 'Use a random User-Agent') [CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Follow redirects') [CompletionResult]::new('--redirects', 'redirects', [CompletionResultType]::ParameterName, 'Follow redirects') [CompletionResult]::new('-k', 'k', [CompletionResultType]::ParameterName, 'Disables TLS certificate validation') diff --git a/shell_completions/feroxbuster.bash b/shell_completions/feroxbuster.bash index 1a23ade..5e1016e 100644 --- a/shell_completions/feroxbuster.bash +++ b/shell_completions/feroxbuster.bash @@ -20,7 +20,7 @@ _feroxbuster() { case "${cmd}" in feroxbuster) - opts=" -v -q -D -r -k -n -f -e -h -V -w -u -t -d -T -p -P -R -s -o -a -x -H -Q -S -X -W -N -C -L --verbosity --silent --quiet --auto-tune --auto-bail --json --dont-filter --redirects --insecure --no-recursion --add-slash --stdin --extract-links --help --version --wordlist --url --threads --depth --timeout --proxy --replay-proxy --replay-codes --status-codes --output --resume-from --debug-log --user-agent --extensions --dont-scan --headers --query --filter-size --filter-regex --filter-words --filter-lines --filter-status --filter-similar-to --scan-limit --parallel --rate-limit --time-limit " + opts=" -v -q -D -A -r -k -n -f -e -h -V -w -u -t -d -T -p -P -R -s -o -a -x -H -Q -S -X -W -N -C -L --verbosity --silent --quiet --auto-tune --auto-bail --json --dont-filter --random-agent --redirects --insecure --no-recursion --add-slash --stdin --extract-links --help --version --wordlist --url --threads --depth --timeout --proxy --replay-proxy --replay-codes --status-codes --output --resume-from --debug-log --user-agent --extensions --dont-scan --headers --query --filter-size --filter-regex --filter-words --filter-lines --filter-status --filter-similar-to --scan-limit --parallel --rate-limit --time-limit " if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 diff --git a/shell_completions/feroxbuster.fish b/shell_completions/feroxbuster.fish index 382bca2..146f9b5 100644 --- a/shell_completions/feroxbuster.fish +++ b/shell_completions/feroxbuster.fish @@ -32,6 +32,7 @@ complete -c feroxbuster -n "__fish_use_subcommand" -l auto-tune -d 'Automaticall complete -c feroxbuster -n "__fish_use_subcommand" -l auto-bail -d 'Automatically stop scanning when an excessive amount of errors are encountered' complete -c feroxbuster -n "__fish_use_subcommand" -l json -d 'Emit JSON logs to --output and --debug-log instead of normal text' complete -c feroxbuster -n "__fish_use_subcommand" -s D -l dont-filter -d 'Don\'t auto-filter wildcard responses' +complete -c feroxbuster -n "__fish_use_subcommand" -s A -l random-agent -d 'Use a random User-Agent' complete -c feroxbuster -n "__fish_use_subcommand" -s r -l redirects -d 'Follow redirects' complete -c feroxbuster -n "__fish_use_subcommand" -s k -l insecure -d 'Disables TLS certificate validation' complete -c feroxbuster -n "__fish_use_subcommand" -s n -l no-recursion -d 'Do not scan recursively' diff --git a/src/parser.rs b/src/parser.rs index d241a73..e6b6ede 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -192,6 +192,15 @@ pub fn initialize() -> App<'static, 'static> { "Sets the User-Agent (default: feroxbuster/VERSION)" ), ) + .arg( + Arg::with_name("random_agent") + .short("A") + .long("random-agent") + .takes_value(false) + .help( + "Use a random User-Agent" + ), + ) .arg( Arg::with_name("redirects") .short("r") From 5235208aa8fd1be53a78d4d8aad3c7b65c953f73 Mon Sep 17 00:00:00 2001 From: epi Date: Thu, 23 Sep 2021 21:22:52 -0500 Subject: [PATCH 14/91] dynamically generate user agents at build time for inclusion into lib.rs --- Cargo.lock | 1 + Cargo.toml | 1 + build.rs | 44 +++++++++++++++++++++++++++++++++++++++++++- src/lib.rs | 3 +++ src/main.rs | 3 +++ 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 596dc0c..dc46f48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -615,6 +615,7 @@ dependencies = [ "log", "openssl", "predicates", + "rand", "regex", "reqwest", "rlimit", diff --git a/Cargo.toml b/Cargo.toml index 0eddae1..22ccb07 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ clap = "2.33" regex = "1" lazy_static = "1.4" dirs = "4.0" +rand = "0.8" [dependencies] futures = { version = "0.3"} diff --git a/build.rs b/build.rs index 591a124..d012407 100644 --- a/build.rs +++ b/build.rs @@ -7,10 +7,38 @@ use clap::Shell; include!("src/parser.rs"); + +/// this code is taken from +/// https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4734c208edf7da625588fa16b5e2ed93 +/// which was linked in the random user agent issue discussion +/// +/// ** I'm not advocating for the use of this code, just using it for demonstration purposes ** +use rand::prelude::*; +use std::fmt::Write as fmt_Write; +use std::fs::write; +const WINDOWS_VERSION: [&str; 11] = [ + "3.1", "3.5", "4.0", "5.0", "5.1", "5.2", "6.0", "6.1", "6.2", "6.3", "10.0", +]; +fn generate_randomua() -> String { + let mut rng = thread_rng(); + let gecko_version = format!("{:.1}", rng.gen_range(40.0..60.0)); + let platform = if (rng.gen::() % 2) == 0 { + let version = WINDOWS_VERSION.choose(&mut rng).unwrap(); + format!("(Windows NT {}; rv:{}) Gecko/20100101 Firefox/{}", + version, gecko_version, gecko_version) + } else { + let version = format!("10.{}", rng.gen_range(0..19)); + format!("(Macintosh; Intel Mac OS X {}; rv:{}) Gecko/20100101 Firefox/{}", + version, gecko_version, gecko_version) + }; + format!("Mozilla/5.0 {}", platform) +} + + fn main() { println!("cargo:rerun-if-env-changed=src/parser.rs"); - if std::env::var("DOCS_RS").is_ok() { + if env::var("DOCS_RS").is_ok() { return; // only build when we're not generating docs } @@ -83,4 +111,18 @@ fn main() { eprintln!("Couldn't copy example config into config directory"); } } + + let user_agents = (0..20).map(|_| generate_randomua()).collect::>(); + + let mut definition = String::from("pub static USER_AGENTS:[&'static str; "); + + definition.push_str(user_agents.len().to_string().as_str()); + definition.push_str("] = ["); + for user_agent in user_agents { + definition.push_str(&format!("\"{}\",", user_agent)); + } + definition.push_str("];"); + + let out_file = format!("{}/user-agents.rs", env::var("OUT_DIR").unwrap()); + write(out_file, definition); } diff --git a/src/lib.rs b/src/lib.rs index c187471..02e50e4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -92,6 +92,9 @@ pub const DEFAULT_STATUS_CODES: [StatusCode; 10] = [ /// Expected location is in the same directory as the feroxbuster binary. pub const DEFAULT_CONFIG_NAME: &str = "ferox-config.toml"; +// includes user agents generated at build time +include!(concat!(env!("OUT_DIR"), "/user-agents.rs")); + #[cfg(test)] mod tests { use super::*; diff --git a/src/main.rs b/src/main.rs index 3fb96ea..1f855f5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,7 @@ use tokio::{ use tokio_util::codec::{FramedRead, LinesCodec}; use feroxbuster::{ + USER_AGENTS, banner::{Banner, UPDATE_URL}, config::{Configuration, OutputLevel}, event_handlers::{ @@ -175,6 +176,8 @@ async fn wrapped_main(config: Arc) -> Result<()> { PROGRESS_BAR.join().unwrap(); }); + PROGRESS_PRINTER.println(USER_AGENTS[0]); + // spawn all event handlers, expect back a JoinHandle and a *Handle to the specific event let (stats_task, stats_handle) = StatsHandler::initialize(config.clone()); let (filters_task, filters_handle) = FiltersHandler::initialize(); From efd706cb9ba34385f5fde276241ee319602c3eae Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Sun, 26 Sep 2021 10:09:52 -0500 Subject: [PATCH 15/91] cargo fmt --- build.rs | 18 +++++++++++------- src/main.rs | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/build.rs b/build.rs index d012407..7f3786e 100644 --- a/build.rs +++ b/build.rs @@ -7,7 +7,6 @@ use clap::Shell; include!("src/parser.rs"); - /// this code is taken from /// https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4734c208edf7da625588fa16b5e2ed93 /// which was linked in the random user agent issue discussion @@ -24,17 +23,20 @@ fn generate_randomua() -> String { let gecko_version = format!("{:.1}", rng.gen_range(40.0..60.0)); let platform = if (rng.gen::() % 2) == 0 { let version = WINDOWS_VERSION.choose(&mut rng).unwrap(); - format!("(Windows NT {}; rv:{}) Gecko/20100101 Firefox/{}", - version, gecko_version, gecko_version) + format!( + "(Windows NT {}; rv:{}) Gecko/20100101 Firefox/{}", + version, gecko_version, gecko_version + ) } else { let version = format!("10.{}", rng.gen_range(0..19)); - format!("(Macintosh; Intel Mac OS X {}; rv:{}) Gecko/20100101 Firefox/{}", - version, gecko_version, gecko_version) + format!( + "(Macintosh; Intel Mac OS X {}; rv:{}) Gecko/20100101 Firefox/{}", + version, gecko_version, gecko_version + ) }; format!("Mozilla/5.0 {}", platform) } - fn main() { println!("cargo:rerun-if-env-changed=src/parser.rs"); @@ -112,7 +114,9 @@ fn main() { } } - let user_agents = (0..20).map(|_| generate_randomua()).collect::>(); + let user_agents = (0..20) + .map(|_| generate_randomua()) + .collect::>(); let mut definition = String::from("pub static USER_AGENTS:[&'static str; "); diff --git a/src/main.rs b/src/main.rs index 1f855f5..56fa8a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,6 @@ use tokio::{ use tokio_util::codec::{FramedRead, LinesCodec}; use feroxbuster::{ - USER_AGENTS, banner::{Banner, UPDATE_URL}, config::{Configuration, OutputLevel}, event_handlers::{ @@ -30,6 +29,7 @@ use feroxbuster::{ scan_manager::{self}, scanner, utils::{fmt_err, slugify_filename}, + USER_AGENTS, }; #[cfg(not(target_os = "windows"))] use feroxbuster::{utils::set_open_file_limit, DEFAULT_OPEN_FILE_LIMIT}; From c5e59b70f7813659df836f13321dde097c0c6203 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Tue, 28 Sep 2021 15:44:11 -0500 Subject: [PATCH 16/91] Hard code --- build.rs | 48 +----------------------------------------------- src/lib.rs | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 50 deletions(-) diff --git a/build.rs b/build.rs index 7f3786e..591a124 100644 --- a/build.rs +++ b/build.rs @@ -7,40 +7,10 @@ use clap::Shell; include!("src/parser.rs"); -/// this code is taken from -/// https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4734c208edf7da625588fa16b5e2ed93 -/// which was linked in the random user agent issue discussion -/// -/// ** I'm not advocating for the use of this code, just using it for demonstration purposes ** -use rand::prelude::*; -use std::fmt::Write as fmt_Write; -use std::fs::write; -const WINDOWS_VERSION: [&str; 11] = [ - "3.1", "3.5", "4.0", "5.0", "5.1", "5.2", "6.0", "6.1", "6.2", "6.3", "10.0", -]; -fn generate_randomua() -> String { - let mut rng = thread_rng(); - let gecko_version = format!("{:.1}", rng.gen_range(40.0..60.0)); - let platform = if (rng.gen::() % 2) == 0 { - let version = WINDOWS_VERSION.choose(&mut rng).unwrap(); - format!( - "(Windows NT {}; rv:{}) Gecko/20100101 Firefox/{}", - version, gecko_version, gecko_version - ) - } else { - let version = format!("10.{}", rng.gen_range(0..19)); - format!( - "(Macintosh; Intel Mac OS X {}; rv:{}) Gecko/20100101 Firefox/{}", - version, gecko_version, gecko_version - ) - }; - format!("Mozilla/5.0 {}", platform) -} - fn main() { println!("cargo:rerun-if-env-changed=src/parser.rs"); - if env::var("DOCS_RS").is_ok() { + if std::env::var("DOCS_RS").is_ok() { return; // only build when we're not generating docs } @@ -113,20 +83,4 @@ fn main() { eprintln!("Couldn't copy example config into config directory"); } } - - let user_agents = (0..20) - .map(|_| generate_randomua()) - .collect::>(); - - let mut definition = String::from("pub static USER_AGENTS:[&'static str; "); - - definition.push_str(user_agents.len().to_string().as_str()); - definition.push_str("] = ["); - for user_agent in user_agents { - definition.push_str(&format!("\"{}\",", user_agent)); - } - definition.push_str("];"); - - let out_file = format!("{}/user-agents.rs", env::var("OUT_DIR").unwrap()); - write(out_file, definition); } diff --git a/src/lib.rs b/src/lib.rs index 02e50e4..7d21910 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -91,9 +91,20 @@ pub const DEFAULT_STATUS_CODES: [StatusCode; 10] = [ /// /// Expected location is in the same directory as the feroxbuster binary. pub const DEFAULT_CONFIG_NAME: &str = "ferox-config.toml"; - -// includes user agents generated at build time -include!(concat!(env!("OUT_DIR"), "/user-agents.rs")); +pub const USER_AGENTS: [&str; 12] = [ + "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; Microsoft; RM-1152) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Mobile Safari/537.36 Edge/15.15254", + "Mozilla/5.0 (Linux; Android 7.0; Pixel C Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246", + "Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9", + "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1", + "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)", + "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)", + "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)", +]; #[cfg(test)] mod tests { From 6de087ae79d0cb883eca66fcf9a1f40df25e9ffe Mon Sep 17 00:00:00 2001 From: epi <43392618+epi052@users.noreply.github.com> Date: Sun, 3 Oct 2021 11:26:48 -0500 Subject: [PATCH 17/91] Update cicd-to-dockerhub.yml --- .github/workflows/cicd-to-dockerhub.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/cicd-to-dockerhub.yml b/.github/workflows/cicd-to-dockerhub.yml index a7cfbf9..863c508 100644 --- a/.github/workflows/cicd-to-dockerhub.yml +++ b/.github/workflows/cicd-to-dockerhub.yml @@ -3,8 +3,6 @@ name: ci-to-dockerhub on: push: branches: [ main ] - pull_request: - branches: [ main ] jobs: build: From e48a462471ca9163a1e012c9224e71a42e54f61a Mon Sep 17 00:00:00 2001 From: epi <43392618+epi052@users.noreply.github.com> Date: Thu, 7 Oct 2021 06:40:40 -0500 Subject: [PATCH 18/91] added confirmed tag to stale-bot --- .github/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/stale.yml b/.github/stale.yml index cd6e1b8..07ec901 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -6,6 +6,7 @@ daysUntilClose: 7 exemptLabels: - pinned - security + - confirmed # Label to use when marking an issue as stale staleLabel: stale # Comment to post when marking an issue as stale. Set to `false` to disable From ef7fc7a8a3891b6b4257b5b3efdf237624080adf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 11:45:26 +0000 Subject: [PATCH 19/91] docs: update README.md [skip ci] --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index 27812dd..187edcf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@

+ +[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) +
feroxbuster
@@ -164,3 +167,23 @@ cat targets | ./feroxbuster --stdin --silent -s 200 301 302 --redirects -x js | For realsies, there used to be over 1300 lines in this README, but it's all been moved to the [new documentation site](https://epi052.github.io/feroxbuster-docs/docs/). Go check it out!

✨🎉👉 DOCUMENTATION 👈🎉✨

+ +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + +

Joona Hoikkala

📖
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file From 2d5825556f7b155e2309c64c9080813a5c1c5f25 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 11:45:27 +0000 Subject: [PATCH 20/91] docs: create .all-contributorsrc [skip ci] --- .all-contributorsrc | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .all-contributorsrc diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 0000000..34c3269 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,24 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [ + { + "login": "joohoi", + "name": "Joona Hoikkala", + "avatar_url": "https://avatars.githubusercontent.com/u/5235109?v=4", + "profile": "https://io.fi", + "contributions": [ + "doc" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "feroxbuster", + "projectOwner": "epi052", + "repoType": "github", + "repoHost": "https://github.com", + "skipCi": true +} From 5c32fab4cbfec7398558b87af8c7841b44aba94a Mon Sep 17 00:00:00 2001 From: epi Date: Thu, 7 Oct 2021 06:54:26 -0500 Subject: [PATCH 21/91] fixed badge --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 187edcf..0178a04 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,4 @@

- -[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) -
feroxbuster
@@ -33,6 +30,12 @@ + + + + + +

![demo](img/demo.gif) From 653117bda6ef0caf374b5a41f1a581874c13d36b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:12:28 +0000 Subject: [PATCH 22/91] docs: update README.md [skip ci] --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0178a04..e1d729e 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,8 @@ - - - - +[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) +

![demo](img/demo.gif) @@ -181,6 +179,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d +

Joona Hoikkala

📖

J Savage

🚇 📖
From 0d1cb25b69ad423bf4ea8ee4c9f72d53a00ac91d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:12:29 +0000 Subject: [PATCH 23/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 34c3269..65bbeb7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -13,6 +13,16 @@ "contributions": [ "doc" ] + }, + { + "login": "jsav0", + "name": "J Savage", + "avatar_url": "https://avatars.githubusercontent.com/u/20546041?v=4", + "profile": "https://github.com/jsav0", + "contributions": [ + "infra", + "doc" + ] } ], "contributorsPerLine": 7, From e5fe9bb36015dcda7a9a012216ef7431c0ca0f40 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:13:29 +0000 Subject: [PATCH 24/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e1d729e..285772c 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-)

@@ -180,6 +180,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Joona Hoikkala

📖
J Savage

🚇 📖 +
Thomas Gotwig

🚇 📖 From 092515cf3aeb9ff38a86b2e615208bbcf77402b3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:13:30 +0000 Subject: [PATCH 25/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 65bbeb7..3e79040 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -23,6 +23,16 @@ "infra", "doc" ] + }, + { + "login": "TGotwig", + "name": "Thomas Gotwig", + "avatar_url": "https://avatars.githubusercontent.com/u/30773779?v=4", + "profile": "http://www.tgotwig.dev", + "contributions": [ + "infra", + "doc" + ] } ], "contributorsPerLine": 7, From c33d3973603556ca39f17209098ac4174c8f20c3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:14:01 +0000 Subject: [PATCH 26/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 285772c..38532e8 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-)

@@ -181,6 +181,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Joona Hoikkala

📖
J Savage

🚇 📖
Thomas Gotwig

🚇 📖 +
Spike

🚇 📖 From b508dcce8d4817bb19f17a98baf786219bc9b8de Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:14:02 +0000 Subject: [PATCH 27/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3e79040..1fbef72 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -33,6 +33,16 @@ "infra", "doc" ] + }, + { + "login": "spikecodes", + "name": "Spike", + "avatar_url": "https://avatars.githubusercontent.com/u/19519553?v=4", + "profile": "https://github.com/spikecodes", + "contributions": [ + "infra", + "doc" + ] } ], "contributorsPerLine": 7, From 36994d208df230b0238342ba56005dd7c3d8598d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:14:41 +0000 Subject: [PATCH 28/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 38532e8..ba9aa7b 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-)

@@ -182,6 +182,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
J Savage

🚇 📖
Thomas Gotwig

🚇 📖
Spike

🚇 📖 +
Evan Richter

💻 📖 From a439be0305576e7e5a2faa45908921b8573fc374 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:14:42 +0000 Subject: [PATCH 29/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 1fbef72..4f66a99 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -43,6 +43,16 @@ "infra", "doc" ] + }, + { + "login": "evanrichter", + "name": "Evan Richter", + "avatar_url": "https://avatars.githubusercontent.com/u/330292?v=4", + "profile": "https://github.com/evanrichter", + "contributions": [ + "code", + "doc" + ] } ], "contributorsPerLine": 7, From 831ae011e21155b959c6cf8843c1da71f26f91b3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:15:06 +0000 Subject: [PATCH 30/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ba9aa7b..f3c5770 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-)

@@ -183,6 +183,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Thomas Gotwig

🚇 📖
Spike

🚇 📖
Evan Richter

💻 📖 +
AG

🤔 📖 From c65e2f02b372e1e791359d7db8f678be12724fc8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:15:06 +0000 Subject: [PATCH 31/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4f66a99..3941124 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -53,6 +53,16 @@ "code", "doc" ] + }, + { + "login": "mzpqnxow", + "name": "AG", + "avatar_url": "https://avatars.githubusercontent.com/u/8016228?v=4", + "profile": "https://github.com/mzpqnxow", + "contributions": [ + "ideas", + "doc" + ] } ], "contributorsPerLine": 7, From e39f6cf16d46e72e662587aee8e13f078c6e15d1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:15:34 +0000 Subject: [PATCH 32/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f3c5770..b867c02 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-7-orange.svg?style=flat-square)](#contributors-)

@@ -184,6 +184,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Spike

🚇 📖
Evan Richter

💻 📖
AG

🤔 📖 +
Nicolas Thumann

💻 📖 From cc1dc94459ad6ec8b005fc9c39f1d2a972483d30 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:15:35 +0000 Subject: [PATCH 33/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3941124..97ce697 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -63,6 +63,16 @@ "ideas", "doc" ] + }, + { + "login": "n-thumann", + "name": "Nicolas Thumann", + "avatar_url": "https://avatars.githubusercontent.com/u/46975855?v=4", + "profile": "https://n-thumann.de/", + "contributions": [ + "code", + "doc" + ] } ], "contributorsPerLine": 7, From f260a981cab456477ae325bc6b67344d07fbd3be Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:16:04 +0000 Subject: [PATCH 34/91] docs: update README.md [skip ci] --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b867c02..0835aa7 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-7-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors-)

@@ -186,6 +186,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
AG

🤔 📖
Nicolas Thumann

💻 📖 + +
Tom Matthews

📖 + From 00b0c3c62d6ee6c079d5d9f1ebfa6244f40e2a4f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:16:05 +0000 Subject: [PATCH 35/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 97ce697..49cbb00 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -73,6 +73,15 @@ "code", "doc" ] + }, + { + "login": "tomtastic", + "name": "Tom Matthews", + "avatar_url": "https://avatars.githubusercontent.com/u/302127?v=4", + "profile": "https://github.com/tomtastic", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, From 672d17ec2737b314f504edd4111ee790ba486512 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:16:28 +0000 Subject: [PATCH 36/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0835aa7..0719592 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors-)

@@ -188,6 +188,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Tom Matthews

📖 +
bsysop

📖 From a035f0eeaf4621616e4d9ad5464868da6fd70d3a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:16:28 +0000 Subject: [PATCH 37/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 49cbb00..ea62350 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -82,6 +82,15 @@ "contributions": [ "doc" ] + }, + { + "login": "bsysop", + "name": "bsysop", + "avatar_url": "https://avatars.githubusercontent.com/u/9998303?v=4", + "profile": "https://github.com/bsysop", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, From b6c41ae2d35063951dc68772dbcc25b909703bfe Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:16:46 +0000 Subject: [PATCH 38/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0719592..d83782a 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-10-orange.svg?style=flat-square)](#contributors-)

@@ -189,6 +189,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Tom Matthews

📖
bsysop

📖 +
Brian Sizemore

💻 From 7d314c7bac6861d6f4dc21f6082166cc209edeb6 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:16:47 +0000 Subject: [PATCH 39/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ea62350..518e134 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -91,6 +91,15 @@ "contributions": [ "doc" ] + }, + { + "login": "bpsizemore", + "name": "Brian Sizemore", + "avatar_url": "https://avatars.githubusercontent.com/u/11645898?v=4", + "profile": "http://bpsizemore.me", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From 74b23141e01ef5811b3eda1ba63a61c8673af3c1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:17:07 +0000 Subject: [PATCH 40/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d83782a..852d21e 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-10-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-11-orange.svg?style=flat-square)](#contributors-)

@@ -190,6 +190,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Tom Matthews

📖
bsysop

📖
Brian Sizemore

💻 +
Alexandre ZANNI

🚇 📖 From 6d5235ab0a24183a53799f393185b5695f1d67b7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:17:08 +0000 Subject: [PATCH 41/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 518e134..c92834f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -100,6 +100,16 @@ "contributions": [ "code" ] + }, + { + "login": "noraj", + "name": "Alexandre ZANNI", + "avatar_url": "https://avatars.githubusercontent.com/u/16578570?v=4", + "profile": "https://pwn.by/noraj", + "contributions": [ + "infra", + "doc" + ] } ], "contributorsPerLine": 7, From d9718d0d6af6eb73997a2a0c31e95467d93732cb Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:17:34 +0000 Subject: [PATCH 42/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 852d21e..34e618b 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-11-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-12-orange.svg?style=flat-square)](#contributors-)

@@ -191,6 +191,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
bsysop

📖
Brian Sizemore

💻
Alexandre ZANNI

🚇 📖 +
Craig

🚇 From 542db19180d1f521e9ae786cc9c0e4b19facc946 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:17:35 +0000 Subject: [PATCH 43/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c92834f..f3bfc45 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -110,6 +110,15 @@ "infra", "doc" ] + }, + { + "login": "craig", + "name": "Craig", + "avatar_url": "https://avatars.githubusercontent.com/u/99729?v=4", + "profile": "https://github.com/craig", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 7, From cc18dfc7d44c7027dc96b2875720a4fdad164a36 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:17:59 +0000 Subject: [PATCH 44/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 34e618b..02b1e8e 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-12-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors-)

@@ -192,6 +192,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Brian Sizemore

💻
Alexandre ZANNI

🚇 📖
Craig

🚇 +
EONRaider

🚇 From 14023f7e05bc272334dd825a5a04df401547f458 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:18:00 +0000 Subject: [PATCH 45/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index f3bfc45..0837d66 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -119,6 +119,15 @@ "contributions": [ "infra" ] + }, + { + "login": "EONRaider", + "name": "EONRaider", + "avatar_url": "https://avatars.githubusercontent.com/u/15611424?v=4", + "profile": "https://www.reddit.com/u/EONRaider", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 7, From ece220263b992dadeadabed7b8fb760aba14a960 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:18:19 +0000 Subject: [PATCH 46/91] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 02b1e8e..b625aa5 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-14-orange.svg?style=flat-square)](#contributors-)

@@ -193,6 +193,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Alexandre ZANNI

🚇 📖
Craig

🚇
EONRaider

🚇 +
wtwver

🚇 From 9f93c2381a56658f0d2c5d1fb5c46bacbdb0522d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 12:18:20 +0000 Subject: [PATCH 47/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0837d66..4fcc578 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -128,6 +128,15 @@ "contributions": [ "infra" ] + }, + { + "login": "wtwver", + "name": "wtwver", + "avatar_url": "https://avatars.githubusercontent.com/u/53866088?v=4", + "profile": "https://github.com/wtwver", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 7, From ea5180555272402e48495c3d2d063deedad78d58 Mon Sep 17 00:00:00 2001 From: epi Date: Thu, 7 Oct 2021 07:20:34 -0500 Subject: [PATCH 48/91] fixed badge --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b625aa5..38b87ea 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,10 @@ -[![All Contributors](https://img.shields.io/badge/all_contributors-14-orange.svg?style=flat-square)](#contributors-) - + + + +

![demo](img/demo.gif) From fe5612ce71558b826a9f1f6535de309dea117db2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:18:39 +0000 Subject: [PATCH 49/91] docs: update README.md [skip ci] --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 38b87ea..dffa05b 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,8 @@ - - - - +[![All Contributors](https://img.shields.io/badge/all_contributors-15-orange.svg?style=flat-square)](#contributors-) +

![demo](img/demo.gif) @@ -197,6 +195,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
EONRaider

🚇
wtwver

🚇 + +
Tib3rius

🐛 + From 4b0b26da0283b9550af65f834b067f310f9209a5 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:18:40 +0000 Subject: [PATCH 50/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4fcc578..8b2a3c5 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -137,6 +137,15 @@ "contributions": [ "infra" ] + }, + { + "login": "Tib3rius", + "name": "Tib3rius", + "avatar_url": "https://avatars.githubusercontent.com/u/48113936?v=4", + "profile": "https://tib3rius.com", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From 1e4d3802f809e544af8ae9a5de8d452547559301 Mon Sep 17 00:00:00 2001 From: epi Date: Sat, 9 Oct 2021 16:21:58 -0500 Subject: [PATCH 51/91] updated readme --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dffa05b..fb1227b 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,15 @@ - + -[![All Contributors](https://img.shields.io/badge/all_contributors-15-orange.svg?style=flat-square)](#contributors-) - + [![All Contributors](https://img.shields.io/badge/all_contributors-15-orange.svg?style=flat-square)](#contributors-) + + --> + + + +

![demo](img/demo.gif) From b1d33f4f7dc6a062f582918945c8b1d418db0c29 Mon Sep 17 00:00:00 2001 From: epi Date: Sat, 9 Oct 2021 16:23:16 -0500 Subject: [PATCH 52/91] updated readme --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index fb1227b..76e7c0a 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,9 @@ + - --> From 46366291f1c5a475edeada52aa0123f5edae4017 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:25:06 +0000 Subject: [PATCH 53/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 76e7c0a..92b885a 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Tib3rius

🐛 +
0xdf

🐛 From d0cdf5766bf98cf5e99615549523b1b0f9b58d13 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:25:07 +0000 Subject: [PATCH 54/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8b2a3c5..bca1284 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -146,6 +146,15 @@ "contributions": [ "bug" ] + }, + { + "login": "0xdf", + "name": "0xdf", + "avatar_url": "https://avatars.githubusercontent.com/u/1489045?v=4", + "profile": "https://github.com/0xdf", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From 98d6fdf536eef5a7c82dc14fd33ea9663fc68f02 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:26:28 +0000 Subject: [PATCH 55/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 92b885a..29d565a 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Tib3rius

🐛
0xdf

🐛 +
Muhammad Ahsan

🐛 From 073291360a0dc6a43710b21673c5e6ff6a67ee8f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:26:29 +0000 Subject: [PATCH 56/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index bca1284..3bbe28e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -155,6 +155,15 @@ "contributions": [ "bug" ] + }, + { + "login": "hunter0x8", + "name": "Muhammad Ahsan", + "avatar_url": "https://avatars.githubusercontent.com/u/46222314?v=4", + "profile": "https://github.com/hunter0x8", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From 0b2d77605ed468ca0c056ea73431005c5acf3cc2 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:27:16 +0000 Subject: [PATCH 57/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 92b885a..7cab87a 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Tib3rius

🐛
0xdf

🐛 +
secure-77

🐛 From 7afb26120671822680b328afe08e1363d592e454 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:27:17 +0000 Subject: [PATCH 58/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index bca1284..72f994b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -155,6 +155,15 @@ "contributions": [ "bug" ] + }, + { + "login": "secure-77", + "name": "secure-77", + "avatar_url": "https://avatars.githubusercontent.com/u/31564517?v=4", + "profile": "http://secure77.de", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From b36c3e0318aff777b0cf91b941f9d03024d1d286 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:27:49 +0000 Subject: [PATCH 59/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7cab87a..9c7d2c1 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Tib3rius

🐛
0xdf

🐛
secure-77

🐛 +
Sophie Brun

🚇 From 82f8f687fd18f46b21e81f31ea189dc9fe29a1cc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:27:49 +0000 Subject: [PATCH 60/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 72f994b..c6f45bf 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -164,6 +164,15 @@ "contributions": [ "bug" ] + }, + { + "login": "sbrun", + "name": "Sophie Brun", + "avatar_url": "https://avatars.githubusercontent.com/u/7712154?v=4", + "profile": "https://github.com/sbrun", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 7, From 5350724e5f06a836f6f0bb249522c3d500d37867 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:29:15 +0000 Subject: [PATCH 61/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9c7d2c1..4620146 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
0xdf

🐛
secure-77

🐛
Sophie Brun

🚇 +
black-A

🤔 From 72fc0b026d233a4141eaec5c4eba152d8a7c26dd Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:29:16 +0000 Subject: [PATCH 62/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index c6f45bf..8c6aec2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -173,6 +173,15 @@ "contributions": [ "infra" ] + }, + { + "login": "black-A", + "name": "black-A", + "avatar_url": "https://avatars.githubusercontent.com/u/30686803?v=4", + "profile": "https://github.com/black-A", + "contributions": [ + "ideas" + ] } ], "contributorsPerLine": 7, From 125a55f72bb172f12a2de0e68dd25c8155265c53 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:31:47 +0000 Subject: [PATCH 63/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4620146..5a4b927 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
secure-77

🐛
Sophie Brun

🚇
black-A

🤔 +
Nicolas Krassas

🤔 From 1723847672b53755a52f45539002f879e227745d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:31:48 +0000 Subject: [PATCH 64/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8c6aec2..6937cca 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -182,6 +182,15 @@ "contributions": [ "ideas" ] + }, + { + "login": "dinosn", + "name": "Nicolas Krassas", + "avatar_url": "https://avatars.githubusercontent.com/u/3851678?v=4", + "profile": "https://github.com/dinosn", + "contributions": [ + "ideas" + ] } ], "contributorsPerLine": 7, From 90dd18af2ea3fd682a3109219b289c838c98bdf4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:40:17 +0000 Subject: [PATCH 65/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5a4b927..e6df3f1 100644 --- a/README.md +++ b/README.md @@ -206,6 +206,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Sophie Brun

🚇
black-A

🤔
Nicolas Krassas

🤔 +
N0ur5

🤔 From 3ee6641a7df212427191bd3f683a14d0c8fc59e3 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:40:18 +0000 Subject: [PATCH 66/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6937cca..e824214 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -191,6 +191,15 @@ "contributions": [ "ideas" ] + }, + { + "login": "N0ur5", + "name": "N0ur5", + "avatar_url": "https://avatars.githubusercontent.com/u/24260009?v=4", + "profile": "https://github.com/N0ur5", + "contributions": [ + "ideas" + ] } ], "contributorsPerLine": 7, From 0281057944df70c83c782b21b2570431787ec964 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:41:26 +0000 Subject: [PATCH 67/91] docs: update README.md [skip ci] --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e6df3f1..5f22a7e 100644 --- a/README.md +++ b/README.md @@ -208,6 +208,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Nicolas Krassas

🤔
N0ur5

🤔 + +
mchill

🐛 + From 86dc8edd3d7e9905db87b09b144f5e5c6c554cab Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:41:27 +0000 Subject: [PATCH 68/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e824214..da0a86e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -200,6 +200,15 @@ "contributions": [ "ideas" ] + }, + { + "login": "moscowchill", + "name": "mchill", + "avatar_url": "https://avatars.githubusercontent.com/u/72578879?v=4", + "profile": "https://github.com/moscowchill", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From bb6146c18f331d305c131527f4bea25f5d56b013 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:42:50 +0000 Subject: [PATCH 69/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5f22a7e..f680dc9 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
mchill

🐛 +
Naman

🐛 From c29abe4ec4af1db407a6605dc589086de460b8bc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:42:51 +0000 Subject: [PATCH 70/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index da0a86e..65099be 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -209,6 +209,15 @@ "contributions": [ "bug" ] + }, + { + "login": "BitThr3at", + "name": "Naman", + "avatar_url": "https://avatars.githubusercontent.com/u/45028933?v=4", + "profile": "http://BitThr3at.github.io", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From ac56225405d2e627b2613ee5aa4ab080e964d225 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:44:03 +0000 Subject: [PATCH 71/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f680dc9..7c3db90 100644 --- a/README.md +++ b/README.md @@ -211,6 +211,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
mchill

🐛
Naman

🐛 +
Ayoub Elaich

🐛 From 035a8c75c028f4a53423a11af0095889e59cd77d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 10:44:04 +0000 Subject: [PATCH 72/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 65099be..74ae7f4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -218,6 +218,15 @@ "contributions": [ "bug" ] + }, + { + "login": "sicks3c", + "name": "Ayoub Elaich", + "avatar_url": "https://avatars.githubusercontent.com/u/32225186?v=4", + "profile": "https://github.com/Sicks3c", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From da9bec5a674ba739f92d8eaa12d62a00684b1811 Mon Sep 17 00:00:00 2001 From: epi Date: Sun, 10 Oct 2021 05:51:43 -0500 Subject: [PATCH 73/91] added henry hoggard --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 74ae7f4..bd6817b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -224,6 +224,15 @@ "name": "Ayoub Elaich", "avatar_url": "https://avatars.githubusercontent.com/u/32225186?v=4", "profile": "https://github.com/Sicks3c", + "contributions": [ + "bug" + ] + }, + { + "login": "HenryHoggard", + "name": "Henry", + "avatar_url": "https://avatars.githubusercontent.com/u/1208121?v=4", + "profile": "https://github.com/HenryHoggard", "contributions": [ "bug" ] diff --git a/README.md b/README.md index 7c3db90..831f5df 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
mchill

🐛
Naman

🐛
Ayoub Elaich

🐛 +
Henry

🐛 From 93686acb48d33efea90ffedc84513ef6aed59ee8 Mon Sep 17 00:00:00 2001 From: epi Date: Sun, 10 Oct 2021 06:02:36 -0500 Subject: [PATCH 74/91] updated contributor --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index bd6817b..4cdebc6 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -236,6 +236,15 @@ "contributions": [ "bug" ] + }, + { + "login": "HenryHoggard", + "name": "Henry", + "avatar_url": "https://avatars.githubusercontent.com/u/6428561?v=4", + "profile": "https://github.com/SleepiPanda", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 831f5df..36ce8b3 100644 --- a/README.md +++ b/README.md @@ -213,6 +213,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Naman

🐛
Ayoub Elaich

🐛
Henry

🐛 +
SleepiPanda

🐛 From 9ca48fe877da36947ab2335042566d9bda4a0e13 Mon Sep 17 00:00:00 2001 From: epi Date: Sun, 10 Oct 2021 06:06:51 -0500 Subject: [PATCH 75/91] updated contributor --- .all-contributorsrc | 13 +++++++++++-- README.md | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4cdebc6..9429e14 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -238,13 +238,22 @@ ] }, { - "login": "HenryHoggard", - "name": "Henry", + "login": "SleepiPanda", + "name": "SleepiPanda", "avatar_url": "https://avatars.githubusercontent.com/u/6428561?v=4", "profile": "https://github.com/SleepiPanda", "contributions": [ "bug" ] + }, + { + "login": "uBadRequest", + "name": "Bad Requests", + "avatar_url": "https://avatars.githubusercontent.com/u/47282747?v=4", + "profile": "https://github.com/uBadRequest", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 36ce8b3..b4aa137 100644 --- a/README.md +++ b/README.md @@ -214,6 +214,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Ayoub Elaich

🐛
Henry

🐛
SleepiPanda

🐛 +
Bad Requests

🐛 From 15bd50dc24b547e1c9ee6afac23e6586644e37b1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 19:20:44 +0000 Subject: [PATCH 76/91] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b4aa137..223a449 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Henry

🐛
SleepiPanda

🐛
Bad Requests

🐛 +
Dominik Nakamura

🚇 From 2132ceadd582f5295569c07f5616d961ba6a296b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 10 Oct 2021 19:20:45 +0000 Subject: [PATCH 77/91] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9429e14..ab91851 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -227,7 +227,7 @@ "contributions": [ "bug" ] - }, + }, { "login": "HenryHoggard", "name": "Henry", @@ -254,6 +254,15 @@ "contributions": [ "bug" ] + }, + { + "login": "dnaka91", + "name": "Dominik Nakamura", + "avatar_url": "https://avatars.githubusercontent.com/u/36804488?v=4", + "profile": "https://home.dnaka91.rocks", + "contributions": [ + "infra" + ] } ], "contributorsPerLine": 7, From 4eebacb0779042e040fc356881ed47b1a8b903f1 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Tue, 12 Oct 2021 02:53:29 +0900 Subject: [PATCH 78/91] fix typo in parser.rs initalize -> initialize --- src/parser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser.rs b/src/parser.rs index d241a73..d260dce 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -458,7 +458,7 @@ mod tests { use super::*; #[test] - /// initalize parser, expect a clap::App returned + /// initialize parser, expect a clap::App returned fn parser_initialize_gives_defaults() { let app = initialize(); assert_eq!(app.get_name(), "feroxbuster"); From 87aaa84f1ef7817582670eac8f53fef84149a7dd Mon Sep 17 00:00:00 2001 From: epi Date: Tue, 12 Oct 2021 18:21:05 -0500 Subject: [PATCH 79/91] added user-agent logic --- src/event_handlers/outputs.rs | 1 + src/extractor/container.rs | 1 + src/utils.rs | 26 ++++++++++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/event_handlers/outputs.rs b/src/event_handlers/outputs.rs index d94cb90..7d70b7e 100644 --- a/src/event_handlers/outputs.rs +++ b/src/event_handlers/outputs.rs @@ -215,6 +215,7 @@ impl TermOutHandler { self.config.replay_client.as_ref().unwrap(), resp.url(), self.config.output_level, + &self.config, tx_stats.clone(), ) .await diff --git a/src/extractor/container.rs b/src/extractor/container.rs index d86ab60..4e84ea4 100644 --- a/src/extractor/container.rs +++ b/src/extractor/container.rs @@ -402,6 +402,7 @@ impl<'a> Extractor<'a> { &client, &url, self.handles.config.output_level, + &self.handles.config, self.handles.stats.tx.clone(), ) .await?; diff --git a/src/utils.rs b/src/utils.rs index a58662a..85ee145 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -5,7 +5,9 @@ use reqwest::{Client, Response, StatusCode, Url}; #[cfg(not(target_os = "windows"))] use rlimit::{getrlimit, setrlimit, Resource}; use std::{ + thread_local, fs, + cell::RefCell, io::{self, BufWriter, Write}, sync::Arc, time::Duration, @@ -21,9 +23,17 @@ use crate::{ }, progress::PROGRESS_PRINTER, send_command, + USER_AGENTS, statistics::StatError::{Connection, Other, Redirection, Request, Timeout}, traits::FeroxSerialize, }; +use crate::config::Configuration; + +thread_local! { + /// simple counter for grabbing 'random' user agents + static USER_AGENT_CTR: RefCell = RefCell::new(0); +} + /// Given the path to a file, open the file in append mode (create it if it doesn't exist) and /// return a reference to the buffered file @@ -94,7 +104,7 @@ pub async fn logged_request(url: &Url, handles: Arc) -> Result, ) -> Result { log::trace!( @@ -130,7 +141,18 @@ pub async fn make_request( tx_stats ); - match client.get(url.to_owned()).send().await { + let mut request = client.get(url.to_owned()); + + if config.random_agent { + let user_agent = USER_AGENT_CTR.with(|ua_ctr| { + let mut inner = ua_ctr.borrow_mut(); + *inner += 1; + USER_AGENTS[*inner % USER_AGENTS.len()] + }); + request = request.header("User-Agent", user_agent); + } + + match request.send().await { Err(e) => { log::trace!("exit: make_request -> {}", e); From 39b2da9735be646cfe5b31e93cb1fcc6398842f6 Mon Sep 17 00:00:00 2001 From: epi Date: Tue, 12 Oct 2021 20:22:01 -0500 Subject: [PATCH 80/91] changed counter type --- src/utils.rs | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/utils.rs b/src/utils.rs index 85ee145..2adf12f 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -5,9 +5,7 @@ use reqwest::{Client, Response, StatusCode, Url}; #[cfg(not(target_os = "windows"))] use rlimit::{getrlimit, setrlimit, Resource}; use std::{ - thread_local, fs, - cell::RefCell, io::{self, BufWriter, Write}, sync::Arc, time::Duration, @@ -29,10 +27,9 @@ use crate::{ }; use crate::config::Configuration; -thread_local! { - /// simple counter for grabbing 'random' user agents - static USER_AGENT_CTR: RefCell = RefCell::new(0); -} +/// simple counter for grabbing 'random' user agents +static mut USER_AGENT_CTR: usize = 0; + /// Given the path to a file, open the file in append mode (create it if it doesn't exist) and @@ -144,11 +141,13 @@ pub async fn make_request( let mut request = client.get(url.to_owned()); if config.random_agent { - let user_agent = USER_AGENT_CTR.with(|ua_ctr| { - let mut inner = ua_ctr.borrow_mut(); - *inner += 1; - USER_AGENTS[*inner % USER_AGENTS.len()] - }); + let index = unsafe { + USER_AGENT_CTR += 1; + USER_AGENT_CTR % USER_AGENTS.len() + }; + + let user_agent = USER_AGENTS[index]; + request = request.header("User-Agent", user_agent); } From 2a4a150598d4dd5f46821886c216b7c7edf37423 Mon Sep 17 00:00:00 2001 From: epi Date: Tue, 12 Oct 2021 20:24:05 -0500 Subject: [PATCH 81/91] changed counter type --- src/utils.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/utils.rs b/src/utils.rs index 2adf12f..6ab38e9 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -13,6 +13,7 @@ use std::{ }; use tokio::sync::mpsc::UnboundedSender; +use crate::config::Configuration; use crate::{ config::OutputLevel, event_handlers::{ @@ -21,17 +22,14 @@ use crate::{ }, progress::PROGRESS_PRINTER, send_command, - USER_AGENTS, statistics::StatError::{Connection, Other, Redirection, Request, Timeout}, traits::FeroxSerialize, + USER_AGENTS, }; -use crate::config::Configuration; /// simple counter for grabbing 'random' user agents static mut USER_AGENT_CTR: usize = 0; - - /// Given the path to a file, open the file in append mode (create it if it doesn't exist) and /// return a reference to the buffered file pub fn open_file(filename: &str) -> Result> { From 3f3b24b26f31cef37ee8b0084d6a933be5729ae7 Mon Sep 17 00:00:00 2001 From: epi Date: Wed, 13 Oct 2021 06:38:26 -0500 Subject: [PATCH 82/91] reverted add-slash change in heuristics --- src/heuristics.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/heuristics.rs b/src/heuristics.rs index ec7b5c0..a0db61a 100644 --- a/src/heuristics.rs +++ b/src/heuristics.rs @@ -157,14 +157,7 @@ impl HeuristicTests { let unique_str = self.unique_string(length); - // To take care of slash when needed - let slash = if self.handles.config.add_slash { - Some("/") - } else { - None - }; - - let nonexistent_url = target.format(&unique_str, slash)?; + let nonexistent_url = target.format(&unique_str, None)?; let response = logged_request(&nonexistent_url.to_owned(), self.handles.clone()).await?; From 521d341e3633c74b57e7e510136ce14be445c423 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 13 Oct 2021 16:03:32 -0500 Subject: [PATCH 83/91] Remove unused and update make_request call --- Cargo.lock | 1 - Cargo.toml | 1 - src/extractor/tests.rs | 15 +++++++++++---- src/main.rs | 3 --- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dc46f48..596dc0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -615,7 +615,6 @@ dependencies = [ "log", "openssl", "predicates", - "rand", "regex", "reqwest", "rlimit", diff --git a/Cargo.toml b/Cargo.toml index 22ccb07..0eddae1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,6 @@ clap = "2.33" regex = "1" lazy_static = "1.4" dirs = "4.0" -rand = "0.8" [dependencies] futures = { version = "0.3"} diff --git a/src/extractor/tests.rs b/src/extractor/tests.rs index 477eb01..94b4d2f 100644 --- a/src/extractor/tests.rs +++ b/src/extractor/tests.rs @@ -211,16 +211,23 @@ async fn extractor_get_links_with_absolute_url_that_differs_from_target_domain() let mock = srv.mock(|when, then| { when.method(GET).path("/some-path"); then.status(200).body( - "\"http://defintely.not.a.thing.probably.com/homepage/assets/img/icons/handshake.svg\"", + "\"http://definitely.not.a.thing.probably.com/homepage/assets/img/icons/handshake.svg\"", ); }); let client = Client::new(); let url = Url::parse(&srv.url("/some-path")).unwrap(); + let config = Configuration::new().unwrap(); - let response = make_request(&client, &url, OutputLevel::Default, tx_stats.clone()) - .await - .unwrap(); + let response = make_request( + &client, + &url, + OutputLevel::Default, + &config, + tx_stats.clone(), + ) + .await + .unwrap(); let (handles, _rx) = Handles::for_testing(None, None); let handles = Arc::new(handles); diff --git a/src/main.rs b/src/main.rs index 56fa8a1..3fb96ea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,7 +29,6 @@ use feroxbuster::{ scan_manager::{self}, scanner, utils::{fmt_err, slugify_filename}, - USER_AGENTS, }; #[cfg(not(target_os = "windows"))] use feroxbuster::{utils::set_open_file_limit, DEFAULT_OPEN_FILE_LIMIT}; @@ -176,8 +175,6 @@ async fn wrapped_main(config: Arc) -> Result<()> { PROGRESS_BAR.join().unwrap(); }); - PROGRESS_PRINTER.println(USER_AGENTS[0]); - // spawn all event handlers, expect back a JoinHandle and a *Handle to the specific event let (stats_task, stats_handle) = StatsHandler::initialize(config.clone()); let (filters_task, filters_handle) = FiltersHandler::initialize(); From 7b3201f2f8826cce19d74f071dad18901b90c70d Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 13 Oct 2021 16:14:42 -0500 Subject: [PATCH 84/91] Fix test --- ferox-stdin-1634159598.state | 1 + src/scan_manager/tests.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 ferox-stdin-1634159598.state diff --git a/ferox-stdin-1634159598.state b/ferox-stdin-1634159598.state new file mode 100644 index 0000000..b4e824a --- /dev/null +++ b/ferox-stdin-1634159598.state @@ -0,0 +1 @@ +{"scans":[{"id":"812b1971bcde441f8b5b7c21c72e7067","url":"http://127.0.0.1:46075/","scan_type":"Directory","status":"Running","num_requests":102774},{"id":"c2e3579de1cb4f67bae2c959ea3dfc61","url":"http://127.0.0.1:32907/","scan_type":"Directory","status":"Running","num_requests":102774}],"config":{"type":"configuration","wordlist":"/tmp/.tmpusrADA/wordlist","config":"/home/dsaxton/.config/feroxbuster/ferox-config.toml","proxy":"","replay_proxy":"","target_url":"","status_codes":[200,204,301,302,307,308,401,403,405,500],"replay_codes":[200,204,301,302,307,308,401,403,405,500],"filter_status":[],"threads":50,"timeout":7,"verbosity":0,"silent":false,"quiet":false,"auto_bail":false,"auto_tune":false,"json":false,"output":"","debug_log":"","user_agent":"feroxbuster/2.4.0","random_agent":false,"redirects":false,"insecure":false,"extensions":[],"headers":{},"queries":[],"no_recursion":false,"extract_links":false,"add_slash":false,"stdin":true,"depth":4,"scan_limit":0,"parallel":0,"rate_limit":0,"filter_size":[],"filter_line_count":[],"filter_word_count":[],"filter_regex":[],"dont_filter":false,"resumed":false,"resume_from":"","save_state":true,"time_limit":"5s","filter_similar":[],"url_denylist":[]},"responses":[],"statistics":{"type":"statistics","timeouts":0,"requests":7249,"expected_per_scan":102774,"total_expected":205548,"errors":0,"successes":0,"redirects":0,"client_errors":7249,"server_errors":0,"total_scans":2,"initial_targets":0,"links_extracted":0,"status_200s":0,"status_301s":0,"status_302s":0,"status_401s":0,"status_403s":1,"status_429s":0,"status_500s":0,"status_503s":0,"status_504s":0,"status_508s":0,"wildcards_filtered":0,"responses_filtered":0,"resources_discovered":0,"url_format_errors":0,"redirection_errors":0,"connection_errors":0,"request_errors":0,"directory_scan_times":[],"total_runtime":[0.0]}} \ No newline at end of file diff --git a/src/scan_manager/tests.rs b/src/scan_manager/tests.rs index 40bfd8e..bbdab7b 100644 --- a/src/scan_manager/tests.rs +++ b/src/scan_manager/tests.rs @@ -379,7 +379,7 @@ fn feroxstates_feroxserialize_implementation() { let json_state = ferox_state.as_json().unwrap(); let expected = format!( - r#"{{"scans":[{{"id":"{}","url":"https://spiritanimal.com","scan_type":"Directory","status":"NotStarted","num_requests":0}}],"config":{{"type":"configuration","wordlist":"/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt","config":"","proxy":"","replay_proxy":"","target_url":"","status_codes":[200,204,301,302,307,308,401,403,405,500],"replay_codes":[200,204,301,302,307,308,401,403,405,500],"filter_status":[],"threads":50,"timeout":7,"verbosity":0,"silent":false,"quiet":false,"auto_bail":false,"auto_tune":false,"json":false,"output":"","debug_log":"","user_agent":"feroxbuster/{}","redirects":false,"insecure":false,"extensions":[],"headers":{{}},"queries":[],"no_recursion":false,"extract_links":false,"add_slash":false,"stdin":false,"depth":4,"scan_limit":0,"parallel":0,"rate_limit":0,"filter_size":[],"filter_line_count":[],"filter_word_count":[],"filter_regex":[],"dont_filter":false,"resumed":false,"resume_from":"","save_state":false,"time_limit":"","filter_similar":[],"url_denylist":[]}},"responses":[{{"type":"response","url":"https://nerdcore.com/css","path":"/css","wildcard":true,"status":301,"content_length":173,"line_count":10,"word_count":16,"headers":{{"server":"nginx/1.16.1"}}}}]"#, + r#"{{"scans":[{{"id":"{}","url":"https://spiritanimal.com","scan_type":"Directory","status":"NotStarted","num_requests":0}}],"config":{{"type":"configuration","wordlist":"/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt","config":"","proxy":"","replay_proxy":"","target_url":"","status_codes":[200,204,301,302,307,308,401,403,405,500],"replay_codes":[200,204,301,302,307,308,401,403,405,500],"filter_status":[],"threads":50,"timeout":7,"verbosity":0,"silent":false,"quiet":false,"auto_bail":false,"auto_tune":false,"json":false,"output":"","debug_log":"","user_agent":"feroxbuster/{}","random_agent":false,"redirects":false,"insecure":false,"extensions":[],"headers":{{}},"queries":[],"no_recursion":false,"extract_links":false,"add_slash":false,"stdin":false,"depth":4,"scan_limit":0,"parallel":0,"rate_limit":0,"filter_size":[],"filter_line_count":[],"filter_word_count":[],"filter_regex":[],"dont_filter":false,"resumed":false,"resume_from":"","save_state":false,"time_limit":"","filter_similar":[],"url_denylist":[]}},"responses":[{{"type":"response","url":"https://nerdcore.com/css","path":"/css","wildcard":true,"status":301,"content_length":173,"line_count":10,"word_count":16,"headers":{{"server":"nginx/1.16.1"}}}}]"#, saved_id, VERSION ); println!("{}\n{}", expected, json_state); From 0a3130934c4cf2035e3bd71940525ac7ad170b53 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 13 Oct 2021 16:30:20 -0500 Subject: [PATCH 85/91] Ignore --- .gitignore | 1 + ferox-stdin-1634159598.state | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 ferox-stdin-1634159598.state diff --git a/.gitignore b/.gitignore index a6b9e1e..31567f9 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ lcov_cobertura.py # state file created during tests ferox-http* +ferox-stdin* # python stuff cuz reasons Pipfile* diff --git a/ferox-stdin-1634159598.state b/ferox-stdin-1634159598.state deleted file mode 100644 index b4e824a..0000000 --- a/ferox-stdin-1634159598.state +++ /dev/null @@ -1 +0,0 @@ -{"scans":[{"id":"812b1971bcde441f8b5b7c21c72e7067","url":"http://127.0.0.1:46075/","scan_type":"Directory","status":"Running","num_requests":102774},{"id":"c2e3579de1cb4f67bae2c959ea3dfc61","url":"http://127.0.0.1:32907/","scan_type":"Directory","status":"Running","num_requests":102774}],"config":{"type":"configuration","wordlist":"/tmp/.tmpusrADA/wordlist","config":"/home/dsaxton/.config/feroxbuster/ferox-config.toml","proxy":"","replay_proxy":"","target_url":"","status_codes":[200,204,301,302,307,308,401,403,405,500],"replay_codes":[200,204,301,302,307,308,401,403,405,500],"filter_status":[],"threads":50,"timeout":7,"verbosity":0,"silent":false,"quiet":false,"auto_bail":false,"auto_tune":false,"json":false,"output":"","debug_log":"","user_agent":"feroxbuster/2.4.0","random_agent":false,"redirects":false,"insecure":false,"extensions":[],"headers":{},"queries":[],"no_recursion":false,"extract_links":false,"add_slash":false,"stdin":true,"depth":4,"scan_limit":0,"parallel":0,"rate_limit":0,"filter_size":[],"filter_line_count":[],"filter_word_count":[],"filter_regex":[],"dont_filter":false,"resumed":false,"resume_from":"","save_state":true,"time_limit":"5s","filter_similar":[],"url_denylist":[]},"responses":[],"statistics":{"type":"statistics","timeouts":0,"requests":7249,"expected_per_scan":102774,"total_expected":205548,"errors":0,"successes":0,"redirects":0,"client_errors":7249,"server_errors":0,"total_scans":2,"initial_targets":0,"links_extracted":0,"status_200s":0,"status_301s":0,"status_302s":0,"status_401s":0,"status_403s":1,"status_429s":0,"status_500s":0,"status_503s":0,"status_504s":0,"status_508s":0,"wildcards_filtered":0,"responses_filtered":0,"resources_discovered":0,"url_format_errors":0,"redirection_errors":0,"connection_errors":0,"request_errors":0,"directory_scan_times":[],"total_runtime":[0.0]}} \ No newline at end of file From b8bfbb09f3ba5ec3913214c52c585e5d6f0f24e2 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 13 Oct 2021 16:32:39 -0500 Subject: [PATCH 86/91] Oops --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 31567f9..cfcc7f9 100644 --- a/.gitignore +++ b/.gitignore @@ -23,8 +23,7 @@ lcov_cobertura.py .dockerignore # state file created during tests -ferox-http* -ferox-stdin* +ferox-*.state # python stuff cuz reasons Pipfile* From 19cd5c910a1acc446b7d7fa5bf65690ea3da3e0c Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 13 Oct 2021 20:08:28 -0500 Subject: [PATCH 87/91] Try a test refactor --- src/scan_manager/tests.rs | 79 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/src/scan_manager/tests.rs b/src/scan_manager/tests.rs index bbdab7b..93fa9c0 100644 --- a/src/scan_manager/tests.rs +++ b/src/scan_manager/tests.rs @@ -378,12 +378,79 @@ fn feroxstates_feroxserialize_implementation() { assert!(expected_strs.eval(&ferox_state.as_str())); let json_state = ferox_state.as_json().unwrap(); - let expected = format!( - r#"{{"scans":[{{"id":"{}","url":"https://spiritanimal.com","scan_type":"Directory","status":"NotStarted","num_requests":0}}],"config":{{"type":"configuration","wordlist":"/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt","config":"","proxy":"","replay_proxy":"","target_url":"","status_codes":[200,204,301,302,307,308,401,403,405,500],"replay_codes":[200,204,301,302,307,308,401,403,405,500],"filter_status":[],"threads":50,"timeout":7,"verbosity":0,"silent":false,"quiet":false,"auto_bail":false,"auto_tune":false,"json":false,"output":"","debug_log":"","user_agent":"feroxbuster/{}","random_agent":false,"redirects":false,"insecure":false,"extensions":[],"headers":{{}},"queries":[],"no_recursion":false,"extract_links":false,"add_slash":false,"stdin":false,"depth":4,"scan_limit":0,"parallel":0,"rate_limit":0,"filter_size":[],"filter_line_count":[],"filter_word_count":[],"filter_regex":[],"dont_filter":false,"resumed":false,"resume_from":"","save_state":false,"time_limit":"","filter_similar":[],"url_denylist":[]}},"responses":[{{"type":"response","url":"https://nerdcore.com/css","path":"/css","wildcard":true,"status":301,"content_length":173,"line_count":10,"word_count":16,"headers":{{"server":"nginx/1.16.1"}}}}]"#, - saved_id, VERSION - ); - println!("{}\n{}", expected, json_state); - assert!(predicates::str::contains(expected).eval(&json_state)); + for expected in [ + r#""scans""#, + &format!(r#""id":"{}""#, saved_id), + r#""url":"https://spiritanimal.com""#, + r#""scan_type":"Directory""#, + r#""status":"NotStarted""#, + r#""num_requests":0"#, + r#""config""#, + r#""type":"configuration""#, + r#""wordlist":"/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt""#, + r#""config""#, + r#""proxy":"""#, + r#""replay_proxy":"""#, + r#""target_url":"""#, + r#""status_codes":[200,204,301,302,307,308,401,403,405,500]"#, + r#""replay_codes":[200,204,301,302,307,308,401,403,405,500]"#, + r#""filter_status":[]"#, + r#""threads":50"#, + r#""timeout":7"#, + r#""verbosity":0"#, + r#""silent":false"#, + r#""quiet":false"#, + r#""auto_bail":false"#, + r#""auto_tune":false"#, + r#""json":false"#, + r#""output":"""#, + r#""debug_log":"""#, + &format!(r#""user_agent":"feroxbuster/{}""#, VERSION), + r#""random_agent":false"#, + r#""redirects":false"#, + r#""insecure":false"#, + r#""extensions":[]"#, + r#""headers""#, + r#""queries":[]"#, + r#""no_recursion":false"#, + r#""extract_links":false"#, + r#""add_slash":false"#, + r#""stdin":false"#, + r#""depth":4"#, + r#""scan_limit":0"#, + r#""parallel":0"#, + r#""rate_limit":0"#, + r#""filter_size":[]"#, + r#""filter_line_count":[]"#, + r#""filter_word_count":[]"#, + r#""filter_regex":[]"#, + r#""dont_filter":false"#, + r#""resumed":false"#, + r#""resume_from":"""#, + r#""save_state":false"#, + r#""time_limit":"""#, + r#""filter_similar":[]"#, + r#""url_denylist":["#, + r#""responses""#, + r#""type":"response""#, + r#""url":"https://nerdcore.com/css""#, + r#""path":"/css""#, + r#""wildcard":true"#, + r#""status":301"#, + r#""content_length":173"#, + r#""line_count":10"#, + r#""word_count":16"#, + r#""headers""#, + r#""server":"nginx/1.16.1"#, + ] + .iter() + { + assert!( + predicates::str::contains(*expected).eval(&json_state), + "{}", + expected + ) + } } #[should_panic] From 3536587260358d6cabf8f1a68edaaa283434f321 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 13 Oct 2021 20:11:02 -0500 Subject: [PATCH 88/91] Update banner --- src/banner/container.rs | 2 +- tests/test_banner.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/banner/container.rs b/src/banner/container.rs index 92d35cf..9d8ec12 100644 --- a/src/banner/container.rs +++ b/src/banner/container.rs @@ -279,7 +279,7 @@ impl Banner { let wordlist = BannerEntry::new("📖", "Wordlist", &config.wordlist); let timeout = BannerEntry::new("💥", "Timeout (secs)", &config.timeout.to_string()); let user_agent = BannerEntry::new("🦡", "User-Agent", &config.user_agent); - let random_agent = BannerEntry::new("🦡", "User-Agent", "(Random)"); + let random_agent = BannerEntry::new("🦡", "User-Agent", "Random"); let extract_links = BannerEntry::new("🔎", "Extract Links", &config.extract_links.to_string()); let json = BannerEntry::new("🧔", "JSON Output", &config.json.to_string()); diff --git a/tests/test_banner.rs b/tests/test_banner.rs index 1f4b373..bcfbc56 100644 --- a/tests/test_banner.rs +++ b/tests/test_banner.rs @@ -163,7 +163,7 @@ fn banner_prints_random_agent() { .and(predicate::str::contains("Status Codes")) .and(predicate::str::contains("Timeout (secs)")) .and(predicate::str::contains("User-Agent")) - .and(predicate::str::contains("(Random)")) + .and(predicate::str::contains("Random")) .and(predicate::str::contains("─┴─")), ); } From 1e3cd3a2091917565a77fe3b114ed575b9aba9df Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Wed, 13 Oct 2021 20:12:43 -0500 Subject: [PATCH 89/91] Doc --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index 7d21910..fc8ead6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -91,6 +91,7 @@ pub const DEFAULT_STATUS_CODES: [StatusCode; 10] = [ /// /// Expected location is in the same directory as the feroxbuster binary. pub const DEFAULT_CONFIG_NAME: &str = "ferox-config.toml"; +/// User agents to select from when random agent is being used pub const USER_AGENTS: [&str; 12] = [ "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36", "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1", From 9c50038a25245236792e71375f65dc14b20977f9 Mon Sep 17 00:00:00 2001 From: Daniel Saxton Date: Thu, 14 Oct 2021 15:15:32 -0500 Subject: [PATCH 90/91] Nit --- src/scan_manager/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scan_manager/tests.rs b/src/scan_manager/tests.rs index 93fa9c0..613e94e 100644 --- a/src/scan_manager/tests.rs +++ b/src/scan_manager/tests.rs @@ -430,7 +430,7 @@ fn feroxstates_feroxserialize_implementation() { r#""save_state":false"#, r#""time_limit":"""#, r#""filter_similar":[]"#, - r#""url_denylist":["#, + r#""url_denylist":[]"#, r#""responses""#, r#""type":"response""#, r#""url":"https://nerdcore.com/css""#, From 8116018b8b13023e464a8f39f9965e46a39417f8 Mon Sep 17 00:00:00 2001 From: epi Date: Fri, 15 Oct 2021 16:16:13 -0500 Subject: [PATCH 91/91] reverted the revert --- src/heuristics.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/heuristics.rs b/src/heuristics.rs index a0db61a..ec7b5c0 100644 --- a/src/heuristics.rs +++ b/src/heuristics.rs @@ -157,7 +157,14 @@ impl HeuristicTests { let unique_str = self.unique_string(length); - let nonexistent_url = target.format(&unique_str, None)?; + // To take care of slash when needed + let slash = if self.handles.config.add_slash { + Some("/") + } else { + None + }; + + let nonexistent_url = target.format(&unique_str, slash)?; let response = logged_request(&nonexistent_url.to_owned(), self.handles.clone()).await?;