How to Integrate CUPP with Other Password Cracking Tools: A Complete Guide

CUPP (Common User Passwords Profiler) generates targeted wordlists from personal information and outputs standard plain-text dictionaries that can be directly consumed by John the Ripper, Hashcat, and other password crackers via file imports, stdout piping, or direct Python API calls.

CUPP is a Python utility in the Mebus/cupp repository that builds victim-specific password dictionaries from personal data inputs. Its modular architecture in cupp.py makes it straightforward to integrate with downstream password cracking tools, providing targeted wordlists that dramatically improve cracking efficiency against human-generated passwords.

Understanding CUPP's Core Architecture

Before integrating CUPP with external tools, understand how its internal pipeline processes data. The utility is organized into discrete functions that can be leveraged independently or as part of automated workflows.

Configuration Loading with read_config()

The read_config() function at line 52 of cupp.py parses the cupp.cfg file and populates a global CONFIG dictionary. This configuration controls numeric ranges, special character sets, and length constraints that dictate the final wordlist size and composition.

Profile-Based Generation via generate_wordlist_from_profile()

The heavy lifting occurs in generate_wordlist_from_profile() (lines 730–970 in cupp.py). This function takes a profile dictionary containing names, birthdates, and personal keywords, then applies leet transformations, case variations, and date permutations. The generated passwords accumulate in unique_list_finished, a Python list that serves as the final output buffer.

Dictionary Enhancement with improve_dictionary()

For existing wordlists, the improve_dictionary() function (lines 777–949) expands dictionaries by adding concatenations, numeric suffixes, and special characters. This mode is essential when you want to enhance public wordlists like RockYou with target-specific mutations before feeding them into your cracking tool.

Integration Methods for Password Cracking Workflows

CUPP provides multiple integration points that accommodate different automation requirements and tooling preferences.

File-Based Output via print_to_file()

All generation functions ultimately call print_to_file(), which writes standard one-word-per-line dictionaries named <profile>.txt or <input>.cupp.txt. These files require no transformation and are immediately compatible with John the Ripper and Hashcat wordlist modes.

stdout Piping for Real-Time Processing

Because print_to_file() also prints a summary to the console, you can suppress the banner using the -q flag and pipe the list directly into other tools or capture it to a file:

./cupp.py -i -q > victim.dict

This approach allows you to chain CUPP into bash pipelines without intermediate file management, though redirection to tee is recommended if you need both console display and file storage.

Programmatic Python API Integration

The core functions in cupp.py are importable as a Python module, enabling direct integration into larger automation frameworks:

from cupp import read_config, generate_wordlist_from_profile, CONFIG

read_config('cupp.cfg')
profile = {
    "name": "alice",
    "surname": "smith",
    "nick": "ali",
    "birthdate": "15081990",
    "spechars1": "y",
    "randnum": "y",
    "leetmode": "y",
    "words": ["company", "admin"]
}

generate_wordlist_from_profile(profile)

This method returns control immediately after generation, allowing your script to pass the resulting file path to Hashcat or John the Ripper via subprocess calls.

Extending Functionality with Custom Hooks

While CUPP does not ship with a formal plugin system, the unique_list_finished list is accessible after calling generate_wordlist_from_profile(). You can append custom combinators or additional mangling rules in your wrapper script without modifying the original cupp.py source code.

Practical Workflows with John the Ripper and Hashcat

Typical red-team workflows combine CUPP's targeted generation with high-performance cracking engines. Here are complete command sequences for both tools.

John the Ripper Integration


# Step 1: Generate victim-specific dictionary

./cupp.py -i -q > alice.dict

# Step 2: Run John with wordlist mode

john --wordlist=alice.dict --format=nt hashfile.txt

John automatically parses the plain-text format produced by CUPP's print_to_file() function.

Hashcat Integration


# Generate dictionary and crack NT hashes

./cupp.py -i -q > victim.dict
hashcat -a 0 -m 1000 -w 3 hashfile.txt victim.dict

