From 92dd9766b841d727ea1fc67b97669726f2338dad Mon Sep 17 00:00:00 2001 From: pyro57000 Date: Tue, 22 Apr 2025 12:10:45 -0500 Subject: [PATCH] refactored for CLI!!! --- pentest_tool/src/cli.rs | 158 +++++++++++++++++++++++++++ pentest_tool/src/info_controls.rs | 2 - pentest_tool/src/main.rs | 3 +- pentest_tool/src/menu.rs | 94 ++++++++-------- pentest_tool/src/project_controls.rs | 13 ++- 5 files changed, 214 insertions(+), 56 deletions(-) create mode 100644 pentest_tool/src/cli.rs diff --git a/pentest_tool/src/cli.rs b/pentest_tool/src/cli.rs new file mode 100644 index 0000000..d57dad1 --- /dev/null +++ b/pentest_tool/src/cli.rs @@ -0,0 +1,158 @@ +use std::path::PathBuf; +use std::process::exit; +use std::thread::JoinHandle; +use chrono::Datelike; +use clearscreen::clear; +use clearscreen; +use chrono::Local; +use crate::Project; +use crate::project_controls; +use crate::box_controls; +use crate::info_controls; +use crate::start_pentest; +use crate::get_user_input; +use crate::menu; + + +fn help(command: Option){ + if command.is_none(){ + println!("Welcom to Pyro's pentest command line!"); + println!("available commands: name | aliases | ..."); + print!(" +list projects | lp | listp | list p +switch project | sp | switch p | switchp +show active project | show active | sa | show a +create new project | cnp | new project | np +save projects | sp | save | s +import project | ip | import +remove project | rp | remove | rmp +show upcoming project | sup | show upcoming +promote project | pp | promote +new terminal | enter | enter terminal | nt | et +inline terminal | it | enter inline | ei +cobalt strike | cs +recreate distrobox | rdb | ndb | new distrobox +generate userpass | userpass | gup | up +inital enum | ie | enum +host discovery | build host discovery | hd | bhd +port scan | cs port scan | cobaltstrike port scan | csps | ps +parse port scan | pps | parse scan +stop boxes | stop distroboxes | sdb +password spray | pass spray | pas +bloodhound | bh +parse gather contacts | pgc | parse contacts | pc +prune distroboxes | pdb | prune +help | ? | -h +") + } +} + +pub fn run_command(cmd: String, + mut projects: Vec, + config_path: PathBuf, + base_files: &PathBuf, + base_notes: &PathBuf, + tools_dir: &PathBuf, + boxtemplate: String, + terminal: String, + cracking_rig: String, + rockyou: String, + rule: String, + upcoming_files: &PathBuf, + upcoming_notes: &PathBuf, + password_spray_file: &PathBuf, + fingerprint: bool, + vault_name: String) -> Option> { + let mut new_id = menu::next_project_id(&config_path); + let active_project = menu::get_active_project(&projects); + let mut notes_folder_string = format!("{}", &active_project.notes_folder.display()); + let mut obsidian_folder_vec = PathBuf::new(); + let mut reached_vault_folder = false; + for folder in notes_folder_string.split("/").collect::>(){ + if !folder.contains(&vault_name){ + reached_vault_folder = true; + obsidian_folder_vec.push(folder); + } + else{ + if reached_vault_folder{ + obsidian_folder_vec.push(folder); + } + } + } + let obsidian_uri = format!("obsidian://open?vault={}&file={}", vault_name, obsidian_folder_vec.display().to_string().replace("/", "%2F")); + let mut response = String::new(); + let now = Local::now(); + let month = now.month(); + let year = now.year(); + let mut season = String::new(); + let mut lseason = String::new(); + match month{ + 12 | 01 | 02 => {season = "Winter".to_owned(); lseason = "Fall".to_owned()}, + 03 | 04 | 05 => {season = "Spring".to_owned(); lseason = "Winter".to_owned()}, + 06 | 07 | 08 => {season = "Summer".to_owned(); lseason = "Spring".to_owned()}, + 09 | 10 | 11 => {season = "Fall".to_owned(); lseason = "Summer".to_owned()}, + _ => {println!("error getting season! Check code..."); exit(1)} + } + match cmd.as_str(){ + "list projects" | "lp" | "listp" | "list p" => {project_controls::list_projects(&projects); return None}, + "switch project" | "swp" | "switch p" | "switchp" => {project_controls::switch_project(&mut projects.clone()); return None}, + "show active project" | "show active" | "sa" | "show a" => {println!("\nclient: {}\n\nproject: {}\n\nbox: {}\n\nproject files: {}\n\nproject notes: {}\n", active_project.customer ,active_project.project_name, active_project.boxname, active_project.files_folder.display(), active_project.notes_folder.display()); return None}, + "create new project" | "cnp" | "new project" | "np" => {new_id = new_id + 1; start_pentest::start_pentest(&config_path, &mut projects, new_id, upcoming_files, upcoming_notes, &boxtemplate, password_spray_file); return None}, + "save projects" | "sp" | "save" | "s" => {project_controls::save_projects(&projects, &config_path); return None}, + "import project" | "ip" | "import" => {new_id = new_id + 1; project_controls::new_project(&mut projects, &base_files, &base_notes, &tools_dir, &boxtemplate, &config_path, new_id, &upcoming_files, &upcoming_notes, fingerprint); return None}, + "remove project" | "rp" | "remove" | "rmp" => {project_controls::remove_project(&mut projects, &config_path); return None}, + "show upcoming projects" | "sup" | "show upcoming" => {project_controls::print_upcoming_projects(&projects); return None}, + "promote project" | "pp" | "promote" => {project_controls::promote_project(&mut projects, &config_path, base_files, base_notes, tools_dir, &boxtemplate, fingerprint); return None}, + "new terminal" | "enter" | "enter terminal" | "nt" | "et" => {box_controls::project_standalone_terminal(active_project.clone(), terminal.clone()); return None}, + "inline terminal" | "it" | "enter inline" | "ei" => {box_controls::project_inline_terminal(active_project.clone()); return None}, + "cobalt strike" | "cs" => {let cs_thread = box_controls::launch_cobalt_strike(active_project.clone()); return cs_thread}, + "recreate distrobox" | "rdb" | "ndb" | "new distrobox" => {box_controls::make_box(&active_project, &tools_dir, &boxtemplate, false, fingerprint); return None}, + "generate userpass" | "userpass" | "gup" | "up" => {info_controls::generate_userpass(&active_project); return None}, + "inital enum" | "ie" | "enum" => {info_controls::run_initial_enum(&active_project); return None}, + "build attack notes" | "ban" | "attack notes" | "hn" => {info_controls::build_cmd_for_host_discovery(&active_project); return None;} + "host discovery" | "build host discovery" | "hd" | "bhd" => {info_controls::build_cmd_for_host_discovery(&active_project); return None}, + "port scan" | "cs port scan" | "cobaltstrike port scan" | "csps" | "ps" => {info_controls::build_cs_portscan_cmd(&active_project); return None}, + "parse port scan" | "pps" | "parse scan" => {info_controls::parse_csportscan(&active_project); return None}, + "stop boxes" | "stop distroboxes" | "sdb" => {box_controls::stop_all_boxes(&projects); return None}, + "password spray" | "pass spray" | "pas" => {info_controls::password_spray_help(&active_project, season, lseason, year, &tools_dir, &config_path); return None}, + "bloodhound" | "bh" => {let bloodhound_handle = box_controls::launch_bloodhound_gui(active_project.clone()).unwrap(); return Some(bloodhound_handle);}, + "parse gather contacts" | "pgc" | "parse contacts" | "pc" => {info_controls::partse_gathercontacts(&active_project); return None}, + "prune distroboxes" | "pdb" | "prune" => {let prune_thread = box_controls::clean_unused_boxes(&projects, &boxtemplate); return prune_thread}, + _ => {println!("unknown command."); return None;} + } +} + +pub fn cli(interactive: bool, + projects: Vec, + config_path: PathBuf, + base_files: &PathBuf, + base_notes: &PathBuf, + tools_dir: &PathBuf, + boxtemplate: String, + terminal: String, + cracking_rig: String, + rockyou: String, + rule: String, + upcoming_files: &PathBuf, + upcoming_notes: &PathBuf, + password_spray_file: &PathBuf, + fingerprint: bool, + vault_name: String) -> Option>>{ + let mut threads = Vec::new(); + if interactive{ + let mut loopize = true; + while loopize{ + let command = get_user_input("command?"); + match command.as_str(){ + "exit" | "main menu" | "mm" | "menu" => loopize = false, + _ => {let thread_option = run_command(command, projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if thread_option.is_some(){threads.push(thread_option.unwrap())}}, + } + } + } + if threads.len() > 0{ + return Some(threads); + } + else { + return None; + } +} \ No newline at end of file diff --git a/pentest_tool/src/info_controls.rs b/pentest_tool/src/info_controls.rs index a101fa5..849c4c6 100644 --- a/pentest_tool/src/info_controls.rs +++ b/pentest_tool/src/info_controls.rs @@ -97,7 +97,6 @@ pub fn run_initial_enum(project: &Project){ for port in target.ports{ output.push_str(format!("| {} | | [[attacks]]\n", port).as_str()); } - output.push_str("\n---\n"); output.push_str("\n"); write!(&host_notes, "{}", output).expect("error writing host_notes"); println!("{} notes written!", target.address); @@ -179,7 +178,6 @@ pub fn build_external_attack_notes(project: &Project){ } } - pub fn build_cmd_for_host_discovery(project: &Project){ let mut cobalt_strike_response = String::new(); let mut need_shell = false; diff --git a/pentest_tool/src/main.rs b/pentest_tool/src/main.rs index 154bf49..c0cbadb 100644 --- a/pentest_tool/src/main.rs +++ b/pentest_tool/src/main.rs @@ -22,6 +22,7 @@ mod project_controls; mod box_controls; mod info_controls; mod start_pentest; +mod cli; pub fn open_overwrite(path: &PathBuf) -> Option{ let file_create_res = fs::OpenOptions::new().create(true).write(true).open(path); @@ -158,7 +159,7 @@ fn main() { upcoming project notes: {} ", &project_base_folder.display(), &project_base_notes.display(), &tools_folder.display(), box_template, terminal_command, cracking_rig, &upcoming_files.display(), &upcoming_notes.display()); println!("loading project configs..."); - let projects = project_controls::get_projects(&config_path); + let projects = project_controls::get_projects(&config_path, true); println!("Enter to start main menu"); let mut enter = String::new(); std::io::stdin().read_line(&mut enter).unwrap(); diff --git a/pentest_tool/src/menu.rs b/pentest_tool/src/menu.rs index 8fa920f..839514a 100644 --- a/pentest_tool/src/menu.rs +++ b/pentest_tool/src/menu.rs @@ -9,9 +9,10 @@ use crate::project_controls; use crate::box_controls; use crate::info_controls; use crate::start_pentest; +use crate::cli; -fn next_project_id(config_path: &PathBuf) -> i32{ - let projects = project_controls::get_projects(config_path); +pub fn next_project_id(config_path: &PathBuf) -> i32{ + let projects = project_controls::get_projects(config_path, false); let mut new_id = 0; for project in projects.clone(){ if project.id > new_id{ @@ -21,7 +22,7 @@ fn next_project_id(config_path: &PathBuf) -> i32{ return new_id; } -fn get_active_project(projects: &Vec) -> &Project{ +pub fn get_active_project(projects: &Vec) -> &Project{ let mut active_project = &projects[0]; for project in projects{ if project.active == true{ @@ -140,58 +141,49 @@ General Notes: {} 11.) Open A Terminal In this windows for the current active project 12.) open current project's cobalt strike 13.) re-create the distrobox for the current active project - 14.) Open Project Files Folder In Dolphin - 15.) Open Project Notes Folder In Dolphin - 16.) generate userpass file from your obsidian notes - 17.) run pyro's initail enum script on a nessus csv for the current project - 18.) build external attack notes from host_notes - 19.) Print Project Info For Report - 20.) Build host discovery cmd command from scope in notes - 21.) build portscan command from scope in notes - 22.) parse a cs portscan services.tsv file - 23.) Stop All Distroboxes - 24.) Password Spray (will print password to spray, and wait the obervation window time) - 25.) crack password hashes on your cracking rig - 26.) Launch bloodhound with the current project's distrobox - 27.) Parse GatherContacts output file - 28.) prune unused distroboxes (free up system storage) - 29.) Quit Application + 14.) generate userpass file from your obsidian notes + 15.) run pyro's initail enum script on a nessus csv for the current project + 16.) build external attack notes from host notes + 17.) Build host discovery cmd command from scope in notes + 18.) build portscan command from scope in notes + 19.) parse a cs portscan services.tsv file + 20.) Stop All Distroboxes + 21.) Password Spray (will print password to spray, and wait the obervation window time) + 22.) Launch bloodhound with the current project's distrobox + 23.) Parse GatherContacts output file + 24.) prune unused distroboxes (free up system storage) + 25.) enter cli + 26.) 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, &obsidian_uri); std::io::stdin().read_line(&mut response).expect("error getting menu input"); clear().expect("error clearing screen"); match response.as_str().trim_end(){ - "1" => println!("\nclient: {}\n\nproject: {}\n\nbox: {}\n\nproject files: {}\n\nproject notes: {}\n", active_project.customer ,active_project.project_name, active_project.boxname, active_project.files_folder.display(), active_project.notes_folder.display()), - "2" => {println!("+++++++++++++++++++++"); - for project in &projects{ - println!("++Customer: {}|Project name: {}|Stage: {}++",project.customer ,project.project_name, project.stage)} - println!("++++++++++++++++++++")}, - "3" => project_controls::switch_project(&mut projects), - "4" => {new_id = new_id + 1; start_pentest::start_pentest(&config_path, &mut projects, new_id, upcoming_files, upcoming_notes, &boxtemplate, password_spray_file)}, - "5" => project_controls::save_projects(&projects, &config_path), - "6" => {new_id = new_id + 1; project_controls::new_project(&mut projects, &base_files, &base_notes, &tools_dir, &boxtemplate, &config_path, new_id, &upcoming_files, &upcoming_notes, fingerprint)}, - "7" => project_controls::remove_project(&mut projects, &config_path), - "8" => project_controls::print_upcoming_projects(&projects), - "9" => project_controls::promote_project(&mut projects, &config_path, base_files, base_notes, tools_dir, &boxtemplate, fingerprint), - "10" => box_controls::project_standalone_terminal(active_project.clone(), terminal.clone()), - "11" => box_controls::project_inline_terminal(active_project.clone()), - "12" => {let cs_thread = box_controls::launch_cobalt_strike(active_project.clone()); if cs_thread.is_some(){threads.push(cs_thread.unwrap());}}, - "13" => box_controls::make_box(&active_project, &tools_dir, &boxtemplate, false, fingerprint), - "14" => info_controls::open_in_dolphin("files", active_project.clone()), - "15" => info_controls::open_in_dolphin("notes", active_project.clone()), - "16" => info_controls::generate_userpass(&active_project), - "17" => info_controls::run_initial_enum(&active_project), - "18" => info_controls::build_external_attack_notes(&active_project), - "19" => info_controls::print_report_information(active_project.clone()), - "20" => info_controls::build_cmd_for_host_discovery(&active_project), - "21" => info_controls::build_cs_portscan_cmd(&active_project), - "22" => info_controls::parse_csportscan(&active_project), - "23" => box_controls::stop_all_boxes(&projects), - "24" => info_controls::password_spray_help(&active_project, season, lseason, year, &tools_dir, &config_path), - "25" => info_controls::crack_hashes(&cracking_rig, &active_project, &terminal, &rockyou, &rule), - "26" => {let bloodhound_handle = box_controls::launch_bloodhound_gui(active_project.clone()).unwrap(); threads.push(bloodhound_handle);}, - "27" => info_controls::partse_gathercontacts(&active_project), - "28" => {let prune_thread = box_controls::clean_unused_boxes(&projects, &boxtemplate); if prune_thread.is_some(){threads.push(prune_thread.unwrap());}}, - "29" => {project_controls::save_projects(&projects, &config_path); + "1" => {let cli_thread_option = cli::run_command(String::from("show active project"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "2" => {let cli_thread_option = cli::run_command(String::from("list projects"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "3" => {let cli_thread_option = cli::run_command(String::from("switch project"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "4" => {let cli_thread_option = cli::run_command(String::from("new project"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "5" => {let cli_thread_option = cli::run_command(String::from("save projects"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "6" => {let cli_thread_option = cli::run_command(String::from("import projects"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "7" => {let cli_thread_option = cli::run_command(String::from("remove project"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "8" => {let cli_thread_option = cli::run_command(String::from("show upcoming projects"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "9" => {let cli_thread_option = cli::run_command(String::from("promote project"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "10" => {let cli_thread_option = cli::run_command(String::from("new terminal"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "11" => {let cli_thread_option = cli::run_command(String::from("inline terminal"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "12" => {let cli_thread_option = cli::run_command(String::from("cobalt strike"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "13" => {let cli_thread_option = cli::run_command(String::from("recreate distrobox"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "14" => {let cli_thread_option = cli::run_command(String::from("generate userpass"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "15" => {let cli_thread_option = cli::run_command(String::from("initail enum"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "16" => {let cli_thread_option = cli::run_command(String::from("build attack notes"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "17" => {let cli_thread_option = cli::run_command(String::from("host discovery"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "18" => {let cli_thread_option = cli::run_command(String::from("port scan"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "19" => {let cli_thread_option = cli::run_command(String::from("parse port scan"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "20" => {let cli_thread_option = cli::run_command(String::from("stop boxes"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "21" => {let cli_thread_option = cli::run_command(String::from("password spray"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "22" => {let cli_thread_option = cli::run_command(String::from("bloodhound"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "23" => {let cli_thread_option = cli::run_command(String::from("parse gather contacts"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "24" => {let cli_thread_option = cli::run_command(String::from("prun distroboxes"), projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_thread_option.is_some(){threads.push(cli_thread_option.unwrap());}}, + "25" => {let cli_threads_option = cli::cli(true, projects.clone(), config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.clone(), cracking_rig.clone(), rockyou.clone(), rule.clone(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.clone()); if cli_threads_option.is_some(){for thread in cli_threads_option.unwrap(){threads.push(thread);}}}, + "26" => {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(); diff --git a/pentest_tool/src/project_controls.rs b/pentest_tool/src/project_controls.rs index 0cfbbe1..f16653a 100644 --- a/pentest_tool/src/project_controls.rs +++ b/pentest_tool/src/project_controls.rs @@ -289,7 +289,7 @@ pub fn remove_project(projects: &mut Vec, config_path: &PathBuf){ } } -pub fn get_projects(config_path: &PathBuf) -> Vec{ +pub fn get_projects(config_path: &PathBuf, show: bool) -> Vec{ let mut mut_config_path = config_path.clone(); mut_config_path.pop(); mut_config_path.push("projects.conf"); @@ -326,7 +326,9 @@ pub fn get_projects(config_path: &PathBuf) -> Vec{ } let project_stage = settings[6].to_owned(); let new_project = Project{customer: customer, project_name: project, files_folder: project_folder, notes_folder: notes_folder, active: active, id: first, boxname: boxname, stage: project_stage}; - println!("{} {} LOADED!", &new_project.customer, &new_project.project_name); + if show{ + println!("{} {} LOADED!", &new_project.customer, &new_project.project_name); + } projects.push(new_project); } } @@ -443,4 +445,11 @@ pub fn promote_project(projects: &mut Vec, config_path: &PathBuf, proje projects.clear(); projects.append(&mut projects_to_save); save_projects(&projects_to_save, config_path); +} + +pub fn list_projects(projects: &Vec){ + println!("+++++++++++++++++++++"); + for project in projects{ + println!("++Customer: {}|Project name: {}|Stage: {}++",project.customer ,project.project_name, project.stage)} + println!("++++++++++++++++++++") } \ No newline at end of file