-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.rs
144 lines (109 loc) · 3.96 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
use itertools::Itertools;
use clap::Parser;
use dotenv::dotenv;
mod alienvault;
mod anubis;
mod crtsh;
mod hackertarget;
mod threatminer;
mod structs;
mod utils;
mod files;
#[derive(Parser, Debug)]
#[command(author, version, about)]
pub struct Arguments {
#[arg(short, long, env("TARGET_URL"), default_value = "https://hackthissite.org/")]
pub target_url: String,
#[arg(short, long, env("OUTPUT_FILE"))]
pub output_file: Option<String>
}
impl Arguments {
pub fn from_env_and_args() -> Self{
dotenv().ok();
Self::parse()
}
}
/// Prints the opening title of darkscout
fn print_opening() {
let s = format!(
"{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}",
r#" _____ _ _____ _ "#,
r#" | __ \ | | / ____| | | "#,
r#" | | | | __ _ _ __| | _| (___ ___ ___ _ _| |_ "#,
r#" | | | |/ _` | '__| |/ /\___ \ / __/ _ \| | | | __| "#,
r#" | |__| | (_| | | | < ____) | (_| (_) | |_| | |_ "#,
r#" |_____/ \__,_|_| |_|\_\_____/ \___\___/ \__,_|\__| "#,
r#" "#,
r#" A Simple, Modern Subdomain Enumerator Written In Rust "#,
);
println!("{}", s);
println!();
let info = format!(
"{}\n{}\n{}\n{}",
r#"*****************************************************"#,
r#"| https://github.com/DarkSuite/DarkScout |"#,
r#"| Welcome To The Dark Side... |"#,
r#"*****************************************************"#
);
println!("{}", info);
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
print_opening();
let start = std::time::Instant::now();
let raw_target = Arguments::from_env_and_args().target_url;
let cleaned_target = utils::sanitize_target_url_string(raw_target);
println!("\n[darkscout]> Starting subdomain enumeration...\n");
println!("[darkscout]> Be patient as this can take a while!\n");
println!("|***************************************************|\n");
let (
alienvault,
anubis,
crtsh,
hackertarget,
threatminer
) = futures::join!(
alienvault::get_alienvault_subdomains(&cleaned_target),
anubis::get_anubis_subdomains(&cleaned_target),
crtsh::get_crt_domains(&cleaned_target),
hackertarget::get_hackertarget_domains(&cleaned_target),
threatminer::get_threatminer_subdomains(&cleaned_target),
);
let duration = start.elapsed();
let subdomains: Vec<_> = alienvault
.iter()
.flatten()
.chain(anubis.iter().flatten())
.chain(crtsh.iter().flatten())
.chain(hackertarget.iter().flatten())
.chain(threatminer.iter().flatten())
.unique_by(|s| &s.url)
.collect();
let total = subdomains.len();
let sub_clone = subdomains.clone();
println!("\n");
println!("[darkscout]> Here are your domains...\n");
println!("|***************************************************|\n");
for sub in subdomains.into_iter() {
println!("{}", sub.url);
}
if let Some(output_file) = Arguments::from_env_and_args().output_file {
// do something with the output_file argument
files::create_output_dir()?;
files::create_output_file(&output_file, &sub_clone)?;
println!("\n[darkscout]> Output successfully writen.");
println!("\n|***************************************************|");
println!(
"\n[darkscout]> Successfully scraped {} subdomains from {} in {:?}",
total, cleaned_target, duration
);
} else {
println!("\n|***************************************************|");
println!(
"\n[darkscout]> Successfully scraped {} subdomains from {} in {:?}",
total, cleaned_target, duration
);
println!();
};
Ok(())
}