diff --git a/.github/workflows/test_install.yml b/.github/workflows/test_install.yml index edf2f3d2..353b9b65 100644 --- a/.github/workflows/test_install.yml +++ b/.github/workflows/test_install.yml @@ -26,7 +26,7 @@ jobs: cache: 'pip' - run: pip install --upgrade pip - run: pwd && ls -hal - - run: sudo ./install.sh 1 + - run: sudo ./install.py 1 - run: pwd && ls -hal # Typing "1" will allow us to manually enter the filepath to hackingtool. # Provide the filepath ${HOME}/work/hackingtool/hackingtool diff --git a/Dockerfile b/Dockerfile index 5656a50a..f7b0f2b5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,12 @@ -FROM kalilinux/kali-rolling - +FROM kalilinux/kali-rolling:latest RUN apt-get update && \ -apt-get install -y git python3-pip figlet sudo; - -#Install packages dependencies -RUN true && \ -apt-get install -y boxes php curl xdotool wget; + apt-get install -y git python3-pip figlet sudo && \ + apt-get install -y boxes php curl xdotool wget WORKDIR /root/hackingtool +COPY requirements.txt ./ +RUN pip3 install --no-cache-dir boxes flask lolcat requests -r requirements.txt COPY . . - -RUN true && \ -pip3 install boxes flask lolcat requests -r requirements.txt; - -RUN true && \ - echo "/root/hackingtool/" > /home/hackingtoolpath.txt; - +RUN true && echo "/root/hackingtool/" > /home/hackingtoolpath.txt; EXPOSE 1-65535 - -ENTRYPOINT ["python3", "/root/hackingtool/hackingtool.py"] +ENTRYPOINT ["python3", "/root/hackingtool/hackingtool.py"] \ No newline at end of file diff --git a/README.md b/README.md index 7f803864..c951a542 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ - [SubDomain Finder](https://github.com/aboul3la/Sublist3r) - [CheckURL](https://github.com/UndeadSec/checkURL) - [Blazy(Also Find ClickJacking)](https://github.com/UltimateHackers/Blazy) -- [Sub-Domain TakeOver](https://github.com/m4ll0k/takeover) +- [Sub-Domain TakeOver](https://github.com/edoardottt/takeover) - [Dirb](https://gitlab.com/kalilinux/packages/dirb) ### Post exploitation tools - [Vegile - Ghost In The Shell](https://github.com/Screetsec/Vegile) @@ -124,6 +124,7 @@ - [Bulk extractor](https://github.com/simsong/bulk_extractor) - [Disk Clone and ISO Image Acquire](https://guymager.sourceforge.io/) - [Toolsley](https://www.toolsley.com/) +- [Volatility3](https://github.com/volatilityfoundation/volatility3/) ### Payload creation tools - [The FatRat](https://github.com/Screetsec/TheFatRat) - [Brutal](https://github.com/Screetsec/Brutal) @@ -200,13 +201,14 @@ - [Gospider](https://github.com/jaeles-project/gospider) #### Mix tools - Terminal Multiplexer +- [Crivo](https://github.com/GMDSantana/crivo) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A00.png) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A0.png) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A1.png) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A2.png) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A4.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/A.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/AA.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/AAA.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/AAAA.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/AAAAA.png) ## Installation For Linux linux

@@ -231,7 +233,7 @@ ## Step : 4 Run hackingtool - sudo bash install.sh + sudo python install.py ## Step : 5 For installing tools in directory @@ -240,13 +242,34 @@ ## Use image with Docker -### Run in one click -`docker run -it vgpastor/hackingtool` +### Create Docker Image +- Create the docker image -### Build locally -`docker-compose build` +```bash +docker buitl -t vgpastor/hackingtool . +``` -`docker-compose run hackingtool` +### Run as container + +```bash +docker-compose up -d +``` + +### Interact with terminal + +- Get into the container +```bash +docker exec -it hackingtool bash +``` +**OUTPUT:** +```bash +Select Best Option : + + [1] Kali Linux / Parrot-Os (apt) + [2] Arch Linux (pacman) + [0] Exit +``` +Enter the options and continue. - If need open other ports you can edit the docker-compose.yml file - Volumes are mounted in the container to persist data and can share files between the host and the container diff --git a/README_template.md b/README_template.md index ea2f0e62..58f2fff0 100644 --- a/README_template.md +++ b/README_template.md @@ -23,11 +23,11 @@ # Hackingtool Menu 🧰 -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A00.png) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A0.png) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A1.png) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A2.png) -![](https://github.com/Z4nzu/hackingtool/blob/master/images/A4.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/A.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/AA.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/AAA.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/AAAA.png) +![](https://github.com/Z4nzu/hackingtool/blob/master/images/AAAAA.png) ## Installation guide for Linux linux

