Hunt threat-intelligence indicators of compromise (IoCs) across Dynatrace logs and spans and produce a 0-100 threat-exposure score. Extracts and normalizes IoCs — IPs, Domains (hostnames included), URLs, Emails, CVEs, File hashes (md5/sha1/sha256), MITRE TTPs — from unstructured reports, advisories, advisory URLs, pasted text, or STIX, then hunts them in fetch logs and fetch spans. Trigger: hunt these IoCs, am I exposed to this threat, check these indicators in my logs and traces, threat exposure report, extract IoCs from this advisory URL, search these hashes/domains/IPs in my environment. Routes CVE-to-vulnerability, IP/Domain/URL/MITRE-to-detection legs to dt-sec-insights. Do NOT use for: querying security.events directly (vulnerabilities, detections, compliance, THREAT_REPORT — use dt-sec-insights); general log queries not tied to an IoC hunt (use dt-obs-logs); general span/trace analysis (use dt-obs-tracing); explaining DQL syntax (use dt-dql-essentials).
75
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Hunt indicators of compromise (IoCs) across Dynatrace logs and spans,
and optionally correlate CVEs and attacker-IPs/MITRE techniques through
security.events (routed to dt-sec-insights). Produces matched-observable
evidence sets and an AI threat-exposure score (0–100%).
dt-dql-essentials first — it provides DQL syntax, function
reference, and query construction patterns required by all hunt templates.matchesPhrase(content, "<ioc>") clauses before using contains to populate
matched-observable columns. Do not start unscoped log hunts with raw
iAny(contains(content, allObservables[])).matchesPhrase clauses. Split large IoC lists into smaller chunks (default 25
IoCs; 10 for long URLs/emails/hashes or after a query-length failure), run each
chunk with the same timeframe/scope, and aggregate results outside DQL. A no-match
conclusion is valid only if every chunk completes cleanly.from:now()-30m for unanchored
hunts. Use event-anchored windows (±30m) for IoCs derived from timestamped
detections/logs/events. On FETCH_EXEC_TIME_LIMIT, automatically retry at
15m then 5m (no approval needed); mark INCONCLUSIVE only if 5m also times
out. Widen on zero-match only on approval (see timeframe-gating.md).dt-sec-insights (threat-intelligence.md).hunt-logs.md).threat.observables.hosts field.
Hostname IoCs belong in the Domains array.security.events analytics (VULNERABILITY,
DETECTION_FINDING, THREAT_REPORT) are owned by dt-sec-insights; never re-author
those here. Narrow carve-out: the hunt's own IoC-scoped, summarize-first
detection/vulnerability rollups live in hunt-security-events.md (leg 3). That
file adds only the IoC filter + rollup shape and links to dt-sec-insights
for field/data-model semantics, the generic summarization recipe, and full-record
drill-down — it does not duplicate them.FETCH_EXEC_TIME_LIMIT on an unscoped hunt is INCONCLUSIVE,
not no-match. Offer scoped follow-up only if entity context exists or the user explicitly
provides one.X-Forwarded-For, Forwarded, X-Real-IP, True-Client-IP, CF-Connecting-IP,
Akamai-True-Client-IP, etc.) and structured fields (clientIP, src_ip, source.ip,
remote_addr). Deduplicate against already-hunted IPs and re-hunt derived IPs across
logs, spans, and detection actor.ips using the same window and scope. Do this
automatically — never wait for user prompting. See secondary-observable-extraction.md.content,
individual spans, per-finding rows) by default — they bloat context without adding
analytic value. Fetch full records only via each reference's documented drill-down
query when a specific record's raw context is required (e.g. secondary-observable
extraction reads log content). Summarize-first ≠ truncation: the rollup preserves every
affected entity and matched observable, so the exposure report stays complete. Bound every
collect* with maxLength:. See hunt-logs.md, hunt-spans.md, hunt-security-events.md.| IoC type | Logs | Spans (inbound + outbound) | security.events (leg 3) |
|---|---|---|---|
| IP | hunt-logs.md | hunt-spans.md | hunt-security-events.md § Detection hunt rollup |
| Domain (incl. hostname) | hunt-logs.md | hunt-spans.md | hunt-security-events.md § Detection hunt rollup |
| URL | hunt-logs.md | hunt-spans.md | hunt-security-events.md § Detection hunt rollup |
hunt-logs.md | ❌ no span field | — | |
| File hash (md5/sha1/sha256) | hunt-logs.md | ❌ no span field | — |
| CVE | — | — | hunt-security-events.md § Vulnerability hunt rollup |
| MITRE TTP | — | — | hunt-security-events.md (technique filter → dt-sec-insights detections.md) |
hunt-security-events.md owns the hunt's IoC-scoped, summarize-first rollups and
links to dt-sec-insights for field semantics and full-record drill-down.
Pull IoCs FROM a THREAT_REPORT event — route to dt-sec-insights
threat-intelligence.md§ Indicators of Compromise. THREAT_REPORT is asecurity.eventsdataset; this skill does not query it.
For any IP, Domain, or URL IoC, the hunt is INCOMPLETE until all three legs have returned a result or an explicit no-match. Execute them in order:
Logs — load hunt-logs.md, run the canonical matchesPhrase template (summarize-first).
Spans — load hunt-spans.md, run the combined inbound+outbound template (summarize-first).
Detections — load hunt-security-events.md § Detection hunt rollup:
in(ip(actor.ips), array(...)) filterlower(url.*) filter (clause owned by dt-sec-insights detections.md)Default window: from:now()-2h; widen to from:now()-24h only if zero rows returned.
For CVE IoCs, also run hunt-security-events.md § Vulnerability hunt rollup.
Rules:
exposure-scoring.md until all three legs are done.FETCH_EXEC_TIME_LIMIT on a leg = INCONCLUSIVE; record it and continue — do not skip.actor.ips undetected, as detections are the only surface where RAP and
external security tools record attacker IPs.| User says | Load this reference |
|---|---|
| Extract IoCs from an advisory URL / web page | ioc-intake.md (agent fetches the page; see intake note) |
| Extract IoCs from a pasted advisory / report / STIX text | ioc-intake.md |
| Hunt these IPs/domains/URLs/emails/hashes in logs | hunt-logs.md |
| Hunt these IPs/domains/URLs in spans/traces | hunt-spans.md |
| Hunt these IPs/domains/URLs/CVEs in detections/vulnerabilities | hunt-security-events.md |
| Score how exposed my environment is / threat exposure report | exposure-scoring.md |
| Cross-evidence correlation — do detection and CVE relate? | dt-sec-contextualization → correlation-and-coverage.md |
| Pod→node topology (detection on pod, CVE on node) | dt-sec-contextualization → correlation-and-coverage.md § Pod→Node Topology |
| Compliance enrichment on matched entities | dt-sec-insights → compliance.md § Entity Security-Tab View |
| A matched IoC — which threat reports mention it (actor/malware/campaign)? | dt-sec-contextualization → ioc-enrichment.md |
| Timeframe too short / should I widen the search window? | timeframe-gating.md |
| Secondary IPs in evidence (X-Forwarded-For, proxy headers, structured fields) | secondary-observable-extraction.md |
| CVEs from this report — am I vulnerable? | hunt-security-events.md § Vulnerability hunt rollup |
| IPs from this report — any detections? | hunt-security-events.md § Detection hunt rollup |
| Domains/URLs from this report — any detections? | hunt-security-events.md § Detection hunt rollup |
| MITRE techniques from this report — any detections? | hunt-security-events.md (→ dt-sec-insights detections.md technique filter) |
| Skill | Role |
|---|---|
dt-dql-essentials | Load first. Core DQL syntax, functions, query patterns. |
dt-sec-insights | security.events — vulnerabilities, detections, THREAT_REPORT IoC extraction. |
dt-sec-contextualization | Cross-evidence correlation, pod→node topology, per-entity enrichment, compliance enrichment on matched entities, and IoC→threat-report attribution (ioc-enrichment.md). Load after hunt legs complete. |
dt-obs-logs | Generic log exploration not tied to IoC hunting. |
dt-obs-tracing | Generic span/trace analysis not tied to IoC hunting; span field semantics. |
47528b0
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.