Investigation Macros
8 pre-built macros for infrastructure investigation.
Investigation Macros Documentation
Pre-built SPL macros for common investigations against the Whisper Knowledge Graph. They all use whisperquery with parameterized Cypher under the hood.
Usage
Call a macro with backtick syntax:
| `whisper_shared_nameservers("example.com")`
Available macros
whisper_shared_nameservers(domain)
Find all domains sharing nameservers with the given domain. Good for spotting related infrastructure or attacker-controlled domain clusters.
| `whisper_shared_nameservers("phishing-target.com")`
Output fields: nameserver, related_domain
During IR, use this to find other domains on the same nameserver as a phishing domain. Shared nameservers often mean common ownership or compromised hosting.
whisper_asn_infrastructure(asn)
List all prefixes routed by an ASN.
| `whisper_asn_infrastructure("AS13335")`
Output fields: asn, prefix
Handy for scoping a bulletproof hosting provider or mapping out a threat actor's ASN.
whisper_cname_chain(domain)
Resolve the full CNAME alias chain for a domain, up to 5 hops deep.
| `whisper_cname_chain("www.example.com")`
Output fields: cname_chain, cname_target, depth
Good for detecting dangling CNAMEs (subdomain takeover risk) and understanding delegation patterns.
whisper_spf_chain(domain)
Trace the SPF include mechanism chain for a domain. Checks for RFC 7208 compliance (maximum 10 DNS lookups).
| `whisper_spf_chain("example.com")`
Output fields: spf_chain, depth
Use this to audit email auth compliance and catch SPF configs that are about to hit the 10-lookup limit.
whisper_bgp_peers(asn)
List BGP peers of an ASN with peer names and country information.
| `whisper_bgp_peers("AS13335")`
Output fields: peer_asn, peer_name, country
Helps you see the transit relationships of a network and spot unusual peering arrangements.
whisper_cohosted_domains(domain)
Find domains co-hosted on the same IP address as the given domain.
| `whisper_cohosted_domains("suspicious-site.com")`
Output fields: ip, cohosted_domain
Look for other potentially malicious domains on the same IP. Low co-hosting density (dedicated IPs) is a common sign of attacker-controlled infrastructure.
whisper_full_investigation(indicator)
Full infrastructure investigation: hostname to IP to ASN with geo context and co-hosting count.
| `whisper_full_investigation("malware-c2.evil.com")`
Output fields: hostname, ip, prefix, asn, asn_name, country, cohost_count
One-command infrastructure overview during triage. Combines domain resolution, ASN lookup, geolocation, and co-hosting analysis.
whisper_explain(indicator)
Get a threat assessment for an indicator via the Whisper explain API.
| `whisper_explain("8.8.8.8")`
Output fields: Results from the explain() stored procedure, including threat score, level, explanation, and contributing factors.
Quick threat check on a single indicator without running the full enrichment pipeline.
Correlation search threshold macros
These macros control the sensitivity of correlation searches. Override them in Settings > Advanced Search > Search Macros:
| Macro | Default | Description |
|---|---|---|
whisper_cname_depth_threshold | 3 | Max CNAME chain depth before alerting |
whisper_newly_observed_domain_age_hours | 24 | Hours to consider a domain newly observed |
whisper_fast_flux_ip_threshold | 5 | Min distinct IPs for fast-flux detection |
whisper_low_cohosting_max | 3 | Max co-hosting count for low-density anomaly |
whisper_multi_feed_threshold | 2 | Min threat feeds for multi-feed detection |
whisper_newly_registered_domain_days | 30 | Max domain age (days) for new domain detection |
whisper_tor_risk_score | 55 | Risk score for TOR exit node communication |
whisper_bulletproof_risk_score | 60 | Risk score for bulletproof ASN communication |
whisper_bgp_conflict_risk_score | 75 | Risk score for BGP prefix conflicts |
Combining macros with SPL
Macros return tabular results, so you can pipe them into any SPL command:
Filter shared nameserver results by country:
| `whisper_shared_nameservers("target.com")`
| lookup whisper_domain_intel domain AS related_domain
| where isnotnull(threat_key)
Investigate suspicious ASNs from enriched events:
index=firewall sourcetype=pan:traffic
| whisperlookup field=dest_ip
| where whisper_cohost_count < 5
| dedup whisper_asn
| map search="| `whisper_asn_infrastructure(\"$$whisper_asn$$\")`"
Export CNAME chains to a lookup:
| `whisper_cname_chain("example.com")`
| outputlookup whisper_cname_results.csv