added logic to launch bloodhound with the

distrobox.
This commit is contained in:
pyro57000
2025-03-13 15:02:01 -05:00
parent b137e0c34d
commit 2796d31f14
3 changed files with 66 additions and 11 deletions

View File

@@ -1,15 +1,15 @@
use core::error;
use std::os::unix::thread::JoinHandleExt;
use std::process::Command;
use std::process::{Command, Stdio};
use std::{path::PathBuf, process};
use std::env;
use std::fs;
use std::io::stdin;
use std::io::{stdin, BufRead, BufReader};
use std::io::Write;
use std::thread::{self, JoinHandle, Thread};
use std::time::Duration;
use std::str::FromStr;
use crate::Project;
use crate::{get_user_input, Project};
pub fn stop_all_boxes(projects: &Vec<Project>){
let mut problem_childs: Vec<Project> = Vec::new();
@@ -205,4 +205,53 @@ pub fn launch_cobalt_strike(project: Project) -> Option<JoinHandle<()>>{
}
});
return Some(handle);
}
pub fn launch_bloodhound_gui(project: Project) -> Option<JoinHandle<()>>{
let mut bloodhound_command = String::new();
let version_response = get_user_input("do you want to use a specific bloodhound version?");
if version_response.to_lowercase().contains("y"){
bloodhound_command = get_user_input("path to the bloodhound binary you want to use?");
}
else{
bloodhound_command = "bloodhound".to_owned();
}
let mut neo4j_started = false;
let neo4jstart_res = Command::new("distrobox")
.arg("enter")
.arg("--root")
.arg(&project.boxname)
.arg("--")
.arg("sudo")
.arg("neo4j")
.arg("start")
.status();
if neo4jstart_res.is_err(){
let error = neo4jstart_res.err().unwrap();
println!("errror starting neo4j...");
println!("{}", error);
}
else{
neo4j_started = true;
thread::sleep(Duration::from_secs(3));
}
if neo4j_started == false{
println!("review previous errors, not spawning bloodhound thread...");
return None;
}
let handle = thread::spawn(move ||{
let bloodhound_res = Command::new("distrobox")
.arg("enter")
.arg("--root")
.arg(&project.boxname)
.arg("--")
.arg(bloodhound_command)
.output();
if bloodhound_res.is_err(){
let error = bloodhound_res.err().unwrap();
println!("error starting bloodhound!");
println!("{}", error);
}
});
return Some(handle);
}

View File

@@ -1,9 +1,11 @@
use core::time;
use std::clone;
use std::path;
use std::path::Path;
use std::path::PathBuf;
use std::process::exit;
use chrono::Datelike;
use chrono::Duration;
use clearscreen::clear;
use clearscreen;
use chrono::Local;
@@ -37,7 +39,7 @@ fn get_active_project(projects: &Vec<Project>) -> &Project{
pub fn main_menu(mut projects: Vec<Project>, 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){
let mut loopize = true;
let mut new_id = next_project_id(&config_path);
let mut threads = Vec::new();
let mut threads = Vec::new();
loop {
let active_project = get_active_project(&projects);
let mut response = String::new();
@@ -137,8 +139,9 @@ Year: {}
21.) Stop All Distroboxes
22.) Password Spray (will print password to spray, and wait the obervation window time)
23.) crack password hashes on your cracking rig
24.) prune unused distroboxes (free up system storage)
25.) Quit Application
24.) Launch bloodhound with the current project's distrobox
25.) prune unused distroboxes (free up system storage)
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);
std::io::stdin().read_line(&mut response).expect("error getting menu input");
clear().expect("error clearing screen");
@@ -169,8 +172,9 @@ Year: {}
"21" => box_controls::stop_all_boxes(&projects),
"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 prune_thread = box_controls::clean_unused_boxes(&projects, &boxtemplate); if prune_thread.is_some(){threads.push(prune_thread.unwrap());}},
"25" => {project_controls::save_projects(&projects, &config_path);
"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);
let mut stop = String::new();
println!("stop all boxes?\ny/n");
std::io::stdin().read_line(&mut stop).unwrap();
@@ -187,6 +191,8 @@ Year: {}
let mut enter = String::new();
std::io::stdin().read_line(&mut enter).unwrap();
}
println!("this will hang until all threads are finished.");
println!("make sure to close all programs opened with this menu, like cobalt strike or bloodhound.");
for thread in threads{
thread.join().unwrap();
}