Put a target behind Cloudflare or Akamai and most scanners happily report the CDN edge. That is useful for footprinting, but it is not the IP the red team needs when the engagement scope includes the origin, the bypass path, or proving that grey-clouding actually held.

origin-recon is CDN origin-IP discovery and exposure reconnaissance for authorized security assessments. A single target flows through passive intelligence — favicon and TLS-cert correlation, passive DNS history, reverse-IP co-hosting — then live DNS work — certificate transparency, wildcard detection, AXFR attempts, altdns permutations — and finally HTTP probing with direct-IP validation. Candidates are enriched with BGP/ASN context and graded by confidence: high when a TLS SAN or body-hash match proves the backend, medium when passive DNS or HTTP response suggests it, low when the correlation is weak enough that a human should decide.

The operator controls the aggression. --passive skips all active probing. --tor routes HTTP egress through a SOCKS proxy and fails closed if Tor is unreachable. Active stages are gated behind scope confirmation unless the operator explicitly authorizes them. Reports leave as terminal tables, Markdown, HTML, JSON, or SARIF; batch mode and CI exit codes support recurring checks against a domain list.

This is the local, full-power build: your API keys, your egress, your scope file. A reduced public-web variant without operator keys is a separate future artifact. The useful output is not a pile of Shodan hits — it is a ranked candidate list with the validation path that got you there, diffable between rescans so exposure regressions do not hide in a folder of stale HTML.

cat redacted-results.log sanitized logs

Origin candidate table

redacted report excerpt

Candidates are graded by confidence and source so weak Shodan correlations do not read the same as a TLS-cert match.

sanitized-output
target: client-[REDACTED].com
apex_https: 200 · server: cloudflare · cdn: cloudflare
candidates:
  - ip: 203.0.113.[x]
    confidence: high
    source: tls_san_match + body_hash
    notes: direct-IP HTTPS 200 with matching cert SAN
  - ip: 198.51.100.[y]
    confidence: medium
    source: urlscan.io passive DNS
    notes: HTTP responsive; verify manually
  - ip: 192.0.2.[z]
    confidence: low
    source: shodan:favicon
    notes: shared asset correlation — investigate manually

Rescan diff

redacted regression

JSON output supports `diff` between scans so grey-cloud regressions and new origin exposure show up as structured deltas.

sanitized-output
diff: reports/2026-06-[REDACTED].json → reports/2026-07-[REDACTED].json
new_origin_ips: [203.0.113.[x]]
removed_from_edge: []
confidence_upgrades: 1
grey_cloud_regressions: 0
sarif_findings_high: 1