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)
- View Installed Tools
- Check for Tool Updates
- Manage Wordlists
**Level 2 - Categories:**
- 📦 APT Tools - Package manager tools
@ -63,6 +64,11 @@ python3 toolbelt.py
- Update all Go tools to @latest
- 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
**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)
- **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

View file

@ -312,10 +312,10 @@ def download_with_progress(url: str, output: str):
## Implementation Priority
**v2.1 (Next Release):**
**v2.1 (COMPLETE):**
1. Individual Tool Selection (gum multi-select) ✅ **COMPLETED**
2. Tool Update Detection ✅ **COMPLETED**
3. Wordlist Management 🔜
3. Wordlist Management ✅ **COMPLETED**
**v2.2:**
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 os
import subprocess
from pathlib import Path
from typing import Optional, List, Dict
# 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("4)", 'green') + " View Installed Tools")
print(colorize("5)", 'green') + " Check for Tool Updates")
print(colorize("6)", 'green') + " Manage Wordlists")
print()
print(colorize("0)", 'red') + " Exit")
print()
@ -102,6 +104,8 @@ def main_menu_loop(distro_name: str, distro_type: str, logger):
view_installed_tools()
elif choice == '5':
update_tools_menu(logger)
elif choice == '6':
wordlist_menu(logger)
elif choice == '0':
print()
print_success("Thank you for using Djedi Toolbelt!")
@ -765,6 +769,217 @@ def update_selected_tools(logger):
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
# ============================================================================