In this section

TR0.9 The Triage Report Template

3-4 hours · Module 0 · Free
What you already know

Section 0.8 gave you the 8-question scorecard that produces a defensible classification for any alert within 15 minutes. The scorecard produces a number, a classification, and documented reasoning. You learn how to capture that output — along with the scope, evidence, containment record, and next steps — into the structured document the investigation team needs to start working immediately.

Scenario

Priya finishes triage on the SSH brute-force alert at 15:27 UTC. She contained the attacker, classified the alert as a confirmed true positive, and documented five findings. The investigation team is standing by. She sends a Slack message: "TP confirmed on SRV-NGE-BRS-DB01 — SSH brute force, attacker contained, see Sentinel for details." The investigation lead opens Sentinel, finds 47 alerts on that server, and spends 40 minutes reconstructing which alerts are relevant, what containment was performed, and where the evidence is stored. The triage was excellent. The handoff was not. Every minute the investigation team spends re-deriving scope is a minute they're not spending on analysis — and the GDPR Article 33 clock has been running since 15:12.

The handoff problem

The triage report is the handoff artifact. Its purpose is to transfer everything the triage analyst learned — classification, scope, evidence, containment actions, outstanding questions — into a structured document the investigation team can act on without re-deriving any of it. A good triage report saves the investigation team 30–60 minutes. A missing or unstructured report forces them to repeat work that was already done.

The cost of a poor handoff compounds. The investigation team spends 40 minutes reconstructing scope. During that time, the attacker may still be operating in areas the triage analyst contained but the investigation team doesn't know about. Regulatory clocks keep running. The CISO is waiting for an executive summary that nobody can produce because the scope hasn't been formally documented. Each gap in the handoff creates downstream delays that multiply through the incident lifecycle.

The report is also the first legal document in the incident record. It establishes the moment of awareness (when GDPR, NIS2, and DORA notification clocks start), the initial scope assessment used for executive briefing and regulatory notification, the evidence chain where chain of custody begins, and the containment record demonstrating due diligence. A Slack message satisfies none of these requirements. It isn't timestamped reliably, isn't structured for regulatory review, and can be edited or deleted after the fact.

TRIAGE REPORT — FROM CLASSIFICATION TO HANDOFF IN 15 MINUTES 1. CLASSIFICATION TP / BTP / FP + justification 2. SCOPE Blast radius + environments 3. FINDINGS IF-numbered evidence 4. CONTAINMENT Actions taken + verification 5. NEXT STEPS Investigation recommendations

Writing the report during triage, not after

The critical discipline is concurrent documentation. Each section should be populated as the triage progresses, not reconstructed from memory afterward. Classification goes in at minute 3 when the TP/FP decision is made. Scope goes in at minute 8 when the cross-environment check completes. Findings accumulate throughout as each indicator is confirmed. Containment is documented action-by-action as each command executes. When containment verification passes, the analyst adds Section 5 recommendations and the report is complete. No separate documentation phase needed.

This is why the template exists — it makes concurrent documentation possible. Without a template, analysts either write the report after triage (which means reconstructing from memory and losing details) or don't write it at all (which means the investigation team starts from scratch). The template converts documentation from a separate task into a natural part of the triage workflow.

Analysts who say "I don't have time to document during triage" are describing a process problem, not a time problem. If documentation happens after triage, the analyst must reconstruct the sequence from memory — which commands were run in which order, which timestamps correspond to which actions, which findings were confirmed versus suspected. Memory is unreliable under pressure. Details are lost.

The triage report written afterward is less accurate than the one written in real time, and it takes longer to produce because reconstruction is harder than recording.

Automating Section 2 with PowerShell

For teams that maintain an asset inventory, Section 2 (Scope) can be partially automated. The following script pulls the compromised user's group memberships, assigned applications, and data access to pre-populate the scope section:

PowerShell — Scope Pre-Population via Graph
# Pre-populate triage report Section 2 — Scope
$CompromisedUser = "j.morrison@northgate-eng.com"
# What groups does this user belong to?
$Groups = Get-MgUserMemberOf -UserId $CompromisedUser |
    Select-Object -ExpandProperty AdditionalProperties |
    Where-Object { $_.'@odata.type' -eq '#microsoft.graph.group' }
# What apps can this user access?
$Apps = Get-MgUserAppRoleAssignment -UserId $CompromisedUser |
    Select-Object ResourceDisplayName, AppRoleId
# Output for Section 2
Write-Host "--- SECTION 2: SCOPE (auto-populated) ---"
Write-Host "Groups: $($Groups.Count) memberships"
$Groups | ForEach-Object { Write-Host "  - $($_.displayName)" }
Write-Host "Applications: $($Apps.Count) assigned"
$Apps | ForEach-Object { Write-Host "  - $($_.ResourceDisplayName)" }

The output tells you what the compromised identity can reach — group memberships reveal lateral movement potential, and application assignments reveal data exposure. This doesn't replace the analyst's scope assessment, but it eliminates the manual lookup step that consumes 5–10 minutes of triage time on identity-based incidents.

The worked example

