
CVE research-to-detection-signature engineering project: fingerprinting the vsftpd 2.3.4 backdoor (CVE-2011-2523) externally, at scale, with validated false-positive/negative handling - built in Python
A CVE to Detection Signature Engineering Project: researching a disclosed vulnerability, building a fingerprint that identifies it externally, and validating detection quality against real lab targets.
Most vulnerability-research portfolios stop at "I exploited X." This one is built around a different question, closer to what detection engineering actually asks:
Once a CVE is disclosed, how do you reliably identify — externally, at scale, without exploiting anything — which internet-facing assets are actually running the vulnerable technology?
This repo documents that full workflow for one real CVE: CVE-2011-2523, the vsftpd 2.3.4 backdoor. It goes from vulnerability research through fingerprint design, detection script engineering, and validation against live lab targets — deliberately built as detection, not exploitation.
CVE Disclosure → Research & Version Analysis → Fingerprint Design
→ Detection Script → Validation (TP/FP/FN review) → Evidence Output
220 welcome banner. That banner is the fingerprint surface — no authentication, no exploitation required to read it.fingerprint_vsftpd_cve_2011_2523.py connects, captures the banner, regex-matches it against the known vulnerable signature, and classifies the result.undetermined rather than a false negative).Rename your screenshot files to match, or update these paths, once uploaded to
/screenshots.
| Fingerprint Script | Validation Output |
|---|---|
| Script | Output |
Additional run detail:
Detail Detail Detail Detail
# Single target
python3 fingerprint_vsftpd_cve_2011_2523.py --target 192.168.56.101
# Batch — multiple hosts, evidence-style JSON output
python3 fingerprint_vsftpd_cve_2011_2523.py --targets-file targets.json \
--output evidence/vsftpd_fingerprint_findings.json
Sample output:
{
"scan_type": "vsftpd_2.3.4_backdoor_fingerprint",
"cve": "CVE-2011-2523",
"total_targets": 1,
"vulnerable_count": 1,
"findings": [
{
"host": "192.168.56.101",
"port": 21,
"banner": "220 (vsFTPd 2.3.4)",
"verdict": "vulnerable",
"reason": "Banner matches known vulnerable signature (vsftpd 2.3.4)"
}
]
}
This three-way split is the core detection-quality control in the project: a naive detector collapses "couldn't check" and "checked and clean" into the same result, which is exactly how false negatives hide in production detection logic.
.
├── fingerprint_vsftpd_cve_2011_2523.py
├── docs/
│ └── CVE-RESEARCH.md
├── evidence/
│ └── vsftpd_fingerprint_findings.json
├── screenshots/
│ └── (script + validation run screenshots)
└── README.md
Cybersecurity Engineer | Detection Engineer | Vulnerability Researcher | Purple Team | SIEM | Enterprise Security
Focused on the research-to-detection pipeline: taking a disclosed CVE from advisory to a working, validated fingerprint capable of identifying vulnerable technology externally and at scale — built on hands-on offensive and defensive lab work rather than theory alone.
https://www.linkedin.com/in/bassey-solomon-henry/
GitHub
https://github.com/solomonhenry-afk/Bassey-Solomon-Henry
"A vulnerability isn't real risk until you can prove, at scale, which systems actually have it. Research tells you what's possible — detection engineering tells you what's true."
If this project is useful, consider starring the repository.
| Core Function | Where It Lives in This Repo |
|---|
| Research newly disclosed CVEs & advisories | docs/CVE-RESEARCH.md — CVE-2011-2523 background, affected versions, disclosure timeline |
| Design technology fingerprints & detection signatures | fingerprint_vsftpd_cve_2011_2523.py — banner-based version-match signature |
| Build scalable detection logic | Batch mode (--targets-file) for fingerprinting multiple hosts in one run |
| Validate detections using real-world assets | Run and validated against live lab targets (Metasploitable2 + closed-port control) |
| Reduce false positives / false negatives | Three-state verdict logic (vulnerable / not_vulnerable / undetermined) instead of a boolean — a closed/filtered port is never silently folded into "not vulnerable" |
| Python scripting for research & validation | Entire detection script + JSON evidence output, no manual steps |
| HTTP/HTTPS, networking fundamentals | Raw TCP/socket-level service interaction, banner parsing |
| Internet-facing infrastructure focus | Designed for external, unauthenticated fingerprinting — no credentials, no exploitation, no service disruption |
| Test Case | Target Type | Expected Verdict | Result |
|---|
| Known-vulnerable host | Metasploitable2 (vsftpd 2.3.4) | vulnerable | Confirmed |
| Closed/filtered port | Non-listening port | undetermined (not a silent false negative) | Confirmed |
| Non-vsftpd service | Other FTP banner | not_applicable | Confirmed |