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)
-
-
-
-
-
+
+
+
+
+
## Installation For 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 π§°
-
-
-
-
-
+
+
+
+
+
## Installation guide for 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)