Threat Hunting Plan and Report Template (ATT&CK)
Plan and report for one hunt: trigger, hypothesis, ATT&CK techniques, data gaps, queries, robust baseline, findings, escalations, detections created, metrics
사용법: Use it when you run a hypothesis-driven, baseline or model-assisted hunt and need the plan and the result in one record. Fill the trigger, hypothesis and data check before running queries, and close with the outputs table. The main pitfall is reporting 'no evidence of compromise' over data with known coverage gaps.
미리보기
Threat Hunting Plan and Report: [Hunt title]
Plan and report for one threat hunt: the intelligence trigger and hypothesis, the MITRE ATT&CK techniques in scope, the data and its coverage gaps, the queries, the baseline and outlier method, the findings, escalations to incident response, the detections and other outputs the hunt created, and the hunt metrics. Supports three hunt types: hypothesis-driven, baseline (exploratory data analysis) and model-assisted. Technique references follow MITRE ATT&CK Enterprise v20 (October 2026). The hunt types and the Prepare, Execute, Act phases (with Knowledge) follow the PEAK threat hunting framework (Splunk SURGe, April 2023); they map to the TaHiTI methodology phases Initiate (Prepare), Hunt (Execute) and Finalize (Act), published for the Dutch financial sector in 2018. Both are cited by name only and the text here is original. Escalations follow NIST SP 800-61 Rev. 3 (April 2025) through the organisation's incident response plan. Replace every
[bracketed]value and every row marked Example. Worked examples use Corvid Commerce, a fictional SaaS company on AWS, hunting for misuse of long-term cloud access keys.
Document control
| Field | Value |
|---|---|
| Document ID | [HUNT-2026-014] |
| Hunt title | [Example: Enumeration with leaked long-term cloud access keys] |
| Version | [1.0] |
| Status | [Planned / In progress / Closed / Cancelled] |
| Hunt type | [Hypothesis-driven / Baseline / Model-assisted] (section 2) |
| Owner (lead hunter) | [@threat-hunter] |
| Approvers / reviewers | [@soc-lead], [@threat-intel-lead], [@data-owner] |
| Last updated | YYYY-MM-DD |
| Classification | Confidential (may contain indicators and findings) |
| Timebox | [Example: 2026-09-08 to 2026-09-19, 6 analyst-days] |
| Data window | [Example: 2026-08-15 to 2026-09-15 (30 days plus overlap)] |
| ATT&CK version mapped | Enterprise [v20] |
| Related records | [Example: INC-2026-0412, DET-CLD-007, PB-CLD-002] |
Approvals
| Role | Name | Decision | Date |
|---|---|---|---|
| SOC lead (plan approval) | [@name] | [Approved / Changes requested] | YYYY-MM-DD |
| Data owner (access to logs) | [@name] | [Decision] | YYYY-MM-DD |
| SOC lead (report acceptance) | [@name] | [Decision] | YYYY-MM-DD |
Revision history
| Version | Date | Author | Change summary |
|---|---|---|---|
| 0.1 | YYYY-MM-DD | [@name] | Plan drafted from intelligence item CTI-2026-088 |
| 0.2 | YYYY-MM-DD | [@name] | Example: Plan approved; data check Q1 complete |
| 1.0 | YYYY-MM-DD | [@name] | Example: Report completed; hunt closed with one escalation and one new detection |
Contents
- Hunt summary
- Hunt type and method
- Trigger and hypothesis
- ATT&CK techniques in scope
- Scope, data sources and coverage gaps
- Queries
- Baseline and outlier method
- Execution log
- Findings
- Escalations
- Outputs
- Metrics
- Team, rules of engagement and data handling
- Glossary and references
- Standard and licence note
1. Hunt summary
| Item | Value |
|---|---|
| Question | Example: Is anyone using a Corvid Commerce long-term access key from outside our networks to enumerate our AWS accounts? |
| Answer | Example: Yes, once. One reporting service key was used from a hosting provider address on 2026-09-14; escalated as INC-2026-0412. No other misuse found in 30 days of data for 38 of 40 accounts. |
| Hypothesis outcome | [Supported / Not supported / Inconclusive] Example: Supported |
| Confidence | [High / Medium / Low] Example: Medium, because two accounts had incomplete data (GAP-01) |
| Key outputs | Example: 1 incident, 1 new detection (DET-CLD-007), 2 data gaps raised, 1 baseline published, 3 keys removed |
| Effort | Example: 5.5 analyst-days of the 6 planned |
2. Hunt type and method
| Hunt type | Use when | Starting point | Typical output |
|---|---|---|---|
| Hypothesis-driven | You can state a specific, testable adversary behaviour in your environment | Intelligence, red team result, incident lesson, threat model | Proof or disproof of the hypothesis, detections |
| Baseline (exploratory data analysis) | You do not yet know what normal looks like for a data source or population | A data source and a population (keys, hosts, users) | A documented baseline, outliers to review, hypotheses for later hunts |
| Model-assisted | Behaviour is too varied for rules, and you can train or apply a statistical or machine learning model | Labelled or unlabelled data, a model and its validation method | Scored outliers, a reusable model, detections that call the model |
This hunt (Example): hypothesis-driven, with a baseline step (section 7) to set the outlier threshold.
Phases used in this template: the PEAK phases Prepare, Execute and Act, with Knowledge carried across all three:
Mapping to TaHiTI: Prepare corresponds to Initiate, Execute to Hunt and Act to Finalize. Check the TaHiTI publication for the activities inside each of its phases. Teams that run TaHiTI can keep their phase names; the sections of this template stay the same.
3. Trigger and hypothesis
3.1 Intelligence trigger
| Trigger ID | Source | Summary | Relevance to us |
|---|---|---|---|
| CTI-2026-088 (Example) | Public threat reports and provider security bulletins | Automated campaigns harvest cloud keys from public code and use them within hours to enumerate and launch compute | We have 120 long-term keys and use public repositories for open source work |
| INT-2026-031 (Example) | Internal secret scanning | Two historical commits with key patterns found in an old public repository | Keys may have been exposed for months |
| TM-2026-007 (Example) | Threat Model (security/threat-model) | Threat "stolen workload credential used from outside" rated high, no detection mapped | Detection gap confirmed |
3.2 Hypothesis
Example: "At least one Corvid Commerce long-term IAM user access key has been used in the last 30 days from a network we do not operate to call many different read-only APIs in a short period, consistent with enumeration after credential theft."
Observable evidence that would support it:
- Read-only API calls signed with a long-term key from an address not in the known network register.
- A higher number of distinct API names per key in a short window than the key's own history.
- The key's first use from a new network owner (autonomous system).
Evidence that would refute it: every long-term key's calls come from registered networks, or unlisted use matches documented, authorised activity.
4. ATT&CK techniques in scope
| Tactic | Technique (ATT&CK Enterprise v20) | Observable in this hunt |
|---|---|---|
| Initial Access, Persistence, Privilege Escalation, Stealth | T1078.004 Valid Accounts: Cloud Accounts | Key used from unexpected networks |
| Credential Access | T1552.001 Unsecured Credentials: Credentials In Files | Exposure source (secret scanning history) |
| Discovery | T1087.004 Account Discovery: Cloud Account | Identity listing calls |
| Discovery | T1580 Cloud Infrastructure Discovery | Compute, network and snapshot description calls |
| Discovery | T1619 Cloud Storage Object Discovery | Bucket and object listing calls |
| Discovery | T1526 Cloud Service Discovery | Calls across many services |
| Persistence, Privilege Escalation | T1098.001 Account Manipulation: Additional Cloud Credentials | Follow-on key creation (pivot query Q5) |
ATT&CK v19 split Defense Evasion into Stealth (TA0005) and Defense Impairment (TA0112); v20 keeps that split. If a pivot finds log tampering, map it to T1685.002 Disable or Modify Tools: Disable or Modify Cloud Log under Defense Impairment.
5. Scope, data sources and coverage gaps
5.1 Scope
| In scope (Example) | Out of scope (Example) |
|---|---|
| 40 AWS accounts in the Corvid Commerce organisation | Azure and Google Cloud estates (separate hunt HUNT-2026-015) |
| Long-term IAM user access keys | Temporary role sessions (covered by a later hunt) |
| Management events, all regions | Data events except for 6 sensitive buckets |
5.2 Data sources
| Source | Fields needed | Window available | Quality check (Q1) |
|---|---|---|---|
| CloudTrail organisation trail in the SIEM | Event time, event name, event source, identity type, access key ID, source address, user agent, account | 13 months | Example: Complete for 38 of 40 accounts |
| IAM credential inventory | Key ID, user, created date, last used | Current snapshot plus daily history | Complete |
| Known network register | Owned and partner ranges | Current version | Updated 2026-09-01 |
| Network owner enrichment (IP to autonomous system) | Owner name, type (hosting, residential, corporate) | Lookup at query time | Enrichment for 99% of addresses |
| Secret scanning history | Repository, commit, detection date | Since enablement | Complete |
5.3 Coverage gaps
| Gap ID | Gap | Effect on the hunt | Action | Owner |
|---|---|---|---|---|
| GAP-01 (Example) | Account corvid-legacy-analytics delivers CloudTrail to the SIEM with up to 6 hours delay and missed 3 days in August | Hunt confidence lowered to Medium | Move the account into the organisation trail; also listed in the Cloud Security Posture Review (security/cloud-security-posture-review) | [@cloud-platform-lead] |
| GAP-02 (Example) | Sandbox account has no trail in two unused regions | Activity there is invisible | Enable organisation trail for all regions; deny unused regions by policy | [@cloud-platform-lead] |
Record each gap against the Security Logging Standard
(security/security-logging-standard) so it is tracked to closure
outside the hunt.
6. Queries
| Query ID | Question it answers |
|---|---|
| Q1 | Is the data complete per account and day, and is the key ID populated? |
| Q2 | Which long-term keys made read-only calls from unlisted networks? |
| Q3 | For those keys, what is the highest number of distinct API names in any 10-minute window? |
| Q4 | What is each key's normal daily number of distinct API names (baseline)? |
| Q5 | Pivot: what else did a suspicious key do (writes, key creation, logging changes)? |
-- Q1 data completeness per account and day (Example)
SELECT recipient_account_id,
DATE(event_time) AS day,
COUNT(*) AS events,
AVG(CASE WHEN access_key_id IS NULL THEN 1.0 ELSE 0.0 END) AS null_key_ratio
FROM cloudtrail
WHERE event_time >= TIMESTAMP '2026-08-15 00:00:00'
GROUP BY recipient_account_id, DATE(event_time)
ORDER BY recipient_account_id, day;
-- Q2 long-term keys with read-only calls from unlisted networks (Example)
SELECT access_key_id, user_arn,
COUNT(*) AS events,
COUNT(DISTINCT source_ip) AS source_ips
FROM cloudtrail c
WHERE identity_type = 'IAMUser'
AND access_key_id LIKE 'AKIA%'
AND (event_name LIKE 'List%' OR event_name LIKE 'Describe%' OR event_name LIKE 'Get%')
AND NOT EXISTS (SELECT 1 FROM known_networks n WHERE cidr_contains(n.cidr, c.source_ip))
AND source_ip NOT LIKE '%.amazonaws.com'
GROUP BY access_key_id, user_arn;
-- Q3 highest distinct API names per key in 10-minute buckets (Example)
SELECT access_key_id, MAX(distinct_apis) AS max_distinct_10m
FROM (
SELECT access_key_id,
time_bucket(event_time, INTERVAL '10' MINUTE) AS bucket,
COUNT(DISTINCT event_name) AS distinct_apis
FROM q2_events
GROUP BY access_key_id, time_bucket(event_time, INTERVAL '10' MINUTE)
) t
GROUP BY access_key_id;
-- Q4 daily distinct API names per key, all networks (Example)
SELECT access_key_id, DATE(event_time) AS day,
COUNT(DISTINCT event_name) AS distinct_apis
FROM cloudtrail
WHERE identity_type = 'IAMUser' AND access_key_id LIKE 'AKIA%'
GROUP BY access_key_id, DATE(event_time);
-- Q5 pivot on one key: non-read-only activity (Example)
SELECT event_time, event_source, event_name, source_ip, error_code
FROM cloudtrail
WHERE access_key_id = 'AKIAEXAMPLE000000007'
AND NOT (event_name LIKE 'List%' OR event_name LIKE 'Describe%' OR event_name LIKE 'Get%')
ORDER BY event_time;
cidr_contains and time_bucket stand for your platform's functions;
q2_events is the row set selected by Q2 before grouping.
Fixed 10-minute buckets in Q3 can split a burst across two buckets, so they may understate the maximum. Detection DET-CLD-007 uses a sliding 10-minute window. Before turning a Q3 result into a detection threshold, confirm the maximum with a sliding window, or with 5-minute buckets summed in adjacent pairs.
7. Baseline and outlier method
Method (Example):
- For each key, compute the daily distinct API count over the window (Q4), excluding the day being scored.
- Compute the key's median and the median absolute deviation (MAD). If MAD is 0, use 1 to avoid division by zero.
- Score each day with a robust z-score:
robust_z = 0.6745 * (x - median) / MAD. - Flag days with
robust_zof 5 or more (Example: 3.5 is a common starting point in the statistics literature; it is raised here to cut review load on keys with very stable usage), and any day where the key was used from a network owner not seen for that key in the previous 30 days (novelty). - Review every flagged day manually (section 9). Record benign causes so the next hunt and the detection can use them.
Worked calculation (Example): key AKIAEXAMPLE000000007 (user
svc-reporting) has a median of 6 distinct APIs per day and a MAD of 1.
On 2026-09-14 it called 18 distinct APIs. Its score is 0.6745 multiplied
by (18 minus 6) divided by 1, which is 0.6745 multiplied by 12, or 8.09.
That is above the threshold of 5, and the source network owner (a
hosting provider) was new for this key, so the day is flagged on both
criteria.
Population results (Example):
| Measure | Value |
|---|---|
| Long-term keys in inventory | 120 |
| Keys with at least one call in the window | 87 |
| Keys with read-only calls from unlisted networks (Q2) | 23 |
| Highest distinct API count in any 10-minute window from unlisted networks, keys with no finding (21 of 23) (Q3) | 9 |
| Same measure for the two keys with findings (Q3) | 18 (F-01), 12 (F-02) |
| Key-days flagged by robust z-score or novelty | 7 |
| Flagged key-days reviewed | 7 |
For a model-assisted hunt, replace this section with the model description, features, training window, validation method, false positive estimate and the version of the model artefact.
8. Execution log
| Date | Activity | Result | Hunter |
|---|---|---|---|
| 2026-09-08 (Example) | Plan approved; Q1 data check | GAP-01 and GAP-02 found; confidence capped at Medium | [@threat-hunter] |
| 2026-09-09 (Example) | Q2 and Q3 over 30 days | 23 keys; distribution published | [@threat-hunter] |
| 2026-09-10 (Example) | Q4 baseline and scoring | 6 key-days flagged | [@threat-hunter] |
| 2026-09-11 (Example) | Review of the 6 flagged key-days | All benign: 4 from the backup tool egress change (F-02), 2 from the data team job (F-03) | [@threat-hunter] |
| 2026-09-15 (Example) | Scheduled re-run with new data; F-01 flagged on 2026-09-14 data (7th flagged key-day); Q5 pivot | Escalated to SOC at 10:42 | [@threat-hunter] |
| 2026-09-16 to 2026-09-19 (Example) | Detection drafted and tested; report written | DET-CLD-007 in Test | [@detection-engineer] |
9. Findings
| Finding ID | Summary | Classification | Evidence | Action |
|---|---|---|---|---|
| F-01 (Example) | Key of svc-reporting called 18 distinct read-only APIs in 6 minutes from 192.0.2.44 (hosting provider) on 2026-09-14; Q5 showed no write calls | Likely malicious | Q3, Q4 score 8.09, Q5 output, novelty of network owner | Escalated (ESC-01) |
| F-02 (Example) | Backup tool key reached 12 distinct APIs in 10 minutes from a new egress range after a vendor change | Benign, authorised | Change ticket for the backup tool | Range added to the network register; migration to workload identity requested |
| F-03 (Example) | Data team scheduled job started using a long-term key from a contractor network | Benign but policy violation | Team confirmation | Exception recorded; key replaced by role access within 30 days |
| F-04 (Example) | 3 long-term keys unused for more than 180 days | Hygiene | IAM inventory | Keys deactivated, then deleted after 30 days |
| F-05 (Example) | Key patterns found in an old public repository belonged to keys already deleted in 2024 | Benign (no live credential) | Secret scanning history and IAM history | Repository archived; no further action |
10. Escalations
| Escalation ID | Finding | Escalated to | Time | Playbook | Incident | Outcome |
|---|---|---|---|---|---|---|
| ESC-01 (Example) | F-01 | SOC shift lead | 2026-09-15 10:42 | PB-CLD-002, SOC Playbook (security/soc-playbook) | INC-2026-0412 | Example: SEV2 (unknown party, no privileged or data access); DP-1 applied, key deactivated 54 minutes after escalation and sessions issued before containment blocked; no data access found; exposure traced to a build log |
Escalation rules:
- Escalate when activity is likely malicious, even if unconfirmed.
Triage belongs to the SOC, under the Incident Response Plan
(
compliance/incident-response-plan) and the severity levels in the Incident Severity Matrix (ops/incident-severity-matrix). - Do not take containment actions yourself, do not contact the suspected actor and do not test the credential.
- Hand over the evidence: query text, result exports with hashes and the timeline you built.
- Pause the hunt on that thread; continue other threads only if the incident commander agrees.
11. Outputs
| Output ID | Type | Description | Owner | Status |
|---|---|---|---|---|
| OUT-01 (Example) | Detection | DET-CLD-007, discovery burst by long-term key from unlisted network, specified in Detection Rule Specification (security/detection-rule-spec) | [@detection-engineer] | In Test since 2026-09-20 |
| OUT-02 (Example) | Data gap | GAP-01 and GAP-02 raised against the logging standard | [@cloud-platform-lead] | Open |
| OUT-03 (Example) | Baseline | Daily distinct API baseline per key, refreshed monthly | [@threat-hunter] | Published |
| OUT-04 (Example) | Hygiene | 3 stale keys removed (F-04) | [@iam-lead] | Done |
| OUT-05 (Example) | Intelligence | Indicator 192.0.2.44 and behaviour summary shared with the threat intelligence team (TLP:AMBER) | [@threat-intel-lead] | Done |
| OUT-06 (Example) | Next hypothesis | Same behaviour with temporary role sessions (HUNT-2026-016) | [@threat-hunter] | Planned |
| OUT-07 (Example) | Playbook change | Hunt escalation path added to PB-CLD-002 triggers (TRG-07) | [@soc-lead] | Done |
12. Metrics
| Metric | Formula | This hunt (Example) | Programme target (Example) |
|---|---|---|---|
| Hunts completed per quarter | Hunts closed in the quarter | 1 of 4 in Q3 | 4 |
| Detections created | Detections reaching Test from hunts | 1 | At least 1 per 2 hunts |
| Escalation rate | Hunts with at least one escalation divided by hunts closed | 1 of 1 | No target (informational) |
| Data gaps found and closed | Gaps closed within 90 days divided by gaps found | 0 of 2 so far | 80% |
| Technique coverage added | ATT&CK techniques with a new Stable detection after the hunt | 4 (T1087.004, T1580, T1619, T1526) once DET-CLD-007 is Stable | Tracked in the coverage map |
| Effort accuracy | Actual analyst-days divided by planned analyst-days | 5.5 / 6 = 0.92 | 0.8 to 1.2 |
| Hunt dwell-time contribution | Escalation time minus earliest malicious event time | 2026-09-15 10:42 minus 2026-09-14 02:11, about 32.5 hours | Trend down |
13. Team, rules of engagement and data handling
| Role | Name | Responsibility |
|---|---|---|
| Lead hunter | [@threat-hunter] | Plan, execution, report |
| Threat intelligence analyst | [@threat-intel-analyst] | Trigger, context, sharing of outputs |
| Data owner | [@cloud-platform-lead] | Log access, explanation of normal behaviour |
| Detection engineer | [@detection-engineer] | Turning findings into detections |
| SOC lead | [@soc-lead] | Approves the plan, receives escalations, accepts the report |
Rules of engagement (Example):
- Read-only access to logs and inventories; no changes to production.
- Queries that touch personal data (user names, addresses) are limited to what the hypothesis needs; results are stored in the case system, not on laptops or in chat.
- Monitoring of identifiable employee behaviour follows the privacy notice and legal approval [reference]; this is a documentation format, not legal advice.
- Hunt evidence is retained according to the Incident Response Plan if escalated, otherwise for [Example: 12 months].
14. Glossary and references
| Term | Meaning |
|---|---|
| Threat hunt | A proactive, human-led search for adversary activity that existing detections missed |
| Hypothesis | A testable statement about adversary behaviour in this environment |
| Baseline | A documented description of normal behaviour for a population and data source |
| Robust z-score | Distance from the median measured in median absolute deviations, scaled by 0.6745 |
| Median absolute deviation (MAD) | The median of the absolute differences between each value and the median |
| Coverage gap | Missing or unreliable data that prevents a technique from being observed |
| Escalation | Hand-off of a likely malicious finding to the SOC for incident response |
| Reference | Use |
|---|---|
| MITRE ATT&CK Enterprise v20, 13 October 2026, attack.mitre.org | Techniques (section 4) |
| D. Bianco, Introducing the PEAK Threat Hunting Framework, Splunk SURGe blog, 18 April 2023, splunk.com | Hunt types (hypothesis-driven, baseline, model-assisted) and phases Prepare, Execute, Act with Knowledge; cited only |
| TaHiTI: Threat Hunting Methodology, Dutch Payments Association (Betaalvereniging Nederland) and Dutch financial sector, 2018, betaalvereniging.nl | Phases Initiate, Hunt and Finalize, mapped in section 2; cited only |
| NIST SP 800-61 Rev. 3, April 2025, csrc.nist.gov/pubs/sp/800/61/r3/final | Escalation into incident response |
SOC Playbook (security/soc-playbook) | Response to escalated findings |
Detection Rule Specification (security/detection-rule-spec) | Detections created from hunts |
Security Logging Standard (security/security-logging-standard) | Data sources and gap tracking |
Threat Model (security/threat-model) and Attack Tree (security/attack-tree) | Sources of hypotheses |
Cloud Security Posture Review (security/cloud-security-posture-review) | Account onboarding gaps |
Incident Response Plan (compliance/incident-response-plan) | Escalation authority and evidence retention |
Standard and licence note
Structure aligned with common threat hunting practice. The hunt types and the Prepare, Execute, Act phases follow the PEAK threat hunting framework published by Splunk SURGe (April 2023), and section 2 maps them to the Initiate, Hunt and Finalize phases of the TaHiTI methodology published for the Dutch financial sector (2018); both are cited by name only, and no text, figures or templates from them are reproduced. Escalation follows NIST SP 800-61 Rev. 3 (April 2025), a work of the United States Government not subject to copyright in the United States. MITRE ATT&CK technique and tactic names and IDs are used under the ATT&CK terms of use: The MITRE Corporation (MITRE) hereby grants you a non-exclusive, royalty-free license to use ATT&CK® for research, development, and commercial purposes. Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. "© 2026 The MITRE Corporation. This work is reproduced and distributed with the permission of The MITRE Corporation." MITRE ATT&CK and ATT&CK are registered trademarks of The MITRE Corporation. Splunk, AWS and other product names are trademarks of their owners; this template is not affiliated with or endorsed by them. Check the current official versions at attack.mitre.org and nist.gov before use. Original text written for this collection. Template licence: MIT.
관련 템플릿
Privacy Threat Model Template (LINDDUN)
Privacy threat model by LINDDUN category: DFD with trust boundaries, data inventory, elicitation matrix, register, PETs, DPIA link
보안 엔지니어링Threat Model Template (STRIDE)
STRIDE threat model: scope, DFD with trust boundaries, assets, threats per element, L x I rating, mitigations, risk acceptance
보안 엔지니어링Attack Tree Analysis Template
Attack tree for one attacker goal: AND/OR tree as list and Mermaid, leaf cost/skill/likelihood, path analysis, countermeasures