The CHAIN-HARVEST SSH brute-force from Section 0.4 produces the following triage report. This is the complete document that Rachel's investigation team receives:

Worked Example — CHAIN-HARVEST Triage Report

TRIAGE REPORT — INC-NE-2026-0406-001

Alert: SSH brute force detected | Source: Sentinel Analytics Rule | Alert Time: 2026-04-06 15:10 UTC

Triage: 15:12–15:27 UTC (15 min) | Analyst: Priya Sharma, L1 SOC

SECTION 1 — CLASSIFICATION

CONFIRMED TRUE POSITIVE — Cross-environment compromise. SSH brute force from 203.0.113.55 succeeded at 03:01:44 for the admin account. Post-auth: payload download, C2 beacon to 45.155.205.99:443, backdoor account, 4 persistence mechanisms. Cross-env correlation confirms lateral movement from DESKTOP-NGE042 (CHAIN-DRIFT). Scorecard: 16/20.

SECTION 2 — SCOPE

Systems: SRV-NGE-BRS-DB01 (Linux DB), DESKTOP-NGE042 (Windows endpoint). Accounts: svc-dbadmin, admin (local), backdoor (attacker-created). Environments: Linux + Windows + Cloud (cross-environment). Data at risk: Customer PII database (85,000 records), /etc/shadow, CI/CD deploy key. Regulatory: GDPR Art. 33 — personal data exposure confirmed. DPO notified 15:28 UTC.

SECTION 3 — FINDINGS

IF-2026-TR4-BF-001 — SSH brute force success → payload download → execution (T1110.001 → T1105 → T1059)

IF-2026-TR4-SUDO-001 — sudo shadow dump → account creation → SSH key → C2 (T1548.003 → T1136.001 → T1098.004)

IF-2026-TR4-PROC-001 — Python C2 beacon in /dev/shm → 45.155.205.99:443 (T1059.006 + T1573.001)

IF-2026-TR4-PERSIST-001 — 4 persistence (cron, systemd, SSH key, .bashrc) (T1053.003 + T1543.002 + T1098.004 + T1546.004)

IF-2026-TR4-CROSS-001 — Cross-env chain: AiTM → Windows beacon → LSASS → SSH → Linux C2 (8-technique chain)

SECTION 4 — CONTAINMENT (15:20–15:25 UTC)

iptables block 45.155.205.99 — C2 transitioned SYN-SENT ✅ | svc-dbadmin disabled (passwd -l + usermod -e 1) ✅ | backdoor deleted (userdel -r) ✅ | SSH keys truncated ✅ | Persistence removed (cron, systemd, .bashrc) ✅ | C2 beacon killed (PID 31337) ✅ | 60-sec verification: no respawn, no reconnect ✅. Sync: Windows team isolated DESKTOP-NGE042 15:22. Cloud team revoked j.morrison sessions 15:22.

SECTION 5 — NEXT STEPS

1. Analyse memory dump (AVML, 8 GiB, SHA256: a7c3e1b2…) — C2 command history, data accessed

2. MySQL query log — determine if PII database accessed/exfiltrated

3. /dev/shm/db_export.sql.gz (4.2 GB) — staged data content

4. Network logs — outbound transfers >1 GB from SRV-NGE-BRS-DB01, 15:12–15:25

5. CHAIN-DRIFT timeline — reconstruct full path from AiTM to Linux C2

6. Fleet scan — other Linux servers (10.1.2.0/24) for svc-dbadmin SSH sessions

7. GDPR — if DB access confirmed, prepare Art. 34 data subject notification

Notice the structure: the investigation team knows the classification and why, the full blast radius, exactly what findings were confirmed with ATT&CK mapping, every containment action with verification status, and seven specific next steps. They can start working immediately. No re-deriving scope. No hunting for evidence. No asking the triage analyst "what did you find?"

Dual-audience reporting

The full report serves the investigation team and the SOC lead. But Rachel's CISO and DPO don't need finding IDs and ATT&CK mappings. They need four things: what happened, how bad it is, what was done, and what happens next. Add a 4-line executive summary at the top of any confirmed TP report.

The executive audience makes decisions based on business risk, not technical indicators. "T1110.001 SSH brute force" means nothing to the DPO. "An attacker gained access to a database containing 85,000 customer records" drives a decision. The technical audience needs the ATT&CK mapping to plan investigation steps. The executive audience needs the regulatory implications to plan notification and communication. Both audiences receive the same underlying report — the executive summary is a lens on top, not a separate document.

This dual-audience approach also protects against a common failure mode: the triage analyst writes an executive-friendly summary and skips the technical detail. The investigation team then receives a report that tells them what happened in business terms but doesn't tell them where to look. The 5-section template prevents this by requiring both the technical detail (Sections 3–5) and the executive layer (the summary at the top). Neither can substitute for the other.

Prose Template — Executive Summary

Executive Summary

A cross-environment attack compromised a Linux database server holding 85,000 customer records. The attack originated from a phishing-compromised cloud identity, traversed a Windows endpoint, and reached the Linux server via SSH lateral movement. All three environments have been contained. GDPR Article 33 notification to the ICO is recommended within 72 hours. The investigation team is analyzing whether customer data was accessed or exfiltrated.