The -a 0 (straight attack) mode is optimal for CUPP-generated lists, as they already contain the permutations that rules would otherwise generate.

Python Automation Pipeline

import subprocess
import os
from cupp import read_config, generate_wordlist_from_profile

read_config('cupp.cfg')
profile = {
    "name": "bob",
    "surname": "lee",
    "birthdate": "12051985",
    "spechars1": "y",
    "randnum": "y",
    "leetmode": "y"
}

generate_wordlist_from_profile(profile)
dict_path = os.path.abspath('bob.txt')

subprocess.run(['hashcat', '-a', '0', '-m', '1000', '-w', '3', 
                'hashes.txt', dict_path])

Optimizing Wordlists for Crackers

CUPP's value in a cracking toolchain comes from its ability to generate high-probability candidates through several configurable mechanisms.

Targeted Permutations

The generate_wordlist_from_profile() function incorporates birthday fragments (YY, YYYY, DDMM), name variations (lower/upper case, reversed strings), and leet substitutions (e.g., a → @, e → 3). These permutations dramatically raise the probability that a human-generated password appears in your wordlist compared to generic dictionaries.

Configurable Scope via cupp.cfg

The cupp.cfg file defines length bounds (wcfrom, wcto), numeric ranges (numfrom/numto), and special character sets. Adjusting these parameters tailors the output volume to the expected password policy of your target organization, preventing wasteful oversized lists while maintaining coverage.

Hybrid Wordlist Creation

Combine public dictionaries with CUPP's enhancement mode to create hybrid lists:


# Download a public corpus

./cupp.py -l -q

# Improve the downloaded list

./cupp.py -w dictionaries/english/words-english.gz > hybrid.dict

This workflow mixes generic passwords with victim-specific twists, providing both breadth and targeting to your cracking attack.

Summary

  • CUPP outputs standard plain-text dictionaries via print_to_file() in cupp.py, making it immediately compatible with any tool that accepts wordlist inputs.
  • Three integration methods are available: file output, stdout piping with -q, and direct Python API imports from cupp.py.
  • Core functions generate_wordlist_from_profile() (lines 730–970) and improve_dictionary() (lines 777–949) handle the heavy lifting of permutation and enhancement.
  • Configuration through cupp.cfg allows precise control over output size and complexity to match target password policies.
  • Straightforward automation is possible via Python scripts that call CUPP functions and then pass results to Hashcat or John the Ripper through subprocess modules.

Frequently Asked Questions

Can CUPP output directly to Hashcat without creating a file?

No, CUPP's print_to_file() function always writes to disk, but you can use stdout redirection and process substitution in bash to stream directly: hashcat -a 0 -m 1000 hashes.txt <(./cupp.py -i -q). This creates a temporary file descriptor that Hashcat reads while avoiding persistent disk storage of the wordlist.

How do I modify the generated password complexity for faster cracking?

Edit the cupp.cfg file to adjust wcfrom and wcto (word length bounds), numfrom/numto (numeric suffix ranges), and the spechars special character set. These parameters directly limit the output size of generate_wordlist_from_profile(), creating smaller, more focused lists that crack faster with minimal wasted attempts.

Is it possible to use CUPP as a library in my existing Python penetration testing framework?

Yes, import the functions directly from cupp.py. The read_config(), generate_wordlist_from_profile(), and improve_dictionary() functions are self-contained and return standard Python lists. You can call them, extend the results with custom logic, and pass the final wordlists to other tools without invoking the CLI interface.

What is the difference between interactive mode (-i) and improving an existing wordlist (-w)?

The -i flag triggers interactive(), which collects victim data through prompts and calls generate_wordlist_from_profile() to create a new targeted list from scratch. The -w flag invokes improve_dictionary(), which takes an existing dictionary file (like RockYou) and expands it with concatenations, numbers, and leet-speak transformations, making it useful for hardening generic lists with target-specific patterns.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →