LANDING PAGE
BRAND IMPERSONATION
NRD
CT LOGS
DetectionBlue TeamSOCOctober 12, 2026•9 min read

Detecting Phishing Landing Pages and Credential Harvesting

Every phishing email ends at a page. Catch the page and you catch the campaign, whichever lure delivered it.

Scroll

Whatever the delivery method, a credential-harvest campaign needs a page that imitates a known brand on infrastructure the attacker has just stood up. That produces a new domain, a fresh certificate and a login form that does not belong on that host. Those properties are visible in DNS, proxy, certificate-transparency and identity data.

Signals at a Glance

SignalWhereATT&CK
Domain first seen in your DNS or proxy within days, hosting a login formDNS, proxyT1566.002
Domain registered recently and containing a brand or product stringWHOIS, passive DNST1583.001
New certificate issued for a name resembling a protected brandCertificate-transparency monitoringT1583.001
Page title or favicon matching a known brand on an unrelated hostWeb crawl, detonationT1566.002
Token issued to one IP and used from another soon after sign-inEntra ID sign-in logsT1539

First Seen, Then Judge

A newly seen domain is common; a newly seen domain visited by several users after the same email is not. Combine first-seen age with a requirement for multiple users and a credential-themed referrer or subject:

// Sentinel / Defender (KQL) - domains first seen in the last 7 days and reached by several users
let history = DeviceNetworkEvents
| where Timestamp between (ago(60d) .. ago(7d))
| extend Domain = tostring(parse_url(RemoteUrl).Host)
| where isnotempty(Domain)
| distinct Domain;
DeviceNetworkEvents
| where Timestamp > ago(7d)
| where InitiatingProcessFileName in~ ("msedge.exe","chrome.exe","firefox.exe")
| extend Domain = tostring(parse_url(RemoteUrl).Host)
| where isnotempty(Domain) and Domain !in (history)
| summarize users=dcount(InitiatingProcessAccountName), hits=count(), firstSeen=min(Timestamp) by Domain
| where users >= 3
| order by users desc
// tune/validate: pair with domain-age and reputation enrichment; new SaaS tenants produce many first-seen hosts

Brand Strings and Certificates

Attackers obtain certificates for lookalike names, and those issuances are public. Subscribe to certificate-transparency data and match your brand, product and login terms against newly issued names, using similarity rather than exact matches:

# Pseudocode for a certificate-transparency watcher (validate with your CT feed's schema)
BRANDS = ["contoso", "contoso-login", "contosobank"]
SUSPECT_WORDS = ["login", "signin", "verify", "secure", "sso", "portal", "account"]

for cert in ct_stream():
    for name in cert.all_domains:
        host = name.lower().lstrip("*.")
        if host.endswith(".contoso.com"):
            continue                       # your own domain
        brand_hit = any(similar(host, b) for b in BRANDS)   # edit distance or homoglyph fold
        word_hit  = any(w in host for w in SUSPECT_WORDS)
        if brand_hit and word_hit:
            queue_for_review(host, cert.issuer, cert.not_before)
# Output: reviewed hosts -> takedown request + proxy/DNS block + hunt for prior visits
Vetted sources

Use certificate-transparency feeds, passive DNS and domain-age data, SigmaHQ proxy and DNS rules, Elastic's identity-based rules for session anomalies and Microsoft Entra ID sign-in log guidance. Baseline your own environment — marketing campaigns and new SaaS tenants create plenty of benign new domains.

Build Detections That Fire

Mjolnir Security helps blue teams turn threat intelligence into high-fidelity detections across endpoint, network, identity and cloud telemetry.

Detection EngineeringManaged Detection & ResponseThreat HuntingIncident ResponsePurple Teaming
  • Detection Engineering We build and tune detections mapped to ATT&CK from your own telemetry.
  • Threat Hunting as a Service Hypothesis-driven hunts for the behaviours on this page.
  • 24/7 Incident Response Containment when a detection fires. Call +1 833 403 5875.
Written by: Mjolnir Threat Research (MTAC)  |  Published: October 12, 2026  |  Last reviewed: October 12, 2026