Skip to content

docs(exercises): a record and template for purple-team exercises - #1191

Merged
Gerrrt merged 2 commits into
mainfrom
docs/exercise-log-template
Oct 14, 2026
Merged

Gerrrt merged 2 commits into
mainfrom
docs/exercise-log-template

Conversation

@Gerrrt

@Gerrrt Gerrrt commented Oct 14, 2026

Copy link
Copy Markdown
Owner

What changed

Docs only. Adds docs/exercises/, a place to record purple-team exercises against the lab domain:

  • docs/exercises/README.md sets the rules:

    • one dated file per exercise
    • a file is a record, never rewritten, so a re-run is a new file that links the earlier one
    • every technique carries its MITRE ATT&CK ID
    • targets are the lab domain or the range only
    • describe the activity, not the payload, with security.md's publishing rules applying
    • a missed detection opens an issue

    It also lists where the evidence comes from (Wazuh, Velociraptor, Zeek, Suricata, the lab's Loki) and holds an index of past exercises, empty for now.

  • docs/exercises/TEMPLATE.md has these sections: objective; scope, including the time window and which deliberate weaknesses were switched on (ADR-0083); techniques; the detections expected, written before the run; what was observed; gaps and fixes; lessons.

  • README's repository layout gains the folder. CLAUDE.md now lists exercise files as records.

Why

The repository has a SOC and a lab domain built to be attacked, and the range on ifrit is next. Until now there was nowhere to write down whether an attack was detected. Recording the expectation before each run and the result after it turns the lab into evidence of detection coverage that can be measured over time.

Blast radius

None. This changes documentation only.

  • No change to network segmentation or firewall rules
  • No new port published to a VLAN that could not already reach the service
  • No credential added outside secrets/*.sops.yaml

Verification

  • scripts/check_docs.py passes: docs OK — 158 Prometheus + 20 Loki rules, 8 dashboards, 156 panels, 11 assertions
  • scripts/lint.sh passes, but 12 of its checks were skipped because there's no Docker here, including editorconfig, shellcheck and actionlint. I checked editorconfig's rules on the new files by hand: no trailing whitespace. markdownlint-cli2 reports 0 errors on all four changed Markdown files. Every relative link target exists.
  • Deployed to the lab and confirmed working: not applicable
  • Docs updated

🤖 Generated with Claude Code

https://claude.ai/code/session_01A4769sNhNE79DH3SBN4YXx


Generated by Claude Code

docs/exercises/ holds one dated file per exercise against the lab
domain: techniques with ATT&CK IDs, the detections expected before the
run, what Wazuh, Velociraptor, Zeek, Suricata and Loki actually saw,
and the gaps that open issues. Files are records like the changelog,
describe activity rather than payloads, and stay inside the lab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A4769sNhNE79DH3SBN4YXx
Copilot AI balanced review requested due to automatic review settings October 14, 2026 10:41

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The template contains a broken ADR-0083 link that should be corrected before approval.

1 open finding
What changed in this PR

Adds immutable purple-team exercise records and a reusable exercise template.

Changes:

  • Documents exercise rules, evidence sources, and indexing.
  • Adds a structured exercise template.
  • Updates repository guidance and layout.
File Description
README.md Lists the exercises directory.
docs/​exercises/​README.md Defines exercise-record conventions.
docs/​exercises/​TEMPLATE.md Provides the exercise format.
CLAUDE.md Classifies exercises as immutable records.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread docs/exercises/TEMPLATE.md Outdated
The template pointed at 0083-give-the-lab-domains-... ; the accepted
file is 0083-give-the-lab-domain-its-... . Every exercise copied from
the template would have carried the broken link.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A4769sNhNE79DH3SBN4YXx
Gerrrt pushed a commit that referenced this pull request Oct 14, 2026
Copilot's review of #1192. ADR-0014 names the C2 operator's interface as
reached from a Hicks workstation over 50 -> 30, and ADR-0091 makes
garuda defensive-only, so the console is driven from Hicks, not the
analyst workstation. The two docs/exercises/ links are dropped to prose
so this ADR does not depend on the still-open #1191 and never carries a
broken link on main.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A4769sNhNE79DH3SBN4YXx
@Gerrrt
Gerrrt merged commit d71cf24 into main Oct 14, 2026
8 checks passed
@Gerrrt
Gerrrt deleted the docs/exercise-log-template branch October 14, 2026 11:09
Gerrrt added a commit that referenced this pull request Oct 14, 2026
* docs(adr): ADR-0095, run Sliver as the range C2 on the attack VM

ADR-0007 and ADR-0017 name a C2 on ifrit without choosing one. This
picks Sliver as the default framework, run on the attack VM inside the
range so its callbacks cross the segment the SOC and Zeek watch, with
Mythic named as a per-exercise fallback. The channel is chosen to be
representative and well-signatured so a missed detection is a real gap,
not an artifact of an exotic tool. No new firewall rule; nothing reaches
the house. Refs #421.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A4769sNhNE79DH3SBN4YXx

* docs(adr): keep C2 operator on Hicks, drop the unmerged exercises links

Copilot's review of #1192. ADR-0014 names the C2 operator's interface as
reached from a Hicks workstation over 50 -> 30, and ADR-0091 makes
garuda defensive-only, so the console is driven from Hicks, not the
analyst workstation. The two docs/exercises/ links are dropped to prose
so this ADR does not depend on the still-open #1191 and never carries a
broken link on main.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A4769sNhNE79DH3SBN4YXx

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants