↳ GitHub sourceAnalytics ruleHigh

Datazag - impersonation domain resolved in DNS

Description

Matches active Datazag impersonation indicators against DNS activity normalized by the ASIM Dns schema, so the rule works across any normalized DNS source without modification. A match means a host inside the estate resolved a domain Datazag scored as brand impersonation, platform impersonation or attacker infrastructure. Requires the ASIM DNS parsers.
Rule type
Scheduled
Version
1.0.0
Declared status
Available
Query frequency
1h
Query period
14d
Trigger
gt 0

Declared MITRE coverage

Declared sources

Metadata from the source file. No dependencies inferred from KQL.

Connectors

Data types

KQL query

Original query, unchanged.

let datazag_identity = "identity--55a5a448-c6f1-5128-bc71-4d85b719131e";
let ioc_lookback = 14d;
let dns_lookback = 1h;
let confidence_floor = 85;
let DatazagDomains =
    ThreatIntelIndicators
    | where TimeGenerated >= ago(ioc_lookback)
    | where tostring(Data.created_by_ref) == datazag_identity
    | where ObservableKey == "domain-name:value"
    | where isnotempty(ObservableValue)
    | summarize arg_max(TimeGenerated, *) by Id
    | where IsDeleted == false
    | where tostring(Data.revoked) != "true"
    | where isempty(ValidUntil) or ValidUntil > now()
    | where Confidence >= confidence_floor
    | extend IndicatorDomain = tolower(trim_end(@"\.", ObservableValue))
    | project
        IndicatorDomain,
        IndicatorStixId     = tostring(Data.id),
        IndicatorRecordId   = Id,
        DatazagAlertRef     = tostring(Data.external_references[0].external_id),
        Confidence,
        IndicatorEvidence   = tostring(Data.labels),
        IndicatorValidUntil = ValidUntil;
let DnsActivity =
    _Im_Dns
    | where TimeGenerated >= ago(dns_lookback)
    | where isnotempty(DnsQuery)
    | extend IndicatorDomain = tolower(trim_end(@"\.", DnsQuery))
    | project
        DnsTime         = TimeGenerated,
        IndicatorDomain,
        DnsQuery,
        SrcIpAddr       = column_ifexists("SrcIpAddr", ""),
        SrcHostname     = column_ifexists("SrcHostname", ""),
        SrcUsername     = column_ifexists("SrcUsername", ""),
        SrcUsernameType = column_ifexists("SrcUsernameType", ""),
        EventVendor     = column_ifexists("EventVendor", ""),
        EventProduct    = column_ifexists("EventProduct", "");
DatazagDomains
| join kind=innerunique DnsActivity on IndicatorDomain
| summarize
    FirstSeen   = min(DnsTime),
    LastSeen    = max(DnsTime),
    QueryCount  = count(),
    SourceIps   = make_set(SrcIpAddr, 50),
    SourceHosts = make_set(SrcHostname, 50),
    Upns        = make_set_if(SrcUsername, SrcUsernameType == "UPN", 50),
    SeenBy      = make_set(strcat(EventVendor, " ", EventProduct), 10)
    by
    IndicatorDomain, IndicatorStixId, IndicatorRecordId, DatazagAlertRef,
    Confidence, IndicatorEvidence, IndicatorValidUntil
| extend
    SourceIp   = tostring(SourceIps[0]),
    SourceHost = tostring(SourceHosts[0]),
    AccountUpn = tostring(Upns[0])
| order by LastSeen desc

Declared entities

DNSIPHostAccount

Related content

Links established from declared identifiers and solution manifests.

Source provenance

GitHub

Displayed values come from files in Azure/Azure-Sentinel. They describe the published template, not your workspace configuration.

Source identifier
8f3c1a4e-6b52-4d19-9c07-2a5e8d0f7b41
Additional source files 2Solutions/Datazag/Analytic Rules/DatazagDomainIndicatorMatch_DNS.yamlsource ↗Solutions/Datazag/Data/Solution_Datazag.jsonsolution-membership ↗
GSTEP / CATALOG TRACKING

Added to catalog : 16 Sept 2026 · 05:49 UTC
Last change observed : 16 Sept 2026 · 05:49 UTC

GSTEP sync dates, separate from the source content’s publication dates.