Black-box service discovery, classification, and adaptive scan routing
Project description
Black-box service discovery, classification, and adaptive scan routing
Driftmux is a black-box auditing tool focused on service discovery, classification, and adaptive scan routing.
It starts by probing a target surface, identifies exposed services and technologies, and then routes each finding to the most suitable scanner. Instead of treating every host the same way, Driftmux adapts its scanning workflow based on what it discovers.
For example:
- generic network discovery with Nmap
- web and exposed service vulnerability checks with Nuclei
- WordPress-specific assessment with Plecost
Driftmux is designed as an orchestrator, not as a monolithic scanner.
Features
- Black-box service discovery
- Technology-aware scan routing
- Structured output for automation and CI
- Multiple output formats
- Modular scanner integration
- Lightweight CLI workflow
- Extensible architecture for new service detectors and scanners
Why driftmux?
Many security tools are powerful but noisy. driftmux focuses on orchestration and correlation: it uses existing tools, normalizes their output and decides what should run next.
| Feature | driftmux | Raw Nmap | Raw Nuclei | Full scanners |
|---|---|---|---|---|
| Service discovery | Yes | Yes | No | Yes |
| Version/CPE parsing | Yes | Yes | No | Yes |
| Vulnerability enrichment | Yes | No | Template-based | Yes |
| Targeted Nuclei execution | Yes | No | Manual | Varies |
| Scan planning | Yes | No | No | Varies |
| Lower-noise profiles | Yes | Manual | Manual | Varies |
| Structured final report | Yes | XML/text | JSONL/text | Varies |
| Lightweight and scriptable | Yes | Yes | Yes | Often heavier |
driftmux is not a replacement for Nmap, Nuclei or dedicated scanners. It is a thin coordination layer that makes them easier to combine.
How it works
Driftmux follows a simple pipeline:
- Discover exposed ports and services
- Classify detected applications and technologies
- Route targets to specialized scanners
- Aggregate findings into a common data model
- Render results as console output, JSON, CSV, or Markdown
Example routing logic:
- WordPress detected → Plecost
- HTTP/HTTPS services detected → Nuclei
- Generic open ports detected → Nmap fingerprints
Installation
Requirements
- Python 3.10+
nmapnucleiplecost
Clone the repository
git clone https://github.com/<your-user>/driftmux.git
cd driftmux
Install the Python package
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
External tools
Depending on the features you use, install Nmap:
sudo apt install nmap
Nuclei and Plecost are optional, but required for their respective checks.
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
pip install plecost
Usage
Basic scan:
driftmux --host example.org
Scan a specific IP:
driftmux --host 193.146.75.190
Scan known ports:
driftmux --host example.org --ports 80,443,8443
Run with NVD enrichment:
driftmux --host example.org \
--vuln-backend nvd \
--min-cvss 7.0
Run a fast profile:
driftmux --host example.org --profile fast
Run a passive profile:
driftmux --host example.org --profile passive
Example output
$ driftmux --host 205.87.65.183 --profile passive --vuln-backend nvd --min-cvss 7.0
[205.87.65.183]
Services: 1 | Findings: 4 | Errors: 1
- 22/tcp ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.16 [ssh]
* CRITICAL nvd: CVE-2008-3844 affects OpenSSH
* HIGH nvd: CVE-2024-6387 affects OpenSSH
* HIGH nvd: CVE-2026-35385 affects OpenSSH
* HIGH nvd: CVE-2023-51767 affects OpenSSH
Saved report to reports/driftmux-report.json
When Nmap can identify product, version or CPE information, driftmux can use that evidence to enrich findings through vulnerability backends such as NVD.
If a service is reported as tcpwrapped, driftmux can still report the exposed port, but it may not have enough evidence to map it to a specific vulnerable product.
Scan profiles
| Profile | Purpose | Active checks |
|---|---|---|
passive |
Conservative discovery and enrichment | No |
passive + NVD |
Conservative discovery and enrichment | Yes |
fast |
Practical day-to-day checks | Limited |
deep |
Broader authorized assessment | More extensive |
Use passive for low-noise review, fast for regular checks and deep only when you have explicit authorization for a more complete assessment.
Roadmap
Planned or possible improvements:
- OS detection support from Nmap XML;
- clearer handling of
tcpwrappedservices; - improved Nuclei target planning;
- richer JSON and HTML reports;
- optional SARIF export;
- better test coverage for planners and scanners.
Disclaimer
driftmux is provided for defensive and authorized security work only. You are responsible for complying with all applicable laws, regulations and rules of engagement.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file driftmux-1.0.tar.gz.
File metadata
- Download URL: driftmux-1.0.tar.gz
- Upload date:
- Size: 26.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69ceb5da17f7be5ad8fe122030e0fe123747e81ac149e380efd0ccfe5e88b69d
|
|
| MD5 |
f5afcb87a6e243ceaadaf7e8ebf465cc
|
|
| BLAKE2b-256 |
8250194930cee1b3f6b5895fc03a19056f1d1e326ccf1de930e01b809d929318
|
Provenance
The following attestation bundles were made for driftmux-1.0.tar.gz:
Publisher:
pypi-publish.yml on aidaph/driftmux
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
driftmux-1.0.tar.gz -
Subject digest:
69ceb5da17f7be5ad8fe122030e0fe123747e81ac149e380efd0ccfe5e88b69d - Sigstore transparency entry: 1459654799
- Sigstore integration time:
-
Permalink:
aidaph/driftmux@b2e878a113214c7984d7cdd323f0ebb023a5a550 -
Branch / Tag:
refs/tags/latest - Owner: https://github.com/aidaph
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@b2e878a113214c7984d7cdd323f0ebb023a5a550 -
Trigger Event:
release
-
Statement type:
File details
Details for the file driftmux-1.0-py3-none-any.whl.
File metadata
- Download URL: driftmux-1.0-py3-none-any.whl
- Upload date:
- Size: 27.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64fa08caef363d6f18bf50b1fb5730ca40bbbe2387b32a7464a94ce2619409b5
|
|
| MD5 |
f6229117fb857567725d888730eebeec
|
|
| BLAKE2b-256 |
1428d24750402f62ad262c0c7ece54575ad7599ff37356d0d1315e0ed5ab2c55
|
Provenance
The following attestation bundles were made for driftmux-1.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on aidaph/driftmux
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
driftmux-1.0-py3-none-any.whl -
Subject digest:
64fa08caef363d6f18bf50b1fb5730ca40bbbe2387b32a7464a94ce2619409b5 - Sigstore transparency entry: 1459654909
- Sigstore integration time:
-
Permalink:
aidaph/driftmux@b2e878a113214c7984d7cdd323f0ebb023a5a550 -
Branch / Tag:
refs/tags/latest - Owner: https://github.com/aidaph
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@b2e878a113214c7984d7cdd323f0ebb023a5a550 -
Trigger Event:
release
-
Statement type: