mirror of
https://github.com/CyberSecurityUP/NeuroSploit.git
synced 2026-02-12 22:12:45 +00:00
Add files via upload
This commit is contained in:
376
core/tool_installer.py
Normal file
376
core/tool_installer.py
Normal file
@@ -0,0 +1,376 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Tool Installer - Installs required pentest tools for NeuroSploitv2
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import shutil
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
from typing import Dict, List, Tuple
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Tool definitions with installation commands for different package managers
|
||||
PENTEST_TOOLS = {
|
||||
"nmap": {
|
||||
"description": "Network scanner and port mapper",
|
||||
"check_cmd": "nmap --version",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y nmap",
|
||||
"yum": "sudo yum install -y nmap",
|
||||
"dnf": "sudo dnf install -y nmap",
|
||||
"brew": "brew install nmap",
|
||||
"pacman": "sudo pacman -S --noconfirm nmap"
|
||||
},
|
||||
"binary": "nmap"
|
||||
},
|
||||
"sqlmap": {
|
||||
"description": "SQL injection detection and exploitation",
|
||||
"check_cmd": "sqlmap --version",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y sqlmap",
|
||||
"yum": "sudo pip3 install sqlmap",
|
||||
"dnf": "sudo dnf install -y sqlmap",
|
||||
"brew": "brew install sqlmap",
|
||||
"pacman": "sudo pacman -S --noconfirm sqlmap",
|
||||
"pip": "pip3 install sqlmap"
|
||||
},
|
||||
"binary": "sqlmap"
|
||||
},
|
||||
"nikto": {
|
||||
"description": "Web server vulnerability scanner",
|
||||
"check_cmd": "nikto -Version",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y nikto",
|
||||
"yum": "sudo yum install -y nikto",
|
||||
"dnf": "sudo dnf install -y nikto",
|
||||
"brew": "brew install nikto",
|
||||
"pacman": "sudo pacman -S --noconfirm nikto"
|
||||
},
|
||||
"binary": "nikto"
|
||||
},
|
||||
"gobuster": {
|
||||
"description": "Directory/file & DNS busting tool",
|
||||
"check_cmd": "gobuster version",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y gobuster",
|
||||
"brew": "brew install gobuster",
|
||||
"go": "go install github.com/OJ/gobuster/v3@latest"
|
||||
},
|
||||
"binary": "gobuster"
|
||||
},
|
||||
"nuclei": {
|
||||
"description": "Fast vulnerability scanner based on templates",
|
||||
"check_cmd": "nuclei -version",
|
||||
"install": {
|
||||
"go": "go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest",
|
||||
"brew": "brew install nuclei"
|
||||
},
|
||||
"binary": "nuclei"
|
||||
},
|
||||
"subfinder": {
|
||||
"description": "Subdomain discovery tool",
|
||||
"check_cmd": "subfinder -version",
|
||||
"install": {
|
||||
"go": "go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest",
|
||||
"brew": "brew install subfinder"
|
||||
},
|
||||
"binary": "subfinder"
|
||||
},
|
||||
"httpx": {
|
||||
"description": "HTTP toolkit for probing",
|
||||
"check_cmd": "httpx -version",
|
||||
"install": {
|
||||
"go": "go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest",
|
||||
"brew": "brew install httpx"
|
||||
},
|
||||
"binary": "httpx"
|
||||
},
|
||||
"ffuf": {
|
||||
"description": "Fast web fuzzer",
|
||||
"check_cmd": "ffuf -V",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y ffuf",
|
||||
"go": "go install github.com/ffuf/ffuf/v2@latest",
|
||||
"brew": "brew install ffuf"
|
||||
},
|
||||
"binary": "ffuf"
|
||||
},
|
||||
"hydra": {
|
||||
"description": "Network login cracker",
|
||||
"check_cmd": "hydra -h",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y hydra",
|
||||
"yum": "sudo yum install -y hydra",
|
||||
"dnf": "sudo dnf install -y hydra",
|
||||
"brew": "brew install hydra",
|
||||
"pacman": "sudo pacman -S --noconfirm hydra"
|
||||
},
|
||||
"binary": "hydra"
|
||||
},
|
||||
"whatweb": {
|
||||
"description": "Web technology identifier",
|
||||
"check_cmd": "whatweb --version",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y whatweb",
|
||||
"brew": "brew install whatweb",
|
||||
"gem": "sudo gem install whatweb"
|
||||
},
|
||||
"binary": "whatweb"
|
||||
},
|
||||
"wpscan": {
|
||||
"description": "WordPress vulnerability scanner",
|
||||
"check_cmd": "wpscan --version",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y wpscan",
|
||||
"brew": "brew install wpscan",
|
||||
"gem": "sudo gem install wpscan"
|
||||
},
|
||||
"binary": "wpscan"
|
||||
},
|
||||
"curl": {
|
||||
"description": "HTTP client for requests",
|
||||
"check_cmd": "curl --version",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y curl",
|
||||
"yum": "sudo yum install -y curl",
|
||||
"dnf": "sudo dnf install -y curl",
|
||||
"brew": "brew install curl",
|
||||
"pacman": "sudo pacman -S --noconfirm curl"
|
||||
},
|
||||
"binary": "curl"
|
||||
},
|
||||
"jq": {
|
||||
"description": "JSON processor for parsing outputs",
|
||||
"check_cmd": "jq --version",
|
||||
"install": {
|
||||
"apt": "sudo apt-get install -y jq",
|
||||
"yum": "sudo yum install -y jq",
|
||||
"dnf": "sudo dnf install -y jq",
|
||||
"brew": "brew install jq",
|
||||
"pacman": "sudo pacman -S --noconfirm jq"
|
||||
},
|
||||
"binary": "jq"
|
||||
},
|
||||
"dirsearch": {
|
||||
"description": "Web path discovery tool",
|
||||
"check_cmd": "dirsearch --version",
|
||||
"install": {
|
||||
"pip": "pip3 install dirsearch"
|
||||
},
|
||||
"binary": "dirsearch"
|
||||
},
|
||||
"wafw00f": {
|
||||
"description": "Web Application Firewall detection",
|
||||
"check_cmd": "wafw00f -h",
|
||||
"install": {
|
||||
"pip": "pip3 install wafw00f"
|
||||
},
|
||||
"binary": "wafw00f"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ToolInstaller:
|
||||
"""Manages installation of pentest tools"""
|
||||
|
||||
def __init__(self):
|
||||
self.package_manager = self._detect_package_manager()
|
||||
|
||||
def _detect_package_manager(self) -> str:
|
||||
"""Detect the system's package manager"""
|
||||
managers = [
|
||||
("apt-get", "apt"),
|
||||
("dnf", "dnf"),
|
||||
("yum", "yum"),
|
||||
("pacman", "pacman"),
|
||||
("brew", "brew")
|
||||
]
|
||||
|
||||
for cmd, name in managers:
|
||||
if shutil.which(cmd):
|
||||
return name
|
||||
|
||||
# Fallback to pip for Python tools
|
||||
return "pip"
|
||||
|
||||
def check_tool_installed(self, tool_name: str) -> Tuple[bool, str]:
|
||||
"""Check if a tool is installed and return its path"""
|
||||
tool_info = PENTEST_TOOLS.get(tool_name)
|
||||
if not tool_info:
|
||||
return False, ""
|
||||
|
||||
binary = tool_info.get("binary", tool_name)
|
||||
path = shutil.which(binary)
|
||||
|
||||
if path:
|
||||
return True, path
|
||||
|
||||
# Check common paths
|
||||
common_paths = [
|
||||
f"/usr/bin/{binary}",
|
||||
f"/usr/local/bin/{binary}",
|
||||
f"/opt/{binary}/{binary}",
|
||||
os.path.expanduser(f"~/go/bin/{binary}"),
|
||||
f"/snap/bin/{binary}"
|
||||
]
|
||||
|
||||
for p in common_paths:
|
||||
if os.path.isfile(p) and os.access(p, os.X_OK):
|
||||
return True, p
|
||||
|
||||
return False, ""
|
||||
|
||||
def get_tools_status(self) -> Dict[str, Dict]:
|
||||
"""Get installation status of all tools"""
|
||||
status = {}
|
||||
for tool_name, tool_info in PENTEST_TOOLS.items():
|
||||
installed, path = self.check_tool_installed(tool_name)
|
||||
status[tool_name] = {
|
||||
"installed": installed,
|
||||
"path": path,
|
||||
"description": tool_info["description"]
|
||||
}
|
||||
return status
|
||||
|
||||
def install_tool(self, tool_name: str) -> Tuple[bool, str]:
|
||||
"""Install a specific tool"""
|
||||
if tool_name not in PENTEST_TOOLS:
|
||||
return False, f"Unknown tool: {tool_name}"
|
||||
|
||||
tool_info = PENTEST_TOOLS[tool_name]
|
||||
install_cmds = tool_info.get("install", {})
|
||||
|
||||
# Try package manager first
|
||||
if self.package_manager in install_cmds:
|
||||
cmd = install_cmds[self.package_manager]
|
||||
elif "pip" in install_cmds:
|
||||
cmd = install_cmds["pip"]
|
||||
elif "go" in install_cmds and shutil.which("go"):
|
||||
cmd = install_cmds["go"]
|
||||
elif "gem" in install_cmds and shutil.which("gem"):
|
||||
cmd = install_cmds["gem"]
|
||||
else:
|
||||
return False, f"No installation method available for {tool_name} on this system"
|
||||
|
||||
print(f"[*] Installing {tool_name}...")
|
||||
print(f" Command: {cmd}")
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
shell=True,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=300
|
||||
)
|
||||
|
||||
if result.returncode == 0:
|
||||
# Verify installation
|
||||
installed, path = self.check_tool_installed(tool_name)
|
||||
if installed:
|
||||
return True, f"Successfully installed {tool_name} at {path}"
|
||||
else:
|
||||
return True, f"Installation completed but binary not found in PATH"
|
||||
else:
|
||||
return False, f"Installation failed: {result.stderr}"
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
return False, "Installation timed out"
|
||||
except Exception as e:
|
||||
return False, f"Installation error: {str(e)}"
|
||||
|
||||
def install_all_tools(self) -> Dict[str, Tuple[bool, str]]:
|
||||
"""Install all pentest tools"""
|
||||
results = {}
|
||||
for tool_name in PENTEST_TOOLS:
|
||||
installed, path = self.check_tool_installed(tool_name)
|
||||
if installed:
|
||||
results[tool_name] = (True, f"Already installed at {path}")
|
||||
else:
|
||||
results[tool_name] = self.install_tool(tool_name)
|
||||
return results
|
||||
|
||||
def install_essential_tools(self) -> Dict[str, Tuple[bool, str]]:
|
||||
"""Install only essential tools for basic pentesting"""
|
||||
essential = ["nmap", "sqlmap", "nikto", "nuclei", "curl", "jq", "httpx", "ffuf"]
|
||||
results = {}
|
||||
for tool_name in essential:
|
||||
installed, path = self.check_tool_installed(tool_name)
|
||||
if installed:
|
||||
results[tool_name] = (True, f"Already installed at {path}")
|
||||
else:
|
||||
results[tool_name] = self.install_tool(tool_name)
|
||||
return results
|
||||
|
||||
|
||||
def print_tools_menu():
|
||||
"""Print the tools installation menu"""
|
||||
installer = ToolInstaller()
|
||||
status = installer.get_tools_status()
|
||||
|
||||
print("\n" + "="*70)
|
||||
print(" PENTEST TOOLS INSTALLATION MANAGER")
|
||||
print("="*70)
|
||||
print(f"\nDetected Package Manager: {installer.package_manager}")
|
||||
print("\nAvailable Tools:")
|
||||
print("-"*70)
|
||||
|
||||
for i, (tool_name, info) in enumerate(status.items(), 1):
|
||||
status_icon = "[+]" if info["installed"] else "[-]"
|
||||
status_text = "Installed" if info["installed"] else "Not Installed"
|
||||
print(f" {i:2}. {status_icon} {tool_name:15} - {info['description'][:40]}")
|
||||
|
||||
print("-"*70)
|
||||
print("\nOptions:")
|
||||
print(" A - Install ALL tools")
|
||||
print(" E - Install ESSENTIAL tools only (nmap, sqlmap, nikto, nuclei, etc.)")
|
||||
print(" 1-N - Install specific tool by number")
|
||||
print(" Q - Return to main menu")
|
||||
print("-"*70)
|
||||
|
||||
return installer, list(status.keys())
|
||||
|
||||
|
||||
def run_installer_menu():
|
||||
"""Run the interactive installer menu"""
|
||||
while True:
|
||||
installer, tool_list = print_tools_menu()
|
||||
|
||||
choice = input("\nSelect option: ").strip().upper()
|
||||
|
||||
if choice == 'Q':
|
||||
break
|
||||
elif choice == 'A':
|
||||
print("\n[*] Installing all tools...")
|
||||
results = installer.install_all_tools()
|
||||
for tool, (success, msg) in results.items():
|
||||
icon = "[+]" if success else "[!]"
|
||||
print(f" {icon} {tool}: {msg}")
|
||||
input("\nPress Enter to continue...")
|
||||
elif choice == 'E':
|
||||
print("\n[*] Installing essential tools...")
|
||||
results = installer.install_essential_tools()
|
||||
for tool, (success, msg) in results.items():
|
||||
icon = "[+]" if success else "[!]"
|
||||
print(f" {icon} {tool}: {msg}")
|
||||
input("\nPress Enter to continue...")
|
||||
else:
|
||||
try:
|
||||
idx = int(choice) - 1
|
||||
if 0 <= idx < len(tool_list):
|
||||
tool_name = tool_list[idx]
|
||||
success, msg = installer.install_tool(tool_name)
|
||||
icon = "[+]" if success else "[!]"
|
||||
print(f"\n {icon} {msg}")
|
||||
input("\nPress Enter to continue...")
|
||||
else:
|
||||
print("[!] Invalid selection")
|
||||
except ValueError:
|
||||
print("[!] Invalid input")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_installer_menu()
|
||||
Reference in New Issue
Block a user