Fix 11 bugs found in full codebase review

- deploy_phishing.py: undefined extra_vars on orchestration playbook
- freebird/main_menu.py: set_variable() called as function, is a method; fix to config.prompt_set_variable()
- freebird/tool_manager.py: shell=True with f-string paths; replace with direct pip binary call
- certipy-enum.py: password exposed in process list and logs; pass via env var
- cleanup_engine.py: load_vars_file() called with path string, expects provider name
- ioc-u.py: scapy import not guarded; tool crashed if scapy missing
- um_ops.py + um-vault.py: SQL table names f-stringed directly; quote identifiers
- ops-logger.sh: 63-line duplicate function block; removed second copy; quote config_script var
- recon_tools.py: ir-sandbox + link-sandbox not in TOOLS dict; forensics menu option 5 hidden from user
- um-crack.py: missing --scope flag inconsistent with all other Umbra tools
- heartbeat_ingest.py: openssl subprocess not catching FileNotFoundError; wrap with clear error
This commit is contained in:
n0mad1k
2026-04-01 22:11:01 -04:00
parent 2611221981
commit 2762b0dfb8
12 changed files with 4034 additions and 84 deletions
+53
View File
@@ -0,0 +1,53 @@
# core/main_menu.py
from InquirerPy import inquirer
from core.utils import clear_screen
from core.config import config
from framework.reconnaissance.reconnaissance_menu import reconnaissance_menu # Corrected path for Reconnaissance Menu
# Main Menu Function
def main_menu():
while True:
clear_screen() # Clear screen before displaying the main menu
selection = inquirer.select(
message="Select a Tactic:",
choices=[
"Reconnaissance",
"Initial Access",
"Execution",
"Persistence",
"Privilege Escalation",
"Defense Evasion",
"Credential Access",
"Discovery",
"Lateral Movement",
"Collection",
"Command and Control",
"Exfiltration",
"Impact",
"Resource Development",
"Set Global Variable",
"Show Global Variables",
"Exit",
],
qmark="", # Remove question mark
pointer="👾" # Customize the pointer
).execute()
# Call relevant function based on user selection
if selection == "Exit":
print("Exiting...")
break
elif selection == "Set Global Variable":
config.prompt_set_variable()
elif selection == "Show Global Variables":
config.show_variables()
elif selection == "Reconnaissance":
reconnaissance_menu() # Navigate to Reconnaissance Menu
else:
# Handle options under construction
print("This feature is under construction. Returning to the main menu...")
input("Press Enter to continue...")
if __name__ == "__main__":
main_menu()
+121
View File
@@ -0,0 +1,121 @@
import os
import subprocess
import argparse
TOOLS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../tools/') # Directory where all tools will be installed
def install_tool(tool_name, repo_url):
tool_path = os.path.join(TOOLS_DIR, tool_name)
if os.path.exists(tool_path):
print(f"{tool_name} is already installed.")
return
# Clone the repository
print(f"Cloning {repo_url}...")
subprocess.run(['git', 'clone', repo_url, tool_path], check=True)
# Set up a virtual environment if necessary
venv_path = os.path.join(tool_path, 'venv')
print(f"Setting up virtual environment for {tool_name}...")
subprocess.run(['python3', '-m', 'venv', venv_path], check=True)
# Activate virtual environment and install dependencies
requirements_file = os.path.join(tool_path, 'requirements.txt')
if os.path.exists(requirements_file):
print(f"Installing dependencies for {tool_name}...")
pip_bin = os.path.join(venv_path, 'bin', 'pip')
subprocess.run([pip_bin, 'install', '-r', requirements_file], check=True)
print(f"{tool_name} installed successfully.")
def install_tools_list(tools_list):
for tool_name, repo_url in tools_list:
install_tool(tool_name, repo_url)
def update_tool(tool_name):
tool_path = os.path.join(TOOLS_DIR, tool_name)
if not os.path.exists(tool_path):
print(f"{tool_name} is not installed.")
return
# Pull the latest changes
print(f"Updating {tool_name}...")
subprocess.run(['git', '-C', tool_path, 'pull'], check=True)
# Update dependencies if necessary
venv_path = os.path.join(tool_path, 'venv')
requirements_file = os.path.join(tool_path, 'requirements.txt')
if os.path.exists(requirements_file):
print(f"Updating dependencies for {tool_name}...")
pip_bin = os.path.join(venv_path, 'bin', 'pip')
subprocess.run([pip_bin, 'install', '-r', requirements_file], check=True)
print(f"{tool_name} updated successfully.")
def remove_tool(tool_name):
tool_path = os.path.join(TOOLS_DIR, tool_name)
if not os.path.exists(tool_path):
print(f"{tool_name} is not installed.")
return
# Remove the tool directory
print(f"Removing {tool_name}...")
subprocess.run(['rm', '-rf', tool_path], check=True)
print(f"{tool_name} removed successfully.")
def show_status(tool_name):
tool_path = os.path.join(TOOLS_DIR, tool_name)
if os.path.exists(tool_path):
print(f"{tool_name} is installed.")
else:
print(f"{tool_name} is not installed.")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Tool Manager for Freebird Framework')
subparsers = parser.add_subparsers(dest='command', help='Subcommands')
# Install command
install_parser = subparsers.add_parser('install', help='Install a tool')
install_parser.add_argument('tool_name', help='Name of the tool to install')
install_parser.add_argument('repo_url', help='Git repository URL of the tool')
# Install multiple tools
install_list_parser = subparsers.add_parser('install-list', help='Install a list of tools')
install_list_parser.add_argument('file', help='Path to a file containing the list of tools and their repositories')
# Update command
update_parser = subparsers.add_parser('update', help='Update a tool')
update_parser.add_argument('tool_name', help='Name of the tool to update')
# Remove command
remove_parser = subparsers.add_parser('remove', help='Remove a tool')
remove_parser.add_argument('tool_name', help='Name of the tool to remove')
# Status command
status_parser = subparsers.add_parser('status', help='Show the status of a tool')
status_parser.add_argument('tool_name', help='Name of the tool')
args = parser.parse_args()
if args.command == 'install':
install_tool(args.tool_name, args.repo_url)
elif args.command == 'install-list':
# Read the file to get a list of tools to install
tools = []
with open(args.file, 'r') as f:
for line in f:
name, url = line.strip().split(',')
tools.append((name.strip(), url.strip()))
install_tools_list(tools)
elif args.command == 'update':
update_tool(args.tool_name)
elif args.command == 'remove':
remove_tool(args.tool_name)
elif args.command == 'status':
show_status(args.tool_name)
else:
parser.print_help()