From efe0276c15fa4a9520e3c92bffce7d22be7d5a90 Mon Sep 17 00:00:00 2001 From: NicPWNs Date: Tue, 18 Nov 2025 19:25:12 -0500 Subject: [PATCH 1/8] feat: Add .gitignore to exclude content and __pycache__ directories --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a1d9a76 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/content +*/__pycache__/ From f1ac25bcc32bc578711f120e5067b3351375bb91 Mon Sep 17 00:00:00 2001 From: NicPWNs Date: Tue, 18 Nov 2025 19:33:06 -0500 Subject: [PATCH 2/8] chore: Remove whitespace --- thetimemachine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/thetimemachine.py b/thetimemachine.py index a08b557..7b8a068 100644 --- a/thetimemachine.py +++ b/thetimemachine.py @@ -16,7 +16,7 @@ from core.parameters import extract_parameters from core.subdomains import extract_subdomains_from_urls from core.lister import scan_for_listings -from core.fetcher import console +from core.fetcher import console def main(): parser = argparse.ArgumentParser(description='⏳ TheTimeMachine - Wayback Recon Suite') parser.add_argument("target", help="Target domain") @@ -42,7 +42,7 @@ def main(): # Use a spinner for animation with console.status("[bold cyan]Contacting archive dimension...[/bold cyan]", spinner="dots"): urls, output_path = fetcher.fetch_wayback_urls(target) - + if urls: console.print(f"[bold green]URLs successfully written to {output_path}[/bold green]") else: @@ -69,7 +69,7 @@ def main(): else: print(f"[+] Using extensions: {', '.join(backup_exts)}") backupfinder.fetch_backup_urls(target, backup_exts) - + if args.listings: scan_for_listings(target, threads=10) # You can customize the thread count From 89ac66f83c9c1105a7219c53f02a2c80a9208b2f Mon Sep 17 00:00:00 2001 From: NicPWNs Date: Tue, 18 Nov 2025 19:35:27 -0500 Subject: [PATCH 3/8] chore: Remove unused imports --- thetimemachine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thetimemachine.py b/thetimemachine.py index 7b8a068..829c70e 100644 --- a/thetimemachine.py +++ b/thetimemachine.py @@ -12,11 +12,11 @@ ) from core.ui import show_loader, print_banner from core.utils import load_extensions_from_file -from core.menu import launch_interactive_menu from core.parameters import extract_parameters -from core.subdomains import extract_subdomains_from_urls from core.lister import scan_for_listings from core.fetcher import console + + def main(): parser = argparse.ArgumentParser(description='⏳ TheTimeMachine - Wayback Recon Suite') parser.add_argument("target", help="Target domain") From a92f5d5bed35d6dadbab349ad55795f20e2211ae Mon Sep 17 00:00:00 2001 From: NicPWNs Date: Tue, 18 Nov 2025 19:43:21 -0500 Subject: [PATCH 4/8] feat: Add help message display when no options are provided --- thetimemachine.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/thetimemachine.py b/thetimemachine.py index 829c70e..0c9c71c 100644 --- a/thetimemachine.py +++ b/thetimemachine.py @@ -1,5 +1,6 @@ # thetimemachine.py import os +import sys import argparse from core import ( fetcher, @@ -30,6 +31,11 @@ def main(): parser.add_argument("--parameters", action="store_true", help="Extract GET parameters from URLs") + # Show help if no `--` options are provided + if not any(arg.startswith('--') for arg in sys.argv[1:]): + parser.print_help() + return + args = parser.parse_args() target = args.target content_dir = f"content/{target}" From f4ee07d4dfa0a45c664eddbb2a412757f96a9246 Mon Sep 17 00:00:00 2001 From: NicPWNs Date: Tue, 18 Nov 2025 19:44:37 -0500 Subject: [PATCH 5/8] fix: Update help message display to show usage instead of help when no options are provided --- thetimemachine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thetimemachine.py b/thetimemachine.py index 0c9c71c..70e6c46 100644 --- a/thetimemachine.py +++ b/thetimemachine.py @@ -31,9 +31,9 @@ def main(): parser.add_argument("--parameters", action="store_true", help="Extract GET parameters from URLs") - # Show help if no `--` options are provided + # Show usage if no `--` options are provided if not any(arg.startswith('--') for arg in sys.argv[1:]): - parser.print_help() + parser.print_usage() return args = parser.parse_args() From 177e148e598185aa61b163b63e6e0db603392a08 Mon Sep 17 00:00:00 2001 From: NicPWNs Date: Tue, 18 Nov 2025 19:45:15 -0500 Subject: [PATCH 6/8] chore: Clean up whitespace in main function --- thetimemachine.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/thetimemachine.py b/thetimemachine.py index 70e6c46..00d5dba 100644 --- a/thetimemachine.py +++ b/thetimemachine.py @@ -30,7 +30,6 @@ def main(): parser.add_argument("--menu", action="store_true", help="Launch interactive menu") parser.add_argument("--parameters", action="store_true", help="Extract GET parameters from URLs") - # Show usage if no `--` options are provided if not any(arg.startswith('--') for arg in sys.argv[1:]): parser.print_usage() @@ -79,7 +78,6 @@ def main(): if args.listings: scan_for_listings(target, threads=10) # You can customize the thread count - if args.attack: result = attackmode.pattern_match_mode(urls_file, args.attack, db_folder="db") if result: @@ -92,6 +90,7 @@ def main(): if args.menu: menu.launch_interactive_menu(urls, target) + if __name__ == "__main__": print_banner() show_loader() From 3380ca85ec7ab616fe2f70f338e6e3f59f7e3f93 Mon Sep 17 00:00:00 2001 From: NicPWNs Date: Tue, 18 Nov 2025 20:13:25 -0500 Subject: [PATCH 7/8] feat: Accept full URLs in the target --- README.md | 2 -- thetimemachine.py | 7 ++++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 465fef1..862c8ca 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,6 @@ pip3 install -r requirements.txt python3 thetimemachine.py [OPTIONS] ``` -**Note:** Don't use `http://` or `https://` in the domain — just pass `domain.com` or `sub.domain.com`. - --- ## 📋 Options diff --git a/thetimemachine.py b/thetimemachine.py index 00d5dba..0a56999 100644 --- a/thetimemachine.py +++ b/thetimemachine.py @@ -2,6 +2,7 @@ import os import sys import argparse +from urllib.parse import urlparse from core import ( fetcher, jwtxposer, @@ -36,7 +37,11 @@ def main(): return args = parser.parse_args() - target = args.target + + # Extract target using urlparse + if "://" not in args.target: + args.target = "//" + args.target + target = urlparse(args.target).hostname.lower() content_dir = f"content/{target}" os.makedirs(content_dir, exist_ok=True) From e7259f13e8a6194d334b28ace5ae2e71239e103d Mon Sep 17 00:00:00 2001 From: NicPWNs Date: Tue, 18 Nov 2025 20:13:49 -0500 Subject: [PATCH 8/8] fix: Correct package name casing for PyJWT and remove unused numpy --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 000ce39..74d4d9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ colorama==0.4.4 -numpy>=1.26.0 requests>=2.31.0 rich>=13.6.0 termcolor>=2.4.0 -PyJwt +PyJWT