From dabca4c20a12698cd6dc689cfebbdc24ead429db Mon Sep 17 00:00:00 2001 From: pyro57000 Date: Wed, 30 Apr 2025 15:37:41 -0500 Subject: [PATCH] added more verbose help features. --- pentest_tool/src/cli.rs | 116 ++++++++++++++++++++++++++--------- pentest_tool/src/menu.rs | 126 +++++++++++++++++++-------------------- 2 files changed, 149 insertions(+), 93 deletions(-) diff --git a/pentest_tool/src/cli.rs b/pentest_tool/src/cli.rs index 89f5db8..ed54de7 100644 --- a/pentest_tool/src/cli.rs +++ b/pentest_tool/src/cli.rs @@ -19,35 +19,39 @@ fn help(command: Option){ if command.is_some(){ let help_cmd = command.unwrap(); match help_cmd.as_str(){ - "list projects" | "lp" | "listp" | "list p" => {println!("list all projects"); return;}, - "switch project" | "swp" | "switch p" | "switchp" => {println!("switch active project"); return;}, - "show active project" | "show active" | "sa" | "show a" => {println!("show currently active project"); return;}, - "create new project" | "cnp" | "new project" | "np" => {println!("create a new project and default note structure"); return;}, - "save projects" | "sp" | "save" | "s" => {println!("save project information"); return;}, - "import project" | "ip" | "import" => {println!("impot existing project"); return;}, - "remove project" | "rp" | "remove" | "rmp" => {println!("remove project"); return;}, - "show upcoming projects" | "sup" | "show upcoming" => {println!("show upcoming projects"); return;}, - "promote project" | "pp" | "promote" => {println!("promote upcoming project to current project"); return;}, - "new terminal" | "enter" | "enter terminal" | "nt" | "et" => {println!("spawn a new terminal window in the active project's distrobox"); return;}, - "inline terminal" | "it" | "enter inline" | "ei" => {println!("spawn a terminal in this window using the current active project's distrobox"); return;}, - "cobalt strike" | "cs" => {println!("open cobalt strike in the active project's distrobox"); return;}, - "recreate distrobox" | "rdb" | "ndb" | "new distrobox" => {println!("recreate the active project's distrobox"); return;}, - "generate userpass" | "userpass" | "gup" | "up" => {println!("generate userpass file based on the active project's notes"); return;}, - "inital enum" | "ie" | "enum" => {println!("run the initial enum script on a nessus csv and save the output to the active project's notes"); return;}, - "build attack notes" | "ban" | "attack notes" | "hn" => {println!("build the active project's attack note based on the active project's host notes (for external tests)"); return;}, - "host discovery" | "build host discovery" | "hd" | "bhd" => {println!("print host discovery ping command for the active project, based on the scope table"); return;}, - "port scan" | "cs port scan" | "cobaltstrike port scan" | "csps" | "ps" => {println!("print the cobalt strike portscan command based on the active project's scope table"); return;}, - "parse port scan" | "pps" | "parse scan" => {println!("parse a cobalt strike portscan and save the files to the active project's files folder"); return;}, - "stop boxes" | "stop distroboxes" | "sdb" => {println!("stop all distroboxes"); return;}, - "password spray" | "pass spray" | "pas" => {println!("iterate through password spray note file and print the command to perform the spray, waiting the proper observation window beteen commands"); return;}, - "bloodhound" | "bh" => {println!("launch bloodhound in the active project's distrobox"); return;}, - "parse gather contacts" | "pgc" | "parse contacts" | "pc" => {println!("parse gather contacts output"); return;}, - "prune distroboxes" | "pdb" | "prune" => {println!("prune distroboxes for all projects that are not being tracked by this tool (frees up system storage)"); return;}, - "clear" | "clear screen" | "cls" => {println!("clears the screen of command output"); return}, + "list projects" | "lp" | "listp" | "list p" => {println!("Command: list projects\nAliases: lp, listp, list p\n\nThis command lists all projects currently tracked by the pentest_tool"); return;}, + "switch project" | "swp" | "switch p" | "switchp" => {println!("Command: switch project\nAliases: swp, switch p, switchp\n\nThis command will switch the active project from the current one to a new on of your choosing. It will prompt you to make a selection."); return;}, + "show active project" | "show active" | "sa" | "show a" => {println!("Command: show active project\nAliases: sa, show a\n\nThis command shows information about the currently active project. NOTE the most useful information is already displayed above the CLI prompt."); return;}, + "create new project" | "cnp" | "new project" | "np" => {println!("Command: create new project\nAliases: cnp, new project, np\n\nThis command creates a new project and default note structure based on pyro's perferred note structure. It will prompt you for any needed information."); return;}, + "save projects" | "sp" | "save" | "s" => {println!("Command: save projects\nAliases: sp save\n\nThis command saves all project information to the ~/.config/pyro_pentest_tool/projects.conf file"); return;}, + "import project" | "ip" | "import" => {println!("Command: import project\nAliases: ip, import\n\nThis command will impot an existing project and set up a new distrobox for the project if it is a current project."); return;}, + "remove project" | "rp" | "remove" | "rmp" => {println!("Command:remove project\nAliases:rp, remove, rmp\n\nThis command removes a project from the list of projects tracked by the pentest_tool, and will destroy its distrobox. It does not remove any directories used or created by the distrobox. Run this after the report is written."); return;}, + "show upcoming projects" | "sup" | "show upcoming" => {println!("Command:show upcoming projects\nAliases:sup, show upcoming\n\nThis command shows a list of upcoming projects. Use this to verify which project you want to promote when the project enters the active phase."); return;}, + "promote project" | "pp" | "promote" => {println!("Command:promote project\nAliases:pp (ha), promote\n\nThis command promotes an upcoming project to a current project. It will copy the folders that were created over to the current project space and set up a new distrobox for the project."); return;}, + "new terminal" | "enter" | "enter terminal" | "nt" | "et" => {println!("Command:new terminal\nAliases:enter, enter terminal, nt, et\n\nThis command spawns a new terminal window in the active project's distrobox. Use this to interact with your project's distrobox."); return;}, + "inline terminal" | "it" | "enter inline" | "ei" => {println!("Command:inline terminal\nAliases:it enter, inline, ei\n\nThis command spawns a terminal in this window using the current active project's distrobox"); return;}, + "cobalt strike" | "cs" => {println!("Command:cobalt strike\nAliases:cs\n\nThis command opens cobalt strike in the active project's distrobox, and spins it off as a new thread to ensure it doesn't block the rest of this tools operation. NOTE the cobalt strike window will need to be closed before this tool exits sucessfully."); return;}, + "recreate distrobox" | "rdb" | "ndb" | "new distrobox" => {println!("Command:recreate distrobox\nAliases:rdb, ndb, new distrobox\n\nThis command destroyes the existing distrobox for the currently active project, and clones a new one based on the current state of the template distrobox."); return;}, + "generate userpass" | "userpass" | "gup" | "up" => {println!("Command:generate userpass\nAliases:userpass, gup, up\n\nThis command generates a userpass file based on the active project's notes. The file will be in the username:password format."); return;}, + "inital enum" | "ie" | "enum" => {println!("Command:initial enum\nAliases:ie, enum\n\nThis command runs the initial enum script on a nessus csv and saves the output to the active project's notes in the host_notes.md file."); return;}, + "build attack notes" | "ban" | "attack notes" | "hn" => {println!("Command:build attack notes\nAliases:ban, attack notes\n\nThis command builds the active project's attack note based on the active project's host notes (for external tests). It is expected that you'd run the initial enum command, then manually fill out the enumeration talbes with correct service names and ports."); return;}, + "host discovery" | "build host discovery" | "hd" | "bhd" => {println!("Command:host discovery\nAliases:build host discovery, hd, bhd\n\nThis command prints the host discovery ping command for the active project, based on the scope table in the general.md notes file."); return;}, + "port scan" | "cs port scan" | "cobaltstrike port scan" | "csps" | "ps" => {println!("Command:port scan\nAliases:cs port scan, cobaltstrike port scan, csps, ps (tell your cat I said that)\n\nThis command prints the cobalt strike portscan command based on the active project's scope table in the general.md notes file"); return;}, + "parse port scan" | "pps" | "parse scan" => {println!("Command:parse port scan\nAliases:pps, parse scan\n\nThis commmand parses a cobalt strike portscan TSV and saves interesting hoests to files to the active project's files folder. The host files are designated with the service that was detected that might be interesting. Use this to generate target lists for specific protocols."); return;}, + "stop boxes" | "stop distroboxes" | "sdb" => {println!("Command:stop boxes\nAliases:stop distroboxes, sdb\n\nThis command stops all distroboxes for the tracked projects. Note if the distrobox isn't running you will see errors in the console, you can safely ignore these."); return;}, + "password spray" | "pass spray" | "pas" => {println!("Command:password spray\nAliases:pass spray, pas\n\nThis command iterates through the password spray note file and print the command to perform the spray, waiting the proper observation window beteen commands. It prompts you to save if needed. NOTE this will block execution for the rest of the program until it is either finished, or you save and exit the password spray function. I'm working on making this better."); return;}, + "bloodhound" | "bh" => {println!("Command:bloodhound\nAliases:bh\n\nThis command launches bloodhound in the active project's distrobox. It will automatically start neo4j before staring bloodhound."); return;}, + "parse gather contacts" | "pgc" | "parse contacts" | "pc" => {println!("Command:parse gather contacts\nAliases:pgc, parse contacts, pc\n\nThis command parses output saved from the gather contacts burpsuite extension."); return;}, + "prune distroboxes" | "pdb" | "prune" => {println!("Command:prune distroboxes\nAliases:pdb, prune\n\nthis command prunes distroboxes for all projects that are not being tracked by this tool (frees up system storage). This will start all the currently acvtive distorboxes to ensure they don't get pruned, and then will delete all the not-started distrobox volumes and resources."); return;}, + "clear" | "clear screen" | "cls" => {println!("Command:clear\nAliases:clear screen, cls\n\nThis command clears the screen of command output."); return}, + "exit" => {println!("Command: exit\nAliases:(none)\nThis command exits the pentest_tool, it will save all project infomation, and wait for all threads to re-join the main thread before exiting."); return;}, + "settings" => {println!("\n\nThe settings file is located at ~/.config/pyro_pentest_tool/conf\n\nThe format is setting_name:setting_value.\n\nNeeded settings are\n project_files - the place to store current project files folders\n\n projtect_notes - the place to store current project notes\n\n tools_folder - the place to store custom tools like those downloaded from github\n\n upcoming_files - the place to store upcoming project files folders\n\n upcoming_notes - The place to store upcoming project note files\n\n box_template - the name of the distrobox you want to clone for project boxes\n\n terminal - the command you use to launch a terminal, while running a specific command: Ex: konsole -e \n\n cracking_rig - the user and host you use for a personal cracking rig in the openssh formating: Ex: pyro@cracking_rig or pyro@192.168.1.101 if you do not have a cracking rig the default is @n\n\n rockyou_location - the location on the cracking rig for the rockyou.txt file default is n\n\n rule_location - the location on the cracking rig for the one rule to rule them all file. Default is n\n\n pass_file - this is the location where you store your standard password spray file. If you do not have a custom one this tool provides one. The default is ~/.config/pyro_pentest_tool/passwordspary.md\n\n fingerprint - this is whether you want fingerprint authentication within your distroboxes, takes y/n\n\n vault_name - the name of your obsidian vault, default is notes\n\n"); return;}, _ => () } } println!("Welcom to Pyro's pentest command line!"); + println!("the pentest_tool uses a configuration file to store your settings. This configuration file is located at ~/.config/pyro_pentest_tool/conf.\nYou can modify this file, but do so cautiously, incorrect formatting will cause this program to have a bruh moment.\nThe correct format is setting_name:setting_value\nExample:\nprojecT_files:/var/home/pyro/pentests/current"); + println!("for help configuring the settings file run help settings"); println!("available commands: name | aliases | ..."); print!(" menu | main menu | mm @@ -181,11 +185,14 @@ pub fn run_command(cmd: String, "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}, - "clear" | "clear screen" | "cls" => {clear().unwrap(); return None}, - _ => {println!("unknown command."); return None;} + _ => {help(None); println!("\n\n unknown command."); return None;} } } +fn print_banner(banner: &str){ + print!("{}", banner); +} + pub fn cli(interactive: bool, mut projects: Vec, config_path: PathBuf, @@ -205,6 +212,55 @@ pub fn cli(interactive: bool, let mut threads = Vec::new(); if interactive{ let mut loopize = true; + let banner = " +,,,;;::ccccc::;;;::c::;,;::cccccllc::::::;:::;;;;,,;,'',,;,,;;;;;;;:;;;;;,,,,,,,,,,,'''''',,,,,,'''' +,;;;::ccccc::::::ccc:;;;:ccccccclc::ccccccc::;;;;;;;;;;,,;;;;;;;;;;;;;;;,,,,,,,,,,,'''''''''',,,,,'' +,;;:::ccc:cc:::ccc:::::::ccccclcccllccccllc::::::;;;;;;;;;;;;;;;;;;;;;;,,,,,,,,,,,''''''''...'',,,,' +,;;:::c::ccc::cc::::::::cclollllllolllllccccc::cc:::::;;;;;;;;;;;;;;;;;;,,,,,,,,,,'''''''''''..'',,, +,;::::::ccc::cc::::::ccloodollooooollllcccccc:llc::::::;;;;;;:;;;;;;;;;;;,,,,,,,,,,''''''''''''''',, +,;:::::c:::c::::ccccloddxxddxxddddodollllccclclcccccc:::::::::::::::;;;;;;;;,,,,,,,,,'''''''''''''', +;;:::::::c::c::clllodxxO0OKX0kkOkkxxxxxdooooolcccccccc:::::::cllc::::::::;;;;;,,,,,,,,,,'''''''''',, +;:::::c:cc::cclolclokO0KXNNX00KKK0O0KOxdxxdooccccclllccccccccdkdlcccccllcc::;;;;;;;;,,,,,,,,,,,',,,, +::::::cc::::coxdlllok00KNWNXXX0KXKOKNOkO0kddocccllllllccccclx0Kkodddoodddoollc::;;;;;;;;;,,,,,,,,,,, +:::::::c:::clkkodooxxkO0KX0xookKKkkKNKO0KkdoodolcllllollolldKNNXKKXKKKKKK0Okxdocc:cc:::;;;;;,,,,,,,, +::cc::cc::cldxllolodxxdoddc'.,okkxOXXOdxkxolkOdlllllllldkdokXNNNNNNNNX0kxollcc:::::cclc::;;;;;;,,,,, +:::::::cccldko:,.';cc:;:;....;clllOXOxxOkocoK0xooddollx0Odd0XNNNNNX0Oxdolcccc::;;;;;;:cllc:;;:;,,,,, +;;::c:::ccldkl;'...,''''....',;,';dxdkkdc;cONKxxOOOxddOXOdx0XXNNWNOdddxkOOOOkdllc:;,,,;cool:;;;;;,,; +,;;::;;::llco:,'..''..,.......''.';:ldl;,,:xXNOOXXX0xdkOOddkXNNWWWX00KXNNX0kxddddol:,''';lol:;;:;;,; +,,,;;;;;:coc;;'..;;. .,,;'.......':dxdc;ldc,l00xkXNKxodkkkkk0XNWWMWWWNXKOxdooolooool:;'..,lol::::;;; +',,,;;;;:cllc;,..',. ','. .....;odoo:;co:.'ldldOOx::x0KXX0kk0XNWWWXOxdoooollllllllcc:'..':lc:::;;; +',,,;;;;;:cccc:,. . ..;cccccc:,,''.',,:l:;;:oOXXKOOOkxOXNNNXOxddooooollllllllc,....:c:::;;; +''',,,;;;;;;;cll,.. .. .':lc:c:;,,......,,;:;;:cokkxxO00O0KXNNN0kxkkkxddoollllllll:'...'::::::: +.''',,,,,,,,,;:c:,.. ..'. ..','',;;'........',,;:;:::cdxxxddkKXXXKKKKXXXXXX0kdoloolllol;....,;::::: +..'''',,'',,,;;:::;..... ............... .'.....,;,',:ldc;:ldOKKK00KNWWWNNXK0xoooodooooo:'...';;;:;; +....'''''',,;;::cll:,''...... . ..........'...,;;l:,,;oddkOOKNWWWWNX0kdodxxxxdddooc,...',;;;;, +......''''',;::cloodddol;. ...........',.;;,,',:cxdd0KXXKKKXKOkxxkkkxdddooc,...';;,,,, +........''',;:clloddxxdo:'. .. ...........''.'',;c:;cccodddk0KX0OOkxddddddo:...';;;;,,' +..........',;:cclodxxkxdl:,.. ... ......'....'..':c,..'.,c,,,.,cxkO00Okxdddddc'..';:;;;,,' +..........',;;:cloodxkkkdol:'. . ... ...... ......';c'.'...:;',;,'..,lxO00Oxxxo:'...,::;;,,,, +...........',;;:clodxkOOkxdol;. .. .. ... ....',::'.''.',.........'oxdxxxdl;...';::;;;,,'' +............',;:clodxkkOOOxddo;. ...... ........',,',................';:clc;,...';::;;,,,''' +............',;:cldxkkOkkkxdddo;. ..... .........,'...........'''','.',,'''....,cc:;;,,'''.. +.............';:cldxxkkkkxddddxl,. .... .;c;'...................',;;cc;'...';clolc:;,,'''... +............'';clodxkkkkkxddddddl' ... .:lc;'................. ....',,''';lxkxdlc:;,'''.... +........',,;:;coddxkOOOOOkxxddddd:. ... ..,''.................. . ..;cdkkkkxoc:;,'''..... +......',;::cllodxkkOOOOOOkxxxddddc. ... ..,;,'................... .. .':odO0Okdl:;,'''...... +.....',;:cloddxxkOOOOOOOkkxxdoooo;. .. ......................... .';cokOOxlc:;,''....... +....,;:clodxxkkOOOkO0OOOOxdlcc;;,...... .';,................. ...',:ldxxxdlc;,''....... +...,:clodooxkkkO0OxO00OOxo:;;,. ........ .''.......... .. .. ..,,,;:codxxdlc:;,'....... +'',;clodolokOkxkOkkO00Oko:;;;. ..... .. .,,........'. .. .. .. ..........;:codocclc:,,'...... + ___ __ __ ___ __ ___ __ + | | |__ | / ` / \\ |\\/| |__ |__| /\\ / ` |__/ |__ |__) + |/\\| |___ |___ \\__, \\__/ | | |___ | | /~~\\ \\__, | \\ |___ | \\ + + __ ___ ___ __ __ + / _` |__ | |__) | | |\\ | | |\\ | / _` + \\__> |___ | | |/\\| | \\| | | \\| \\__> + + + + "; + print_banner(banner); while loopize{ let active_project = get_active_project(&projects); print!(" @@ -215,12 +271,16 @@ Notes Folder: {} Boxname: {} Obsidian URI: {} +for help enter help or ?. for information about a specific command enter help (command) + ", active_project.customer, active_project.project_name, active_project.stage, active_project.files_folder.display(), active_project.notes_folder.display(), active_project.boxname, "coming soon"); let command = get_user_input("command?"); match command.as_str(){ "exit" => loopize = false, - "menu" | "main menu" | "mm" => {let menu_thread_option = menu::main_menu(&mut projects, 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 menu_thread_option.is_some(){for thread in menu_thread_option.unwrap(){threads.push(thread);}}} + "menu" | "main menu" | "mm" => {let menu_thread_option = menu::main_menu(&mut projects, 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 menu_thread_option.is_some(){for thread in menu_thread_option.unwrap(){threads.push(thread);}}}, + "print banner" | "banner" => print_banner(banner), + "clear" | "clear screen" | "cls" => {clear().unwrap(); print_banner(banner);} _ => {let thread_option = run_command(command, &mut projects, 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())}}, } } diff --git a/pentest_tool/src/menu.rs b/pentest_tool/src/menu.rs index b91cb1e..00e6c70 100644 --- a/pentest_tool/src/menu.rs +++ b/pentest_tool/src/menu.rs @@ -60,26 +60,18 @@ pub fn main_menu(projects: &mut Vec, ....,;:clodxxkkOOOkO0OOOOxdlcc;;,...... .';,................. ...',:ldxxxdlc;,''....... ...,:clodooxkkkO0OxO00OOxo:;;,. ........ .''.......... .. .. ..,,,;:codxxdlc:;,'....... '',;clodolokOkxkOkkO00Oko:;;;. ..... .. .,,........'. .. .. .. ..........;:codocclc:,,'...... - ___ __ __ ___ __ ___ __ - | | |__ | / ` / \\ |\\/| |__ |__| /\\ / ` |__/ |__ |__) - |/\\| |___ |___ \\__, \\__/ | | |___ | | /~~\\ \\__, | \\ |___ | \\ - - __ ___ ___ __ __ - / _` |__ | |__) | | |\\ | | |\\ | / _` - \\__> |___ | | |/\\| | \\| | | \\| \\__> - - - - "; +"; while loopize { let _enter_to_clear = get_user_input("press enter to display main menu."); clear().expect("error clearing screen"); print!(" {} -NOTE OPTION 26 WILL SAVE YOUR PROJECTS BEFORE QUITTING - - - Main Menu: +___ ___ _ ___ ___ +| \\/ | (_) | \\/ | _ +| . . | __ _ _ _ __ | . . | ___ _ __ _ _(_) +| |\\/| |/ _` | | '_ \\ | |\\/| |/ _ \\ '_ \\| | | | +| | | | (_| | | | | | | | | | __/ | | | |_| |_ +\\_| |_/\\__,_|_|_| |_| \\_| |_/\\___|_| |_|\\__,_(_) 1 .) Show Active Project 2 .) List Projects 3 .) Switch Active Project @@ -169,30 +161,32 @@ NOTE OPTION 26 WILL SAVE YOUR PROJECTS BEFORE QUITTING clear().expect("error clearing screen"); print!(" {} - NOTE OPTION 26 WILL SAVE YOUR PROJECTS BEFORE QUITTING - - - Main Menu: - 1 .) Show Active Project - 2 .) List Projects - 3 .) Switch Active Project - 4 .) create new project with Pyro's default layout - 5 .) Save Project Information - 6 .) Import New Project to Current projects list - and setup new Distrobox - 7 .) Remove Project - 8 .) Print upcoming projects - 9. ) promote project from upcoming to current - 10.) Open A New Terminal in Current Active Project - 11.) Open A Terminal In this windows for the current active project - 12.) re-create the distrobox for the current active project - 13.) generate userpass file from your obsidian notes - 14.) run pyro's initail enum script on a nessus csv for the current project - 15.) build external attack notes from host notes - 16.) Stop All Distroboxes - 17.) Password Spray (will print password to spray, and wait the obervation window time) - 18.) Parse GatherContacts output file - 19.) prune unused distroboxes (free up system storage) - 20.) exit menu + _____ _ _ ___ ___ +| ___| | | | | | \\/ | _ +| |____ _| |_ ___ _ __ _ __ __ _| | | . . | ___ _ __ _ _(_) +| __\\ \\/ / __/ _ \\ '__| '_ \\ / _` | | | |\\/| |/ _ \\ '_ \\| | | | +| |___> <| || __/ | | | | | (_| | | | | | | __/ | | | |_| |_ +\\____/_/\\_\\\\__\\___|_| |_| |_|\\__,_|_| \\_| |_/\\___|_| |_|\\__,_(_) + 1 .) Show Active Project + 2 .) List Projects + 3 .) Switch Active Project + 4 .) create new project with Pyro's default layout + 5 .) Save Project Information + 6 .) Import New Project to Current projects list - and setup new Distrobox + 7 .) Remove Project + 8 .) Print upcoming projects + 9. ) promote project from upcoming to current + 10.) Open A New Terminal in Current Active Project + 11.) Open A Terminal In this windows for the current active project + 12.) re-create the distrobox for the current active project + 13.) generate userpass file from your obsidian notes + 14.) run pyro's initail enum script on a nessus csv for the current project + 15.) build external attack notes from host notes + 16.) Stop All Distroboxes + 17.) Password Spray (will print password to spray, and wait the obervation window time) + 18.) Parse GatherContacts output file + 19.) prune unused distroboxes (free up system storage) + 20.) exit menu \n", banner); match get_user_input("selection?").as_str(){ "1" => {let thread_option = cli::run_command("show active project".to_owned(), projects, config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.to_owned(), cracking_rig.to_owned(), rockyou.to_owned(), rule.to_owned(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.to_owned()); if thread_option.is_some(){threads.push(thread_option.unwrap());}}, @@ -250,32 +244,34 @@ NOTE OPTION 26 WILL SAVE YOUR PROJECTS BEFORE QUITTING clear().expect("error clearing screen"); print!(" {} - NOTE OPTION 26 WILL SAVE YOUR PROJECTS BEFORE QUITTING - - - Main Menu: - 1 .) Show Active Project - 2 .) List Projects - 3 .) Switch Active Project - 4 .) create new project with Pyro's default layout - 5 .) Save Project Information - 6 .) Import New Project to Current projects list - and setup new Distrobox - 7 .) Remove Project - 8 .) Print upcoming projects - 9. ) promote project from upcoming to current - 10.) Open A New Terminal in Current Active Project - 11.) Open A Terminal In this windows for the current active project - 12.) open cobalt strike in the current project's distrobox - 13.) re-create the distrobox for the current active project - 14.) generate userpass file from your obsidian notes - 15.) print host discvoery command for internal pingsweep - 16.) print cobalt strike portscan command to include all in scope ranges - 17) parse a cobalt strike portscan CSV - 18.) Stop All Distroboxes - 19.) Password Spray (will print password to spray, and wait the obervation window time) - 20.) open bloodhound in the current project's distrobox - 21.) prune unused distroboxes (free up system storage) - 22.) exit menu + _____ _ _ ___ ___ +|_ _| | | | | | \\/ | _ + | | _ __ | |_ ___ _ __ _ __ __ _| | | . . | ___ _ __ _ _(_) + | || '_ \\| __/ _ \\ '__| '_ \\ / _` | | | |\\/| |/ _ \\ '_ \\| | | | + _| || | | | || __/ | | | | | (_| | | | | | | __/ | | | |_| |_ + \\___/_| |_|\\__\\___|_| |_| |_|\\__,_|_| \\_| |_/\\___|_| |_|\\__,_(_) + 1 .) Show Active Project + 2 .) List Projects + 3 .) Switch Active Project + 4 .) create new project with Pyro's default layout + 5 .) Save Project Information + 6 .) Import New Project to Current projects list - and setup new Distrobox + 7 .) Remove Project + 8 .) Print upcoming projects + 9. ) promote project from upcoming to current + 10.) Open A New Terminal in Current Active Project + 11.) Open A Terminal In this windows for the current active project + 12.) open cobalt strike in the current project's distrobox + 13.) re-create the distrobox for the current active project + 14.) generate userpass file from your obsidian notes + 15.) print host discvoery command for internal pingsweep + 16.) print cobalt strike portscan command to include all in scope ranges + 17) parse a cobalt strike portscan CSV + 18.) Stop All Distroboxes + 19.) Password Spray (will print password to spray, and wait the obervation window time) + 20.) open bloodhound in the current project's distrobox + 21.) prune unused distroboxes (free up system storage) + 22.) exit menu \n", banner); match get_user_input("selection?").as_str(){ "1" => {let thread_option = cli::run_command("show active project".to_owned(), projects, config_path.clone(), base_files, base_notes, tools_dir, boxtemplate.clone(), terminal.to_owned(), cracking_rig.to_owned(), rockyou.to_owned(), rule.to_owned(), upcoming_files, upcoming_notes, password_spray_file, fingerprint, vault_name.to_owned()); if thread_option.is_some(){threads.push(thread_option.unwrap());}},