Skip to content

Evidence and Reporting

Mikhail Deynekin edited this page Oct 21, 2026 · 1 revision

🧾 Evidence and Reporting

How WinSecHunter preserves what it found, how you prove it was not altered, and how the bundle differs from the narrative reports.

← Home Β· Reporting and Abuse


Two kinds of output

Output Written by Goes where Purpose
Evidence bundle Export-WinSecInvestigation <OutputDirectory>/<CaseId>/ immutable facts + hashes
Reports New-WinSecIncidentReport, New-WinSecAbuseReport, Export-WinSecIocList <OutputDirectory>/<CaseId>-reports/ documents for humans and third parties

Reports are deliberately outside the bundle. Adding a file after export would make the manifest report an Extra file, and a verifier would be right to flag it.

Bundle anatomy

WSC-20261021-AB12CD34/
β”œβ”€β”€ events.csv            flattened events (spreadsheet / SIEM)
β”œβ”€β”€ events.json           flattened events (API / jq)
β”œβ”€β”€ events.clixml         typed WinSecEvent objects for Import-Clixml
β”œβ”€β”€ findings.json         brute-force / spraying / stuffing findings
β”œβ”€β”€ sessions.csv          reconstructed logon sessions
β”œβ”€β”€ coverage.csv          log completeness snapshot
β”œβ”€β”€ attribution.json      PTR / geo / ASN / provider verdicts
β”œβ”€β”€ timeline.csv          activity buckets
β”œβ”€β”€ iocs.csv              indicators with count and first/last sighting
β”œβ”€β”€ iocs.json             same, structured
β”œβ”€β”€ report.html           self-contained event-centric report
β”œβ”€β”€ report.md             Markdown summary
β”œβ”€β”€ case.json             case metadata and notes
└── manifest.json         SHA-256 + bytes + UTC write time for every artifact above

Artifacts are written only when the corresponding input exists (for example, no findings.json when no findings were supplied).

Manifest

{
  "caseId": "WSC-20261021-AB12CD34",
  "generatedUtc": "2026-10-21T12:34:56.0000000Z",
  "collector": {
    "host": "IR-WS01",
    "user": "analyst",
    "tool": "WinSecHunter",
    "toolVersion": "2.1.0",
    "catalogVersion": "2.1.0",
    "psVersion": "7.6.6",
    "os": "Microsoft Windows 11 ..."
  },
  "hashAlgorithm": "SHA256",
  "artifacts": {
    "WSC-20261021-AB12CD34/events.csv": {
      "Sha256": "…",
      "Bytes": 123456,
      "WrittenUtc": "2026-10-21T12:34:55.0000000Z",
      "Source": "Get-WinSecEventByIp events (flattened)"
    }
  }
}

The manifest is written last and does not hash itself. Every other file is listed.

Verify integrity

$s = Test-WinSecEvidenceIntegrity -Path D:\IR\WSC-20261021-AB12CD34 -Summary
$s | Format-List BundlePath, CaseId, Artifacts, Verified, Modified, Missing, Extra, Unreadable, IsIntact
Status Meaning Action
OK hash and size match none
Modified file exists, content or size changed treat evidence as unreliable; re-export from source
Missing listed in the manifest, not present restore from a copy; do not "fix" the manifest
Extra present in the folder, not in the manifest added after export β€” remove or document it
Unreadable exists but cannot be hashed permissions or a lock; resolve and re-run

Extra is the check a hash list alone cannot perform: an added file breaks no recorded hash.

# machine-readable for a pipeline
Test-WinSecEvidenceIntegrity .\bundle -Json | Set-Content .\integrity.json -Encoding utf8NoBOM

# only problems
Test-WinSecEvidenceIntegrity .\bundle -ProblemsOnly | Format-Table RelativePath, Status

Reopen a case

$b = Import-WinSecCase -Path D:\IR\WSC-20261021-AB12CD34
$b.Case.CaseId
$b.Events.Count
$b.Events[0].GetType().Name        # WinSecEvent β€” typed, not a flat row
$b.Events | Get-WinSecIpTimeline -AsciiChart

events.json is preferred; if it is absent, events.clixml is used. -SkipEvents loads the case and the other artifacts without rehydrating events β€” useful for very large bundles.

The restored case keeps its evidence table, so a follow-up report references the same chain of custody.

What to hand over

Recipient Hand over Do not hand over
Internal case file whole bundle + <CaseId>-reports raw credentials
Management executive incident report (.html or .md) raw event dump
Auditor / court bundle + verification output + custody notes modified copies
ISP abuse desk .eml (attachments included) unrelated internal data
TIP / SIEM iocs.stix.json or iocs.csv account names, unless policy allows

Custody checklist

  1. Export once; keep the bundle read-only afterwards.
  2. Record Test-WinSecEvidenceIntegrity -Summary output and store it with the bundle.
  3. Keep the original EVTX or disk image alongside the bundle when available.
  4. Share copies, never the only copy.
  5. If a file must be added, create a new bundle version instead of editing the old one.
  6. Include the case id and UTC timestamps in every hand-off message.

Report vs bundle report

The bundle contains report.html β€” an event-centric document generated during export (summary cards, histogram, tables). New-WinSecIncidentReport produces a narrative report with verdict, confidence, recommendations and custody statement. They complement each other: the bundle report is raw evidence, the incident report is the story told about it.

πŸ›‘οΈ WinSecHunter v2.1.0

🏠 Home

πŸ“– Learn

🎯 Problem Domain πŸš€ Getting Started 🧭 Architecture

πŸ”§ Use

πŸ“š Cmdlet Reference πŸ” Detection and Analysis 🌐 Remote Collection πŸ›°οΈ Threat Intel and Attribution πŸ›‘οΈ Audit Policy Guide

πŸ“„ Report and preserve

πŸ“ Reporting and Abuse 🧾 Evidence and Reporting πŸ“Š Reference Tables

βš™οΈ Operate

πŸ”§ Configuration 🩺 Troubleshooting and FAQ πŸ§‘β€πŸ’» Development πŸ—ΊοΈ Roadmap


πŸ“„ README Β· πŸ”– Changelog Β· πŸ“¦ Releases

Clone this wiki locally