Back to Articles

changeme: The Data-Driven Default Credential Scanner That Separates Code from Credentials

[ View on GitHub ]

changeme: The Data-Driven Default Credential Scanner That Separates Code from Credentials

Hook

While security teams scramble to patch the latest zero-day, attackers are walking through the front door using credentials like admin/admin on production systems. changeme exists because default credentials remain one of the easiest—and most embarrassing—attack vectors in 2024.

Context

Commercial vulnerability scanners excel at finding CVEs and misconfigurations, but they often skip over a fundamental security gap: default and backdoor credentials. Devices ship with factory passwords. Developers leave test credentials in place. Legacy equipment runs with vendor-set admin accounts that were never changed.

changeme fills the gap between heavyweight penetration testing frameworks and general-purpose password crackers. It’s not trying to brute-force common passwords or crack hashes. Instead, it focuses on a curated database of known default and backdoor credentials across vendors, protocols, and device types. The tool’s philosophy is simple: separate credential data from scanning logic, make it trivial to add new credentials, and support the protocols that matter for infrastructure and IoT security.

Technical Insight

Output

Scanners

Core

Input

IPs/Shodan/nmap

Load creds

Distribute tasks

Route by protocol

Route by protocol

Route by protocol

Route by protocol

Results

Results

Results

Results

Optional distributed queue

Target Sources

YAML Credentials

Queue System

Scanner Engine

HTTP/HTTPS

SSH

Database Protocols

Other Protocols

Reports

Redis Backend

System architecture — auto-generated

The architecture of changeme revolves around a deliberate separation of concerns: YAML files store credentials, Python handles protocol-specific scanning, and an optional Redis backend enables distributed execution. This data-driven design means adding support for a new device’s default credentials requires zero code changes—just a new YAML file in the credentials directory.

Each credential is defined declaratively in YAML format with information about the target service, protocol, and credential pairs. This YAML-first approach makes changeme’s credential database community-extensible. Security researchers can contribute new credentials without understanding the scanning engine’s internals. The --mkcred interactive tool scaffolds these YAML files by asking questions, lowering the barrier to contribution.

changeme implements protocol-specific scanners for HTTP/HTTPS, SSH (both password and key-based), MSSQL, MySQL, PostgreSQL, MongoDB, SNMP, and FTP. The SSH scanner can test both traditional passwords and known private keys—a feature most credential scanners overlook.

Target loading is flexible. You can specify a single IP, a subnet in CIDR notation, a list of hosts in a text file, an nmap XML output, or even a Shodan query. The Shodan integration is particularly powerful for security research:

./changeme.py --shodan_query "Server: SQ-WEBCAM" --shodan_key YOUR_API_KEY -c camera

This command queries Shodan for internet-facing webcams, retrieves their IP addresses, and immediately tests them against camera-specific default credentials.

The queuing system supports both an in-memory queue (simple, single-instance) and a Redis-backed queue (recommended for production use). The Redis option enables horizontal scaling: you can spin up multiple changeme containers or processes pointing at the same Redis instance, effectively creating a distributed credential scanner:

# Start Redis
docker run -d --name redis1 redis

# Launch scanner instance
docker run -it --link redis1:redis ztgrace/changeme ./changeme.py --redishost redis --threads 20 192.168.0.0/16

Each instance pulls targets from the shared Redis queue, scans them, and reports results back. The queue prevents duplicate work and provides resilience—if one scanner crashes, others continue processing.

The protocol-specific syntax is another useful feature: ./changeme.py snmp://192.168.1.20 explicitly tests only SNMP credentials against that host, bypassing irrelevant HTTP or database checks.

Gotcha

changeme has only been tested on Linux and has known issues on Windows and macOS. The recommended workaround is Docker, which adds overhead and complexity for developers on non-Linux systems who just want to run a quick scan. If you’re a security consultant on a MacBook, you’ll be managing containers instead of running a native binary.

The README explicitly states that the telnet scanner is broken. Before relying on changeme for production security audits, you’ll want to verify which protocols actually work in the current release.

Dependency management requires manual installation of platform-specific system libraries: unixodbc-dev for MSSQL support and libpq-dev for PostgreSQL support must be installed before running pip. PhantomJS is required for HTML report screenshots but must be separately installed and added to PATH. This isn’t the plug-and-play experience developers expect from contemporary security tools.

Verdict

Use changeme if you’re conducting authorized penetration tests or security audits where identifying default credentials quickly across diverse network equipment is critical. It’s especially valuable when scanning large heterogeneous networks with IoT devices, industrial systems, and legacy equipment from multiple vendors—exactly the environments where default credentials proliferate. The Shodan integration makes it powerful for bug bounty hunters and security researchers mapping internet-facing attack surface. Skip it if you need native Windows or macOS support, require telnet scanning, or need a general-purpose password cracking tool. For Windows-centric network pentesting, CrackMapExec may be more appropriate. For broader protocol support, consider Metasploit’s auxiliary modules or Hydra with custom wordlists. changeme’s sweet spot is Linux-based security teams with Redis infrastructure who need to audit default credentials at scale and want a credential database they can extend without touching code.

// ADD TO YOUR README
[![Featured on Starlog](https://starlog.is/api/badge/cybersecurity/ztgrace-changeme.svg)](https://starlog.is/api/badge-click/cybersecurity/ztgrace-changeme)