diff --git a/hackingtool.py b/hackingtool.py index 22aa566..9db5a93 100755 --- a/hackingtool.py +++ b/hackingtool.py @@ -201,7 +201,6 @@ def interact_menu(): console.print("\n[bold red]Interrupted by user — exiting[/bold red]") break - def main(): try: if system() == "Linux": diff --git a/tools/anonsurf.py b/tools/anonsurf.py index 006d328..93884db 100644 --- a/tools/anonsurf.py +++ b/tools/anonsurf.py @@ -5,6 +5,7 @@ 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 @@ -59,3 +60,70 @@ class AnonSurfTools(HackingToolsCollection): AnonymouslySurf(), 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 c05c2f1..b8a1bbc 100644 --- a/tools/ddos.py +++ b/tools/ddos.py @@ -6,6 +6,7 @@ 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 @@ -148,3 +149,70 @@ class Saphyra(HackingTool): 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 406e3ef..22f4fe7 100644 --- a/tools/exploit_frameworks.py +++ b/tools/exploit_frameworks.py @@ -7,6 +7,7 @@ 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" @@ -62,14 +63,74 @@ class ExploitFrameworkTools(HackingToolsCollection): 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 function is non-invasive (does not change program logic) — call it from -# your UI code whenever you want a colored overview in terminal. +# 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. This helper does not modify any tool logic. + 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) @@ -83,3 +144,9 @@ def render_tools_table(tools, title: str | None = None): 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 3ec51b3..29b1af1 100644 --- a/tools/forensic_tools.py +++ b/tools/forensic_tools.py @@ -13,6 +13,8 @@ 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" @@ -106,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 6cb45a7..14f9bc7 100644 --- a/tools/information_gathering_tools.py +++ b/tools/information_gathering_tools.py @@ -3,6 +3,7 @@ import os import socket import subprocess import webbrowser +import sys from core import HackingTool from core import HackingToolsCollection @@ -12,6 +13,7 @@ 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" @@ -41,9 +43,6 @@ 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" @@ -106,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)" @@ -235,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 bd3a359..c72d5d2 100644 --- a/tools/other_tools.py +++ b/tools/other_tools.py @@ -19,6 +19,7 @@ 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) @@ -74,7 +75,47 @@ class OtherTools(HackingToolsCollection): 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/payload_creator.py b/tools/payload_creator.py index c4e701f..28ba67a 100644 --- a/tools/payload_creator.py +++ b/tools/payload_creator.py @@ -8,6 +8,7 @@ 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) @@ -15,8 +16,8 @@ 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" @@ -31,8 +32,7 @@ class TheFatRat(HackingTool): ]) 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") @@ -40,9 +40,8 @@ class TheFatRat(HackingTool): 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" @@ -52,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 + console.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 - """) +[!] 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" @@ -78,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" @@ -92,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", @@ -106,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" @@ -118,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" @@ -159,10 +154,48 @@ class PayloadCreatorTools(HackingToolsCollection): 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) + 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 6f31512..fc90cdd 100644 --- a/tools/phising_attack.py +++ b/tools/phising_attack.py @@ -8,6 +8,7 @@ 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) @@ -263,13 +264,56 @@ class PhishingAttackTools(HackingToolsCollection): ) 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", "project_url", "projectUrl", default="") or "" + 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 6811740..c1cd3a9 100644 --- a/tools/post_exploitation.py +++ b/tools/post_exploitation.py @@ -8,6 +8,7 @@ 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) @@ -51,6 +52,12 @@ class PostExploitationTools(HackingToolsCollection): 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) @@ -58,14 +65,58 @@ class PostExploitationTools(HackingToolsCollection): 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) + 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 5b9a8bf..c54f1ba 100644 --- a/tools/remote_administration.py +++ b/tools/remote_administration.py @@ -6,6 +6,7 @@ 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) @@ -43,6 +44,12 @@ class RemoteAdministrationTools(HackingToolsCollection): 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) @@ -50,14 +57,58 @@ class RemoteAdministrationTools(HackingToolsCollection): 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) + 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 76ed7b3..a221d46 100644 --- a/tools/reverse_engineering.py +++ b/tools/reverse_engineering.py @@ -8,6 +8,7 @@ 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) @@ -63,6 +64,12 @@ class ReverseEngineeringTools(HackingToolsCollection): 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) @@ -70,14 +77,55 @@ class ReverseEngineeringTools(HackingToolsCollection): 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) + 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 9b46016..36061ee 100644 --- a/tools/sql_tools.py +++ b/tools/sql_tools.py @@ -6,6 +6,7 @@ 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) @@ -14,37 +15,25 @@ 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" @@ -54,15 +43,9 @@ class SQLiScanner(HackingTool): 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): @@ -71,10 +54,7 @@ class Explo(HackingTool): 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" @@ -84,43 +64,32 @@ class Blisqy(HackingTool): 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) @@ -129,14 +98,52 @@ class SqlInjectionTools(HackingToolsCollection): 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) + 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 631b232..fc457fd 100644 --- a/tools/steganography.py +++ b/tools/steganography.py @@ -9,6 +9,7 @@ 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) @@ -23,55 +24,54 @@ class SteganoHide(HackingTool): "[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" @@ -81,13 +81,14 @@ 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) @@ -96,14 +97,52 @@ class SteganographyTools(HackingToolsCollection): 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) + 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 779b2c6..510cc0e 100644 --- a/tools/tool_manager.py +++ b/tools/tool_manager.py @@ -5,11 +5,11 @@ from time import sleep 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) @@ -27,8 +27,7 @@ class UpdateTool(HackingTool): 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): @@ -55,14 +54,14 @@ class UninstallTool(HackingTool): ], 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() @@ -85,7 +84,43 @@ class ToolManager(HackingToolsCollection): 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 617d11e..f27e2a5 100644 --- a/tools/webattack.py +++ b/tools/webattack.py @@ -7,6 +7,7 @@ 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) @@ -141,7 +142,45 @@ class WebAttackTools(HackingToolsCollection): 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 882b52d..387ec32 100644 --- a/tools/wireless_attack_tools.py +++ b/tools/wireless_attack_tools.py @@ -1,5 +1,6 @@ # coding=utf-8 import os +import subprocess from core import HackingTool from core import HackingToolsCollection @@ -8,6 +9,7 @@ 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) @@ -51,9 +53,9 @@ class pixiewps(HackingTool): 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"' + "'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 ") @@ -187,7 +189,45 @@ class WirelessAttackTools(HackingToolsCollection): 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 bf1d886..109dcd5 100644 --- a/tools/wordlist_generator.py +++ b/tools/wordlist_generator.py @@ -3,14 +3,17 @@ import os import subprocess from rich.console import Console -from rich.panel import Panel +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 -console = Console() +_theme = Theme({"purple": "#7B61FF"}) +console = Console(theme=_theme) class Cupp(HackingTool): @@ -23,10 +26,10 @@ class Cupp(HackingTool): def show_info(self): panel = Panel( - f"[bold magenta]{self.TITLE}[/bold magenta]\n\n" + 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="magenta", + border_style="purple", box=box.ROUNDED, ) console.print(panel) @@ -44,10 +47,10 @@ class WlCreator(HackingTool): def show_info(self): panel = Panel( - f"[bold magenta]{self.TITLE}[/bold magenta]\n\n" + 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="magenta", + border_style="purple", box=box.ROUNDED, ) console.print(panel) @@ -63,10 +66,10 @@ class GoblinWordGenerator(HackingTool): def show_info(self): panel = Panel( - f"[bold magenta]{self.TITLE}[/bold magenta]\n\n" + 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="magenta", + border_style="purple", box=box.ROUNDED, ) console.print(panel) @@ -88,10 +91,10 @@ class showme(HackingTool): def show_info(self): panel = Panel( - f"[bold magenta]{self.TITLE}[/bold magenta]\n\n" + 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="magenta", + border_style="purple", box=box.ROUNDED, ) console.print(panel) @@ -107,10 +110,10 @@ class WordlistGeneratorTools(HackingToolsCollection): ] def show_info(self): - header = Panel(f"[bold white on magenta] {self.TITLE} [/bold white on magenta]", - border_style="magenta", box=box.DOUBLE) + 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 magenta") + 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") @@ -119,4 +122,48 @@ class WordlistGeneratorTools(HackingToolsCollection): 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