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>
This commit is contained in:
rpriven 2025-11-01 00:17:21 -06:00
parent c4f40e79c8
commit 37085d853a
Signed by: djedi
GPG key ID: D04DED574622EF45
23 changed files with 243 additions and 2 deletions

View file

@ -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

View file

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

View file

@ -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
# ============================================================================ # ============================================================================