Generating Threat Intel Reports
Markdown--- name: generating-threat-intel-reports description: Generates daily HTML cyber threat intelligence and exposure reports by correlating Cloudflare MCP threat data (APT infrastructure, IOCs, DDoS, campaigns) with optional F5 BIG-IP perimeter logs and Cortex XSIAM xdr_data telemetry. Use when asked to produce a daily threat briefing, prioritize IOCs for blocking, assess whether global threats reached the organization's perimeter/endpoints, detect webshells, or export indicators for XSIAM/Sigma/Suricata ingestion. --- # Generating Threat Intel Reports
Minimal viable pipeline (Cloudflare-only), extendable with F5/XSIAM later:
Bashpython 01_collect_cloudflare.py --since 24h --out data/cloudflare.json python 04_correlate.py --cloudflare data/cloudflare.json --out data/correlated.json python 05_generate_html.py --in data/correlated.json --out reports/daily-threat-report-$(date +%F).html python 06_export_iocs.py --in data/correlated.json --out-dir exports/
Open reports/daily-threat-report-<date>.html in a browser. If F5/XSIAM sources are unavailable, the report degrades gracefully — sections that need them show "Data source not connected" instead of failing.
Progress checklist for building/running the skill end-to-end:
- Step 1: Collect Cloudflare MCP data (threat events, IOCs, DDoS, campaigns, IP/URL/ASN reputation, Radar)
- Step 2: (Optional) Collect F5 BIG-IP perimeter logs (requests, WAF, JA3/JA4, HTTP status codes)
- Step 3: (Optional) Query XSIAM
xdr_datafor endpoint/identity/network corroboration - Step 4: Correlate across sources, dedupe IOCs, compute scores
- Step 5: Generate HTML dashboard
- Step 6: Export IOC feeds (CSV, Sigma, Suricata, YARA, XSIAM JSON)
- Step 7: Deliver report (email/Slack/Teams) and archive
Step 1 — Collect Cloudflare data
Query via MCP tools for the last 24h:
- Threat events (with MITRE TTP mappings, regions, verticals)
- Top source IPs, ASNs, JA3/JA4 fingerprints, domains, URLs, SHA hashes
- IP/domain/URL reputation lookups for all observed indicators
- Active threat actor campaigns (APT, cybercrime, ransomware clusters)
- DDoS activity (bps/pps, vectors, protocols, geographic source/target)
- Radar trends (compare today vs yesterday/last week/last month)
- Explicitly query for novel/first-seen events: "threat events observed in the last 24h not seen in the prior 30 days"
Persist raw results as JSON — never discard the source payload, only summarize on top of it.
Step 2 — Collect F5 (if available)
Pull HTTP/TLS logs (iControl REST, Telemetry Streaming, or exported to XSIAM):
- Request URI, method, HTTP status code, JA3/JA4, source IP, user-agent
- WAF block/allow decisions
- Flag suspicious upload patterns (
.php,.aspx,.jsp,.ashx,/upload*) and suspicious params (cmd=,exec=,system=)
Step 3 — Collect XSIAM xdr_data (if available)
For every Cloudflare IOC, check presence in:
- Endpoint telemetry (process trees — especially web server → shell → PowerShell/bash chains)
- Identity/VPN/SSO logs (auth events, impossible travel, risk users)
- DNS/proxy/firewall logs
- Alerts/incidents already opened referencing the IOC
Step 4 — Correlate
For each IOC, build a presence matrix: Cloudflare | F5 | XSIAM. Compute:
- Threat Exposure Score = f(IOCs seen at perimeter, IOCs reaching backend with 2xx, IOCs with endpoint activity)
- Active Compromise Score = f(execution, persistence, exfiltration signals)
- Webshell Probability = f(successful upload + 200 response + file creation + web-server child process + outbound connection + known IOC + matching MITRE TTP)
- Reconstruct a cross-source timeline (Cloudflare detection → F5 request → F5 verdict → backend response → XSIAM process/auth events)
Only IOCs that appear in ≥2 sources or have high native Cloudflare confidence should reach "Immediate Block" — this keeps the list actionable instead of listing thousands of global IOCs.
Step 5 — Generate HTML
Single self-contained HTML file (inline CSS/JS, Chart.js via CDN or vendored), dark theme, sortable/filterable tables (DataTables or vanilla JS), print/PDF-friendly. See Report Structure below.
Step 6 — Export IOCs
Generate in exports/:
iocs.csv,blocklist.txtsuricata.rules,sigma.yml, YARA (if hash-based webshell/malware detected)xsiam_indicators.json(ready for direct ingestion)- Suggested XQL hunting queries as a
.xqlor markdown block
Step 7 — Deliver
Send via email/Slack/Teams webhook, archive under reports/archive/YYYY-MM-DD/.
- Header — date, overall threat level (🟢/🟡/🔴), Threat Exposure Score, Active Compromise Score
- Executive Summary — 1 paragraph, LLM-written, plain language, no jargon dump
- Threat Events Overview — totals by severity, top countries, top victim industries, top attack types, timeline chart
- Top Attackers — top 20 source IPs/ASNs/countries with campaign attribution
- Reputation Deep-Dive — answers "Are any of these IPs known malicious?" per top-5 IP with botnet/APT/scanner/C2/DDoS flags and confidence
- IOC Prioritization Table — IOC | Type | Score | Seen | Sources (CF/F5/XSIAM) | Recommended Action
- Threat Actor Intelligence — per-actor cards (activity, infrastructure, targets, TTPs, MITRE IDs, expected evolution) — only include actors with actual events today
- Novel/Emerging Threats — first-seen-in-24h events with why-it-matters, detection, mitigation
- MITRE ATT&CK Coverage — tactic-by-tactic % of observed events
- DDoS Summary — largest attacks, vectors, geo heatmap, trend deltas
- Perimeter Exposure (if F5 connected) — malicious IPs that reached backend, HTTP status outcomes, top targeted URIs/apps
- Endpoint/Identity Corroboration (if XSIAM connected) — IOC-to-endpoint matches, auth anomalies, process execution chains, incident links
- Webshell Detection (if F5+XSIAM connected) — probability score, evidence chain, affected hosts
- Reconstructed Timeline — cross-source kill-chain view for any IOC with ≥2-source correlation
- Recommended Actions — prioritized (P1/P2/P3), each with reason + confidence
- Hunting & Detection Content — suggested XQL, Sigma, Suricata, YARA, WAF rules
- IOC Export Footer — links/paths to generated CSV/JSON/rule files
Example 1:
Input: Cloudflare MCP returns an IP (198.51.100.10) tagged as active C2, score 99, associated with FIN7.
Output: Row in Immediate Block table: 198.51.100.10 | IP | 99 | Today | Block. Recommended Actions P1: "Block 198.51.100.10 — Reason: Active C2 infrastructure (FIN7) — Confidence: 99%."
Example 2:
Input: Cloudflare flags IOC as high-confidence; F5 logs show same IP hit /upload.aspx with HTTP 200; XSIAM shows w3wp.exe → cmd.exe → powershell.exe 60 seconds later on the matching host.
Output: Webshell Detection section set to CRITICAL, with full timeline table (08:13 CF detection → 08:21 F5 request → 08:22 200 OK → 08:23 file created → 08:24 w3wp.exe spawns powershell.exe), MITRE T1505.003 + T1190 + T1059 tagged, and Recommended Actions: isolate host, hunt SHA256 org-wide, block IP/domain, patch exploited CVE.
Example 3: Input: No F5/XSIAM MCP configured, only Cloudflare. Output: Report generates normally through section 10 (DDoS Summary); sections 11–14 render a placeholder: "Perimeter/endpoint correlation unavailable — connect F5/XSIAM MCP to enable this section." Report is still fully usable as a standalone Threat Intelligence Daily Briefing.
- Always keep raw JSON from each source before summarizing — enables re-running correlation without re-querying MCP.
- Prioritize ruthlessly. Never dump 50,000 IOCs; the value is in narrowing to the handful that matter (multi-source hits, high confidence, or actually reached the perimeter).
- Write the Executive Summary last, after all data is collected, so it reflects real numbers, not a template.
- Treat HTTP status codes as signal. A malicious IP getting
200 OKis categorically more important than the same IP getting403. - Degrade gracefully. Each optional data source (F5, XSIAM) should independently enable/disable report sections — never let a missing integration break the whole report.
- Make the report self-contained. Inline all CSS/JS or vendor them locally so the HTML opens correctly even offline/air-gapped.
- Tag every finding with MITRE ATT&CK IDs when available from either Cloudflare or XSIAM — this is what makes the report usable by other analysts.
- Version and date every report (
daily-threat-report-YYYY-MM-DD.html) and keep an archive for trend comparison ("what changed vs yesterday/last week"). - Cross-reference before calling something "malicious." A single low-confidence source shouldn't drive a Block recommendation — require corroboration or a high native score (≥90).
- Don't list every raw IOC from Cloudflare without filtering — it overwhelms the SOC and buries what matters.
- Don't treat DDoS volumetric stats and targeted APT/webshell activity with the same urgency — separate sections, separate scoring.
- Don't claim compromise based on Cloudflare/F5 data alone — "reached the backend" is not the same as "confirmed compromise"; only XSIAM endpoint evidence justifies that language.
- Don't hardcode assumptions about which MCP tools exist — check available Cloudflare MCP tool names/schemas first, since they can change.
- Don't skip deduplication — the same IOC often appears across multiple Cloudflare event types and will inflate counts if not merged by indicator value.
- Don't generate export files (Sigma/Suricata/YARA) for indicators with