Skip to content

joshuavanderpoll/CMS-Detector

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

21 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

CMS-Detector

A lightweight fast Go script to detect which CMS or framework a given website is running, based on HTTP response fingerprints.

✨ Features

  • Detects 60+ CMS/frameworks (WordPress, Drupal, Shopify, Laravel, Wix, …).
  • Multiple fingerprint methods:
    • HTML body regex & string search
    • HTTP headers
    • Cookies (including Base64/JSON decoding)
  • CLI modes:
    • Standard (colorful output)
    • Raw (--raw) β†’ just the CMS name (script-friendly)
    • JSON (--json) β†’ structured output
  • Works with both http:// and https:// targets.

πŸ“¦ Installation

Prereq: Go 1.21+ (for go install). For prebuilt binaries from Releases, no Go toolchain is required.

1) Install from GitHub Releases (recommended)

Download a prebuilt binary for your OS/arch from the Releases page and put it on your PATH.

Linux/macOS:

# pick the right asset from the release page
tar -xzf cmsdetector_v1.0.0_linux_amd64.tar.gz
chmod +x cmsdetector_v1.0.0_linux_amd64/cmsdetector
sudo mv cmsdetector_v1.0.0_linux_amd64/cmsdetector /usr/local/bin/cms_detector
cms_detector --help

Windows

Expand-Archive .\cmsdetector_V1.0.0_windows_amd64.zip -DestinationPath .
Move-Item .\cmsdetector_V1.0.0_windows_amd64\cmsdetector.exe $Env:ProgramFiles\cms_detector\cms_detector.exe
$Env:ProgramFiles\cms_detector\cms_detector.exe --help

2) Install via go install (from the repo)

This builds and installs directly from the repo’s module path.

go install github.com/joshuavanderpoll/CMS-Detector@latest
# or use a specific version:
go install github.com/joshuavanderpoll/CMS-Detector@v1.0.0

# Usage
~/go/bin/CMS-Detector --help

3) Build from source (clone & build)

# Clone the repository
git clone https://github.com/joshuavanderpoll/CMS-Detector.git
cd CMS-Detector

# Build the Go binary
go build -o cms_detector .

πŸš€ Usage

Basic Scan

./cms_detector --host "https://wordpress.com"

Output:

CMS Detector
[β€’] Made by: https://github.com/joshuavanderpoll/CMS-Detector
[@] Scanning host "https://wordpress.com"...
[√] "https://wordpress.com" is using "WordPress"!
    ↳ matched by: string_contains:/wp-content/

Raw Mode (Script friendly)

./cms_detector --host "https://wordpress.com" --raw

Output:

wordpress

JSON output

./cms_detector --host "https://wordpress.com" --json

Output:

{"host":"https://wordpress.com","status_code":200,"detected":true,"matches":[{"name":"WordPress","matched_by":["string_contains:/wp-content/"]}],"timing_ms":188,"redirects":0}

⚑ Options

Option Description
--host Target host (e.g. example.com, https://example.com)
--raw Print only CMS name(s) in lowercase (e.g. wordpress)
--json Return structured JSON output
--timeout Set request timeout (default: 10s)
--insecure Disable SSL verification (verify=False)
--ua Custom User-Agent string
--no-redirect Do not follow HTTP redirects

βœ… Supported CMS / Frameworks

πŸ” Fingerprint Types

  • html β†’ Match a CSS selector against the parsed DOM (recommended for HTML β€” no false positives from page text)
  • regex β†’ Match regex in HTML
  • string_contains β†’ HTML contains substring
  • strings_contain β†’ HTML contains all substrings (pipe-separated)
  • header_key_equals β†’ Header key exists
  • header_key_value β†’ Header key/value match
  • header_key_value_contains β†’ Header key’s value contains substring
  • cookie_key_equals β†’ Cookie key exists
  • cookie_key_value β†’ Cookie key/value match
  • cookie_key_value_contains β†’ Cookie value contains substring
  • cookie_key_value_b64_json_keys β†’ Decode cookie from Base64 β†’ JSON β†’ check for keys
  • cookie_substr_key_value_b64_type β†’ Check cookie name suffix, decode Base64, verify value type

html β€” DOM/CSS selector matching

Unlike string_contains, the html type parses the response into a real DOM and runs a CSS selector (powered by cascadia). It only matches actual elements/attributes, so a blog that merely mentions /wp-content/ in its text is not a false positive β€” the path has to live in a real <link href>/<script src>.

Supported selector features: tag/class/id, descendant & child combinators, selector groups (a, b), and attribute matchers [attr], [attr=val], [attr*=val] (contains), [attr^=val] (prefix), [attr$=val] (suffix).

// WordPress (fingerprints/fingerprints.go)
{Type: `html`, Value: `meta[name="generator"][content*="WordPress"]`},
{Type: `html`, Value: `link[href*="/wp-content/"], script[src*="/wp-content/"]`},

βž• Adding your own detection

Detections are plain Go data in fingerprints/fingerprints.go. Add a CMS entry to the All slice β€” no engine changes needed:

{
    Name: `My CMS`,
    Fingerprints: []Fingerprint{
        {Type: `html`, Value: `meta[name="generator"][content*="My CMS"]`},
        {Type: `header_key_value_contains`, Key: `X-Powered-By`, Value: `MyCMS`},
    },
},

A CMS is reported if any of its fingerprints match. Invalid regex/CSS selectors are skipped at startup rather than crashing, so a typo in one fingerprint won't break the rest. PRs with new detections are welcome.

About

A lightweight fast Go script to detect which CMS or framework a given website is running, based on HTTP response fingerprints.

Topics

Resources

License

Contributing

Security policy

Stars

6 stars

Watchers

1 watching

Forks

Contributors

Languages