Tech-stack fingerprinting
TL;DR: Identify the frameworks, libraries, CDN, WAF, and language behind every live host. Stack drives wordlist choice, payload selection, and which CVEs to map against — without it, fuzzing is random.
What it is
Tech fingerprinting reduces an opaque HTTP response to a structured “this is Spring Boot 2.7, with Tomcat, behind Cloudflare, using a React 18 frontend.” Each identified component changes which wordlist to fuzz with, which payloads encode-bypass the WAF, and which n-day CVEs might already work (n-day-rapid-exploitation).
Preconditions / where it applies
- A live HTTP/S host within scope
- Some response body / headers / cookies to analyse (not just a 403 block page)
- A continuously updated fingerprint database (Wappalyzer rules, retire.js signatures, nuclei templates)
Technique
- Passive header analysis — cheapest signals, no extra traffic:
1
2
3
4
5
6
Server: nginx/1.18.0
X-Powered-By: Express
X-AspNet-Version: 4.0.30319
Set-Cookie: JSESSIONID=... -> Java servlet container
Set-Cookie: laravel_session=... -> Laravel
Set-Cookie: connect.sid=... -> Express session
- Body-level signals:
- HTML comments (
<!-- powered by WordPress 6.4 -->) - Meta tags (
<meta name="generator" content="Drupal 10">) - CSP / report-to headers list internal hostnames + asset hosts
<script src="/static/_next/...">→ Next.js;/static/runtime~main.abc.js→ Webpack- Favicon hash (
mmh3of the body) cross-referenced with Shodan favicon search
- HTML comments (
- Active fingerprinting:
- Predictable 404 bodies per framework (Django, Rails, Express each have a unique default)
- Probing well-known paths:
/wp-login.php,/.well-known/security.txt,/actuator,/_next/,/__webpack_hmr - JS bundle parsing for library imports + version strings (js-recon)
- Tools to automate the pass:
1
2
3
4
5
6
7
8
# whatweb — comprehensive plugin set
whatweb -v https://target.tld
# wappalyzer CLI / browser ext (browser version detects SPA frameworks better)
wappalyzer https://target.tld
# nuclei tech-detect templates
nuclei -u https://target.tld -t technologies/ -severity info
- Fingerprint the WAF too.
wafw00fand nuclei’swaf-detecttemplates identify Cloudflare, Akamai, F5, AWS WAF; this determines which payload encodings to try. - Record findings per host in the asset graph (asset-graphing). The same target may have 5 different frameworks across its subdomains — admin in WordPress, marketing in HubSpot, app in Next.js. Each is a different bug shop.
Detection and defence
- Strip identifying headers (
Server,X-Powered-By,X-AspNet-Version) at the edge proxy - Customise framework 404 pages to a generic site-wide error template
- Don’t expose
/actuator,/.git/,/_next/__webpack_hmroutside development - Defender: fingerprint your own surface and reconcile against asset inventory — drift detection catches shadow IT
- Repeated nuclei tech-detect template signatures from a single IP are an easy WAF/SOC alert
References
- Wappalyzer rules — community fingerprint definitions
- whatweb — CLI fingerprint scanner
- Shodan favicon search — pivot by favicon hash to find more hosts with the same stack
- HackTricks — Pentesting Web Methodology — fingerprinting checklist