Markdown Editor

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

Kỹ thuật bảo mậtĐầy đủMITRE ATT&CK v20; PEAK and TaHiTI (names only); NIST SP 800-61 Rev. 3threathuntingplan
Mở trong editorTải .md

Cách dùng: 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.

Xem trước

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

FieldValue
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 updatedYYYY-MM-DD
ClassificationConfidential (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 mappedEnterprise [v20]
Related records[Example: INC-2026-0412, DET-CLD-007, PB-CLD-002]

Approvals

RoleNameDecisionDate
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

VersionDateAuthorChange summary
0.1YYYY-MM-DD[@name]Plan drafted from intelligence item CTI-2026-088
0.2YYYY-MM-DD[@name]Example: Plan approved; data check Q1 complete
1.0YYYY-MM-DD[@name]Example: Report completed; hunt closed with one escalation and one new detection

Contents

1. Hunt summary

ItemValue
QuestionExample: Is anyone using a Corvid Commerce long-term access key from outside our networks to enumerate our AWS accounts?
AnswerExample: 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 outputsExample: 1 incident, 1 new detection (DET-CLD-007), 2 data gaps raised, 1 baseline published, 3 keys removed
EffortExample: 5.5 analyst-days of the 6 planned

2. Hunt type and method

Hunt typeUse whenStarting pointTypical output
Hypothesis-drivenYou can state a specific, testable adversary behaviour in your environmentIntelligence, red team result, incident lesson, threat modelProof or disproof of the hypothesis, detections
Baseline (exploratory data analysis)You do not yet know what normal looks like for a data source or populationA data source and a population (keys, hosts, users)A documented baseline, outliers to review, hypotheses for later hunts
Model-assistedBehaviour is too varied for rules, and you can train or apply a statistical or machine learning modelLabelled or unlabelled data, a model and its validation methodScored 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 IDSourceSummaryRelevance to us
CTI-2026-088 (Example)Public threat reports and provider security bulletinsAutomated campaigns harvest cloud keys from public code and use them within hours to enumerate and launch computeWe have 120 long-term keys and use public repositories for open source work
INT-2026-031 (Example)Internal secret scanningTwo historical commits with key patterns found in an old public repositoryKeys 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 mappedDetection 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

TacticTechnique (ATT&CK Enterprise v20)Observable in this hunt
Initial Access, Persistence, Privilege Escalation, StealthT1078.004 Valid Accounts: Cloud AccountsKey used from unexpected networks
Credential AccessT1552.001 Unsecured Credentials: Credentials In FilesExposure source (secret scanning history)
DiscoveryT1087.004 Account Discovery: Cloud AccountIdentity listing calls
DiscoveryT1580 Cloud Infrastructure DiscoveryCompute, network and snapshot description calls
DiscoveryT1619 Cloud Storage Object DiscoveryBucket and object listing calls
DiscoveryT1526 Cloud Service DiscoveryCalls across many services
Persistence, Privilege EscalationT1098.001 Account Manipulation: Additional Cloud CredentialsFollow-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 organisationAzure and Google Cloud estates (separate hunt HUNT-2026-015)
Long-term IAM user access keysTemporary role sessions (covered by a later hunt)
Management events, all regionsData events except for 6 sensitive buckets

5.2 Data sources

SourceFields neededWindow availableQuality check (Q1)
CloudTrail organisation trail in the SIEMEvent time, event name, event source, identity type, access key ID, source address, user agent, account13 monthsExample: Complete for 38 of 40 accounts
IAM credential inventoryKey ID, user, created date, last usedCurrent snapshot plus daily historyComplete
Known network registerOwned and partner rangesCurrent versionUpdated 2026-09-01
Network owner enrichment (IP to autonomous system)Owner name, type (hosting, residential, corporate)Lookup at query timeEnrichment for 99% of addresses
Secret scanning historyRepository, commit, detection dateSince enablementComplete

5.3 Coverage gaps

Gap IDGapEffect on the huntActionOwner
GAP-01 (Example)Account corvid-legacy-analytics delivers CloudTrail to the SIEM with up to 6 hours delay and missed 3 days in AugustHunt confidence lowered to MediumMove 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 regionsActivity there is invisibleEnable 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 IDQuestion it answers
Q1Is the data complete per account and day, and is the key ID populated?
Q2Which long-term keys made read-only calls from unlisted networks?
Q3For those keys, what is the highest number of distinct API names in any 10-minute window?
Q4What is each key's normal daily number of distinct API names (baseline)?
Q5Pivot: 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):

  1. For each key, compute the daily distinct API count over the window (Q4), excluding the day being scored.
  2. Compute the key's median and the median absolute deviation (MAD). If MAD is 0, use 1 to avoid division by zero.
  3. Score each day with a robust z-score: robust_z = 0.6745 * (x - median) / MAD.
  4. Flag days with robust_z of 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).
  5. 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):

