Skip to content
VC
Case Study #27 · OSINT · Research

Open-source competitive intelligence: from a public link to the operator behind it

My own tooling, not a client project. Starting from a single public ad link, the technical chain gets reconstructed in 30-60 minutes: what the infrastructure runs on, which tracker serves it, and who stands behind it. Free public sources only — not a single paid subscription. Plus a separate rulebook that exists because the methodology caught a mistake of my own.

Type
Own methodology · internal tooling
Stack
bash · whois / dig / openssl · crt.sh · URLscan
Time per chain
30-60 minutes
Outcome
12 steps · $0 on paid data services
01 · Pain Point

The link is public and yet tells you nothing

You see a competitor's ad link, or a link in an email from a prospective counterparty. It's public — and it answers none of the practical questions on its own. Where does it actually lead? Between the click and the final page sits a filter that serves a neutral placeholder to anyone who doesn't look like the intended visitor. Who owns it? Domain registration is hidden behind a privacy provider. Which tracker serves it? Nowhere stated — platforms don't sign their work.

The commercial answer is paid subscriptions: passive DNS, certificate history, infrastructure attribution. That's hundreds of dollars a month, and it still covers only part of the question. A service will show you neighbouring domains, but it won't tell you which tracker sits inside, nor whether that adjacency means shared ownership at all.

The second place this work breaks isn't data collection — it's the discipline of the conclusion. Gathering signals is easy. Over-reading them is just as easy: spot a shared intermediate service in two different chains and declare them one operation. That conclusion is worse than no conclusion — it looks well-founded, and people make decisions on it.

02 · Solution

Twelve steps, two scripts, and discipline about conclusions

The methodology has two halves, and the second one matters more. First: collection — reproducible, scripted, leaving artifacts behind. Second: rules of interpretation — which signal proves an owner, and which one shows up across hundreds of unrelated operators and proves nothing at all.

01
Registration

WHOIS: registrar, domain creation date, privacy provider, name servers

02
Infrastructure

DNS records A / NS / SOA / MX / TXT, certificate SANs, crt.sh history

03
Stack fingerprint

HEAD request: server headers, X-Powered-By, cookie naming patterns

04
Live click

The real redirect chain, requested with a genuine visitor's parameters

05
Passive archives

Public scans, passive DNS, the web archive: what others saw before you

Collection collapsed into one command

The 01-recon.sh script takes a domain and, in a single pass, runs WHOIS, DNS, certificate parsing, historical enumeration from certificate transparency, a HEAD request, public scans, passive DNS and the web archive. Each step lands as its own file in a working directory — an artifact you can return to, attach to a conclusion, and diff against a re-run of the same domain a month later. Intelligence that exists only in the analyst's terminal isn't intelligence.

The live click is a separate script — on purpose

The serving filter hands a neutral page to anyone who doesn't look like the intended visitor: wrong region, wrong device class, wrong referring source. So 02-live-click.sh issues the request with a genuine visitor's parameters and captures everything the hop exposes:

  • the full redirect chain — every hop is a separate domain and, possibly, a separate party
  • Set-Cookie at each hop — cookie names identify a platform far better than page content does
  • response headers per hop: web server, framework tells, CDN identifiers
  • the final response with real content — the thing the whole chain exists to deliver

Keeping this in its own file isn't cosmetic. It's the only step that sends a request with a substituted referring source, and it must never go out accidentally as part of routine collection. The reasoning is written into the script's header comment so the decision outlives its author.

Identify the tracker by signature, not by name

A tracker never introduces itself. But every platform leaves a fingerprint, and the fingerprint is more durable than anything printed on the page. The tracker-signatures.md reference is a "signal → platform" table that grows with every analysis:

  • a service response header unique to one platform — the strongest signal, identification is instant
  • cookie naming shape and structure — say, a name carrying a fixed-length hash plus a signed value
  • the shape of the click URL path: where the campaign id sits, where the partner id sits
  • the field set in an integration JSON payload — the key composition maps cleanly onto a platform family
  • the load-balancer hostname in cloud DNS — often the operator's internal project codename

The code on the page says more about the team than the page does

A dedicated step reads the collected JS and CSS not for logic, but for traces of the authors: hard-coded service endpoints, internal entity names and — above all — comments written in a non-Latin script. One or two lines in a developer's native language narrow the candidate set more than the rest of the technical collection combined. It's a cheap step, and it's almost always skipped.

Attribution rules live in their own document, not in a closing paragraph

A chain involves several independent parties, not one: the masking layer, the tracker, an intermediate redirect service, the end merchant. Each is a separate company, and each may serve dozens of unrelated clients. So attribution-rules.md splits signals into two lists: those that prove a specific operator, and those that show up everywhere. The conclusion is drawn from the first unique signature in the chain — not from the last hop, and not from shared intermediate links.

