Add wordlist management with SecLists support - v2.1 COMPLETE
Implemented comprehensive wordlist management system. Features: - New main menu option "6) Manage Wordlists" - Install SecLists from GitHub (~500MB collection) - View wordlist directory structure with file counts - Update SecLists with git pull - Installs to ~/wordlists/SecLists (user-owned) Implementation: - wordlist_menu() - Interactive wordlist management - install_seclists() - Clone SecLists with --depth 1 - view_wordlists() - Browse installed wordlists by category - update_seclists() - Pull latest from GitHub - Shows popular wordlist categories after install - Handles reinstall with confirmation prompt SecLists Categories: - Passwords (rockyou, common, leaked databases) - Usernames (common names and usernames) - Discovery (DNS, web content, subdomains) - Fuzzing (XSS, SQLi, injection payloads) - Payloads, IOCs, Web-Shells, Pattern-Matching Installation Details: - Location: ~/wordlists/SecLists/ - Size: ~500MB (compressed download) - Uses --depth 1 for faster clone - User-owned, no sudo required - Easy to update with git pull Image Update: - Replaced 21 individual images with single toolbelt.jpeg - Selected best image (seed_13) with tools visible on belt - Cleaned up images directory v2.1 Status: ALL FEATURES COMPLETE ✅ Individual Tool Selection ✅ Tool Update Detection ✅ Wordlist Management 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
26
README.md
|
|
@ -44,6 +44,7 @@ python3 toolbelt.py
|
||||||
- Install Prerequisites (fresh)
|
- Install Prerequisites (fresh)
|
||||||
- View Installed Tools
|
- View Installed Tools
|
||||||
- Check for Tool Updates
|
- Check for Tool Updates
|
||||||
|
- Manage Wordlists
|
||||||
|
|
||||||
**Level 2 - Categories:**
|
**Level 2 - Categories:**
|
||||||
- 📦 APT Tools - Package manager tools
|
- 📦 APT Tools - Package manager tools
|
||||||
|
|
@ -63,6 +64,11 @@ python3 toolbelt.py
|
||||||
- Update all Go tools to @latest
|
- Update all Go tools to @latest
|
||||||
- Select individual tools to update (gum multi-select)
|
- Select individual tools to update (gum multi-select)
|
||||||
|
|
||||||
|
**Wordlist Management:**
|
||||||
|
- Install SecLists (comprehensive wordlist collection)
|
||||||
|
- View installed wordlists and directory structure
|
||||||
|
- Update SecLists from GitHub
|
||||||
|
|
||||||
### Pre-Built Profiles
|
### Pre-Built Profiles
|
||||||
|
|
||||||
**Bug Bounty Hunter** - Web app testing and reconnaissance
|
**Bug Bounty Hunter** - Web app testing and reconnaissance
|
||||||
|
|
@ -214,6 +220,26 @@ python3 toolbelt.py
|
||||||
- **Comprehensive Update:** Option 3 updates ALL Go tools (PD + non-PD)
|
- **Comprehensive Update:** Option 3 updates ALL Go tools (PD + non-PD)
|
||||||
- **Selective Update:** Option 4 lets you cherry-pick which tools to update
|
- **Selective Update:** Option 4 lets you cherry-pick which tools to update
|
||||||
|
|
||||||
|
### Manage Wordlists
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 toolbelt.py
|
||||||
|
# Select: 6) Manage Wordlists
|
||||||
|
|
||||||
|
# Option 1: Install SecLists (~500MB)
|
||||||
|
# Option 2: View installed wordlists and structure
|
||||||
|
# Option 3: Update SecLists from GitHub
|
||||||
|
```
|
||||||
|
|
||||||
|
**SecLists includes:**
|
||||||
|
- **Passwords**: rockyou, common passwords, leaked databases
|
||||||
|
- **Usernames**: Common usernames and names
|
||||||
|
- **Subdomains**: DNS enumeration wordlists
|
||||||
|
- **Directories**: Web content discovery lists
|
||||||
|
- **Fuzzing**: XSS, SQLi, and other injection payloads
|
||||||
|
|
||||||
|
**Installation location:** `~/wordlists/SecLists/`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔗 Integration with Fresh
|
## 🔗 Integration with Fresh
|
||||||
|
|
|
||||||
4
TODO.md
|
|
@ -312,10 +312,10 @@ def download_with_progress(url: str, output: str):
|
||||||
|
|
||||||
## Implementation Priority
|
## Implementation Priority
|
||||||
|
|
||||||
**v2.1 (Next Release):**
|
**v2.1 (COMPLETE):**
|
||||||
1. Individual Tool Selection (gum multi-select) ✅ **COMPLETED**
|
1. Individual Tool Selection (gum multi-select) ✅ **COMPLETED**
|
||||||
2. Tool Update Detection ✅ **COMPLETED**
|
2. Tool Update Detection ✅ **COMPLETED**
|
||||||
3. Wordlist Management 🔜
|
3. Wordlist Management ✅ **COMPLETED**
|
||||||
|
|
||||||
**v2.2:**
|
**v2.2:**
|
||||||
4. Resource Monitoring
|
4. Resource Monitoring
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 134 KiB |
215
toolbelt.py
|
|
@ -7,6 +7,7 @@ Interactive package manager for pentesting and security research tools
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
from pathlib import Path
|
||||||
from typing import Optional, List, Dict
|
from typing import Optional, List, Dict
|
||||||
|
|
||||||
# Import local modules
|
# Import local modules
|
||||||
|
|
@ -81,6 +82,7 @@ def show_main_menu(distro_name: str, distro_type: str):
|
||||||
print(colorize("3)", 'green') + " Install Prerequisites (fresh)")
|
print(colorize("3)", 'green') + " Install Prerequisites (fresh)")
|
||||||
print(colorize("4)", 'green') + " View Installed Tools")
|
print(colorize("4)", 'green') + " View Installed Tools")
|
||||||
print(colorize("5)", 'green') + " Check for Tool Updates")
|
print(colorize("5)", 'green') + " Check for Tool Updates")
|
||||||
|
print(colorize("6)", 'green') + " Manage Wordlists")
|
||||||
print()
|
print()
|
||||||
print(colorize("0)", 'red') + " Exit")
|
print(colorize("0)", 'red') + " Exit")
|
||||||
print()
|
print()
|
||||||
|
|
@ -102,6 +104,8 @@ def main_menu_loop(distro_name: str, distro_type: str, logger):
|
||||||
view_installed_tools()
|
view_installed_tools()
|
||||||
elif choice == '5':
|
elif choice == '5':
|
||||||
update_tools_menu(logger)
|
update_tools_menu(logger)
|
||||||
|
elif choice == '6':
|
||||||
|
wordlist_menu(logger)
|
||||||
elif choice == '0':
|
elif choice == '0':
|
||||||
print()
|
print()
|
||||||
print_success("Thank you for using Djedi Toolbelt!")
|
print_success("Thank you for using Djedi Toolbelt!")
|
||||||
|
|
@ -765,6 +769,217 @@ def update_selected_tools(logger):
|
||||||
input("Press Enter to continue...")
|
input("Press Enter to continue...")
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================================
|
||||||
|
# Wordlist Management
|
||||||
|
# ============================================================================
|
||||||
|
|
||||||
|
def wordlist_menu(logger):
|
||||||
|
"""Wordlist management menu"""
|
||||||
|
while True:
|
||||||
|
print_section("📚 WORDLIST MANAGEMENT")
|
||||||
|
|
||||||
|
# Check if SecLists is installed
|
||||||
|
seclists_path = os.path.expanduser("~/wordlists/SecLists")
|
||||||
|
seclists_installed = os.path.isdir(seclists_path)
|
||||||
|
|
||||||
|
print(colorize("1)", 'green') + " Install SecLists")
|
||||||
|
if seclists_installed:
|
||||||
|
print(colorize(" ✓ Already installed at ~/wordlists/SecLists", 'green'))
|
||||||
|
else:
|
||||||
|
print(" Comprehensive wordlist collection")
|
||||||
|
print()
|
||||||
|
|
||||||
|
print(colorize("2)", 'green') + " View Installed Wordlists")
|
||||||
|
print(" Browse wordlist directory structure")
|
||||||
|
print()
|
||||||
|
|
||||||
|
print(colorize("3)", 'green') + " Update SecLists")
|
||||||
|
if seclists_installed:
|
||||||
|
print(" Pull latest updates from GitHub")
|
||||||
|
else:
|
||||||
|
print(colorize(" (Requires SecLists to be installed first)", 'yellow'))
|
||||||
|
print()
|
||||||
|
|
||||||
|
print(colorize("0)", 'red') + " Back to Main Menu")
|
||||||
|
print()
|
||||||
|
|
||||||
|
choice = input(colorize("Select option: ", 'yellow')).strip()
|
||||||
|
|
||||||
|
if choice == '0':
|
||||||
|
return
|
||||||
|
elif choice == '1':
|
||||||
|
install_seclists(logger)
|
||||||
|
elif choice == '2':
|
||||||
|
view_wordlists(logger)
|
||||||
|
elif choice == '3':
|
||||||
|
update_seclists(logger, seclists_installed)
|
||||||
|
else:
|
||||||
|
print_error("Invalid option. Please try again.")
|
||||||
|
input("\nPress Enter to continue...")
|
||||||
|
|
||||||
|
|
||||||
|
def install_seclists(logger):
|
||||||
|
"""Install SecLists wordlist collection"""
|
||||||
|
print_section("📥 Installing SecLists")
|
||||||
|
|
||||||
|
wordlists_dir = os.path.expanduser("~/wordlists")
|
||||||
|
seclists_path = os.path.join(wordlists_dir, "SecLists")
|
||||||
|
|
||||||
|
# Check if already installed
|
||||||
|
if os.path.isdir(seclists_path):
|
||||||
|
print_warning("SecLists is already installed!")
|
||||||
|
print_info(f"Location: {seclists_path}")
|
||||||
|
print()
|
||||||
|
response = input(colorize("Reinstall? This will delete and re-clone. [y/N]: ", 'yellow')).strip().lower()
|
||||||
|
if response != 'y':
|
||||||
|
print_warning("Installation cancelled")
|
||||||
|
input("\nPress Enter to continue...")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Remove existing
|
||||||
|
print_info("Removing existing SecLists...")
|
||||||
|
try:
|
||||||
|
subprocess.run(['rm', '-rf', seclists_path], check=True)
|
||||||
|
except Exception as e:
|
||||||
|
print_error(f"Failed to remove existing SecLists: {e}")
|
||||||
|
logger.error(f"Failed to remove SecLists: {e}")
|
||||||
|
input("\nPress Enter to continue...")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Create wordlists directory
|
||||||
|
if not os.path.isdir(wordlists_dir):
|
||||||
|
print_info(f"Creating {wordlists_dir}...")
|
||||||
|
os.makedirs(wordlists_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# Clone SecLists
|
||||||
|
print_info("Cloning SecLists from GitHub...")
|
||||||
|
print_warning("This is a large repository (~500MB), it may take a few minutes...")
|
||||||
|
print()
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
['git', 'clone', '--depth', '1', 'https://github.com/danielmiessler/SecLists.git', seclists_path],
|
||||||
|
check=False
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.returncode == 0:
|
||||||
|
print()
|
||||||
|
print_success("SecLists installed successfully!")
|
||||||
|
print_info(f"Location: {seclists_path}")
|
||||||
|
print()
|
||||||
|
print_info("Popular wordlists:")
|
||||||
|
print(f" • Passwords: {seclists_path}/Passwords/")
|
||||||
|
print(f" • Usernames: {seclists_path}/Usernames/")
|
||||||
|
print(f" • Subdomains: {seclists_path}/Discovery/DNS/")
|
||||||
|
print(f" • Directories: {seclists_path}/Discovery/Web-Content/")
|
||||||
|
print(f" • Fuzzing: {seclists_path}/Fuzzing/")
|
||||||
|
logger.info("SecLists installed successfully")
|
||||||
|
else:
|
||||||
|
print_error("Failed to clone SecLists repository")
|
||||||
|
logger.error("SecLists installation failed")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print_error(f"Installation failed: {e}")
|
||||||
|
logger.error(f"SecLists installation error: {e}", exc_info=True)
|
||||||
|
|
||||||
|
print()
|
||||||
|
input("Press Enter to continue...")
|
||||||
|
|
||||||
|
|
||||||
|
def view_wordlists(logger):
|
||||||
|
"""View installed wordlist directory structure"""
|
||||||
|
print_section("📂 Installed Wordlists")
|
||||||
|
|
||||||
|
wordlists_dir = os.path.expanduser("~/wordlists")
|
||||||
|
|
||||||
|
if not os.path.isdir(wordlists_dir):
|
||||||
|
print_warning("No wordlists directory found")
|
||||||
|
print_info(f"Expected location: {wordlists_dir}")
|
||||||
|
print()
|
||||||
|
input("Press Enter to continue...")
|
||||||
|
return
|
||||||
|
|
||||||
|
seclists_path = os.path.join(wordlists_dir, "SecLists")
|
||||||
|
|
||||||
|
if not os.path.isdir(seclists_path):
|
||||||
|
print_warning("SecLists not found")
|
||||||
|
print_info("Use option 1 to install SecLists")
|
||||||
|
print()
|
||||||
|
input("Press Enter to continue...")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Show SecLists structure
|
||||||
|
print(colorize(f"SecLists Location: {seclists_path}", 'cyan'))
|
||||||
|
print()
|
||||||
|
|
||||||
|
categories = [
|
||||||
|
"Discovery",
|
||||||
|
"Fuzzing",
|
||||||
|
"IOCs",
|
||||||
|
"Miscellaneous",
|
||||||
|
"Passwords",
|
||||||
|
"Pattern-Matching",
|
||||||
|
"Payloads",
|
||||||
|
"Usernames",
|
||||||
|
"Web-Shells"
|
||||||
|
]
|
||||||
|
|
||||||
|
for category in categories:
|
||||||
|
category_path = os.path.join(seclists_path, category)
|
||||||
|
if os.path.isdir(category_path):
|
||||||
|
# Count files in category
|
||||||
|
try:
|
||||||
|
file_count = sum(1 for _ in Path(category_path).rglob('*') if _.is_file())
|
||||||
|
print(colorize(f" 📁 {category}/", 'green') + f" ({file_count} files)")
|
||||||
|
except Exception:
|
||||||
|
print(colorize(f" 📁 {category}/", 'green'))
|
||||||
|
|
||||||
|
print()
|
||||||
|
print_info(f"Full path: {seclists_path}")
|
||||||
|
print()
|
||||||
|
input("Press Enter to continue...")
|
||||||
|
|
||||||
|
|
||||||
|
def update_seclists(logger, seclists_installed: bool):
|
||||||
|
"""Update SecLists from GitHub"""
|
||||||
|
print_section("🔄 Updating SecLists")
|
||||||
|
|
||||||
|
if not seclists_installed:
|
||||||
|
print_warning("SecLists is not installed!")
|
||||||
|
print_info("Use option 1 to install SecLists first")
|
||||||
|
print()
|
||||||
|
input("Press Enter to continue...")
|
||||||
|
return
|
||||||
|
|
||||||
|
seclists_path = os.path.expanduser("~/wordlists/SecLists")
|
||||||
|
|
||||||
|
print_info("Pulling latest updates from GitHub...")
|
||||||
|
print()
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Run git pull
|
||||||
|
result = subprocess.run(
|
||||||
|
['git', '-C', seclists_path, 'pull'],
|
||||||
|
check=False
|
||||||
|
)
|
||||||
|
|
||||||
|
print()
|
||||||
|
if result.returncode == 0:
|
||||||
|
print_success("SecLists updated successfully!")
|
||||||
|
else:
|
||||||
|
print_warning("Update completed with issues")
|
||||||
|
print_info("Try reinstalling if problems persist (option 1)")
|
||||||
|
|
||||||
|
logger.info(f"SecLists update completed with exit code {result.returncode}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print_error(f"Update failed: {e}")
|
||||||
|
logger.error(f"SecLists update error: {e}", exc_info=True)
|
||||||
|
|
||||||
|
print()
|
||||||
|
input("Press Enter to continue...")
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Main Entry Point
|
# Main Entry Point
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
|
||||||