MeasureValue
Long-term keys in inventory120
Keys with at least one call in the window87
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 novelty7
Flagged key-days reviewed7

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

DateActivityResultHunter
2026-09-08 (Example)Plan approved; Q1 data checkGAP-01 and GAP-02 found; confidence capped at Medium[@threat-hunter]
2026-09-09 (Example)Q2 and Q3 over 30 days23 keys; distribution published[@threat-hunter]
2026-09-10 (Example)Q4 baseline and scoring6 key-days flagged[@threat-hunter]
2026-09-11 (Example)Review of the 6 flagged key-daysAll 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 pivotEscalated to SOC at 10:42[@threat-hunter]
2026-09-16 to 2026-09-19 (Example)Detection drafted and tested; report writtenDET-CLD-007 in Test[@detection-engineer]

9. Findings

Finding IDSummaryClassificationEvidenceAction
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 callsLikely maliciousQ3, Q4 score 8.09, Q5 output, novelty of network ownerEscalated (ESC-01)
F-02 (Example)Backup tool key reached 12 distinct APIs in 10 minutes from a new egress range after a vendor changeBenign, authorisedChange ticket for the backup toolRange 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 networkBenign but policy violationTeam confirmationException recorded; key replaced by role access within 30 days
F-04 (Example)3 long-term keys unused for more than 180 daysHygieneIAM inventoryKeys deactivated, then deleted after 30 days
F-05 (Example)Key patterns found in an old public repository belonged to keys already deleted in 2024Benign (no live credential)Secret scanning history and IAM historyRepository archived; no further action

10. Escalations

Escalation IDFindingEscalated toTimePlaybookIncidentOutcome
ESC-01 (Example)F-01SOC shift lead2026-09-15 10:42PB-CLD-002, SOC Playbook (security/soc-playbook)INC-2026-0412Example: 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:

  1. 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).
  2. Do not take containment actions yourself, do not contact the suspected actor and do not test the credential.
  3. Hand over the evidence: query text, result exports with hashes and the timeline you built.
  4. Pause the hunt on that thread; continue other threads only if the incident commander agrees.

11. Outputs

Output IDTypeDescriptionOwnerStatus
OUT-01 (Example)DetectionDET-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 gapGAP-01 and GAP-02 raised against the logging standard[@cloud-platform-lead]Open
OUT-03 (Example)BaselineDaily distinct API baseline per key, refreshed monthly[@threat-hunter]Published
OUT-04 (Example)Hygiene3 stale keys removed (F-04)[@iam-lead]Done
OUT-05 (Example)IntelligenceIndicator 192.0.2.44 and behaviour summary shared with the threat intelligence team (TLP:AMBER)[@threat-intel-lead]Done
OUT-06 (Example)Next hypothesisSame behaviour with temporary role sessions (HUNT-2026-016)[@threat-hunter]Planned
OUT-07 (Example)Playbook changeHunt escalation path added to PB-CLD-002 triggers (TRG-07)[@soc-lead]Done

12. Metrics

MetricFormulaThis hunt (Example)Programme target (Example)
Hunts completed per quarterHunts closed in the quarter1 of 4 in Q34
Detections createdDetections reaching Test from hunts1At least 1 per 2 hunts
Escalation rateHunts with at least one escalation divided by hunts closed1 of 1No target (informational)
Data gaps found and closedGaps closed within 90 days divided by gaps found0 of 2 so far80%
Technique coverage addedATT&CK techniques with a new Stable detection after the hunt4 (T1087.004, T1580, T1619, T1526) once DET-CLD-007 is StableTracked in the coverage map
Effort accuracyActual analyst-days divided by planned analyst-days5.5 / 6 = 0.920.8 to 1.2
Hunt dwell-time contributionEscalation time minus earliest malicious event time2026-09-15 10:42 minus 2026-09-14 02:11, about 32.5 hoursTrend down

13. Team, rules of engagement and data handling

RoleNameResponsibility
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

TermMeaning
Threat huntA proactive, human-led search for adversary activity that existing detections missed
HypothesisA testable statement about adversary behaviour in this environment
BaselineA documented description of normal behaviour for a population and data source
Robust z-scoreDistance 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 gapMissing or unreliable data that prevents a technique from being observed
EscalationHand-off of a likely malicious finding to the SOC for incident response
ReferenceUse
MITRE ATT&CK Enterprise v20, 13 October 2026, attack.mitre.orgTechniques (section 4)
D. Bianco, Introducing the PEAK Threat Hunting Framework, Splunk SURGe blog, 18 April 2023, splunk.comHunt 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.nlPhases 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/finalEscalation 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.

Template liên quan