@@ -41,7 +41,7 @@ sudo pip3 install -r requirements.txt - bash install.sh + python install.py sudo hackingtool diff --git a/core.py b/core.py index 49156602..9fb68eec 100644 --- a/core.py +++ b/core.py @@ -1,11 +1,21 @@ +from rich.console import Console +from rich.panel import Panel +from rich.table import Table +from rich import box +from rich.traceback import install +from rich.theme import Theme + import os import sys import webbrowser from platform import system from traceback import print_exc -from typing import Callable -from typing import List -from typing import Tuple +from typing import Callable, List, Tuple + +# Enable rich tracebacks +install() +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) def clear_screen(): @@ -24,57 +34,57 @@ def validate_input(ip, val_range): class HackingTool(object): - # About the HackingTool - TITLE: str = "" # used to show info in the menu + TITLE: str = "" DESCRIPTION: str = "" - INSTALL_COMMANDS: List[str] = [] INSTALLATION_DIR: str = "" - UNINSTALL_COMMANDS: List[str] = [] - RUN_COMMANDS: List[str] = [] - OPTIONS: List[Tuple[str, Callable]] = [] - PROJECT_URL: str = "" - def __init__(self, options = None, installable: bool = True, - runnable: bool = True): + def __init__(self, options=None, installable=True, runnable=True): options = options or [] if isinstance(options, list): self.OPTIONS = [] if installable: - self.OPTIONS.append(('Install', self.install)) + self.OPTIONS.append(("Install", self.install)) if runnable: - self.OPTIONS.append(('Run', self.run)) + self.OPTIONS.append(("Run", self.run)) self.OPTIONS.extend(options) else: - raise Exception( - "options must be a list of (option_name, option_fn) tuples") + raise Exception("options must be a list of (option_name, option_fn) tuples") def show_info(self): - desc = self.DESCRIPTION + desc = f"[cyan]{self.DESCRIPTION}[/cyan]" if self.PROJECT_URL: - desc += '\n\t[*] ' - desc += self.PROJECT_URL - os.system(f'echo "{desc}"|boxes -d boy | lolcat') + desc += f"\n[green]πŸ”— {self.PROJECT_URL}[/green]" + console.print(Panel(desc, title=f"[bold purple]{self.TITLE}[/bold purple]", border_style="purple", box=box.DOUBLE)) - def show_options(self, parent = None): + def show_options(self, parent=None): clear_screen() self.show_info() + + table = Table(title="Options", box=box.SIMPLE_HEAVY) + table.add_column("No.", style="bold cyan", justify="center") + table.add_column("Action", style="bold yellow") + for index, option in enumerate(self.OPTIONS): - print(f"[{index + 1}] {option[0]}") + table.add_row(str(index + 1), option[0]) + if self.PROJECT_URL: - print(f"[{98}] Open project page") - print(f"[{99}] Back to {parent.TITLE if parent is not None else 'Exit'}") - option_index = input("Select an option : ").strip() + table.add_row("98", "Open Project Page") + table.add_row("99", f"Back to {parent.TITLE if parent else 'Exit'}") + + console.print(table) + + option_index = input("\n[?] Select an option: ").strip() try: option_index = int(option_index) if option_index - 1 in range(len(self.OPTIONS)): ret_code = self.OPTIONS[option_index - 1][1]() if ret_code != 99: - input("\n\nPress ENTER to continue:").strip() + input("\nPress [Enter] to continue...") elif option_index == 98: self.show_project_page() elif option_index == 99: @@ -82,95 +92,101 @@ def show_options(self, parent = None): sys.exit() return 99 except (TypeError, ValueError): - print("Please enter a valid option") - input("\n\nPress ENTER to continue:").strip() + console.print("[red]⚠ Please enter a valid option.[/red]") + input("\nPress [Enter] to continue...") except Exception: - print_exc() - input("\n\nPress ENTER to continue:").strip() - return self.show_options(parent = parent) + console.print_exception(show_locals=True) + input("\nPress [Enter] to continue...") + return self.show_options(parent=parent) - def before_install(self): - pass + def before_install(self): pass def install(self): self.before_install() if isinstance(self.INSTALL_COMMANDS, (list, tuple)): for INSTALL_COMMAND in self.INSTALL_COMMANDS: + console.print(f"[yellow]β†’ {INSTALL_COMMAND}[/yellow]") os.system(INSTALL_COMMAND) self.after_install() def after_install(self): - print("Successfully installed!") + console.print("[green]βœ” Successfully installed![/green]") def before_uninstall(self) -> bool: - """ Ask for confirmation from the user and return """ return True def uninstall(self): if self.before_uninstall(): if isinstance(self.UNINSTALL_COMMANDS, (list, tuple)): for UNINSTALL_COMMAND in self.UNINSTALL_COMMANDS: + console.print(f"[red]β†’ {UNINSTALL_COMMAND}[/red]") os.system(UNINSTALL_COMMAND) self.after_uninstall() - def after_uninstall(self): - pass + def after_uninstall(self): pass - def before_run(self): - pass + def before_run(self): pass def run(self): self.before_run() if isinstance(self.RUN_COMMANDS, (list, tuple)): for RUN_COMMAND in self.RUN_COMMANDS: + console.print(f"[cyan]βš™ Running:[/cyan] [bold]{RUN_COMMAND}[/bold]") os.system(RUN_COMMAND) self.after_run() - def after_run(self): - pass + def after_run(self): pass - def is_installed(self, dir_to_check = None): - print("Unimplemented: DO NOT USE") + def is_installed(self, dir_to_check=None): + console.print("[yellow]⚠ Unimplemented: DO NOT USE[/yellow]") return "?" def show_project_page(self): + console.print(f"[blue]🌐 Opening project page: {self.PROJECT_URL}[/blue]") webbrowser.open_new_tab(self.PROJECT_URL) class HackingToolsCollection(object): - TITLE: str = "" # used to show info in the menu + TITLE: str = "" DESCRIPTION: str = "" - TOOLS = [] # type: List[Any[HackingTool, HackingToolsCollection]] + TOOLS: List = [] def __init__(self): pass def show_info(self): - os.system("figlet -f standard -c {} | lolcat".format(self.TITLE)) - # os.system(f'echo "{self.DESCRIPTION}"|boxes -d boy | lolcat') - # print(self.DESCRIPTION) + console.rule(f"[bold purple]{self.TITLE}[/bold purple]", style="purple") + console.print(f"[italic cyan]{self.DESCRIPTION}[/italic cyan]\n") - def show_options(self, parent = None): + def show_options(self, parent=None): clear_screen() self.show_info() + + table = Table(title="Available Tools", box=box.MINIMAL_DOUBLE_HEAD) + table.add_column("No.", justify="center", style="bold cyan") + table.add_column("Tool Name", style="bold yellow") + for index, tool in enumerate(self.TOOLS): - print(f"[{index} {tool.TITLE}") - print(f"[{99}] Back to {parent.TITLE if parent is not None else 'Exit'}") - tool_index = input("Choose a tool to proceed: ").strip() + table.add_row(str(index), tool.TITLE) + + table.add_row("99", f"Back to {parent.TITLE if parent else 'Exit'}") + console.print(table) + + tool_index = input("\n[?] Choose a tool: ").strip() try: tool_index = int(tool_index) if tool_index in range(len(self.TOOLS)): - ret_code = self.TOOLS[tool_index].show_options(parent = self) + ret_code = self.TOOLS[tool_index].show_options(parent=self) if ret_code != 99: - input("\n\nPress ENTER to continue:").strip() + input("\nPress [Enter] to continue...") elif tool_index == 99: if parent is None: sys.exit() return 99 except (TypeError, ValueError): - print("Please enter a valid option") - input("\n\nPress ENTER to continue:").strip() + console.print("[red]⚠ Please enter a valid option.[/red]") + input("\nPress [Enter] to continue...") except Exception: - print_exc() - input("\n\nPress ENTER to continue:").strip() - return self.show_options(parent = parent) + console.print_exception(show_locals=True) + input("\nPress [Enter] to continue...") + return self.show_options(parent=parent) diff --git a/docker-compose.yml b/docker-compose.yml index 93ca8da0..301548bb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,10 @@ version: "3.9" services: hackingtool: - build: . - stdin_open: true # docker run -i - tty: true # docker run -t + image: vgpastor/hackingtool + container_name: hackingtool + stdin_open: true + tty: true volumes: - .:/root/hackingtool ports: diff --git a/generate_readme.py b/generate_readme.py index 069b015d..fa3cba5d 100644 --- a/generate_readme.py +++ b/generate_readme.py @@ -1,9 +1,16 @@ +# coding=utf-8 import re +from rich.console import Console +from rich.theme import Theme + from core import HackingTool from core import HackingToolsCollection from hackingtool import all_tools +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + def sanitize_anchor(s): return re.sub(r"\W", "-", s.lower()) @@ -48,4 +55,4 @@ def generate_readme(): if __name__ == '__main__': - generate_readme() + generate_readme() \ No newline at end of file diff --git a/hackingtool.py b/hackingtool.py index 1e433e89..9db5a938 100755 --- a/hackingtool.py +++ b/hackingtool.py @@ -1,11 +1,22 @@ #!/usr/bin/env python3 -# Version 1.1.0 +# Version 1.1.0 (rich UI - purple theme) import os import sys import webbrowser from platform import system from time import sleep +from rich.console import Console +from rich.panel import Panel +from rich.table import Table +from rich.prompt import Prompt, IntPrompt, Confirm +from rich.align import Align +from rich.text import Text +from rich import box +from rich.columns import Columns +from rich.rule import Rule +from rich.padding import Padding + from core import HackingToolsCollection from tools.anonsurf import AnonSurfTools from tools.ddos import DDOSTools @@ -26,7 +37,9 @@ from tools.wordlist_generator import WordlistGeneratorTools from tools.xss_attack import XSSAttackTools -logo = """\033[33m +console = Console() + +ASCII_LOGO = r""" β–„β–ˆ β–ˆβ–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–„β–ˆ β–„β–ˆβ–„ β–„β–ˆ β–ˆβ–ˆβ–ˆβ–„β–„β–„β–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–„β–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–€β–€β–€β–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–β–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆβ–Œ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–€β–€β–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ @@ -35,11 +48,29 @@ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–„ β–ˆβ–ˆβ–ˆβ–β–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–Œ β–„ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–€ β–ˆβ–€ β–€β–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–„β–ˆβ–ˆ - β–€ β–€ - \033[34m[βœ”] https://github.com/Z4nzu/hackingtool [βœ”] - \033[34m[βœ”] Version 1.1.0 [βœ”] - \033[91m[X] Please Don't Use For illegal Activity [X] -\033[97m """ + β–€ β–€ +""" + +tool_definitions = [ + ("Anonymously Hiding Tools", "πŸ›‘οΈ"), + ("Information gathering tools", "πŸ”"), + ("Wordlist Generator", "πŸ“š"), + ("Wireless attack tools", "πŸ“Ά"), + ("SQL Injection Tools", "🧩"), + ("Phishing attack tools", "🎣"), + ("Web Attack tools", "🌐"), + ("Post exploitation tools", "πŸ”§"), + ("Forensic tools", "πŸ•΅οΈ"), + ("Payload creation tools", "πŸ“¦"), + ("Exploit framework", "🧰"), + ("Reverse engineering tools", "πŸ”"), + ("DDOS Attack Tools", "⚑"), + ("Remote Administrator Tools (RAT)", "πŸ–₯️"), + ("XSS Attack Tools", "πŸ’₯"), + ("Steganograhy tools", "πŸ–ΌοΈ"), + ("Other tools", "✨"), + ("Update or Uninstall | Hackingtool", "♻️"), +] all_tools = [ AnonSurfTools(), @@ -68,55 +99,129 @@ class AllTools(HackingToolsCollection): TOOLS = all_tools def show_info(self): - print(logo + '\033[0m \033[97m') + header = Text() + header.append(ASCII_LOGO, style="bold magenta") + header.append("\n\n",) + footer = Text.assemble( + (" https://github.com/Z4nzu/hackingtool ", "bold bright_black"), + (" | ",), + ("Version 1.1.0", "bold green"), + ) + warning = Text(" Please Don't Use For illegal Activity ", style="bold red") + panel = Panel( + Align.center(header + Text("\n") + footer + Text("\n") + warning), + box=box.DOUBLE, + padding=(1, 2), + border_style="magenta" + ) + console.print(panel) -if __name__ == "__main__": - try: - if system() == 'Linux': - fpath = os.path.expanduser("~/hackingtoolpath.txt") - if not os.path.exists(fpath): - os.system('clear') - # run.menu() - print(""" - [@] Set Path (All your tools will be installed in that directory) - [1] Manual - [2] Default - """) - choice = input("Z4nzu =>> ").strip() - - if choice == "1": - inpath = input("Enter Path (with Directory Name) >> ").strip() - with open(fpath, "w") as f: - f.write(inpath) - print("Successfully Set Path to: {}".format(inpath)) - elif choice == "2": - autopath = "/home/hackingtool/" - with open(fpath, "w") as f: - f.write(autopath) - print("Your Default Path Is: {}".format(autopath)) - sleep(3) - else: - print("Try Again..!!") - sys.exit(0) +def build_menu(): + table = Table.grid(expand=True) + table.add_column("idx", width=6, justify="right") + table.add_column("name", justify="left") + for idx, (title, icon) in enumerate(tool_definitions): + if idx == 17: + label = "[bold magenta]99[/bold magenta]" + name = f"[bold magenta]{icon} {title}[/bold magenta]" + else: + label = f"[bold magenta]{idx}[/bold magenta]" + name = f"[white]{icon}[/white] [magenta]{title}[/magenta]" + table.add_row(label, name) + + top_panel = Panel( + Align.center(Text("HackingTool β€” Main Menu", style="bold white on magenta"), vertical="middle"), + style="magenta", + padding=(0, 1), + box=box.ROUNDED + ) + menu_panel = Panel.fit( + table, + title="[bold magenta]Select a tool[/bold magenta]", + border_style="bright_magenta", + box=box.SQUARE + ) + footer = Align.center(Text("Choose number and press Enter β€” 99 to exit", style="italic bright_black")) + console.print(top_panel) + console.print(menu_panel) + console.print(Rule(style="bright_black")) + console.print(footer) + console.print("") + + +def choose_path(): + fpath = os.path.expanduser("~/hackingtoolpath.txt") + if not os.path.exists(fpath): + os.system("clear" if system() == "Linux" else "cls") + build_menu() + console.print(Panel("Setup path for tool installations", border_style="magenta")) + choice = Prompt.ask("[magenta]Set Path[/magenta]", choices=["1", "2"], default="2") + if choice == "1": + inpath = Prompt.ask("[magenta]Enter Path (with Directory Name)[/magenta]") + with open(fpath, "w") as f: + f.write(inpath) + console.print(f"[green]Successfully Set Path to:[/green] {inpath}") + else: + autopath = "/home/hackingtool/" + with open(fpath, "w") as f: + f.write(autopath) + console.print(f"[green]Your Default Path Is:[/green] {autopath}") + sleep(1) + return fpath + + +def interact_menu(): + while True: + try: + build_menu() + choice = IntPrompt.ask("[magenta]Choose a tool to proceed[/magenta]", default=0) + if choice == 99: + console.print(Panel("[bold white on magenta]Goodbye β€” Come Back Safely[/bold white on magenta]")) + break + if 0 <= choice < len(all_tools): + tool = all_tools[choice] + name = tool_definitions[choice][0] + console.print(Panel(f"[bold magenta]{tool_definitions[choice][1]} Selected:[/bold magenta] [white]{name}")) + try: + fn = getattr(tool, "show_options", None) + if callable(fn): + fn() + else: + console.print(f"[yellow]Tool '{name}' has no interactive menu (show_options).[/yellow]") + except Exception as e: + console.print(Panel(f"[red]Error while opening {name}[/red]\n{e}", border_style="red")) + if not Confirm.ask("[magenta]Return to main menu?[/magenta]", default=True): + console.print(Panel("[bold white on magenta]Exiting...[/bold white on magenta]")) + break + else: + console.print("[red]Invalid selection. Pick a number from the menu.[/red]") + except KeyboardInterrupt: + console.print("\n[bold red]Interrupted by user β€” exiting[/bold red]") + break + +def main(): + try: + if system() == "Linux": + fpath = choose_path() with open(fpath) as f: - archive = f.readline() + archive = f.readline().strip() os.makedirs(archive, exist_ok=True) os.chdir(archive) - AllTools().show_options() - - # If not Linux and probably Windows + AllTools().show_info() + interact_menu() elif system() == "Windows": - print( - r"\033[91m Please Run This Tool On A Debian System For Best Results\e[00m" - ) + console.print(Panel("[bold red]Please run this tool on a Debian/Linux system for best results[/bold red]")) + if Confirm.ask("Open guidance link in your browser?", default=True): + webbrowser.open_new_tab("https://tinyurl.com/y522modc") sleep(2) - webbrowser.open_new_tab("https://tinyurl.com/y522modc") - else: - print("Please Check Your System or Open New Issue ...") - + console.print("[yellow]Please Check Your System or Open New Issue ...[/yellow]") except KeyboardInterrupt: - print("\nExiting ..!!!") - sleep(2) + console.print("\n[bold red]Exiting ..!!![/bold red]") + sleep(1) + + +if __name__ == "__main__": + main() diff --git a/images/A.png b/images/A.png new file mode 100644 index 00000000..80d43f8b Binary files /dev/null and b/images/A.png differ diff --git a/images/A0.png b/images/A0.png deleted file mode 100644 index 68d3234c..00000000 Binary files a/images/A0.png and /dev/null differ diff --git a/images/A00.png b/images/A00.png deleted file mode 100644 index 215e213a..00000000 Binary files a/images/A00.png and /dev/null differ diff --git a/images/A1.png b/images/A1.png deleted file mode 100644 index a5af007e..00000000 Binary files a/images/A1.png and /dev/null differ diff --git a/images/A2.png b/images/A2.png deleted file mode 100644 index 053f50fa..00000000 Binary files a/images/A2.png and /dev/null differ diff --git a/images/A4.png b/images/A4.png deleted file mode 100644 index 26d30b3e..00000000 Binary files a/images/A4.png and /dev/null differ diff --git a/images/AA.png b/images/AA.png new file mode 100644 index 00000000..5716f893 Binary files /dev/null and b/images/AA.png differ diff --git a/images/AAA.png b/images/AAA.png new file mode 100644 index 00000000..87c5d3a4 Binary files /dev/null and b/images/AAA.png differ diff --git a/images/AAAA.png b/images/AAAA.png new file mode 100644 index 00000000..1ca83adc Binary files /dev/null and b/images/AAAA.png differ diff --git a/images/AAAAA.png b/images/AAAAA.png new file mode 100644 index 00000000..549a2c52 Binary files /dev/null and b/images/AAAAA.png differ diff --git a/install.py b/install.py new file mode 100755 index 00000000..d7c328f5 --- /dev/null +++ b/install.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 +# install_hackingtool.py (rich-based installer UI) +import os +import sys +import shutil +import subprocess +from pathlib import Path + +from rich.console import Console +from rich.panel import Panel +from rich.prompt import Prompt, Confirm, IntPrompt +from rich.table import Table +from rich.align import Align +from rich.progress import Progress, SpinnerColumn, TextColumn +from rich.text import Text +from rich import box +from random import choice + +console = Console() + +REPO_URL = "https://github.com/Z4nzu/hackingtool.git" +INSTALL_DIR = Path("/usr/share/hackingtool") +BIN_PATH = Path("/usr/bin/hackingtool") +VENV_DIR_NAME = "venv" +REQUIREMENTS = "requirements.txt" + + +def check_root(): + if os.geteuid() != 0: + console.print(Panel("[red]This installer must be run as root. Use: sudo python3 install_hackingtool.py[/red]")) + sys.exit(1) + + +def run_cmd(cmd, check=True, capture=False, env=None): + return subprocess.run(cmd, shell=True, check=check, capture_output=capture, text=True, env=env) + + +def colorful_logo(): + logos = ["magenta", "bright_magenta", "cyan", "blue", "green", "yellow"] + style = choice(logos) + logo_lines = r""" + β–„β–ˆ β–ˆβ–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–„β–ˆ β–„β–ˆβ–„ β–„β–ˆ β–ˆβ–ˆβ–ˆβ–„β–„β–„β–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–„β–ˆ + β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–€β–€β–€β–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ + β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–β–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆβ–Œ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–€β–€β–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ + β–„β–ˆβ–ˆβ–ˆβ–„β–„β–„β–„β–ˆβ–ˆβ–ˆβ–„β–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆβ–Œ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ +β–€β–€β–ˆβ–ˆβ–ˆβ–€β–€β–€β–€β–ˆβ–ˆβ–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆβ–Œ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–€β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ + β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–„ β–ˆβ–ˆβ–ˆβ–β–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ + β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–Œ β–„ + β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–€ β–ˆβ–€ β–€β–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–„β–ˆβ–ˆ + β–€ β–€ +""" + panel = Panel(Text(logo_lines, style=style), box=box.DOUBLE, border_style=style) + console.print(panel) + console.print(f"[bold {style}]https://github.com/Z4nzu/hackingtool[/bold {style}]\n") + + +def choose_distro(): + console.print(Panel("[bold magenta]Select installation target[/bold magenta]\n\n[1] Kali / Parrot (apt)\n[2] Arch (pacman)\n[0] Exit", border_style="bright_magenta")) + choice = IntPrompt.ask("Choice", choices=["0", "1", "2"], default=1) + return choice + + +def check_internet(): + console.print("[yellow]* Checking internet connectivity...[/yellow]") + try: + run_cmd("curl -sSf --max-time 10 https://www.google.com > /dev/null", check=True) + console.print("[green][βœ”] Internet connection OK[/green]") + return True + except Exception: + try: + run_cmd("curl -sSf --max-time 10 https://github.com > /dev/null", check=True) + console.print("[green][βœ”] Internet connection OK[/green]") + return True + except Exception: + console.print("[red][✘] Internet connection not available[/red]") + return False + + +def system_update_and_install(choice): + if choice == 1: + console.print("[yellow]* Running apt update/upgrade...[/yellow]") + try: + run_cmd("apt update -y && apt upgrade -y") + except subprocess.CalledProcessError as e: + console.print(f"[red][!][/red] apt update/upgrade failed (non-fatal). Continuing installation. Error: {e}") + console.print("[yellow]* Installing required packages (apt)...[/yellow]") + try: + run_cmd("apt-get install -y git python3-pip python3-venv figlet boxes php curl xdotool wget") + except subprocess.CalledProcessError as e: + console.print(f"[red][!][/red] apt-get install failed (non-fatal). You may need to install some packages manually. Error: {e}") + elif choice == 2: + console.print("[yellow]* Running pacman update...[/yellow]") + try: + run_cmd("pacman -Syu --noconfirm") + except subprocess.CalledProcessError as e: + console.print(f"[red][!][/red] pacman update failed (non-fatal). Continuing installation. Error: {e}") + console.print("[yellow]* Installing required packages (pacman)...[/yellow]") + try: + run_cmd("pacman -S --noconfirm git python-pip") + except subprocess.CalledProcessError as e: + console.print(f"[red][!][/red] pacman install failed (non-fatal). You may need to install some packages manually. Error: {e}") + else: + console.print("[red]Invalid package manager choice[/red]") + + +def prepare_install_dir(): + if INSTALL_DIR.exists(): + console.print(f"[red]The directory {INSTALL_DIR} already exists.[/red]") + if Confirm.ask("Replace it? This will remove the existing directory", default=False): + run_cmd(f"rm -rf {str(INSTALL_DIR)}") + else: + console.print("[red]Installation aborted by user.[/red]") + sys.exit(1) + INSTALL_DIR.mkdir(parents=True, exist_ok=True) + + +def git_clone(): + console.print("[yellow]* Cloning hackingtool repository...[/yellow]") + try: + run_cmd(f"git clone {REPO_URL} {str(INSTALL_DIR)}") + console.print("[green][βœ”] Repository cloned[/green]") + return True + except Exception as e: + console.print(f"[red][✘] Failed to clone repository: {e}[/red]") + return False + + +def create_venv_and_install(choice): + venv_path = INSTALL_DIR / VENV_DIR_NAME + console.print("[yellow]* Creating virtual environment...[/yellow]") + run_cmd(f"python3 -m venv {str(venv_path)}") + activate = venv_path / "bin" / "activate" + pip = str(venv_path / "bin" / "pip") + if (INSTALL_DIR / REQUIREMENTS).exists(): + console.print("[yellow]* Installing Python requirements...[/yellow]") + run_cmd(f"{pip} install -r {str(INSTALL_DIR / REQUIREMENTS)}") + else: + console.print("[yellow]requirements.txt not found, skipping pip install.[/yellow]") + if choice == 1: + run_cmd("apt install figlet -y") + elif choice == 2: + # try pacman and fallback to AUR instructions + try: + run_cmd("pacman -S --noconfirm figlet") + except Exception: + console.print("[yellow]figlet not available in pacman automatically. Consider installing from AUR.[/yellow]") + + +def create_launcher(): + console.print("[yellow]* Creating launcher script...[/yellow]") + launcher = INSTALL_DIR / "hackingtool.sh" + with open(launcher, "w") as f: + f.write("#!/bin/bash\n") + f.write(f"source {str(INSTALL_DIR / VENV_DIR_NAME)}/bin/activate\n") + f.write(f"python3 {str(INSTALL_DIR / 'hackingtool.py')} \"$@\"\n") + os.chmod(launcher, 0o755) + # move to /usr/bin/hackingtool + if BIN_PATH.exists(): + BIN_PATH.unlink() + shutil.move(str(launcher), str(BIN_PATH)) + console.print(f"[green][βœ”] Launcher installed at {str(BIN_PATH)}[/green]") + + +def final_messages(): + panel = Panel( + "[bold magenta]Installation complete[/bold magenta]\n\nType [bold cyan]hackingtool[/bold cyan] in terminal to start.", + border_style="magenta", + ) + console.print(panel) + +def main(): + check_root() + console.clear() + colorful_logo() + choice = choose_distro() + if choice == 0: + console.print("[red]Exiting...[/red]") + sys.exit(0) + if not check_internet(): + sys.exit(1) + + with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress: + progress.add_task(description="Preparing system...", total=None) + system_update_and_install(choice) + + prepare_install_dir() + ok = git_clone() + if not ok: + sys.exit(1) + + with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress: + progress.add_task(description="Setting up virtualenv & requirements...", total=None) + create_venv_and_install(choice) + + create_launcher() + final_messages() + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + console.print("\n[red]Installation interrupted by user[/red]") + sys.exit(1) + except subprocess.CalledProcessError as e: + console.print(f"[red]Command failed: {e}[/red]") + sys.exit(1) diff --git a/install.sh b/install.sh deleted file mode 100755 index 59abb135..00000000 --- a/install.sh +++ /dev/null @@ -1,160 +0,0 @@ -#!/bin/bash - -set -e - -clear - -RED='\e[1;31m' -GREEN='\e[1;32m' -YELLOW='\e[1;33m' -BLUE='\e[1;34m' -CYAN='\e[1;36m' -WHITE='\e[1;37m' -ORANGE='\e[1;93m' -NC='\e[0m' - -if [[ $EUID -ne 0 ]]; then - echo -e "${RED}This script must be run as root" - exit 1 -fi - -COLOR_NUM=$((RANDOM % 7)) -# Assign a color variable based on the random number -case $COLOR_NUM in - 0) COLOR=$RED;; - 1) COLOR=$GREEN;; - 2) COLOR=$YELLOW;; - 3) COLOR=$BLUE;; - 4) COLOR=$CYAN;; - 5) COLOR=$ORANGE;; - *) COLOR=$WHITE;; -esac - -echo -e "${COLOR}" -echo "" -echo " β–„β–ˆ β–ˆβ–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–„β–ˆ β–„β–ˆβ–„ β–„β–ˆ β–ˆβ–ˆβ–ˆβ–„β–„β–„β–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–„β–ˆ "; -echo " β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–€β–€β–€β–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ "; -echo " β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–β–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆβ–Œ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–€β–€β–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ "; -echo " β–„β–ˆβ–ˆβ–ˆβ–„β–„β–„β–„β–ˆβ–ˆβ–ˆβ–„β–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆβ–Œ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ "; -echo "β–€β–€β–ˆβ–ˆβ–ˆβ–€β–€β–€β–€β–ˆβ–ˆβ–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆβ–Œ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–€β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ "; -echo " β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–„ β–ˆβ–ˆβ–ˆβ–β–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ "; -echo " β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–ˆβ–ˆβ–„ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–Œ β–„ "; -echo " β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆ β–€β–ˆβ–€ β–ˆβ–€ β–€β–ˆ β–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–„β–ˆβ–ˆ "; -echo " β–€ β–€ "; - -echo -e "${BLUE} https://github.com/Z4nzu/hackingtool ${NC}" -echo -e "${RED} [!] This Tool Must Run As ROOT [!]${NC}\n" -echo -e "${CYAN} Select Best Option : \n" -echo -e "${WHITE} [1] Kali Linux / Parrot-Os (apt)" -echo -e "${WHITE} [2] Arch Linux (pacman)" # added arch linux support because of feature request #231 -echo -e "${WHITE} [0] Exit " - -echo -e "${COLOR}β”Œβ”€β”€($USERγ‰Ώ$HOST)-[$(pwd)]" -choice=$1 -if [[ ! $choice =~ ^[1-2]+$ ]]; then - read -p "└─$>>" choice -fi - -# Define installation directories -install_dir="/usr/share/hackingtool" -bin_dir="/usr/bin" - -# Check if the user chose a valid option and perform the installation steps -if [[ $choice =~ ^[1-2]+$ ]]; then - echo -e "${YELLOW}[*] Checking Internet Connection ..${NC}" - echo ""; - if curl -s -m 10 https://www.google.com > /dev/null || curl -s -m 10 https://www.github.com > /dev/null; then - echo -e "${GREEN}[βœ”] Internet connection is OK [βœ”]${NC}" - echo ""; - echo -e "${YELLOW}[*] Updating package list ..." - # Perform installation steps based on the user's choice - if [[ $choice == 1 ]]; then - sudo apt update -y && sudo apt upgrade -y - sudo apt-get install -y git python3-pip figlet boxes php curl xdotool wget -y ; - elif [[ $choice == 2 ]]; then - sudo pacman -Suy -y - sudo pacman -S python-pip -y - else - exit - fi - echo ""; - echo -e "${YELLOW}[*] Checking directories...${NC}" - if [[ -d "$install_dir" ]]; then - echo -e -n "${RED}[!] The directory $install_dir already exists. Do you want to replace it? [y/n]: ${NC}" - read input - if [[ $input == "y" ]] || [[ $input == "Y" ]]; then - echo -e "${YELLOW}[*]Removing existing module.. ${NC}" - sudo rm -rf "$install_dir" - else - echo -e "${RED}[✘]Installation Not Required[✘] ${NC}" - exit - fi - fi - echo ""; - echo -e "${YELLOW}[βœ”] Downloading hackingtool...${NC}" - if sudo git clone https://github.com/Z4nzu/hackingtool.git $install_dir; then - # Install virtual environment - echo -e "${YELLOW}[*] Installing Virtual Environment...${NC}" - if [[ $choice == 1 ]]; then - sudo apt install python3-venv -y - elif [[ $choice == 2 ]]; then - echo "Python 3.3+ comes with a module called venv."; - fi - echo ""; - # Create a virtual environment for the tool - echo -e "${YELLOW}[*] Creating virtual environment..." - sudo python3 -m venv $install_dir/venv - source $install_dir/venv/bin/activate - # Install requirements - echo -e "${GREEN}[βœ”] Virtual Environment successfully [βœ”]${NC}"; - echo ""; - echo -e "${YELLOW}[*] Installing requirements...${NC}" - if [[ $choice == 1 ]]; then - pip3 install -r $install_dir/requirements.txt - sudo apt install figlet -y - elif [[ $choice == 2 ]]; then - pip3 install -r $install_dir/requirements.txt - sudo -u $SUDO_USER git clone https://aur.archlinux.org/boxes.git && cd boxes - sudo -u $SUDO_USER makepkg -si - sudo pacman -S figlet -y - fi - # Create a shell script to launch the tool - echo -e "${YELLOW}[*] Creating a shell script to launch the tool..." -# echo '#!/bin/bash' > hackingtool.sh - echo '#!/bin/bash' > $install_dir/hackingtool.sh - echo "source $install_dir/venv/bin/activate" >> $install_dir/hackingtool.sh - echo "python3 $install_dir/hackingtool.py \$@" >> $install_dir/hackingtool.sh - chmod +x $install_dir/hackingtool.sh - sudo mv $install_dir/hackingtool.sh $bin_dir/hackingtool - echo -e "${GREEN}[βœ”] Script created successfully [βœ”]" - else - echo -e "${RED}[✘] Failed to download Hackingtool [✘]" - exit 1 - fi - - else - echo -e "${RED}[✘] Internet connection is not available [✘]${NC}" - exit 1 - fi - - if [ -d $install_dir ]; then - echo ""; - echo -e "${GREEN}[βœ”] Successfully Installed [βœ”]"; - echo ""; - echo ""; - echo -e "${ORANGE}[+]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[+]" - echo "[+] [+]" - echo -e "${ORANGE}[+] βœ”βœ”βœ” Now Just Type In Terminal (hackingtool) βœ”βœ”βœ” [+]" - echo "[+] [+]" - echo -e "${ORANGE}[+]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[+]" - else - echo -e "${RED}[✘] Installation Failed !!! [✘]"; - exit 1 - fi - -elif [[ $choice == 0 ]]; then - echo -e "${RED}[✘] Exiting tool [✘]" - exit 1 -else - echo -e "${RED}[!] Select Valid Option [!]" -fi diff --git a/requirements.txt b/requirements.txt index 3ee5ae76..5fd25154 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ boxes flask lolcat -requests \ No newline at end of file +requests +rich \ No newline at end of file diff --git a/tools/anonsurf.py b/tools/anonsurf.py index 05d4b5e0..93884db9 100644 --- a/tools/anonsurf.py +++ b/tools/anonsurf.py @@ -1,25 +1,38 @@ # coding=utf-8 import os +from rich.console import Console +from rich.panel import Panel +from rich.prompt import Prompt +from rich.text import Text +from rich.table import Table + from core import HackingTool from core import HackingToolsCollection +console = Console() +P_COLOR = "magenta" + class AnonymouslySurf(HackingTool): TITLE = "Anonymously Surf" - DESCRIPTION = "It automatically overwrites the RAM when\n" \ - "the system is shutting down and also change Ip." + DESCRIPTION = ( + "It automatically overwrites the RAM when\n" + "the system is shutting down and also change Ip." + ) INSTALL_COMMANDS = [ "sudo git clone https://github.com/Und3rf10w/kali-anonsurf.git", - "cd kali-anonsurf && sudo ./installer.sh && cd .. && sudo rm -r kali-anonsurf" + "cd kali-anonsurf && sudo ./installer.sh && cd .. && sudo rm -r kali-anonsurf", ] RUN_COMMANDS = ["sudo anonsurf start"] PROJECT_URL = "https://github.com/Und3rf10w/kali-anonsurf" def __init__(self): - super(AnonymouslySurf, self).__init__([('Stop', self.stop)]) + super(AnonymouslySurf, self).__init__([("Stop", self.stop)]) def stop(self): + console.print(Panel(Text(self.TITLE, justify="center"), style=f"bold {P_COLOR}")) + console.print("Stopping Anonsurf...", style=f"bold {P_COLOR}") os.system("sudo anonsurf stop") @@ -28,13 +41,16 @@ class Multitor(HackingTool): DESCRIPTION = "How to stay in multi places at the same time" INSTALL_COMMANDS = [ "sudo git clone https://github.com/trimstray/multitor.git", - "cd multitor;sudo bash setup.sh install" + "cd multitor;sudo bash setup.sh install", + ] + RUN_COMMANDS = [ + "multitor --init 2 --user debian-tor --socks-port 9000 --control-port 9900 --proxy privoxy --haproxy" ] - RUN_COMMANDS = ["multitor --init 2 --user debian-tor --socks-port 9000 --control-port 9900 --proxy privoxy --haproxy"] PROJECT_URL = "https://github.com/trimstray/multitor" def __init__(self): - super(Multitor, self).__init__(runnable = False) + # keep original behavior (non-runnable) while still initializing + super(Multitor, self).__init__(runnable=False) class AnonSurfTools(HackingToolsCollection): @@ -42,5 +58,72 @@ class AnonSurfTools(HackingToolsCollection): DESCRIPTION = "" TOOLS = [ AnonymouslySurf(), - Multitor() + Multitor(), ] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Anonymously Hiding Tools", show_lines=True, expand=True) + table.add_column("Title", style="magenta", no_wrap=True) + table.add_column("Description", style="magenta") + table.add_column("Project URL", style="magenta", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc).strip().replace("\n", " "), str(url)) + + panel = Panel(table, title=f"[{P_COLOR}]Available Tools[/ {P_COLOR}]", border_style=P_COLOR) + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + console.print(Panel.fit( + "[bold magenta]Anonymously Hiding Tools Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style=P_COLOR + )) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # delegate if collection-style interface exists + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # otherwise, if the tool has actions or a run method, prefer those + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = AnonSurfTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/ddos.py b/tools/ddos.py index f9e93372..b8a1bbcf 100644 --- a/tools/ddos.py +++ b/tools/ddos.py @@ -2,9 +2,18 @@ import os import subprocess +from rich.console import Console +from rich.prompt import Prompt +from rich.panel import Panel +from rich.text import Text +from rich.table import Table + from core import HackingTool from core import HackingToolsCollection +console = Console() +P_COLOR = "magenta" # primary purple/magenta theme for styling + class ddos(HackingTool): TITLE = "ddos" @@ -21,12 +30,13 @@ class ddos(HackingTool): PROJECT_URL = "https://github.com/the-deepnet/ddos.git" def run(self): - method = input("Enter Method >> ") - url = input("Enter URL >> ") - threads = input("Enter Threads >> ") - proxylist = input(" Enter ProxyList >> ") - multiple = input(" Enter Multiple >> ") - timer = input(" Enter Timer >> ") + console.print(Panel(Text(self.TITLE, justify="center"), style=f"bold {P_COLOR}")) + method = Prompt.ask("Enter Method >>") + url = Prompt.ask("Enter URL >>") + threads = Prompt.ask("Enter Threads >>") + proxylist = Prompt.ask("Enter ProxyList >>") + multiple = Prompt.ask("Enter Multiple >>") + timer = Prompt.ask("Enter Timer >>") os.system("cd ddos;") subprocess.run( [ @@ -52,7 +62,8 @@ class SlowLoris(HackingTool): INSTALL_COMMANDS = ["sudo pip3 install slowloris"] def run(self): - target_site = input("Enter Target Site:- ") + console.print(Panel(Text(self.TITLE, justify="center"), style=f"bold {P_COLOR}")) + target_site = Prompt.ask("Enter Target Site:-") subprocess.run(["slowloris", target_site]) @@ -70,9 +81,10 @@ class Asyncrone(HackingTool): PROJECT_URL = "https://github.com/fatihsnsy/aSYNcrone" def run(self): - source_port = input("Enter Source Port >> ") - target_ip = input("Enter Target IP >> ") - target_port = input("Enter Target port >> ") + console.print(Panel(Text(self.TITLE, justify="center"), style=f"bold {P_COLOR}")) + source_port = Prompt.ask("Enter Source Port >>") + target_ip = Prompt.ask("Enter Target IP >>") + target_port = Prompt.ask("Enter Target port >>") os.system("cd aSYNcrone;") subprocess.run( ["sudo", "./aSYNcrone", source_port, target_ip, target_port, 1000] @@ -108,8 +120,9 @@ class GoldenEye(HackingTool): PROJECT_URL = "https://github.com/jseidl/GoldenEye" def run(self): + console.print(Panel(Text(self.TITLE, justify="center"), style=f"bold {P_COLOR}")) os.system("cd GoldenEye ;sudo ./goldeneye.py") - print("\033[96m Go to Directory \n [*] USAGE: ./goldeneye.py [OPTIONS]") + console.print("Go to Directory\n[*] USAGE: ./goldeneye.py [OPTIONS]") class Saphyra(HackingTool): @@ -125,13 +138,81 @@ class Saphyra(HackingTool): PROJECT_URL = "https://github.com/anonymous24x7/Saphyra-DDoS" def run(self): - url = input("Enter url>>> ") + console.print(Panel(Text(self.TITLE, justify="center"), style=f"bold {P_COLOR}")) + url = Prompt.ask("Enter url>>>") try: os.system("python saphyra.py " + url) except Exception: - print("Enter a valid url.") + console.print("Enter a valid url.", style="bold red") class DDOSTools(HackingToolsCollection): TITLE = "DDOS Attack Tools" TOOLS = [SlowLoris(), Asyncrone(), UFONet(), GoldenEye(), Saphyra()] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="DDOS Attack Tools", show_lines=True, expand=True) + table.add_column("Title", style="magenta", no_wrap=True) + table.add_column("Description", style="magenta") + table.add_column("Project URL", style="magenta", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc).strip().replace("\n", " "), str(url)) + + panel = Panel(table, title=f"[{P_COLOR}]Available Tools[/ {P_COLOR}]", border_style=P_COLOR) + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + console.print(Panel.fit( + "[bold magenta]DDOS Attack Tools Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style=P_COLOR + )) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # If tool exposes show_options (collection-style), delegate to it + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # Otherwise, if runnable, call its run method + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = DDOSTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/exploit_frameworks.py b/tools/exploit_frameworks.py index 9b78e1ee..22f4fe73 100644 --- a/tools/exploit_frameworks.py +++ b/tools/exploit_frameworks.py @@ -3,6 +3,15 @@ from core import HackingToolsCollection from tools.webattack import Web2Attack +from rich.console import Console +from rich.table import Table +from rich.panel import Panel +from rich.text import Text +from rich.prompt import Prompt + +console = Console() +PURPLE_STYLE = "bold magenta" + class RouterSploit(HackingTool): TITLE = "RouterSploit" @@ -42,7 +51,7 @@ class Commix(HackingTool): PROJECT_URL = "https://github.com/commixproject/commix" def __init__(self): - super(Commix, self).__init__(runnable = False) + super(Commix, self).__init__(runnable=False) class ExploitFrameworkTools(HackingToolsCollection): @@ -53,3 +62,91 @@ class ExploitFrameworkTools(HackingToolsCollection): Commix(), Web2Attack() ] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Exploit framework", show_lines=True, expand=True) + table.add_column("Title", style="magenta", no_wrap=True) + table.add_column("Description", style="magenta") + table.add_column("Project URL", style="magenta", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc).strip().replace("\n", " "), str(url)) + + panel = Panel(table, title=f"[magenta]Available Tools[/magenta]", border_style=PURPLE_STYLE) + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + console.print(Panel.fit( + "[bold magenta]Exploit Framework Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style=PURPLE_STYLE + )) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # If tool exposes show_options (collection-style), delegate to it + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # Otherwise, if runnable, call its run method + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +# --- Optional helper: pretty-print the tools list into a magenta-styled table. +# This helper is non-invasive and does not change tool logic. +def render_tools_table(tools, title: str | None = None): + """ + Render a list of HackingTool instances (or objects with TITLE/DESCRIPTION/PROJECT_URL) + as a rich table in magenta style. + """ + tbl = Table(title=title or "Tools", show_lines=False, header_style=PURPLE_STYLE) + tbl.add_column("Name", style=PURPLE_STYLE, no_wrap=True) + tbl.add_column("Description") + tbl.add_column("Project URL", overflow="fold") + + for t in tools: + name = getattr(t, "TITLE", "") + desc = getattr(t, "DESCRIPTION", "") + url = getattr(t, "PROJECT_URL", "") + tbl.add_row(name, desc, url) + + console.print(Panel(tbl, border_style=PURPLE_STYLE, title=Text(title or "Toolset", style=PURPLE_STYLE))) + + +if __name__ == "__main__": + tools = ExploitFrameworkTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/forensic_tools.py b/tools/forensic_tools.py index 84d6b7db..29b1af18 100644 --- a/tools/forensic_tools.py +++ b/tools/forensic_tools.py @@ -1,9 +1,24 @@ # coding=utf-8 import os +import sys + +# Fetching parent directory for importing core.py +current_dir = os.path.dirname(__file__) +parent_dir = os.path.dirname(current_dir) +sys.path.append(parent_dir) from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.panel import Panel +from rich.text import Text +from rich.table import Table +from rich.prompt import Prompt + +console = Console() +PURPLE_STYLE = "bold magenta" + class Autopsy(HackingTool): TITLE = "Autopsy" @@ -14,7 +29,7 @@ class Autopsy(HackingTool): RUN_COMMANDS = ["sudo autopsy"] def __init__(self): - super(Autopsy, self).__init__(installable = False) + super(Autopsy, self).__init__(installable=False) class Wireshark(HackingTool): @@ -25,7 +40,7 @@ class Wireshark(HackingTool): RUN_COMMANDS = ["sudo wireshark"] def __init__(self): - super(Wireshark, self).__init__(installable = False) + super(Wireshark, self).__init__(installable=False) class BulkExtractor(HackingTool): @@ -37,23 +52,24 @@ def __init__(self): super(BulkExtractor, self).__init__([ ('GUI Mode (Download required)', self.gui_mode), ('CLI Mode', self.cli_mode) - ], installable = False, runnable = False) + ], installable=False, runnable=False) def gui_mode(self): - os.system( - "sudo git clone https://github.com/simsong/bulk_extractor.git") + console.print(Panel(Text(self.TITLE, justify="center"), style=PURPLE_STYLE)) + console.print("[bold magenta]Cloning repository and attempting to run GUI...[/]") + os.system("sudo git clone https://github.com/simsong/bulk_extractor.git") os.system("ls src/ && cd .. && cd java_gui && ./BEViewer") - print( - "If you getting error after clone go to /java_gui/src/ And Compile .Jar file && run ./BEViewer") - print( - "Please Visit For More Details About Installation >> https://github.com/simsong/bulk_extractor") + console.print( + "[magenta]If you get an error after clone go to /java_gui/src/ and compile the .jar file && run ./BEViewer[/]") + console.print( + "[magenta]Please visit for more details about installation: https://github.com/simsong/bulk_extractor[/]") def cli_mode(self): + console.print(Panel(Text(self.TITLE + " - CLI Mode", justify="center"), style=PURPLE_STYLE)) os.system("sudo apt install bulk-extractor") - print("bulk_extractor and options") + console.print("[magenta]Showing bulk_extractor help and options:[/]") os.system("bulk_extractor -h") - os.system( - 'echo "bulk_extractor [options] imagefile" | boxes -d headline | lolcat') + os.system('echo "bulk_extractor [options] imagefile" | boxes -d headline | lolcat') class Guymager(HackingTool): @@ -63,6 +79,9 @@ class Guymager(HackingTool): RUN_COMMANDS = ["sudo guymager"] PROJECT_URL = "https://guymager.sourceforge.io/" + def __init__(self): + super(Guymager, self).__init__(installable=False) + class Toolsley(HackingTool): TITLE = "Toolsley" @@ -77,7 +96,7 @@ class Toolsley(HackingTool): PROJECT_URL = "https://www.toolsley.com/" def __init__(self): - super(Toolsley, self).__init__(installable = False, runnable = False) + super(Toolsley, self).__init__(installable=False, runnable=False) class ForensicTools(HackingToolsCollection): @@ -89,3 +108,72 @@ class ForensicTools(HackingToolsCollection): Guymager(), Toolsley() ] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Forensic Tools", show_lines=True, expand=True) + table.add_column("Title", style=PURPLE_STYLE, no_wrap=True) + table.add_column("Description", style=PURPLE_STYLE) + table.add_column("Project URL", style=PURPLE_STYLE, no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc).replace("\n", " "), str(url)) + + console.print(Panel(table, title=f"[magenta]Available Tools[/magenta]", border_style=PURPLE_STYLE)) + + def show_options(self, parent=None): + console.print("\n") + console.print(Panel.fit( + "[bold magenta]Forensic Tools Collection[/bold magenta]\n" + "Select a tool to run or view options.", + border_style=PURPLE_STYLE + )) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # delegate to collection-like tools if available + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # if tool exposes actions (like BulkExtractor) and has a menu, try to show it + elif hasattr(selected, "show_actions"): + selected.show_actions(parent=self) + # otherwise try to call run if present + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = ForensicTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/information_gathering_tools.py b/tools/information_gathering_tools.py index 65b0169a..14f9bc78 100644 --- a/tools/information_gathering_tools.py +++ b/tools/information_gathering_tools.py @@ -3,11 +3,21 @@ import socket import subprocess import webbrowser +import sys from core import HackingTool from core import HackingToolsCollection from core import clear_screen +from rich.console import Console +from rich.panel import Panel +from rich.text import Text +from rich.prompt import Prompt +from rich.table import Table + +console = Console() +PURPLE_STYLE = "bold magenta" + class NMAP(HackingTool): TITLE = "Network Map (nmap)" @@ -19,7 +29,7 @@ class NMAP(HackingTool): PROJECT_URL = "https://github.com/nmap/nmap" def __init__(self): - super(NMAP, self).__init__(runnable = False) + super(NMAP, self).__init__(runnable=False) class Dracnmap(HackingTool): @@ -33,19 +43,17 @@ class Dracnmap(HackingTool): RUN_COMMANDS = ["cd Dracnmap;sudo ./dracnmap-v2.2.sh"] PROJECT_URL = "https://github.com/Screetsec/Dracnmap" -# def __init__(self): -# super(Dracnmap, self).__init__(runnable = False) - class PortScan(HackingTool): TITLE = "Port scanning" def __init__(self): - super(PortScan, self).__init__(installable = False) + super(PortScan, self).__init__(installable=False) def run(self): clear_screen() - target = input('Select a Target IP: ') + console.print(Panel(Text(self.TITLE, justify="center"), style=PURPLE_STYLE)) + target = Prompt.ask("[bold]Select a Target IP[/]", default="", show_default=False) subprocess.run(["sudo", "nmap", "-O", "-Pn", target]) @@ -53,13 +61,14 @@ class Host2IP(HackingTool): TITLE = "Host to IP " def __init__(self): - super(Host2IP, self).__init__(installable = False) + super(Host2IP, self).__init__(installable=False) def run(self): clear_screen() - host = input("Enter host name (e.g. www.google.com):- ") + console.print(Panel(Text(self.TITLE, justify="center"), style=PURPLE_STYLE)) + host = Prompt.ask("Enter host name (e.g. www.google.com):- ") ips = socket.gethostbyname(host) - print(ips) + console.print(f"[{PURPLE_STYLE}]{host} -> {ips}[/]") class XeroSploit(HackingTool): @@ -96,9 +105,6 @@ class ReconSpider(HackingTool): RUN_COMMANDS = ["cd reconspider;python3 reconspider.py"] PROJECT_URL = "https://github.com/bhavsec/reconspider" -# def __init__(self): -# super(ReconSpider, self).__init__(runnable = False) - class IsItDown(HackingTool): TITLE = "IsItDown (Check Website Down/Up)" @@ -106,9 +112,10 @@ class IsItDown(HackingTool): def __init__(self): super(IsItDown, self).__init__( - [('Open', self.open)], installable = False, runnable = False) + [('Open', self.open)], installable=False, runnable=False) def open(self): + console.print(Panel("Opening isitdownrightnow.com", style=PURPLE_STYLE)) webbrowser.open_new_tab("https://www.isitdownrightnow.com/") @@ -142,7 +149,8 @@ class Striker(HackingTool): PROJECT_URL = "https://github.com/s0md3v/Striker" def run(self): - site = input("Enter Site Name (example.com) >> ") + console.print(Panel(Text(self.TITLE, justify="center"), style=PURPLE_STYLE)) + site = Prompt.ask("Enter Site Name (example.com) >> ") os.chdir("Striker") subprocess.run(["sudo", "python3", "striker.py", site]) @@ -160,7 +168,7 @@ class SecretFinder(HackingTool): PROJECT_URL = "https://github.com/m4ll0k/SecretFinder" def __init__(self): - super(SecretFinder, self).__init__(runnable = False) + super(SecretFinder, self).__init__(runnable=False) class Shodan(HackingTool): @@ -172,7 +180,7 @@ class Shodan(HackingTool): PROJECT_URL = "https://github.com/m4ll0k/Shodanfy.py" def __init__(self): - super(Shodan, self).__init__(runnable = False) + super(Shodan, self).__init__(runnable=False) class PortScannerRanger(HackingTool): @@ -185,7 +193,8 @@ class PortScannerRanger(HackingTool): PROJECT_URL = "https://github.com/floriankunushevci/rang3r" def run(self): - ip = input("Enter Ip >> ") + console.print(Panel(Text(self.TITLE, justify="center"), style=PURPLE_STYLE)) + ip = Prompt.ask("Enter Ip >> ") os.chdir("rang3r") subprocess.run(["sudo", "python", "rang3r.py", "--ip", ip]) @@ -195,12 +204,14 @@ class Breacher(HackingTool): DESCRIPTION = "An advanced multithreaded admin panel finder written in python." INSTALL_COMMANDS = ["git clone https://github.com/s0md3v/Breacher.git"] PROJECT_URL = "https://github.com/s0md3v/Breacher" - + def run(self): - domain = input("Enter domain (example.com) >> ") + console.print(Panel(Text(self.TITLE, justify="center"), style=PURPLE_STYLE)) + domain = Prompt.ask("Enter domain (example.com) >> ") os.chdir("Breacher") subprocess.run(["python3", "breacher.py", "-u", domain]) + class InformationGatheringTools(HackingToolsCollection): TITLE = "Information gathering tools" TOOLS = [ @@ -220,3 +231,72 @@ class InformationGatheringTools(HackingToolsCollection): PortScannerRanger(), Breacher() ] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Information Gathering Tools", show_lines=True, expand=True) + table.add_column("Title", style=PURPLE_STYLE, no_wrap=True) + table.add_column("Description", style=PURPLE_STYLE) + table.add_column("Project URL", style=PURPLE_STYLE, no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc).replace("\n", " "), str(url)) + + console.print(Panel(table, title=f"[magenta]Available Tools[/magenta]", border_style=PURPLE_STYLE)) + + def show_options(self, parent=None): + console.print("\n") + console.print(Panel.fit( + "[bold magenta]Information Gathering Collection[/bold magenta]\n" + "Select a tool to view/run it or return to the previous menu.", + border_style=PURPLE_STYLE + )) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # delegate to collection-style tools if available + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # if tool exposes actions/menu, try to call it + elif hasattr(selected, "show_actions"): + selected.show_actions(parent=self) + # otherwise try to call run if present + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = InformationGatheringTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/other_tools.py b/tools/other_tools.py index 0b8cbd52..c72d5d2b 100644 --- a/tools/other_tools.py +++ b/tools/other_tools.py @@ -15,6 +15,15 @@ from tools.others.web_crawling import WebCrawlingTools from tools.others.wifi_jamming import WifiJammingTools +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class HatCloud(HackingTool): TITLE = "HatCloud(Bypass CloudFlare for IP)" @@ -44,3 +53,69 @@ class OtherTools(HackingToolsCollection): WebCrawlingTools(), MixTools() ] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Other Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc).strip().replace("\n", " "), str(url)) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Other Tools Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # If tool exposes show_options (collection-style), delegate to it + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # Otherwise, if runnable, call its run method + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = OtherTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/others/android_attack.py b/tools/others/android_attack.py index 5b56a2a1..8e536efa 100644 --- a/tools/others/android_attack.py +++ b/tools/others/android_attack.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class Keydroid(HackingTool): TITLE = "Keydroid" @@ -65,3 +75,62 @@ class AndroidAttackTools(HackingToolsCollection): Droidcam(), EvilApp() ] + + def pretty_print(self): + table = Table(title="Android Attack Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Android Attack Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = AndroidAttackTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/email_verifier.py b/tools/others/email_verifier.py index 5969bd0e..672df517 100644 --- a/tools/others/email_verifier.py +++ b/tools/others/email_verifier.py @@ -2,6 +2,15 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class KnockMail(HackingTool): TITLE = "Knockmail" @@ -17,4 +26,62 @@ class KnockMail(HackingTool): class EmailVerifyTools(HackingToolsCollection): TITLE = "Email Verify tools" TOOLS = [KnockMail()] - + + def pretty_print(self): + table = Table(title="Email Verify Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Email Verify Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = EmailVerifyTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/hash_crack.py b/tools/others/hash_crack.py index 60a7289f..96651e70 100644 --- a/tools/others/hash_crack.py +++ b/tools/others/hash_crack.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class HashBuster(HackingTool): TITLE = "Hash Buster" @@ -19,3 +29,62 @@ class HashBuster(HackingTool): class HashCrackingTools(HackingToolsCollection): TITLE = "Hash cracking tools" TOOLS = [HashBuster()] + + def pretty_print(self): + table = Table(title="Hash Cracking Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Hash Cracking Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = HashCrackingTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/others/homograph_attacks.py b/tools/others/homograph_attacks.py index 1ff22077..4d9943db 100644 --- a/tools/others/homograph_attacks.py +++ b/tools/others/homograph_attacks.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class EvilURL(HackingTool): TITLE = "EvilURL" @@ -15,3 +25,62 @@ class EvilURL(HackingTool): class IDNHomographAttackTools(HackingToolsCollection): TITLE = "IDN Homograph Attack" TOOLS = [EvilURL()] + + def pretty_print(self): + table = Table(title="IDN Homograph Attack Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]IDN Homograph Attack Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = IDNHomographAttackTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/mix_tools.py b/tools/others/mix_tools.py index 574eb875..5f54f920 100644 --- a/tools/others/mix_tools.py +++ b/tools/others/mix_tools.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class TerminalMultiplexer(HackingTool): TITLE = "Terminal Multiplexer" @@ -14,6 +24,84 @@ def __init__(self): super(TerminalMultiplexer, self).__init__(runnable = False) +class Crivo(HackingTool): + TITLE = "Crivo" + DESCRIPTION = "A tool for extracting and filtering URLs, IPs, domains, " \ + "\n and subdomains from web pages or text, " \ + "with built-in web scraping capabilities.\n" \ + "See: python3 crivo_cli.py -h" + INSTALL_COMMANDS = [ + "git clone https://github.com/GMDSantana/crivo.git", + "cd crivo;pip install -r requirements.txt" + ] + PROJECT_URL = "https://github.com/GMDSantana/crivo" + + def __init__(self): + super(Crivo, self).__init__(runnable = False) + + class MixTools(HackingToolsCollection): TITLE = "Mix tools" - TOOLS = [TerminalMultiplexer()] + TOOLS = [ + TerminalMultiplexer(), + Crivo() + ] + + def pretty_print(self): + table = Table(title="Mix Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Mix Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = MixTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/payload_injection.py b/tools/others/payload_injection.py index 92ab1467..b5c89b20 100644 --- a/tools/others/payload_injection.py +++ b/tools/others/payload_injection.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class DebInject(HackingTool): TITLE = "Debinject" @@ -23,9 +33,6 @@ class Pixload(HackingTool): PROJECT_URL = "https://github.com/chinarulezzz/pixload" def __init__(self): - # super(Pixload, self).__init__([ - # ('How To Use', self.show_project_page) - # ], runnable = False) super(Pixload, self).__init__(runnable = False) @@ -35,3 +42,62 @@ class PayloadInjectorTools(HackingToolsCollection): DebInject(), Pixload() ] + + def pretty_print(self): + table = Table(title="Payload Injector Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Payload Injector Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = PayloadInjectorTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/socialmedia.py b/tools/others/socialmedia.py index 3a1d0a2d..542f73a6 100644 --- a/tools/others/socialmedia.py +++ b/tools/others/socialmedia.py @@ -6,6 +6,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class InstaBrute(HackingTool): TITLE = "Instagram Attack" @@ -49,7 +59,6 @@ class Faceshell(HackingTool): def run(self): name = input("Enter Username >> ") wordlist = input("Enter Wordlist >> ") - # Ignore a FileNotFoundError if we are already in the Brute_Force directory with contextlib.suppress(FileNotFoundError): os.chdir("Brute_Force") subprocess.run( @@ -75,3 +84,62 @@ class SocialMediaBruteforceTools(HackingToolsCollection): Faceshell(), AppCheck() ] + + def pretty_print(self): + table = Table(title="Social Media Bruteforce Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Social Media Bruteforce Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = SocialMediaBruteforceTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/socialmedia_finder.py b/tools/others/socialmedia_finder.py index 405f8ab3..81720861 100644 --- a/tools/others/socialmedia_finder.py +++ b/tools/others/socialmedia_finder.py @@ -5,6 +5,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class FacialFind(HackingTool): TITLE = "Find SocialMedia By Facial Recognation System" @@ -85,3 +95,62 @@ class SocialMediaFinderTools(HackingToolsCollection): Sherlock(), SocialScan() ] + + def pretty_print(self): + table = Table(title="Social Media Finder Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Social Media Finder Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = SocialMediaFinderTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/web_crawling.py b/tools/others/web_crawling.py index 8d7989c6..7cb610fd 100644 --- a/tools/others/web_crawling.py +++ b/tools/others/web_crawling.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class GoSpider(HackingTool): TITLE = "Gospider" @@ -16,3 +26,62 @@ def __init__(self): class WebCrawlingTools(HackingToolsCollection): TITLE = "Web crawling" TOOLS = [GoSpider()] + + def pretty_print(self): + table = Table(title="Web Crawling Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Web Crawling Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = WebCrawlingTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/others/wifi_jamming.py b/tools/others/wifi_jamming.py index e2c5933a..55b20b8b 100644 --- a/tools/others/wifi_jamming.py +++ b/tools/others/wifi_jamming.py @@ -2,6 +2,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class WifiJammerNG(HackingTool): TITLE = "WifiJammer-NG" @@ -35,3 +45,62 @@ class WifiJammingTools(HackingToolsCollection): WifiJammerNG(), KawaiiDeauther() ] + + def pretty_print(self): + table = Table(title="Wifi Jamming Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Wifi Jamming Tools Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_info"): + selected.show_info() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = WifiJammingTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/payload_creator.py b/tools/payload_creator.py index 34ed64a5..28ba67a5 100644 --- a/tools/payload_creator.py +++ b/tools/payload_creator.py @@ -1,13 +1,23 @@ +# coding=utf-8 import os from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class TheFatRat(HackingTool): TITLE = "The FatRat" - DESCRIPTION = "TheFatRat Provides An Easy way to create Backdoors and \n" \ - "Payload which can bypass most anti-virus" + DESCRIPTION = "TheFatRat Provides An Easy way to create Backdoors and Payloads " \ + "which can bypass most anti-virus" INSTALL_COMMANDS = [ "sudo git clone https://github.com/Screetsec/TheFatRat.git", "cd TheFatRat && sudo chmod +x setup.sh" @@ -22,8 +32,7 @@ def __init__(self): ]) def update(self): - os.system( - "cd TheFatRat && bash update && chmod +x setup.sh && bash setup.sh") + os.system("cd TheFatRat && bash update && chmod +x setup.sh && bash setup.sh") def troubleshoot(self): os.system("cd TheFatRat && sudo chmod +x chk_tools && ./chk_tools") @@ -31,9 +40,8 @@ def troubleshoot(self): class Brutal(HackingTool): TITLE = "Brutal" - DESCRIPTION = "Brutal is a toolkit to quickly create various payload," \ - "powershell attack,\nvirus attack and launch listener for " \ - "a Human Interface Device" + DESCRIPTION = "Brutal is a toolkit to quickly create various payloads, powershell attacks, " \ + "virus attacks and launch listener for a Human Interface Device" INSTALL_COMMANDS = [ "sudo git clone https://github.com/Screetsec/Brutal.git", "cd Brutal && sudo chmod +x Brutal.sh" @@ -43,22 +51,22 @@ class Brutal(HackingTool): def show_info(self): super(Brutal, self).show_info() - print(""" - [!] Requirement - >> Arduino Software (I used v1.6.7) - >> TeensyDuino - >> Linux udev rules - >> Copy and paste the PaensyLib folder inside your Arduino libraries - - [!] Kindly Visit below link for Installation for Arduino - >> https://github.com/Screetsec/Brutal/wiki/Install-Requirements - """) + console.print(""" +[!] Requirement + >> Arduino Software (I used v1.6.7) + >> TeensyDuino + >> Linux udev rules + >> Copy and paste the PaensyLib folder inside your Arduino libraries + +[!] Visit for Installation for Arduino: + >> https://github.com/Screetsec/Brutal/wiki/Install-Requirements +""") class Stitch(HackingTool): TITLE = "Stitch" - DESCRIPTION = "Stitch is Cross Platform Python Remote Administrator Tool\n\t" \ - "[!] Refer Below Link For Wins & MAc Os" + DESCRIPTION = "Stitch is Cross Platform Python Remote Administrator Tool\n" \ + "[!] Refer Below Link For Wins & Mac OS" INSTALL_COMMANDS = [ "sudo git clone https://github.com/nathanlopez/Stitch.git", "cd Stitch && sudo pip install -r lnx_requirements.txt" @@ -69,10 +77,8 @@ class Stitch(HackingTool): class MSFVenom(HackingTool): TITLE = "MSFvenom Payload Creator" - DESCRIPTION = "MSFvenom Payload Creator (MSFPC) is a wrapper to generate \n" \ - "multiple types of payloads, based on users choice.\n" \ - "The idea is to be as simple as possible (only requiring " \ - "one input) \nto produce their payload." + DESCRIPTION = "MSFvenom Payload Creator (MSFPC) is a wrapper to generate multiple types of payloads, " \ + "based on user choice. Simplifies payload creation." INSTALL_COMMANDS = [ "sudo git clone https://github.com/g0tmi1k/msfpc.git", "cd msfpc;sudo chmod +x msfpc.sh" @@ -83,9 +89,7 @@ class MSFVenom(HackingTool): class Venom(HackingTool): TITLE = "Venom Shellcode Generator" - DESCRIPTION = "venom 1.0.11 (malicious_server) was build to take " \ - "advantage of \n apache2 webserver to deliver payloads " \ - "(LAN) using a fake webpage written in html" + DESCRIPTION = "Venom 1.0.11 (malicious_server) exploits apache2 webserver to deliver LAN payloads via fake webpages." INSTALL_COMMANDS = [ "sudo git clone https://github.com/r00t-3xp10it/venom.git", "sudo chmod -R 775 venom*/ && cd venom*/ && cd aux && sudo bash setup.sh", @@ -97,8 +101,7 @@ class Venom(HackingTool): class Spycam(HackingTool): TITLE = "Spycam" - DESCRIPTION = "Script to generate a Win32 payload that takes the webcam " \ - "image every 1 minute and send it to the attacker" + DESCRIPTION = "Generates a Win32 payload that captures webcam images every 1 minute and sends them to the attacker." INSTALL_COMMANDS = [ "sudo git clone https://github.com/indexnotfound404/spycam.git", "cd spycam && bash install.sh && chmod +x spycam" @@ -109,19 +112,20 @@ class Spycam(HackingTool): class MobDroid(HackingTool): TITLE = "Mob-Droid" - DESCRIPTION = "Mob-Droid helps you to generate metasploit payloads in " \ - "easy way\n without typing long commands and save your time" + DESCRIPTION = "Generates metasploit payloads easily without typing long commands." INSTALL_COMMANDS = [ - "git clone https://github.com/kinghacker0/mob-droid.git"] + "git clone https://github.com/kinghacker0/mob-droid.git" + ] RUN_COMMANDS = ["cd mob-droid;sudo python mob-droid.py"] PROJECT_URL = "https://github.com/kinghacker0/Mob-Droid" class Enigma(HackingTool): TITLE = "Enigma" - DESCRIPTION = "Enigma is a Multiplatform payload dropper" + DESCRIPTION = "Enigma is a Multiplatform payload dropper." INSTALL_COMMANDS = [ - "sudo git clone https://github.com/UndeadSec/Enigma.git"] + "sudo git clone https://github.com/UndeadSec/Enigma.git" + ] RUN_COMMANDS = ["cd Enigma;sudo python enigma.py"] PROJECT_URL = "https://github.com/UndeadSec/Enigma" @@ -138,3 +142,60 @@ class PayloadCreatorTools(HackingToolsCollection): MobDroid(), Enigma() ] + + def pretty_print(self): + table = Table(title="Payload Creation Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + console.print(Panel(table, title="[purple]Available Tools[/purple]", border_style="purple")) + + def show_options(self): + console.print("\n") + console.print(Panel.fit( + "[bold purple]Payload Creator Collection[/bold purple]\n" + "Select a tool to run it or exit.", + border_style="purple" + )) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + desc = getattr(tool, "DESCRIPTION", "") or "β€”" + table.add_row(str(i + 1), tool.TITLE, desc.replace("\n", " ")) + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "show_actions"): + selected.show_actions() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + + return self.show_options() + + +if __name__ == "__main__": + tools = PayloadCreatorTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/phising_attack.py b/tools/phising_attack.py index 44513463..fc90cdde 100644 --- a/tools/phising_attack.py +++ b/tools/phising_attack.py @@ -4,6 +4,16 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + + class autophisher(HackingTool): TITLE = "Autophisher RK" DESCRIPTION = "Automated Phishing Toolkit" @@ -13,7 +23,8 @@ class autophisher(HackingTool): ] RUN_COMMANDS = ["cd autophisher;sudo bash autophisher.sh"] PROJECT_URL = "https://github.com/CodingRanjith/autophisher" - + + class Pyphisher(HackingTool): TITLE = "Pyphisher" DESCRIPTION = "Easy to use phishing tool with 77 website templates" @@ -23,8 +34,9 @@ class Pyphisher(HackingTool): "pip3 install -r requirements.txt" ] RUN_COMMANDS = ["cd PyPhisher;sudo python3 pyphisher.py"] - PROJECT_URL = "git clone https://github.com/KasRoudra/PyPhisher" - + PROJECT_URL = "git clone https://github.com/KasRoudra/PyPhisher" + + class AdvPhishing(HackingTool): TITLE = "AdvPhishing" DESCRIPTION = "This is Advance Phishing Tool ! OTP PHISHING" @@ -32,7 +44,8 @@ class AdvPhishing(HackingTool): "sudo git clone https://github.com/Ignitetch/AdvPhishing.git", "cd AdvPhishing;chmod 777 *;bash Linux-Setup.sh"] RUN_COMMANDS = ["cd AdvPhishing && sudo bash AdvPhishing.sh"] - PROJECT_URL = "https://github.com/Ignitetch/AdvPhishing" + PROJECT_URL = "https://github.com/Ignitetch/AdvPhishing" + class Setoolkit(HackingTool): TITLE = "Setoolkit" @@ -118,7 +131,8 @@ class QRJacking(HackingTool): "sudo git clone https://github.com/cryptedwolf/ohmyqr.git && sudo apt -y install scrot"] RUN_COMMANDS = ["cd ohmyqr && sudo bash ohmyqr.sh"] PROJECT_URL = "https://github.com/cryptedwolf/ohmyqr" - + + class WifiPhisher(HackingTool): TITLE = "WifiPhisher" DESCRIPTION = "The Rogue Access Point Framework" @@ -126,8 +140,9 @@ class WifiPhisher(HackingTool): "sudo git clone https://github.com/wifiphisher/wifiphisher.git", "cd wifiphisher"] RUN_COMMANDS = ["cd wifiphisher && sudo python setup.py"] - PROJECT_URL = "https://github.com/wifiphisher/wifiphisher" - + PROJECT_URL = "https://github.com/wifiphisher/wifiphisher" + + class BlackEye(HackingTool): TITLE = "BlackEye" DESCRIPTION = "The ultimate phishing tool with 38 websites available!" @@ -135,7 +150,8 @@ class BlackEye(HackingTool): "sudo git clone https://github.com/thelinuxchoice/blackeye", "cd blackeye "] RUN_COMMANDS = ["cd blackeye && sudo bash blackeye.sh"] - PROJECT_URL = "https://github.com/An0nUD4Y/blackeye" + PROJECT_URL = "https://github.com/An0nUD4Y/blackeye" + class ShellPhish(HackingTool): TITLE = "ShellPhish" @@ -143,7 +159,8 @@ class ShellPhish(HackingTool): INSTALL_COMMANDS = ["git clone https://github.com/An0nUD4Y/shellphish.git"] RUN_COMMANDS = ["cd shellphish;sudo bash shellphish.sh"] PROJECT_URL = "https://github.com/An0nUD4Y/shellphish" - + + class Thanos(HackingTool): TITLE = "Thanos" DESCRIPTION = "Browser to Browser Phishingtoolkit" @@ -152,8 +169,9 @@ class Thanos(HackingTool): "cd Thanos && sudo chmod -R 777 Thanos.sh" ] RUN_COMMANDS = ["cd Thanos;sudo bash Thanos.sh"] - PROJECT_URL = "https://github.com/TridevReddy/Thanos" - + PROJECT_URL = "https://github.com/TridevReddy/Thanos" + + class QRLJacking(HackingTool): TITLE = "QRLJacking" DESCRIPTION = "QRLJacking" @@ -169,7 +187,8 @@ class QRLJacking(HackingTool): ] RUN_COMMANDS = ["cd QRLJacking/QRLJacker;python3 QrlJacker.py"] PROJECT_URL = "https://github.com/OWASP/QRLJacking" - + + class Maskphish(HackingTool): TITLE = "Miskphish" DESCRIPTION = "Hide phishing URL under a normal looking URL (google.com or facebook.com)" @@ -177,7 +196,7 @@ class Maskphish(HackingTool): "sudo git clone https://github.com/jaykali/maskphish.git", "cd maskphish"] RUN_COMMANDS = ["cd maskphish;sudo bash maskphish.sh"] - PROJECT_URL = "https://github.com/jaykali/maskphish" + PROJECT_URL = "https://github.com/jaykali/maskphish" class BlackPhish(HackingTool): @@ -195,11 +214,12 @@ def __init__(self): def update(self): os.system("cd BlackPhish;sudo bash update.sh") + class dnstwist(HackingTool): - Title='dnstwist' - Install_commands=['sudo git clone https://github.com/elceef/dnstwist.git','cd dnstwist'] - Run_commands=['cd dnstwist;sudo python3 dnstwist.py'] - project_url='https://github.com/elceef/dnstwist' + Title = 'dnstwist' + Install_commands = ['sudo git clone https://github.com/elceef/dnstwist.git','cd dnstwist'] + Run_commands = ['cd dnstwist;sudo python3 dnstwist.py'] + project_url = 'https://github.com/elceef/dnstwist' class PhishingAttackTools(HackingToolsCollection): @@ -223,3 +243,77 @@ class PhishingAttackTools(HackingToolsCollection): Maskphish(), dnstwist() ] + + def _get_attr_fallback(self, item, *names, default=""): + for n in names: + if hasattr(item, n): + return getattr(item, n) + return default + + def pretty_print(self): + table = Table(title="Phishing Attack Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + # try typical attribute names, then fall back to common variations + title = ( + self._get_attr_fallback(t, "TITLE", "Title", "title") + or t.__class__.__name__ + ) + desc = self._get_attr_fallback(t, "DESCRIPTION", "Description", "description", "INSTALL_COMMANDS", default="") or "" + # prefer PROJECT_URL but also accept project_url or project_url-like fields + url = self._get_attr_fallback(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") or "" + table.add_row(str(title), str(desc).strip().replace("\n", " "), str(url)) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Phishing Attack Tools Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr_fallback(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr_fallback(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # If tool exposes show_options (collection-style), delegate to it + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # Otherwise, if runnable, call its run method + elif hasattr(selected, "run"): + selected.run() + # Preserve any before_run hooks if present + elif hasattr(selected, "before_run"): + selected.before_run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = PhishingAttackTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/post_exploitation.py b/tools/post_exploitation.py index 3d9791fc..c1cd3a97 100644 --- a/tools/post_exploitation.py +++ b/tools/post_exploitation.py @@ -4,6 +4,15 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class Vegile(HackingTool): TITLE = "Vegile - Ghost In The Shell" @@ -42,3 +51,72 @@ class PostExploitationTools(HackingToolsCollection): Vegile(), ChromeKeyLogger() ] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Post-Exploitation Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="").strip().replace("\n", " ") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc or "β€”"), str(url)) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Post-Exploitation Tools Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # Delegate to collection-style show_options if available + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # Otherwise call run if available + elif hasattr(selected, "run"): + selected.run() + # If tool exposes before_run (like Vegile), call it to preserve original behavior + elif hasattr(selected, "before_run"): + selected.before_run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = PostExploitationTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/remote_administration.py b/tools/remote_administration.py index b8f226ab..c54f1ba0 100644 --- a/tools/remote_administration.py +++ b/tools/remote_administration.py @@ -2,6 +2,15 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class Stitch(HackingTool): TITLE = "Stitch" @@ -34,3 +43,72 @@ class RemoteAdministrationTools(HackingToolsCollection): Stitch(), Pyshell() ] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Remote Administration Tools (RAT)", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="").strip().replace("\n", " ") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc or "β€”"), str(url)) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Remote Administration Tools (RAT) Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + # If tool exposes show_options (collection-style), delegate to it + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + # Otherwise, if runnable, call its run method + elif hasattr(selected, "run"): + selected.run() + # Preserve any before_run hooks if present + elif hasattr(selected, "before_run"): + selected.before_run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = RemoteAdministrationTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/reverse_engineering.py b/tools/reverse_engineering.py index 552f781a..a221d460 100644 --- a/tools/reverse_engineering.py +++ b/tools/reverse_engineering.py @@ -4,6 +4,15 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class AndroGuard(HackingTool): TITLE = "Androguard" @@ -13,7 +22,7 @@ class AndroGuard(HackingTool): PROJECT_URL = "https://github.com/androguard/androguard " def __init__(self): - super(AndroGuard, self).__init__(runnable = False) + super(AndroGuard, self).__init__(runnable=False) class Apk2Gold(HackingTool): @@ -44,7 +53,7 @@ class Jadx(HackingTool): PROJECT_URL = "https://github.com/skylot/jadx" def __init__(self): - super(Jadx, self).__init__(runnable = False) + super(Jadx, self).__init__(runnable=False) class ReverseEngineeringTools(HackingToolsCollection): @@ -54,3 +63,69 @@ class ReverseEngineeringTools(HackingToolsCollection): Apk2Gold(), Jadx() ] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Reverse Engineering Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="").strip().replace("\n", " ") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc or "β€”"), str(url)) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Reverse Engineering Tools Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "before_run"): + selected.before_run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = ReverseEngineeringTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/sql_tools.py b/tools/sql_tools.py index 666ff9b3..36061ee3 100644 --- a/tools/sql_tools.py +++ b/tools/sql_tools.py @@ -2,113 +2,148 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class Sqlmap(HackingTool): TITLE = "Sqlmap tool" DESCRIPTION = "sqlmap is an open source penetration testing tool that " \ - "automates the process of \n" \ - "detecting and exploiting SQL injection flaws and taking " \ - "over of database servers \n " \ - "[!] python3 sqlmap.py -u [] --batch --banner \n " \ - "More Usage [!] https://github.com/sqlmapproject/sqlmap/wiki/Usage" - INSTALL_COMMANDS = [ - "sudo git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev"] + "automates the process of detecting and exploiting SQL injection flaws " \ + "and taking over database servers. [!] python3 sqlmap.py -u [http://example.com] --batch --banner. More usage: https://github.com/sqlmapproject/sqlmap/wiki/Usage" + INSTALL_COMMANDS = ["sudo git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev"] RUN_COMMANDS = ["cd sqlmap-dev;python3 sqlmap.py --wizard"] PROJECT_URL = "https://github.com/sqlmapproject/sqlmap" + class NoSqlMap(HackingTool): TITLE = "NoSqlMap" - DESCRIPTION = "NoSQLMap is an open source Python tool designed to \n " \ - "audit for as well as automate injection attacks and exploit.\n " \ - "\033[91m " \ - "[*] Please Install MongoDB \n " - INSTALL_COMMANDS = [ - "git clone https://github.com/codingo/NoSQLMap.git", - "sudo chmod -R 755 NoSQLMap;cd NoSQLMap;python setup.py install" - ] + DESCRIPTION = "NoSQLMap is an open source Python tool designed to audit and automate injection attacks. [*] Please install MongoDB." + INSTALL_COMMANDS = ["git clone https://github.com/codingo/NoSQLMap.git", + "sudo chmod -R 755 NoSQLMap;cd NoSQLMap;python setup.py install"] RUN_COMMANDS = ["python NoSQLMap"] PROJECT_URL = "https://github.com/codingo/NoSQLMap" class SQLiScanner(HackingTool): TITLE = "Damn Small SQLi Scanner" - DESCRIPTION = "Damn Small SQLi Scanner (DSSS) is a fully functional SQL " \ - "injection\nvulnerability scanner also supporting GET and " \ - "POST parameters.\n" \ - "[*]python3 dsss.py -h[help] | -u[URL]" + DESCRIPTION = "DSSS is a fully functional SQL injection vulnerability scanner also supporting GET and POST parameters. Usage: python3 dsss.py -h | -u [URL]" INSTALL_COMMANDS = ["git clone https://github.com/stamparm/DSSS.git"] PROJECT_URL = "https://github.com/stamparm/DSSS" def __init__(self): - super(SQLiScanner, self).__init__(runnable = False) + super(SQLiScanner, self).__init__(runnable=False) class Explo(HackingTool): TITLE = "Explo" - DESCRIPTION = "Explo is a simple tool to describe web security issues " \ - "in a human and machine readable format.\n " \ - "Usage:- \n " \ - "[1] explo [--verbose|-v] testcase.yaml \n " \ - "[2] explo [--verbose|-v] examples/*.yaml" - INSTALL_COMMANDS = [ - "git clone https://github.com/dtag-dev-sec/explo.git", - "cd explo;sudo python setup.py install" - ] + DESCRIPTION = "Explo is a simple tool to describe web security issues in human and machine readable format. Usage: explo [--verbose|-v] testcase.yaml | explo [--verbose|-v] examples/*.yaml" + INSTALL_COMMANDS = ["git clone https://github.com/dtag-dev-sec/explo.git", + "cd explo;sudo python setup.py install"] PROJECT_URL = "https://github.com/dtag-dev-sec/explo" def __init__(self): - super(Explo, self).__init__(runnable = False) + super(Explo, self).__init__(runnable=False) class Blisqy(HackingTool): TITLE = "Blisqy - Exploit Time-based blind-SQL injection" - DESCRIPTION = "Blisqy is a tool to aid Web Security researchers to find " \ - "Time-based Blind SQL injection \n on HTTP Headers and also " \ - "exploitation of the same vulnerability.\n " \ - "For Usage >> \n" + DESCRIPTION = "Blisqy helps web security researchers find time-based blind SQL injections on HTTP headers and exploit them." INSTALL_COMMANDS = ["git clone https://github.com/JohnTroony/Blisqy.git"] PROJECT_URL = "https://github.com/JohnTroony/Blisqy" def __init__(self): - super(Blisqy, self).__init__(runnable = False) + super(Blisqy, self).__init__(runnable=False) class Leviathan(HackingTool): TITLE = "Leviathan - Wide Range Mass Audit Toolkit" - DESCRIPTION = "Leviathan is a mass audit toolkit which has wide range " \ - "service discovery,\nbrute force, SQL injection detection " \ - "and running custom exploit capabilities. \n " \ - "[*] It Requires API Keys \n " \ - "More Usage [!] https://github.com/utkusen/leviathan/wiki" - INSTALL_COMMANDS = [ - "git clone https://github.com/leviathan-framework/leviathan.git", - "cd leviathan;sudo pip install -r requirements.txt" - ] + DESCRIPTION = "Leviathan is a mass audit toolkit with service discovery, brute force, SQL injection detection, and custom exploit capabilities. Requires API keys." + INSTALL_COMMANDS = ["git clone https://github.com/leviathan-framework/leviathan.git", + "cd leviathan;sudo pip install -r requirements.txt"] RUN_COMMANDS = ["cd leviathan;python leviathan.py"] PROJECT_URL = "https://github.com/leviathan-framework/leviathan" class SQLScan(HackingTool): TITLE = "SQLScan" - DESCRIPTION = "sqlscan is quick web scanner for find an sql inject point." \ - " not for educational, this is for hacking." - INSTALL_COMMANDS = [ - "sudo apt install php php-bz2 php-curl php-mbstring curl", - "sudo curl https://raw.githubusercontent.com/Cvar1984/sqlscan/dev/build/main.phar --output /usr/local/bin/sqlscan", - "chmod +x /usr/local/bin/sqlscan" - ] + DESCRIPTION = "SQLScan is a quick web scanner to find SQL injection points. Not for educational purposes." + INSTALL_COMMANDS = ["sudo apt install php php-bz2 php-curl php-mbstring curl", + "sudo curl https://raw.githubusercontent.com/Cvar1984/sqlscan/dev/build/main.phar --output /usr/local/bin/sqlscan", + "chmod +x /usr/local/bin/sqlscan"] RUN_COMMANDS = ["sudo sqlscan"] PROJECT_URL = "https://github.com/Cvar1984/sqlscan" class SqlInjectionTools(HackingToolsCollection): TITLE = "SQL Injection Tools" - TOOLS = [ - Sqlmap(), - NoSqlMap(), - SQLiScanner(), - Explo(), - Blisqy(), - Leviathan(), - SQLScan() - ] + TOOLS = [Sqlmap(), NoSqlMap(), SQLiScanner(), Explo(), Blisqy(), Leviathan(), SQLScan()] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="SQL Injection Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="").strip().replace("\n", " ") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "PROJECT", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc or "β€”"), str(url)) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]SQL Injection Tools Collection[/bold magenta]\nSelect a tool to view options or run it.", border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = int(Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99")) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "before_run"): + selected.before_run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = SqlInjectionTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/steganography.py b/tools/steganography.py index 121e906f..fc457fd8 100644 --- a/tools/steganography.py +++ b/tools/steganography.py @@ -5,6 +5,15 @@ from core import HackingToolsCollection from core import validate_input +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class SteganoHide(HackingTool): TITLE = "SteganoHide" @@ -15,56 +24,54 @@ def run(self): "[1] Hide\n" "[2] Extract\n" "[99]Cancel\n" - ">> ") + ">> " + ) choice_run = validate_input(choice_run, [1, 2, 99]) if choice_run is None: - print("Please choose a valid input") + console.print("[bold red]Please choose a valid input[/bold red]") return self.run() if choice_run == 99: return if choice_run == 1: - file_hide = input("Enter Filename you want to Embed (1.txt) >> ") - file_to_be_hide = input("Enter Cover Filename(test.jpeg) >> ") - subprocess.run( - ["steghide", "embed", "-cf", file_to_be_hide, "-ef", file_hide]) + file_hide = input("Enter Filename to Embed (1.txt) >> ") + file_to_be_hide = input("Enter Cover Filename (test.jpeg) >> ") + subprocess.run(["steghide", "embed", "-cf", file_to_be_hide, "-ef", file_hide]) - elif choice_run == "2": - from_file = input("Enter Filename From Extract Data >> ") + elif choice_run == 2: + from_file = input("Enter Filename to Extract Data From >> ") subprocess.run(["steghide", "extract", "-sf", from_file]) class StegnoCracker(HackingTool): TITLE = "StegnoCracker" - DESCRIPTION = "SteganoCracker is a tool that uncover hidden data inside " \ - "files\n using brute-force utility" - INSTALL_COMMANDS = [ - "pip3 install stegcracker && pip3 install stegcracker -U --force-reinstall"] + DESCRIPTION = "SteganoCracker uncovers hidden data inside files using brute-force utility" + INSTALL_COMMANDS = ["pip3 install stegcracker && pip3 install stegcracker -U --force-reinstall"] def run(self): - filename = input("Enter Filename:- ") - passfile = input("Enter Wordlist Filename:- ") + filename = input("Enter Filename >> ") + passfile = input("Enter Wordlist Filename >> ") subprocess.run(["stegcracker", filename, passfile]) - + class StegoCracker(HackingTool): TITLE = "StegoCracker" - DESCRIPTION = "StegoCracker is a tool that let's you hide data into image or audio files and can retrieve from a file " - + DESCRIPTION = "StegoCracker lets you hide and retrieve data in image or audio files" INSTALL_COMMANDS = [ "sudo git clone https://github.com/W1LDN16H7/StegoCracker.git", "sudo chmod -R 755 StegoCracker" ] - RUN_COMMANDS = ["cd StegoCracker && python3 -m pip install -r requirements.txt ", - "./install.sh" + RUN_COMMANDS = [ + "cd StegoCracker && python3 -m pip install -r requirements.txt", + "./install.sh" ] PROJECT_URL = "https://github.com/W1LDN16H7/StegoCracker" - + class Whitespace(HackingTool): TITLE = "Whitespace" - DESCRIPTION = "Use whitespace and unicode chars for steganography" + DESCRIPTION = "Use whitespace and unicode characters for steganography" INSTALL_COMMANDS = [ "sudo git clone https://github.com/beardog108/snow10.git", "sudo chmod -R 755 snow10" @@ -74,12 +81,68 @@ class Whitespace(HackingTool): class SteganographyTools(HackingToolsCollection): - TITLE = "Steganograhy tools" - TOOLS = [ - SteganoHide(), - StegnoCracker(), - StegoCracker(), - Whitespace() - - - ] + TITLE = "Steganography Tools" + TOOLS = [SteganoHide(), StegnoCracker(), StegoCracker(), Whitespace()] + + def _get_attr(self, obj, *names, default=""): + for n in names: + if hasattr(obj, n): + return getattr(obj, n) + return default + + def pretty_print(self): + table = Table(title="Steganography Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + title = self._get_attr(t, "TITLE", "Title", "title", default=t.__class__.__name__) + desc = self._get_attr(t, "DESCRIPTION", "Description", "description", default="").strip().replace("\n", " ") + url = self._get_attr(t, "PROJECT_URL", "PROJECT_URL", "project_url", "projectUrl", default="") + table.add_row(str(title), str(desc or "β€”"), str(url)) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Steganography Tools Collection[/bold magenta]\nSelect a tool to run or view options.", border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = self._get_attr(tool, "TITLE", "Title", "title", default=tool.__class__.__name__) + desc = self._get_attr(tool, "DESCRIPTION", "Description", "description", default="β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = int(Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99")) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + elif hasattr(selected, "before_run"): + selected.before_run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = SteganographyTools() + tools.pretty_print() + tools.show_options() diff --git a/tools/tool_manager.py b/tools/tool_manager.py index 79250f4a..510cc0ed 100644 --- a/tools/tool_manager.py +++ b/tools/tool_manager.py @@ -5,6 +5,14 @@ from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) class UpdateTool(HackingTool): @@ -15,12 +23,11 @@ def __init__(self): super(UpdateTool, self).__init__([ ("Update System", self.update_sys), ("Update Hackingtool", self.update_ht) - ], installable = False, runnable = False) + ], installable=False, runnable=False) def update_sys(self): os.system("sudo apt update && sudo apt full-upgrade -y") - os.system( - "sudo apt-get install tor openssl curl && sudo apt-get update tor openssl curl") + os.system("sudo apt-get install tor openssl curl && sudo apt-get update tor openssl curl") os.system("sudo apt-get install python3-pip") def update_ht(self): @@ -44,17 +51,17 @@ class UninstallTool(HackingTool): def __init__(self): super(UninstallTool, self).__init__([ ('Uninstall', self.uninstall) - ], installable = False, runnable = False) + ], installable=False, runnable=False) def uninstall(self): - print("hackingtool started to uninstall..\n") + console.print("hackingtool started to uninstall..\n") sleep(1) os.system("sudo chmod +x /etc/;" "sudo chmod +x /usr/share/doc;" "sudo rm -rf /usr/share/doc/hackingtool/;" "cd /etc/;" "sudo rm -rf /etc/hackingtool/;") - print("\nHackingtool Successfully Uninstalled... Goodbye.") + console.print("\n[bold green]Hackingtool Successfully Uninstalled... Goodbye.[/bold green]") sys.exit() @@ -64,3 +71,56 @@ class ToolManager(HackingToolsCollection): UpdateTool(), UninstallTool() ] + + def pretty_print(self): + table = Table(title="Tool Manager β€” Update / Uninstall", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " ")) + + panel = Panel(table, title="[purple]Available Manager Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Tool Manager[/bold magenta]\nSelect an action to run.", border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Options[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc) + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = int(Prompt.ask("[bold cyan]Select an option[/bold cyan]", default="99")) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + + return self.show_options(parent=parent) + + +if __name__ == "__main__": + manager = ToolManager() + manager.pretty_print() + manager.show_options() diff --git a/tools/webattack.py b/tools/webattack.py index 45885f2d..f27e2a52 100644 --- a/tools/webattack.py +++ b/tools/webattack.py @@ -1,40 +1,52 @@ # coding=utf-8 import subprocess - from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class Web2Attack(HackingTool): TITLE = "Web2Attack" DESCRIPTION = "Web hacking framework with tools, exploits by python" INSTALL_COMMANDS = [ - "sudo git clone https://github.com/santatic/web2attack.git"] + "sudo git clone https://github.com/santatic/web2attack.git" + ] RUN_COMMANDS = ["cd web2attack && sudo python3 w2aconsole"] PROJECT_URL = "https://github.com/santatic/web2attack" class Skipfish(HackingTool): TITLE = "Skipfish" - DESCRIPTION = "Skipfish – Fully automated, active web application " \ - "security reconnaissance tool \n " \ - "Usage: skipfish -o [FolderName] targetip/site" + DESCRIPTION = ( + "Skipfish – Fully automated, active web application " + "security reconnaissance tool \n " + "Usage: skipfish -o [FolderName] targetip/site" + ) RUN_COMMANDS = [ "sudo skipfish -h", 'echo "skipfish -o [FolderName] targetip/site"|boxes -d headline | lolcat' ] def __init__(self): - super(Skipfish, self).__init__(installable = False) + super(Skipfish, self).__init__(installable=False) class SubDomainFinder(HackingTool): TITLE = "SubDomain Finder" - DESCRIPTION = "Sublist3r is a python tool designed to enumerate " \ - "subdomains of websites using OSINT \n " \ - "Usage:\n\t" \ - "[1] python3 sublist3r.py -d example.com \n" \ - "[2] python3 sublist3r.py -d example.com -p 80,443" + DESCRIPTION = ( + "Sublist3r is a python tool designed to enumerate " + "subdomains of websites using OSINT \n " + "Usage:\n\t[1] python3 sublist3r.py -d example.com \n" + "[2] python3 sublist3r.py -d example.com -p 80,443" + ) INSTALL_COMMANDS = [ "sudo pip3 install requests argparse dnspython", "sudo git clone https://github.com/aboul3la/Sublist3r.git", @@ -46,10 +58,11 @@ class SubDomainFinder(HackingTool): class CheckURL(HackingTool): TITLE = "CheckURL" - DESCRIPTION = "Detect evil urls that uses IDN Homograph Attack.\n\t" \ - "[!] python3 checkURL.py --url google.com" - INSTALL_COMMANDS = [ - "sudo git clone https://github.com/UndeadSec/checkURL.git"] + DESCRIPTION = ( + "Detect evil urls that uses IDN Homograph Attack.\n\t" + "[!] python3 checkURL.py --url google.com" + ) + INSTALL_COMMANDS = ["sudo git clone https://github.com/UndeadSec/checkURL.git"] RUN_COMMANDS = ["cd checkURL && python3 checkURL.py --help"] PROJECT_URL = "https://github.com/UndeadSec/checkURL" @@ -67,26 +80,30 @@ class Blazy(HackingTool): class SubDomainTakeOver(HackingTool): TITLE = "Sub-Domain TakeOver" - DESCRIPTION = "Sub-domain takeover vulnerability occur when a sub-domain " \ - "\n (subdomain.example.com) is pointing to a service " \ - "(e.g: GitHub, AWS/S3,..)\n" \ - "that has been removed or deleted.\n" \ - "Usage:python3 takeover.py -d www.domain.com -v" + DESCRIPTION = ( + "Sub-domain takeover vulnerability occur when a sub-domain " + "\n (subdomain.example.com) is pointing to a service " + "(e.g: GitHub, AWS/S3,..)\nthat has been removed or deleted.\n" + "Usage:python3 takeover.py -d www.domain.com -v" + ) INSTALL_COMMANDS = [ - "git clone https://github.com/m4ll0k/takeover.git", + "git clone https://github.com/edoardottt/takeover.git", "cd takeover;sudo python3 setup.py install" ] - PROJECT_URL = "https://github.com/m4ll0k/takeover" + PROJECT_URL = "https://github.com/edoardottt/takeover" def __init__(self): - super(SubDomainTakeOver, self).__init__(runnable = False) + super(SubDomainTakeOver, self).__init__(runnable=False) + class Dirb(HackingTool): TITLE = "Dirb" - DESCRIPTION = "DIRB is a Web Content Scanner. It looks for existing " \ - "(and/or hidden) Web Objects.\n" \ - "It basically works by launching a dictionary based " \ - "attack against \n a web server and analyzing the response." + DESCRIPTION = ( + "DIRB is a Web Content Scanner. It looks for existing " + "(and/or hidden) Web Objects.\n" + "It basically works by launching a dictionary based " + "attack against \n a web server and analyzing the response." + ) INSTALL_COMMANDS = [ "sudo git clone https://gitlab.com/kalilinux/packages/dirb.git", "cd dirb;sudo bash configure;make" @@ -110,3 +127,60 @@ class WebAttackTools(HackingToolsCollection): SubDomainTakeOver(), Dirb() ] + + def pretty_print(self): + table = Table(title="Web Attack Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Web Attack Tools Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = WebAttackTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/wireless_attack_tools.py b/tools/wireless_attack_tools.py index 5e5038c8..387ec32a 100644 --- a/tools/wireless_attack_tools.py +++ b/tools/wireless_attack_tools.py @@ -1,22 +1,34 @@ # coding=utf-8 import os +import subprocess from core import HackingTool from core import HackingToolsCollection +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt + +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class WIFIPumpkin(HackingTool): TITLE = "WiFi-Pumpkin" - DESCRIPTION = "The WiFi-Pumpkin is a rogue AP framework to easily create " \ - "these fake networks\n" \ - "all while forwarding legitimate traffic to and from the " \ - "unsuspecting target." + DESCRIPTION = ( + "The WiFi-Pumpkin is a rogue AP framework to easily create " + "these fake networks\n" + "all while forwarding legitimate traffic to and from the " + "unsuspecting target." + ) INSTALL_COMMANDS = [ "sudo apt install libssl-dev libffi-dev build-essential", "sudo git clone https://github.com/P0cL4bs/wifipumpkin3.git", "chmod -R 755 wifipumpkin3", "sudo apt install python3-pyqt5", - "cd wifipumpkin3;sudo python3 setup.py install" + "cd wifipumpkin3;sudo python3 setup.py install", ] RUN_COMMANDS = ["sudo wifipumpkin3"] PROJECT_URL = "https://github.com/P0cL4bs/wifipumpkin3" @@ -24,14 +36,16 @@ class WIFIPumpkin(HackingTool): class pixiewps(HackingTool): TITLE = "pixiewps" - DESCRIPTION = "Pixiewps is a tool written in C used to bruteforce offline " \ - "the WPS pin\n " \ - "exploiting the low or non-existing entropy of some Access " \ - "Points, the so-called pixie dust attack" + DESCRIPTION = ( + "Pixiewps is a tool written in C used to bruteforce offline " + "the WPS pin\n " + "exploiting the low or non-existing entropy of some Access " + "Points, the so-called pixie dust attack" + ) INSTALL_COMMANDS = [ "sudo git clone https://github.com/wiire/pixiewps.git && apt-get -y install build-essential", "cd pixiewps*/ && make", - "cd pixiewps*/ && sudo make install && wget https://pastebin.com/y9Dk1Wjh" + "cd pixiewps*/ && sudo make install && wget https://pastebin.com/y9Dk1Wjh", ] PROJECT_URL = "https://github.com/wiire/pixiewps" @@ -39,19 +53,22 @@ def run(self): os.system( 'echo "' '1.> Put your interface into monitor mode using ' - '\'airmon-ng start {wireless interface}\n' - '2.> wash -i {monitor-interface like mon0}\'\n' - '3.> reaver -i {monitor interface} -b {BSSID of router} -c {router channel} -vvv -K 1 -f"' - '| boxes -d boy') + "'airmon-ng start {wireless interface}\n'" + "'2.> wash -i {monitor-interface like mon0}\'\n'" + "'3.> reaver -i {monitor interface} -b {BSSID of router} -c {router channel} -vvv -K 1 -f" + '| boxes -d boy' + ) print("You Have To Run Manually By USing >>pixiewps -h ") class BluePot(HackingTool): TITLE = "Bluetooth Honeypot GUI Framework" - DESCRIPTION = "You need to have at least 1 bluetooth receiver " \ - "(if you have many it will work with those, too).\n" \ - "You must install/libbluetooth-dev on " \ - "Ubuntu/bluez-libs-devel on Fedora/bluez-devel on openSUSE" + DESCRIPTION = ( + "You need to have at least 1 bluetooth receiver " + "(if you have many it will work with those, too).\n" + "You must install/libbluetooth-dev on " + "Ubuntu/bluez-libs-devel on Fedora/bluez-devel on openSUSE" + ) INSTALL_COMMANDS = [ "sudo wget https://raw.githubusercontent.com/andrewmichaelsmith/bluepot/master/bin/bluepot-0.2.tar.gz" "sudo tar xfz bluepot-0.2.tar.gz;sudo rm bluepot-0.2.tar.gz" @@ -83,7 +100,7 @@ class Wifiphisher(HackingTool): """ INSTALL_COMMANDS = [ "git clone https://github.com/wifiphisher/wifiphisher.git", - "cd wifiphisher;sudo python3 setup.py install" + "cd wifiphisher;sudo python3 setup.py install", ] RUN_COMMANDS = ["cd wifiphisher;sudo wifiphisher"] PROJECT_URL = "https://github.com/wifiphisher/wifiphisher" @@ -94,7 +111,7 @@ class Wifite(HackingTool): DESCRIPTION = "Wifite is an automated wireless attack tool" INSTALL_COMMANDS = [ "sudo git clone https://github.com/derv82/wifite2.git", - "cd wifite2 && sudo python3 setup.py install" + "cd wifite2 && sudo python3 setup.py install", ] RUN_COMMANDS = ["cd wifite2; sudo wifite"] PROJECT_URL = "https://github.com/derv82/wifite2" @@ -102,8 +119,10 @@ class Wifite(HackingTool): class EvilTwin(HackingTool): TITLE = "EvilTwin" - DESCRIPTION = "Fakeap is a script to perform Evil Twin Attack, by getting" \ - " credentials using a Fake page and Fake Access Point" + DESCRIPTION = ( + "Fakeap is a script to perform Evil Twin Attack, by getting" + " credentials using a Fake page and Fake Access Point" + ) INSTALL_COMMANDS = ["sudo git clone https://github.com/Z4nzu/fakeap.git"] RUN_COMMANDS = ["cd fakeap && sudo bash fakeap.sh"] PROJECT_URL = "https://github.com/Z4nzu/fakeap" @@ -111,12 +130,14 @@ class EvilTwin(HackingTool): class Fastssh(HackingTool): TITLE = "Fastssh" - DESCRIPTION = "Fastssh is an Shell Script to perform multi-threaded scan" \ - " \n and brute force attack against SSH protocol using the " \ - "most commonly credentials." + DESCRIPTION = ( + "Fastssh is an Shell Script to perform multi-threaded scan" + " \n and brute force attack against SSH protocol using the " + "most commonly credentials." + ) INSTALL_COMMANDS = [ "sudo git clone https://github.com/Z4nzu/fastssh.git && cd fastssh && sudo chmod +x fastssh.sh", - "sudo apt-get install -y sshpass netcat" + "sudo apt-get install -y sshpass netcat", ] RUN_COMMANDS = ["cd fastssh && sudo bash fastssh.sh --scan"] PROJECT_URL = "https://github.com/Z4nzu/fastssh" @@ -124,12 +145,14 @@ class Fastssh(HackingTool): class Howmanypeople(HackingTool): TITLE = "Howmanypeople" - DESCRIPTION = "Count the number of people around you by monitoring wifi " \ - "signals.\n" \ - "[@] WIFI ADAPTER REQUIRED* \n[*]" \ - "It may be illegal to monitor networks for MAC addresses, \n" \ - "especially on networks that you do not own. " \ - "Please check your country's laws" + DESCRIPTION = ( + "Count the number of people around you by monitoring wifi " + "signals.\n" + "[@] WIFI ADAPTER REQUIRED* \n[*]" + "It may be illegal to monitor networks for MAC addresses, \n" + "especially on networks that you do not own. " + "Please check your country's laws" + ) INSTALL_COMMANDS = [ "sudo apt-get install tshark" ";sudo python3 -m pip install howmanypeoplearearound" @@ -149,5 +172,62 @@ class WirelessAttackTools(HackingToolsCollection): Wifite(), EvilTwin(), Fastssh(), - Howmanypeople() + Howmanypeople(), ] + + def pretty_print(self): + table = Table(title="Wireless Attack Tools", show_lines=True, expand=True) + table.add_column("Title", style="purple", no_wrap=True) + table.add_column("Description", style="purple") + table.add_column("Project URL", style="purple", no_wrap=True) + + for t in self.TOOLS: + desc = getattr(t, "DESCRIPTION", "") or "" + url = getattr(t, "PROJECT_URL", "") or "" + table.add_row(t.TITLE, desc.strip().replace("\n", " "), url) + + panel = Panel(table, title="[purple]Available Tools[/purple]", border_style="purple") + console.print(panel) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Wireless Attack Tools Collection[/bold magenta]\n" + "Select a tool to view options or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_options"): + selected.show_options(parent=self) + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = WirelessAttackTools() + tools.pretty_print() + tools.show_options() \ No newline at end of file diff --git a/tools/wordlist_generator.py b/tools/wordlist_generator.py index cc15775c..109dcd5d 100644 --- a/tools/wordlist_generator.py +++ b/tools/wordlist_generator.py @@ -1,7 +1,20 @@ # coding=utf-8 +import os +import subprocess + +from rich.console import Console +from rich.theme import Theme +from rich.table import Table +from rich.panel import Panel +from rich.prompt import Prompt +from rich import box + from core import HackingTool from core import HackingToolsCollection +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) + class Cupp(HackingTool): TITLE = "Cupp" @@ -11,6 +24,16 @@ class Cupp(HackingTool): RUN_COMMANDS = ["cd cupp && python3 cupp.py -i"] PROJECT_URL = "https://github.com/Mebus/cupp" + def show_info(self): + panel = Panel( + f"[bold purple]{self.TITLE}[/bold purple]\n\n" + f"[cyan]{self.DESCRIPTION}[/cyan]\n\n" + f"[green]Repository:[/green] [underline blue]{self.PROJECT_URL}[/underline blue]", + border_style="purple", + box=box.ROUNDED, + ) + console.print(panel) + class WlCreator(HackingTool): TITLE = "WordlistCreator" @@ -22,6 +45,16 @@ class WlCreator(HackingTool): "cd wlcreator && sudo gcc -o wlcreator wlcreator.c && ./wlcreator 5"] PROJECT_URL = "https://github.com/Z4nzu/wlcreator" + def show_info(self): + panel = Panel( + f"[bold purple]{self.TITLE}[/bold purple]\n\n" + f"[cyan]{self.DESCRIPTION}[/cyan]\n\n" + f"[green]Repository:[/green] [underline blue]{self.PROJECT_URL}[/underline blue]", + border_style="purple", + box=box.ROUNDED, + ) + console.print(panel) + class GoblinWordGenerator(HackingTool): TITLE = "Goblin WordGenerator" @@ -31,6 +64,16 @@ class GoblinWordGenerator(HackingTool): RUN_COMMANDS = ["cd GoblinWordGenerator && python3 goblin.py"] PROJECT_URL = "https://github.com/UndeadSec/GoblinWordGenerator.git" + def show_info(self): + panel = Panel( + f"[bold purple]{self.TITLE}[/bold purple]\n\n" + f"[cyan]{self.DESCRIPTION}[/cyan]\n\n" + f"[green]Repository:[/green] [underline blue]{self.PROJECT_URL}[/underline blue]", + border_style="purple", + box=box.ROUNDED, + ) + console.print(panel) + class showme(HackingTool): TITLE = "Password list (1.4 Billion Clear Text Password)" @@ -46,6 +89,16 @@ class showme(HackingTool): RUN_COMMANDS = ["cd SMWYG-Show-Me-What-You-Got && python SMWYG.py"] PROJECT_URL = "https://github.com/Viralmaniar/SMWYG-Show-Me-What-You-Got" + def show_info(self): + panel = Panel( + f"[bold purple]{self.TITLE}[/bold purple]\n\n" + f"[cyan]{self.DESCRIPTION}[/cyan]\n\n" + f"[green]Repository:[/green] [underline blue]{self.PROJECT_URL}[/underline blue]", + border_style="purple", + box=box.ROUNDED, + ) + console.print(panel) + class WordlistGeneratorTools(HackingToolsCollection): TITLE = "Wordlist Generator" @@ -55,3 +108,62 @@ class WordlistGeneratorTools(HackingToolsCollection): GoblinWordGenerator(), showme() ] + + def show_info(self): + header = Panel(f"[bold white on purple] {self.TITLE} [/bold white on purple]", + border_style="purple", box=box.DOUBLE) + console.print(header) + table = Table(box=box.SIMPLE, show_header=True, header_style="bold purple") + table.add_column("#", justify="center", style="cyan", width=4) + table.add_column("Tool", style="bold") + table.add_column("Description", style="dim", overflow="fold") + + for idx, t in enumerate(self.TOOLS, start=1): + desc = getattr(t, "DESCRIPTION", "") or "" + table.add_row(str(idx), t.TITLE, desc) + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + def show_options(self, parent=None): + console.print("\n") + panel = Panel.fit("[bold magenta]Wordlist Generator Collection[/bold magenta]\n" + "Select a tool to view details or run it.", + border_style="purple") + console.print(panel) + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True, expand=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + title = getattr(tool, "TITLE", tool.__class__.__name__) + desc = getattr(tool, "DESCRIPTION", "β€”") + table.add_row(str(i + 1), title, desc or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to previous menu") + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to view/run[/bold cyan]", default="99") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + selected = self.TOOLS[choice - 1] + if hasattr(selected, "show_info"): + selected.show_info() + elif hasattr(selected, "run"): + selected.run() + else: + console.print("[bold yellow]Selected tool has no runnable interface.[/bold yellow]") + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent) + + +if __name__ == "__main__": + tools = WordlistGeneratorTools() + tools.show_info() + tools.show_options() \ No newline at end of file diff --git a/tools/xss_attack.py b/tools/xss_attack.py index 5e4bc0d1..9bdd47f6 100644 --- a/tools/xss_attack.py +++ b/tools/xss_attack.py @@ -1,13 +1,19 @@ # coding=utf-8 import os import subprocess +from rich.console import Console +from rich.panel import Panel +from rich.prompt import Prompt +from rich.table import Table from core import HackingTool from core import HackingToolsCollection +console = Console() + class Dalfox(HackingTool): - TITLE = "DalFox(Finder of XSS)" + TITLE = "DalFox (Finder of XSS)" DESCRIPTION = "XSS Scanning and Parameter Analysis tool." INSTALL_COMMANDS = [ "sudo apt-get install golang", @@ -23,7 +29,7 @@ class Dalfox(HackingTool): class XSSPayloadGenerator(HackingTool): TITLE = "XSS Payload Generator" - DESCRIPTION = "XSS PAYLOAD GENERATOR -XSS SCANNER-XSS DORK FINDER" + DESCRIPTION = "XSS PAYLOAD GENERATOR - XSS SCANNER - XSS DORK FINDER" INSTALL_COMMANDS = [ "git clone https://github.com/capture0x/XSS-LOADER.git", "cd XSS-LOADER;sudo pip3 install -r requirements.txt" @@ -40,25 +46,28 @@ class XSSFinder(HackingTool): PROJECT_URL = "https://github.com/Damian89/extended-xss-search" def after_install(self): - print("""\033[96m - Follow This Steps After Installation:- - \033[31m [*] Go To extended-xss-search directory, - and Rename the example.app-settings.conf to app-settings.conf - """) + console.print(Panel.fit( + "[bold cyan]Follow These Steps After Installation:[/bold cyan]\n" + "[red]*[/red] Go to [yellow]extended-xss-search[/yellow] directory\n" + "[green]*[/green] Rename [bold]example.app-settings.conf[/bold] β†’ [bold]app-settings.conf[/bold]", + title="[ Install Notes ]", + border_style="magenta" + )) input("Press ENTER to continue") def run(self): - print("""\033[96m - You have To Add Links to scan - \033[31m[!] Go to extended-xss-search - [*] config/urls-to-test.txt - [!] python3 extended-xss-search.py - """) + console.print(Panel.fit( + "[bold cyan]You need to add links to scan[/bold cyan]\n" + "[red]*[/red] Go to [yellow]extended-xss-search/config/urls-to-test.txt[/yellow]\n" + "[green]*[/green] Run: [bold]python3 extended-xss-search.py[/bold]", + title="[ Run Instructions ]", + border_style="blue" + )) class XSSFreak(HackingTool): TITLE = "XSS-Freak" - DESCRIPTION = "XSS-Freak is an XSS scanner fully written in python3 from scratch" + DESCRIPTION = "An XSS scanner fully written in Python 3 from scratch." INSTALL_COMMANDS = [ "git clone https://github.com/PR0PH3CY33/XSS-Freak.git", "cd XSS-Freak;sudo pip3 install -r requirements.txt" @@ -69,7 +78,7 @@ class XSSFreak(HackingTool): class XSpear(HackingTool): TITLE = "XSpear" - DESCRIPTION = "XSpear is XSS Scanner on ruby gems" + DESCRIPTION = "XSpear is an XSS Scanner built on Ruby Gems." INSTALL_COMMANDS = ["gem install XSpear"] RUN_COMMANDS = ["XSpear -h"] PROJECT_URL = "https://github.com/hahwul/XSpear" @@ -84,27 +93,32 @@ class XSSCon(HackingTool): PROJECT_URL = "https://github.com/menkrep1337/XSSCon" def run(self): - website = input("Enter Website >> ") + console.print(Panel.fit( + "Enter target website to scan with XSSCon:", + title="[bold yellow]XSSCon[/bold yellow]", + border_style="bright_yellow" + )) + website = Prompt.ask("[bold cyan]Enter Website[/bold cyan]") os.system("cd XSSCon;") subprocess.run(["python3", "xsscon.py", "-u", website]) class XanXSS(HackingTool): TITLE = "XanXSS" - DESCRIPTION = "XanXSS is a reflected XSS searching tool\n " \ - "that creates payloads based from templates" + DESCRIPTION = "Reflected XSS searching tool that creates payloads from templates." INSTALL_COMMANDS = ["git clone https://github.com/Ekultek/XanXSS.git"] PROJECT_URL = "https://github.com/Ekultek/XanXSS" def run(self): - os.system("cd XanXSS ;python xanxss.py -h") - print("\033[96m You Have to run it manually By Using\n" - " [!]python xanxss.py [Options]") + os.system("cd XanXSS; python xanxss.py -h") + console.print( + "[cyan]You have to run it manually using:[/cyan]\n[bold yellow]python xanxss.py [options][/bold yellow]" + ) class XSSStrike(HackingTool): TITLE = "Advanced XSS Detection Suite" - DESCRIPTION = "XSStrike is a python script designed to detect and exploit XSS vulnerabilities." + DESCRIPTION = "XSStrike is a Python-based tool designed to detect and exploit XSS vulnerabilities." INSTALL_COMMANDS = [ "sudo rm -rf XSStrike", "git clone https://github.com/UltimateHackers/XSStrike.git " @@ -113,13 +127,12 @@ class XSSStrike(HackingTool): PROJECT_URL = "https://github.com/UltimateHackers/XSStrike" def __init__(self): - super(XSSStrike, self).__init__(runnable = False) + super(XSSStrike, self).__init__(runnable=False) class RVuln(HackingTool): TITLE = "RVuln" - DESCRIPTION = "RVuln is multi-threaded and Automated Web Vulnerability " \ - "Scanner written in Rust" + DESCRIPTION = "Multi-threaded and Automated Web Vulnerability Scanner written in Rust." INSTALL_COMMANDS = [ "sudo git clone https://github.com/iinc0gnit0/RVuln.git;" "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh;" @@ -144,3 +157,37 @@ class XSSAttackTools(HackingToolsCollection): XSSStrike(), RVuln() ] + + def show_info(self): + console.print(Panel.fit( + "[bold magenta]XSS Attack Tools Collection[/bold magenta]\n" + "A curated set of tools for XSS vulnerability analysis and exploitation.", + border_style="bright_magenta" + )) + + def show_options(self, parent=None): + console.print("\n") + self.show_info() + + table = Table(title="[bold cyan]Available Tools[/bold cyan]", show_lines=True) + table.add_column("Index", justify="center", style="bold yellow") + table.add_column("Tool Name", justify="left", style="bold green") + table.add_column("Description", justify="left", style="white") + + for i, tool in enumerate(self.TOOLS): + table.add_row(str(i + 1), tool.TITLE, tool.DESCRIPTION or "β€”") + + table.add_row("[red]99[/red]", "[bold red]Exit[/bold red]", "Return to Main Menu") + + console.print(table) + + try: + choice = Prompt.ask("[bold cyan]Select a tool to run[/bold cyan]") + choice = int(choice) + if 1 <= choice <= len(self.TOOLS): + self.TOOLS[choice - 1].show_options(parent=self) + elif choice == 99: + return 99 + except Exception: + console.print("[bold red]Invalid choice. Try again.[/bold red]") + return self.show_options(parent=parent)