Zero paid sources is a constraint, not a saving

The whole collection stands on what's available to anyone: registry whois servers, public DNS resolvers, certificate transparency, public page scans, passive DNS and the web archive. The constraint is methodologically useful: it forces you to rely on signals anyone can independently re-verify, rather than on the verdict of a closed service that can be neither challenged nor reproduced.

03 · Stack

Tools that are already on every machine

bash + curl

The whole collection is a plain shell script — no dependencies, no install step

whois

Registrar, domain creation date, privacy provider, name servers — the first filter

dig (A / NS / SOA / MX / TXT)

The DNS map: hosting, mail, third-party service verifications

openssl s_client + x509

Certificate SANs — every adjacent domain issued under one certificate

crt.sh

Certificate transparency: historical subdomain and related-name enumeration

URLscan.io API

Public scans: the full chain of loaded assets, headers and cookies

Passive DNS (HackerTarget / OTX)

Free equivalents of paid DNS-history services

Wayback Machine

How the domain looked before — often before privacy was switched on

python3 (stdlib)

JSON response parsing inline in the pipe, no packages to install

Markdown + git

Signature and attribution references are versioned alongside the scripts

bashcurlwhoisdigopensslcrt.shURLscanpassive DNSWaybackpython3git
04 · Results

A methodology that catches its own errors

Time per chain
30-60 min

from a public link to a named operator, its stack, and how the claim is verified

Data budget
$0

no paid subscription for passive DNS, certificate history or attribution

Chains analysed
3

three independent analyses; each one added new signatures to the references

The most valuable result was catching my own mistake

On the third analysis the attribution was wrong at first. Two different chains converged on the same intermediate redirect service, and that looked like proof of shared ownership — a vivid, reproducible and entirely false signal. The error surfaced one step later: the response headers carried a tracker signature belonging to one specific platform and found nowhere else. The operator turned out to be a different one — and that was confirmed independently, through the public site of the platform's owner.

The rule that came out of it

Shared tools do not prove shared ownership. That sentence went into attribution-rules.md together with an explicit list of signals that prove nothing while looking convincing:

  • anycast addresses of a popular CDN — a shared pool across every customer on the tier
  • the most popular registrar and its default privacy provider — that's popularity, not a relationship
  • a third-party redirect service mid-chain — independent SaaS used by dozens of unrelated operators
  • a boilerplate landing template and the standard cookie set of a popular framework

The resulting algorithm is short: find the first hop carrying a unique signature, identify the platform from it, confirm with a second independent signal — and only then name an operator. Overlap in shared infrastructure enters the write-up as supporting evidence, never as the primary claim.

What's left after three analyses

A repository with the playbook, two reusable scripts and two reference documents that grow with each new chain. Plus a delivery checklist — the fields that must be filled before a conclusion counts as finished: who the operator is, where it's publicly corroborated, what the stack is, and exactly what proves the attribution. The checklist exists for the same reason the rules do: so the analyst's confidence never substitutes for evidence.

The overall takeaway, details aside: a methodology that catches its own errors is worth more than one that is always certain. The document now answers not only "how to find out", but also "when you don't know yet".

05 · Where it fits

Where else the same methodology applies

This case isn't about ad links. It's the generic task of "reconstruct who stands behind an infrastructure from one public identifier — and don't get the conclusion wrong". It comes up far more often than you'd expect:

  • Counterparty checks before a deal — domain age, the real infrastructure owner, related properties under the same certificate, history in the web archive
  • Technical competitor research — what the site is built on, which analytics and third-party services are wired in, what lived on the domain a year ago
  • Clones and phishing against your brand — a network of lookalike domains usually gives itself away through a shared certificate and shared infrastructure
  • Due diligence before buying a domain or a project — what used to be hosted there and what it's tied to through certificate history
  • Auditing your own perimeter — the same reconnaissance pointed inward: which of your subdomains and internal names are visible from outside for free
What's reused on subsequent projects
  • The one-shot recon script: a domain in, a folder of per-step artifacts out
  • The isolated live-click script — the risky request never leaves as part of routine collection
  • A "signal → platform" reference that grows with every new analysis
  • Attribution rules: an explicit split between signals that prove and signals that don't
  • A delivery checklist — mandatory output fields, so the result doesn't stay in the analyst's head
Similar challenge?

If the question is "who is behind this" — the answer is usually already public

Most of the answer sits in free sources — it just has to be collected in the right order and read correctly. One chain takes 30-60 minutes; the methodology, the scripts and the references stay with you and keep working without me.

Ready to start?

The 5,000 ₽ audit — with a concrete report and quote

I'll tell you what to deploy in your business first, what the payback looks like, and whether you need AI for the task at all (sometimes you don't).

Or just send your question — I reply within 2 hours