The executive summary should be written last, after the full report is complete. It distills the five sections into four sentences that can be read in 30 seconds. Every claim in the executive summary must trace back to a finding in the full report — this is not the place for speculation or unconfirmed scope.

The four-sentence structure is deliberate. Sentence one states what happened in business terms. Sentence two states the scope and potential impact. Sentence three states what containment actions were taken. Sentence four states what happens next — specifically the regulatory or business decisions that need to be made. Resist the temptation to add qualifications, hedges, or technical detail. The executive summary exists to enable a decision in 30 seconds. If the CISO needs technical detail, they read the full report.

If they need a decision briefing, they read the four sentences.

One common mistake: writing the executive summary before containment is confirmed. The CISO receives "all environments contained" and makes decisions based on that. Ten minutes later, verification reveals the containment on the Linux server failed and the C2 beacon respawned. Now the executive summary is wrong and the CISO has already briefed the board. Write the summary after verification. "Containment executed, verification in progress" is acceptable if time pressure demands an early brief — but it must be flagged as incomplete.

Report quality: the five mistakes that waste investigation time

Vague classification without evidence. "Classification: TP" without specifying which finding confirmed the TP. The investigation team cannot validate the classification without seeing the evidence. Every classification must reference at least one IF-numbered finding or specific indicator.

Incomplete scope. Listing the compromised system but not the blast radius. "SRV-NGE-BRS-DB01 compromised" without noting the 85,000 PII records, the 12 reachable Linux servers, and the CI/CD deploy key forces the investigation team to re-derive scope — 30–60 minutes of repeated work.

Missing containment verification. Documenting containment actions but not the verification results. "iptables block applied" is insufficient. The report must confirm the block is effective — "C2 connection transitioned from ESTAB to SYN-SENT, verified at 15:23." Unverified containment may leave the attacker operating while the investigation team believes the environment is contained.

Timestamps without timezone. "Alert fired at 15:10" — is that UTC, BST, or local server time? All timestamps in the triage report must specify UTC. If the original alert was in local time, convert to UTC in the report and note the conversion. Ambiguous timestamps create confusion during cross-environment correlation and become a serious problem during regulatory review when the notification clock depends on the exact moment of awareness.

Narrative without structure. A free-text description of what happened without the 5-section format. Even FP classifications use the template: "Section 1: FP — Legitimate admin activity from authorized IP. Section 2: N/A. Section 3: Alert triggered by scheduled maintenance script. Section 4: No containment required. Section 5: Tune the analytics rule to exclude this maintenance window." The structure is the discipline. Unstructured reports force the investigation team to parse prose to extract classification, scope, and containment status — work the template eliminates entirely.

FP reports are shorter but equally important. They build the tuning backlog. If every FP report includes a Section 5 recommendation ("tune this rule to exclude scheduled maintenance from the svc-backup account"), the detection engineering team accumulates a prioritized list of rules to refine. FP reports without recommendations leave the same alert firing next week, consuming another 15 minutes of analyst time on the same false positive.

KQL: generating the report header automatically

For teams using Sentinel, the report header fields can be pulled directly from the incident:

KQL — Triage Report Header
// Generate triage report header from Sentinel incident
let IncidentId = "INC-NE-2026-0406-001";
SecurityIncident
| where IncidentNumber == IncidentId
| project
    IncidentNumber,
    Title,
    Severity,
    CreatedTime,
    FirstActivityTime,
    LastActivityTime,
    // Scope: entities involved
    AlertCount = array_length(AlertIds),
    Owner = Owner.assignedTo,
    Status,
    Classification
| extend
    AlertWindow = LastActivityTime - FirstActivityTime,
    TriageDuration = now() - CreatedTime

The query returns the incident metadata — reference number, alert source, severity, timeline, and current owner. This eliminates transcription errors in the report header and ensures the timestamp is in UTC from the source.

"The triage report is an internal document — it doesn't need to be formal"

The triage report is the first official incident document. It establishes the moment of awareness (when regulatory notification clocks start), the initial scope assessment (used for executive briefing), the evidence chain (chain of custody begins here), and the containment record (demonstrating due diligence). A Slack message is not timestamped reliably, is not structured for regulatory review, and can be edited or deleted. The formal triage report satisfies regulatory scrutiny, supports legal proceedings, and enables the investigation team to start working without re-discovering scope. Organizations that skip formal triage reports discover the gap during their first regulatory audit or legal proceeding — when the cost of reconstruction is measured in billable legal hours, not analyst minutes.

Investigation Principle

The triage report is not a summary of what happened. It is a transfer document — everything the investigation team needs to start working without asking the triage analyst a single question. If the investigation team has to come back and ask "what did you find?" or "what did you contain?", the report failed. The five-section structure makes completeness checkable: any empty section is a visible gap.

Next

Section 0.10 puts everything together. You'll work a full triage from alert to handoff — the 60-minute window, the scorecard, the containment actions, and the triage report — on a fresh NE incident you haven't seen before. This is where the methodology becomes muscle memory.

Unlock the Full Course See Full Course Agenda