added a function to info_controls that parses

GatherContacts output and prints them to the
console as well as saves them to both a text file
in the /pentest/working directory as well as your
notes in a password_enumeration.md file.
This commit is contained in:
pyro57000
2025-04-08 12:48:07 -05:00
parent 649dad5e79
commit 012ba517ab
3 changed files with 121 additions and 6 deletions

View File

@@ -1,6 +1,8 @@
use std::collections::HashMap;
use std::fs;
use std::fs::read_to_string;
use std::fs::OpenOptions;
use std::hash::Hash;
use std::io::BufReader;
use std::io::Write;
use std::path::PathBuf;
@@ -10,6 +12,8 @@ use std::thread;
use std::time::Duration;
use std::io::stdin;
use std::thread::JoinHandle;
use chrono::format;
use reqwest::dns::Name;
use walkdir::WalkDir;
use clearscreen::clear;
use clearscreen;
@@ -775,4 +779,114 @@ pub fn get_mssql_column_names(project: &Project) -> Option<JoinHandle<()>>{
}
});
return Some(db_handle);
}
pub fn partse_gathercontacts(project: &Project){
fn format_names(names: Vec<&str>) -> HashMap<&str, Vec<String>>{
let mut formated_data = HashMap::new();
let mut flast = Vec::new();
let mut fdotlast = Vec::new();
let mut fdashlast = Vec::new();
let mut firstl = Vec::new();
let mut firstdotlast = Vec::new();
let mut firstlast = Vec::new();
let mut last_vec = Vec::new();
let mut first_vec = Vec::new();
for name in names{
let name_vec: Vec<&str> = name.split("|").collect();
if name_vec.len() == 2{
let first = name_vec[0];
let last = name_vec[1];
let first_chars: Vec<char> = first.chars().collect();
let last_chars: Vec<char> = last.chars().collect();
flast.push(format!("{}{}", &first_chars[0], &last));
fdotlast.push(format!("{}.{}", &first_chars[0], &last));
fdashlast.push(format!("{}-{}", &first, &last));
firstl.push(format!("{}{}", &first, &last_chars[0]));
firstdotlast.push(format!("{}.{}", &first, &last));
firstlast.push(format!("{}{}", &first, &last));
last_vec.push(format!("{}", &last));
first_vec.push(format!("{}", &first));
}
}
formated_data.insert("flast", flast);
formated_data.insert("fdotlast", fdotlast);
formated_data.insert("fdashlast", fdashlast);
formated_data.insert("firstl", firstl);
formated_data.insert("firstdotlast", firstdotlast);
formated_data.insert("firstlast", firstlast);
formated_data.insert("last", last_vec);
formated_data.insert("fisrt", first_vec);
return formated_data;
}
let gather_file = get_user_input("path to your gather contacts output?");
print!("
supported formats:
flast
f.last
f-last
firstl
first.last
firstlast
last
\n");
let format = get_user_input("format of usernames?");
let domain = get_user_input("domain name?");
let gather_source = fs::read_to_string(gather_file);
if gather_source.is_err(){
let error = gather_source.err().unwrap();
println!("error reading gather contacts output!");
println!("{}", error);
return;
}
let gather_source_string = gather_source.unwrap();
let gather_source_lines: Vec<&str> = gather_source_string.split("\n").collect();
let mut names = String::new();
for line in gather_source_lines{
if line.len() > 2{
let line_vec: Vec<&str> = line.split("\t").collect();
let first = line_vec[1].trim();
let last = line_vec[2].trim();
if first.len() > 1 && last.len() >1 {
let name = format!("{}|{}",first, last);
names = format!("{} {}", names, name.trim());
}
}
}
let users: Vec<&str> = names.split(" ").collect();
let data = format_names(users);
let mut email_text_path = project.files_folder.clone();
let mut email_note_path = project.notes_folder.clone();
email_text_path.push("working/extrapolated_emails.txt");
email_note_path.push("email_enum.md");
let email_text_res = OpenOptions::new().append(true).create(true).open(email_text_path);
if email_text_res.is_err(){
let error = email_text_res.err().unwrap();
println!("error opening email text file!");
println!("{}", error);
return;
}
let email_notes_res = OpenOptions::new().append(true).create(true).open(email_note_path);
if email_notes_res.is_err(){
let error = email_notes_res.err().unwrap();
println!("error opeing email notes file!");
println!("{}", error);
return;
}
let mut email_text_file = email_text_res.unwrap();
let mut email_note_file = email_notes_res.unwrap();
let note_wriet_res = write!(email_note_file, "# Extrapolated Emails: \n");
if note_wriet_res.is_err(){
let error = note_wriet_res.err().unwrap();
println!("error writing to email notes file!");
println!("{}", error);
}
println!("data gathered, printing emails and saving files...\n\n");
for email in &data[&format.to_lowercase().trim()]{
let outline = format!("{}@{}", email, domain);
println!("{}", &outline);
write!(email_note_file, "{}\n", outline).expect("error writing email notes file!");
write!(email_text_file, "{}\n", outline).expect("error writing email text file!");
}
}

View File

@@ -98,7 +98,7 @@ pub fn main_menu(mut projects: Vec<Project>, config_path: PathBuf, base_files: &
NOTE OPTION 26 WILL SAVE YOUR PROJECTS BEFORE QUITTING
NOTE OPTION 27 WILL SAVE YOUR PROJECTS BEFORE QUITTING
base prject folder: {}
upcoming project folder: {}
@@ -135,8 +135,9 @@ Year: {}
22.) Password Spray (will print password to spray, and wait the obervation window time)
23.) crack password hashes on your cracking rig
24.) Launch bloodhound with the current project's distrobox
25.) prune unused distroboxes (free up system storage)
26.) Quit Application
25.) Parse GatherContacts output file
26.) prune unused distroboxes (free up system storage)
27.) Quit Application
\n",&base_files.display(), &upcoming_files.display(), active_project.customer, active_project.project_name, active_project.files_folder.display(), active_project.notes_folder.display(), active_project.boxname, terminal, season, year);
std::io::stdin().read_line(&mut response).expect("error getting menu input");
clear().expect("error clearing screen");
@@ -168,8 +169,9 @@ Year: {}
"22" => info_controls::password_spray_help(&active_project, season, lseason, year, &tools_dir, &config_path),
"23" => info_controls::crack_hashes(&cracking_rig, &active_project, &terminal, &rockyou, &rule),
"24" => {let bloodhound_handle = box_controls::launch_bloodhound_gui(active_project.clone()).unwrap(); threads.push(bloodhound_handle);},
"25" => {let prune_thread = box_controls::clean_unused_boxes(&projects, &boxtemplate); if prune_thread.is_some(){threads.push(prune_thread.unwrap());}},
"26" => {project_controls::save_projects(&projects, &config_path);
"25" => info_controls::partse_gathercontacts(&active_project),
"26" => {let prune_thread = box_controls::clean_unused_boxes(&projects, &boxtemplate); if prune_thread.is_some(){threads.push(prune_thread.unwrap());}},
"27" => {project_controls::save_projects(&projects, &config_path);
let mut stop = String::new();
println!("stop all boxes?\ny/n");
std::io::stdin().read_line(&mut stop).unwrap();

View File

@@ -9,7 +9,6 @@ use std::thread;
use std::time::Duration;
use std::str::FromStr;
use crate::get_user_input;
use fs_extra::file;
use crate::Project;
use crate::box_controls::make_box;