mirror of
https://github.com/maxDcb/C2TeamServer
synced 2026-06-06 16:14:27 +00:00
1306 lines
60 KiB
YAML
1306 lines
60 KiB
YAML
schema_version: 1
|
|
catalog_version: "2026-05-07"
|
|
description: >
|
|
Source of truth for C2TeamServer validation coverage. This catalog describes
|
|
what must be tested; it does not store pass/fail results. Automated and manual
|
|
runners should report results by stable id.
|
|
|
|
status_model:
|
|
auto_result: [pass, fail, blocked, untested]
|
|
manual_result: [pass, fail, blocked, untested]
|
|
final_result:
|
|
pass: "all required auto/manual validations passed"
|
|
fail: "at least one required validation failed"
|
|
partial: "some required validation is still untested"
|
|
blocked: "validation cannot run because a dependency is missing"
|
|
untested: "no validation result exists yet"
|
|
planned: "known required coverage with no stable validation yet"
|
|
|
|
validation_modes:
|
|
auto: "validated by automated tests only"
|
|
manual: "validated by a predetermined manual procedure only"
|
|
auto+manual: "requires both automated tests and a real lab/manual validation"
|
|
planned: "known required coverage with no stable validation yet"
|
|
|
|
axes:
|
|
os: [any, windows, linux, teamserver, client]
|
|
arch: [any, x64, x86, arm64, n/a]
|
|
listener: [n/a, https, http, tcp, smb, dns, github, any]
|
|
artifact_category:
|
|
- n/a
|
|
- command_specs
|
|
- tools
|
|
- scripts
|
|
- uploaded
|
|
- generated
|
|
- hosted
|
|
- beacons
|
|
- modules
|
|
- any
|
|
|
|
entries:
|
|
- id: C2CLIENT-CONFIG-ENV-001
|
|
area: C2Client
|
|
feature: Config loading
|
|
scenario: "Load .env values and environment overrides with documented precedence."
|
|
priority: critical
|
|
validation: auto
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_env_loading.py"]
|
|
manual: []
|
|
|
|
- id: C2CLIENT-CONFIG-CERT-001
|
|
area: C2Client
|
|
feature: TLS certificate config
|
|
scenario: "Use C2_CERT_PATH when set and report a clear error when the certificate is missing."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_env_loading.py", "C2Client/tests/test_grpc_client.py"]
|
|
manual: ["Start C2Client with C2_CERT_PATH pointing to the release TeamServer certificate."]
|
|
|
|
- id: C2CLIENT-STARTUP-GUI-001
|
|
area: C2Client
|
|
feature: GUI startup
|
|
scenario: "Start python3 -m C2Client.GUI without crashing and create non-closable core tabs."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_gui_startup.py"]
|
|
manual: ["Run python3 -m C2Client.GUI and verify Terminal, AI, Hooks, and Artifacts tabs are present."]
|
|
|
|
- id: C2CLIENT-RPC-BINDINGS-001
|
|
area: C2Client
|
|
feature: Protocol bindings
|
|
scenario: "Expose TeamServer RPC fields used by sessions, listeners, artifacts, commands, and hooks."
|
|
priority: critical
|
|
validation: auto
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_protocol_bindings.py", "C2Client/tests/test_grpc_client.py"]
|
|
manual: []
|
|
|
|
- id: C2CLIENT-SESSION-PANEL-001
|
|
area: C2Client
|
|
feature: Sessions panel
|
|
scenario: "Render sessions table with stable column sizing, readable IPs, last seen, state, OS tooltip, and module count context."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_session_panel.py", "C2Client/tests/test_ui_status.py"]
|
|
manual: ["Connect at least one Windows and one Linux beacon and inspect session row readability while resizing."]
|
|
|
|
- id: C2CLIENT-LISTENER-PANEL-001
|
|
area: C2Client
|
|
feature: Listener panel
|
|
scenario: "Render listeners table, restrict form fields, and preserve column sizing during refresh."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_listener_panel.py"]
|
|
manual: ["Create/list/stop an HTTPS listener and verify form validation for host and port."]
|
|
|
|
- id: C2CLIENT-GRAPH-PANEL-001
|
|
area: C2Client
|
|
feature: Graph panel
|
|
scenario: "Render separated nodes by default, zoom in/out controls, and no redundant title frame."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_graph_panel.py"]
|
|
manual: ["Open Graph with multiple sessions/listeners and verify nodes are not stacked."]
|
|
|
|
- id: C2CLIENT-CONSOLE-FORMATTING-001
|
|
area: C2Client
|
|
feature: Console formatting
|
|
scenario: "Use unified timestamp, marker, and body colors with no duplicated queued/done/result lines."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_console_panel.py"]
|
|
manual: ["Run pwd and ls on a beacon and verify one queued line and one done line with output."]
|
|
|
|
- id: C2CLIENT-CONSOLE-AUTOCOMPLETE-001
|
|
area: C2Client
|
|
feature: Beacon console autocomplete
|
|
scenario: "Build autocomplete from CommandSpec, artifact catalog, sessions, listeners, and loaded module state."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: any, artifact_category: command_specs}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_console_panel.py", "C2Client/tests/assistant_agent/test_command_builder.py", "C2Client/tests/assistant_agent/test_command_specs.py"]
|
|
manual: ["Press Tab on assemblyExec, inject, dotnetExec, download, upload, and loadModule commands."]
|
|
|
|
- id: C2CLIENT-CONSOLE-HELP-001
|
|
area: C2Client
|
|
feature: Beacon command help
|
|
scenario: "Render help from TeamServer CommandSpec without legacy << or >> markers."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: any, artifact_category: command_specs}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_console_panel.py", "teamServer/tests/TeamServerHelpServiceTests.cpp"]
|
|
manual: ["Run help and help assemblyExec in a beacon console."]
|
|
|
|
- id: C2CLIENT-TERMINAL-BASE-001
|
|
area: C2Client
|
|
feature: Terminal tab
|
|
scenario: "Show base help text, command history, unified colors, and terminal autocomplete."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_terminal_panel_dropper_arch.py", "C2Client/tests/test_console_panel.py"]
|
|
manual: ["Open Terminal, press Tab, run help, and verify formatting/newlines."]
|
|
|
|
- id: C2CLIENT-TERMINAL-HOST-001
|
|
area: C2Client
|
|
feature: Terminal host command
|
|
scenario: "Host an artifact reference through GeneratedArtifacts/hosted instead of arbitrary legacy file paths."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: https, artifact_category: hosted}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_terminal_panel_dropper_arch.py", "teamServer/tests/TeamServerTermLocalServiceTests.cpp"]
|
|
manual: ["Run host <listener> <artifact-id-or-name> and fetch the returned URL."]
|
|
|
|
- id: C2CLIENT-TERMINAL-DROPPER-001
|
|
area: C2Client
|
|
feature: Dropper
|
|
scenario: "Generate and host droppers with selected beacon arch and shellcode generator."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: x64, listener: https, artifact_category: hosted}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_terminal_panel_dropper_arch.py"]
|
|
manual: ["Generate an HTTPS Windows x64 dropper and verify it appears as a hosted artifact."]
|
|
|
|
- id: C2CLIENT-TERMINAL-CREDENTIALS-001
|
|
area: C2Client
|
|
feature: Credential store terminal commands
|
|
scenario: "Add, list, and retrieve credentials through terminal commands."
|
|
priority: medium
|
|
validation: planned
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerTermLocalServiceTests.cpp"]
|
|
manual: ["Use credential add/list/get once the server-side credential store is stabilized."]
|
|
|
|
- id: C2CLIENT-ARTIFACTS-LIST-001
|
|
area: C2Client
|
|
feature: Artifacts tab
|
|
scenario: "List CommandSpecs, Tools, Scripts, UploadedArtifacts, GeneratedArtifacts, hosted artifacts, beacons, and modules with category filters."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: any}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_artifact_panel.py", "teamServer/tests/TeamServerArtifactCatalogTests.cpp"]
|
|
manual: ["Open Artifacts tab after a clean release build and verify each expected category."]
|
|
|
|
- id: C2CLIENT-ARTIFACTS-UPLOAD-001
|
|
area: C2Client
|
|
feature: Artifact upload
|
|
scenario: "Upload operator files into UploadedArtifacts with selected platform and arch."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: any, listener: n/a, artifact_category: uploaded}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_artifact_panel.py", "teamServer/tests/TeamServerArtifactCatalogTests.cpp"]
|
|
manual: ["Upload a file from the Artifacts tab and verify it is usable by upload/kerberosUseTicket/psExec."]
|
|
|
|
- id: C2CLIENT-ARTIFACTS-DOWNLOAD-001
|
|
area: C2Client
|
|
feature: Artifact download
|
|
scenario: "Download selected artifacts from TeamServer to the client filesystem."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: generated}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_artifact_panel.py"]
|
|
manual: ["Download a generated artifact from Artifacts tab and verify file hash/size."]
|
|
|
|
- id: C2CLIENT-ARTIFACTS-DELETE-001
|
|
area: C2Client
|
|
feature: Artifact delete
|
|
scenario: "Delete uploaded, generated, and hosted artifacts using artifact IDs, not legacy terminal paths."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: generated}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_artifact_panel.py"]
|
|
manual: ["Delete an uploaded artifact, a generated screenshot, and a hosted artifact from Artifacts tab."]
|
|
|
|
- id: C2CLIENT-HOOKS-PANEL-001
|
|
area: C2Client
|
|
feature: Hooks panel
|
|
scenario: "List hooks with descriptions/tooltips, activation counts, and manual start using context snapshot."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: any, artifact_category: scripts}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_script_panel.py"]
|
|
manual: ["Run a ManualStart hook and verify it receives beacon/listener snapshot context."]
|
|
|
|
- id: C2CLIENT-AI-PANEL-001
|
|
area: C2Client
|
|
feature: Data AI panel
|
|
scenario: "Render system/user/assistant markers with distinct colors and line breaks."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_assistant_panel.py", "C2Client/tests/assistant_agent/test_service_bootstrap.py"]
|
|
manual: ["Open Data AI tab and verify marker colors and multiline output readability."]
|
|
|
|
- id: C2CLIENT-MAIN-THEME-001
|
|
area: C2Client
|
|
feature: Main layout theme
|
|
scenario: "Use consistent dark background across main layout, sessions, listeners, graph, consoles, and hooks."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: client, arch: n/a, listener: n/a, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["C2Client/tests/test_ui_status.py"]
|
|
manual: ["Resize the main window and inspect for stray light rectangles or unthemed panels."]
|
|
|
|
- id: TEAMSERVER-CONFIG-DIRECTORIES-001
|
|
area: TeamServer
|
|
feature: Runtime directory layout
|
|
scenario: "Resolve release data layout for Tools, Scripts, UploadedArtifacts, GeneratedArtifacts, hosted, Beacons, Modules, and CommandSpecs."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: n/a, artifact_category: any}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerArtifactCatalogTests.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Inspect build/artifacts/Release/data after a clean build and download scripts."]
|
|
|
|
- id: TEAMSERVER-STARTUP-TLS-001
|
|
area: TeamServer
|
|
feature: Startup and TLS
|
|
scenario: "Start TeamServer with generated certificate, client auth, and readable config errors."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: n/a, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["teamServer/tests/testsTestServer.cpp"]
|
|
manual: ["Start Release TeamServer and connect C2Client over TLS."]
|
|
|
|
- id: TEAMSERVER-COMMAND-CATALOG-001
|
|
area: TeamServer
|
|
feature: Command catalog
|
|
scenario: "List CommandSpecs from core modules and common commands with help and argument metadata."
|
|
priority: critical
|
|
validation: auto
|
|
axes: {os: teamserver, arch: n/a, listener: n/a, artifact_category: command_specs}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandCatalogTests.cpp", "teamServer/tests/TeamServerHelpServiceTests.cpp"]
|
|
manual: []
|
|
|
|
- id: TEAMSERVER-COMMAND-PREPARATION-001
|
|
area: TeamServer
|
|
feature: Command preparation
|
|
scenario: "Prepare common commands, module commands, artifact-backed commands, shellcode-backed commands, and rejected commands."
|
|
priority: critical
|
|
validation: auto
|
|
axes: {os: teamserver, arch: any, listener: any, artifact_category: any}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: []
|
|
|
|
- id: TEAMSERVER-ARTIFACT-CATALOG-001
|
|
area: TeamServer
|
|
feature: Artifact catalog
|
|
scenario: "List, filter, upload, delete, and resolve artifacts by category/platform/arch/runtime/source."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: n/a, artifact_category: any}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerArtifactCatalogTests.cpp"]
|
|
manual: ["Use C2Client Artifacts tab to filter and delete uploaded/generated/hosted artifacts."]
|
|
|
|
- id: TEAMSERVER-GENERATED-ARTIFACTS-001
|
|
area: TeamServer
|
|
feature: Generated artifact store
|
|
scenario: "Register generated artifacts with sidecars, hash, size, source, format, and category."
|
|
priority: critical
|
|
validation: auto
|
|
axes: {os: teamserver, arch: any, listener: n/a, artifact_category: generated}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandPreparationServiceTests.cpp", "teamServer/tests/TeamServerArtifactCatalogTests.cpp"]
|
|
manual: []
|
|
|
|
- id: TEAMSERVER-HOSTED-ARTIFACTS-001
|
|
area: TeamServer
|
|
feature: Hosted artifacts
|
|
scenario: "Host artifacts under GeneratedArtifacts/hosted and list/delete them through artifact services."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: n/a, listener: https, artifact_category: hosted}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerTermLocalServiceTests.cpp", "teamServer/tests/TeamServerArtifactCatalogTests.cpp"]
|
|
manual: ["Host an artifact, fetch its URL, then delete it from Artifacts tab."]
|
|
|
|
- id: TEAMSERVER-FILE-TRANSFER-001
|
|
area: TeamServer
|
|
feature: File transfer service
|
|
scenario: "Prepare upload/download paths, write chunked command results, and keep command context until final success."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: any, artifact_category: generated}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandPreparationServiceTests.cpp", "teamServer/tests/TeamServerListenerSessionServiceTests.cpp"]
|
|
manual: ["Run download and screenShot from a real beacon and verify a single final console result."]
|
|
|
|
- id: TEAMSERVER-SHELLCODE-SERVICE-001
|
|
area: TeamServer
|
|
feature: Shellcode service
|
|
scenario: "Generate shellcode artifacts from supported sources and expose generic generator metadata."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: x64, listener: n/a, artifact_category: generated}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandPreparationServiceTests.cpp", "core/modules/AssemblyExec/tests/testsAssemblyExec.cpp", "core/modules/Inject/tests/testsInject.cpp"]
|
|
manual: ["Run assemblyExec --donut-exe and inject with a real Windows beacon."]
|
|
|
|
- id: TEAMSERVER-LISTENER-SESSION-SERVICE-001
|
|
area: TeamServer
|
|
feature: Listener/session service
|
|
scenario: "Stream sessions/listeners, queue commands, deduplicate responses, track modules, and route command results."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerListenerSessionServiceTests.cpp"]
|
|
manual: ["Connect multiple beacons/listeners and verify command routing in C2Client."]
|
|
|
|
- id: TEAMSERVER-LISTENER-ARTIFACT-SERVICE-001
|
|
area: TeamServer
|
|
feature: Listener artifact service
|
|
scenario: "Resolve beacon binaries by target OS and arch for droppers and terminal operations."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: any, artifact_category: beacons}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerListenerArtifactServiceTests.cpp"]
|
|
manual: ["Generate a dropper for Windows x64 and Linux x64 and verify selected beacon binary."]
|
|
|
|
- id: TEAMSERVER-SOCKS-SERVICE-001
|
|
area: TeamServer
|
|
feature: SOCKS service
|
|
scenario: "Start, list, and stop TeamServer SOCKS routes from terminal commands."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: n/a, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerSocksServiceTests.cpp"]
|
|
manual: ["Run terminal socks start/list/stop against a live beacon route."]
|
|
|
|
- id: LIBSOCKS5-PROTOCOL-001
|
|
area: Libraries
|
|
feature: libSocks5 protocol handling
|
|
scenario: "Negotiate SOCKS5 no-auth, accept IPv4 and hostname CONNECT, and reject unsupported commands/address types with explicit replies."
|
|
priority: high
|
|
validation: auto
|
|
axes: {os: teamserver, arch: n/a, listener: n/a, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["libs/libSocks5/tests/TestsSocksServer.cpp"]
|
|
manual: []
|
|
|
|
- id: TEAMSERVER-SOCKS-STRESS-001
|
|
area: TeamServer
|
|
feature: SOCKS stress
|
|
scenario: "Sustain concurrent SOCKS5 HTTP(S) requests through a bound live beacon, including hostname-mode CONNECT, and report latency/error distribution."
|
|
priority: high
|
|
validation: manual
|
|
axes: {os: teamserver, arch: n/a, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: []
|
|
manual: ["Run scripts/socks5_stress_test.py against a live socks start/bind route with a fixed request/concurrency target, then repeat with --socks-hostname."]
|
|
|
|
- id: BEACON-CORE-REGISTER-001
|
|
area: Beacon
|
|
feature: Registration and metadata
|
|
scenario: "Register hostname, username, OS, arch, privilege, process id, internal IPs, and additional information."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/beacon/tests/testBeacon.cpp", "core/beacon/tests/testBeaconHttp.cpp"]
|
|
manual: ["Launch Windows and Linux beacons and verify rows in Sessions panel."]
|
|
|
|
- id: BEACON-CORE-HEARTBEAT-001
|
|
area: Beacon
|
|
feature: Heartbeat and state
|
|
scenario: "Update last seen, stale state, listener proof of life, and reconnect behavior."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/beacon/tests/testBeacon.cpp", "C2Client/tests/test_session_panel.py"]
|
|
manual: ["Use low C2_SESSION_STALE_AFTER_MS and verify now/stale transitions."]
|
|
|
|
- id: BEACON-CORE-TASK-QUEUE-001
|
|
area: Beacon
|
|
feature: Task queue
|
|
scenario: "Receive tasks, execute common commands/modules, return command IDs, and preserve command context."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/beacon/tests/testBeacon.cpp", "teamServer/tests/TeamServerListenerSessionServiceTests.cpp"]
|
|
manual: ["Run pwd, ls, help, loadModule, and download through a live beacon."]
|
|
|
|
- id: BEACON-CORE-CHUNKED-RESULTS-001
|
|
area: Beacon
|
|
feature: Chunked command results
|
|
scenario: "Emit recurring chunks for large results and finish with a single success response."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: generated}
|
|
evidence:
|
|
auto: ["core/modules/Download/tests/testsDownload.cpp", "core/modules/MiniDump/tests/testsMiniDump.cpp", "core/modules/ScreenShot/tests/testsScreenShot.cpp"]
|
|
manual: ["Run download of a large file and screenShot from a real beacon."]
|
|
|
|
- id: BEACON-CORE-MODULE-LIFECYCLE-001
|
|
area: Beacon
|
|
feature: Module lifecycle
|
|
scenario: "loadModule, unloadModule, listModule, duplicate-load rejection, and module count tracking."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: modules}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerListenerSessionServiceTests.cpp", "core/modules/ModuleCmd/tests/testsModuleCmd.cpp"]
|
|
manual: ["Load pwd, verify listModule, attempt duplicate load, then unload."]
|
|
|
|
- id: LISTENER-HTTPS-001
|
|
area: Listeners
|
|
feature: HTTPS listener
|
|
scenario: "Start listener, register beacon, exchange tasks/results, host artifacts, and stop listener."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: hosted}
|
|
evidence:
|
|
auto: ["core/beacon/tests/testBeaconHttp.cpp", "teamServer/tests/TeamServerHttpListenerTransportTests.cpp"]
|
|
manual: ["Run a full Windows x64 and Linux x64 beacon golden path over HTTPS."]
|
|
|
|
- id: LISTENER-HTTP-001
|
|
area: Listeners
|
|
feature: HTTP listener
|
|
scenario: "Start listener, register beacon, and exchange simple command results."
|
|
priority: high
|
|
validation: manual
|
|
axes: {os: any, arch: any, listener: http, artifact_category: n/a}
|
|
evidence:
|
|
auto: []
|
|
manual: ["Run whoami/pwd through HTTP listener."]
|
|
|
|
- id: LISTENER-TCP-001
|
|
area: Listeners
|
|
feature: TCP listener
|
|
scenario: "Start TCP listener and route task/result traffic."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: tcp, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/listener/tests/testListenerTcp.cpp", "core/beacon/tests/testBeaconTcp.cpp"]
|
|
manual: ["Run whoami/pwd through TCP listener."]
|
|
|
|
- id: LISTENER-SMB-001
|
|
area: Listeners
|
|
feature: SMB listener
|
|
scenario: "Start SMB listener and route task/result traffic through named pipe transport."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: any, listener: smb, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/listener/tests/testListenerSmb.cpp", "core/beacon/tests/testBeaconSmb.cpp"]
|
|
manual: ["Run whoami through SMB listener with a Windows beacon."]
|
|
|
|
- id: LISTENER-DNS-001
|
|
area: Listeners
|
|
feature: DNS listener
|
|
scenario: "Start DNS listener and route task/result traffic within DNS transport limits."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: dns, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/listener/tests/testListenerDns.cpp", "core/beacon/tests/testBeaconDns.cpp"]
|
|
manual: ["Run small commands through DNS listener and verify no large artifact test is attempted."]
|
|
|
|
- id: LISTENER-GITHUB-001
|
|
area: Listeners
|
|
feature: GitHub listener
|
|
scenario: "Start GitHub listener and route task/result traffic through configured repository transport."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: github, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/listener/tests/testListenerGithub.cpp", "core/beacon/tests/testBeaconGithub.cpp"]
|
|
manual: ["Run a simple command through GitHub listener with test credentials/repo."]
|
|
|
|
- id: COMMON-HELP-001
|
|
area: CommonCommands
|
|
feature: help
|
|
scenario: "List commands and show command-specific help from CommandSpec."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: command_specs}
|
|
evidence:
|
|
auto: ["core/modules/ModuleCmd/CommandSpecs/common/help.json", "teamServer/tests/TeamServerHelpServiceTests.cpp"]
|
|
manual: ["Run help and help <command> in a beacon console."]
|
|
|
|
- id: COMMON-SLEEP-001
|
|
area: CommonCommands
|
|
feature: sleep
|
|
scenario: "Change beacon sleep interval and reject invalid values clearly."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/ModuleCmd/CommandSpecs/common/sleep.json", "core/beacon/tests/testBeacon.cpp"]
|
|
manual: ["Run sleep 1 then verify beacon polling delay changes."]
|
|
|
|
- id: COMMON-END-001
|
|
area: CommonCommands
|
|
feature: end
|
|
scenario: "Stop a beacon session cleanly."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/ModuleCmd/CommandSpecs/common/end.json", "core/beacon/tests/testBeacon.cpp"]
|
|
manual: ["Run end and verify session stops updating."]
|
|
|
|
- id: COMMON-LISTENER-001
|
|
area: CommonCommands
|
|
feature: listener
|
|
scenario: "Start and stop child listeners from a beacon using validated listener parameters."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/ModuleCmd/CommandSpecs/common/listener.json", "core/beacon/tests/testBeacon.cpp"]
|
|
manual: ["Run listener start tcp and listener stop from a beacon."]
|
|
|
|
- id: COMMON-LOADMODULE-001
|
|
area: CommonCommands
|
|
feature: loadModule
|
|
scenario: "Autocomplete unloaded modules, resolve module artifacts by OS/arch, and reject duplicates."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: modules}
|
|
evidence:
|
|
auto: ["core/modules/ModuleCmd/CommandSpecs/common/loadModule.json", "teamServer/tests/TeamServerListenerSessionServiceTests.cpp"]
|
|
manual: ["Run loadModule pwd, listModule, duplicate loadModule pwd."]
|
|
|
|
- id: COMMON-UNLOADMODULE-001
|
|
area: CommonCommands
|
|
feature: unloadModule
|
|
scenario: "Autocomplete loaded modules and unload selected module."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: modules}
|
|
evidence:
|
|
auto: ["core/modules/ModuleCmd/CommandSpecs/common/unloadModule.json", "teamServer/tests/TeamServerListenerSessionServiceTests.cpp"]
|
|
manual: ["Run unloadModule pwd after loadModule pwd."]
|
|
|
|
- id: COMMON-LISTMODULE-001
|
|
area: CommonCommands
|
|
feature: listModule
|
|
scenario: "List loaded modules by name and state in the beacon console."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: modules}
|
|
evidence:
|
|
auto: ["core/modules/ModuleCmd/CommandSpecs/common/listModule.json", "teamServer/tests/TeamServerListenerSessionServiceTests.cpp"]
|
|
manual: ["Run listModule and verify name/status output only."]
|
|
|
|
- id: ARTIFACT-LAYOUT-001
|
|
area: Artifacts
|
|
feature: Release data layout
|
|
scenario: "Release scripts place files under the canonical data layout with platform and arch subfolders."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: n/a, artifact_category: any}
|
|
evidence:
|
|
auto: ["docs/artifacts.md", "teamServer/tests/TeamServerArtifactCatalogTests.cpp"]
|
|
manual: ["Run clean build plus download-c2implant-artifacts.sh and download-c2linuximplant-artifacts.sh."]
|
|
|
|
- id: ARTIFACT-TOOLS-001
|
|
area: Artifacts
|
|
feature: Tools
|
|
scenario: "Resolve Tools/<platform>/<arch> and Tools/Any/any for module preparers and terminal upload."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: n/a, artifact_category: tools}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Place a tool under Tools/Windows/x64 and verify autocomplete/preparer resolution."]
|
|
|
|
- id: ARTIFACT-SCRIPTS-001
|
|
area: Artifacts
|
|
feature: Scripts
|
|
scenario: "Resolve Scripts/Windows, Scripts/Linux, and Scripts/Any for script-backed commands."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: n/a, artifact_category: scripts}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run powershell -s and script with files from Scripts folder."]
|
|
|
|
- id: ARTIFACT-UPLOADED-001
|
|
area: Artifacts
|
|
feature: UploadedArtifacts
|
|
scenario: "Resolve operator-uploaded payloads by category, platform, arch, and Any/any fallback."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: n/a, artifact_category: uploaded}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandPreparationServiceTests.cpp", "C2Client/tests/test_artifact_panel.py"]
|
|
manual: ["Upload a file via Artifacts tab and use it with upload and kerberosUseTicket."]
|
|
|
|
- id: ARTIFACT-GENERATED-001
|
|
area: Artifacts
|
|
feature: GeneratedArtifacts
|
|
scenario: "Store download, screenshot, minidump, shellcode, hosted, and future generated categories with sidecars."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: teamserver, arch: any, listener: n/a, artifact_category: generated}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerArtifactCatalogTests.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Generate download, screenshot, and payload artifacts and inspect Artifacts tab."]
|
|
|
|
- id: MODULE-ASSEMBLYEXEC-CONTRACT-001
|
|
area: Modules
|
|
feature: assemblyExec
|
|
scenario: "Generate shellcode on TeamServer from exe/dll/raw artifacts, preserve args, autocomplete artifact inputs, and execute on Windows beacon."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: generated}
|
|
evidence:
|
|
auto: ["core/modules/AssemblyExec/tests/testsAssemblyExec.cpp", "core/modules/AssemblyExec/tests/functional/testsAssemblyExecFunctional.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp", "C2Client/tests/test_console_panel.py"]
|
|
manual: ["Run assemblyExec --donut-exe Rubeus.exe -- <args> on Windows x64 HTTPS beacon."]
|
|
|
|
- id: MODULE-INJECT-CONTRACT-001
|
|
area: Modules
|
|
feature: inject
|
|
scenario: "Prepare shellcode payload from tools/beacons/raw, support pid/spawn modes, autocomplete payload and args, and execute on Windows beacon."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: generated}
|
|
evidence:
|
|
auto: ["core/modules/Inject/tests/testsInject.cpp", "core/modules/Inject/tests/functional/testsInjectFunctional.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp", "C2Client/tests/test_console_panel.py"]
|
|
manual: ["Run inject --pid <pid> --donut-exe Tool.exe -- <args> and inject with beacon payload option."]
|
|
|
|
- id: MODULE-DOWNLOAD-CONTRACT-001
|
|
area: Modules
|
|
feature: download
|
|
scenario: "Download remote file into GeneratedArtifacts/download/beacon using chunked output and registered sidecar."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: generated}
|
|
evidence:
|
|
auto: ["core/modules/Download/tests/testsDownload.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run download <remote-path> and verify generated artifact hash/size in Artifacts tab."]
|
|
|
|
- id: MODULE-UPLOAD-CONTRACT-001
|
|
area: Modules
|
|
feature: upload
|
|
scenario: "Upload an UploadedArtifact to a remote path with server-controlled input resolution."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: uploaded}
|
|
evidence:
|
|
auto: ["core/modules/Upload/tests/testsUpload.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Upload an operator file in Artifacts tab, run upload <artifact> <remote-path>, then cat/list it remotely."]
|
|
|
|
- id: MODULE-MINIDUMP-CONTRACT-001
|
|
area: Modules
|
|
feature: miniDump
|
|
scenario: "Dump LSASS to XORed GeneratedArtifacts/minidump/beacon output and support local decrypt helper."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: generated}
|
|
evidence:
|
|
auto: ["core/modules/MiniDump/tests/testsMiniDump.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run miniDump dump lsass.xored as elevated Windows beacon and verify generated artifact."]
|
|
|
|
- id: MODULE-SCREENSHOT-CONTRACT-001
|
|
area: Modules
|
|
feature: screenShot
|
|
scenario: "Capture desktop PNG, return chunked generated screenshot artifact, and show a single final console result."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: generated}
|
|
evidence:
|
|
auto: ["core/modules/ScreenShot/tests/testsScreenShot.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp", "teamServer/tests/TeamServerListenerSessionServiceTests.cpp"]
|
|
manual: ["Run screenShot desktop.png on Windows x64 HTTPS beacon and open generated PNG."]
|
|
|
|
- id: MODULE-POWERSHELL-CONTRACT-001
|
|
area: Modules
|
|
feature: powershell
|
|
scenario: "Execute inline commands and Scripts-backed -s payloads without sending literal -s to PowerShell."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: scripts}
|
|
evidence:
|
|
auto: ["core/modules/Powershell/tests/testsPowershell.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run powershell -s testScript.ps1 and verify script output, then run powershell whoami."]
|
|
|
|
- id: MODULE-PWSH-CONTRACT-001
|
|
area: Modules
|
|
feature: pwSh
|
|
scenario: "Load fixed rdm.dll from Tools/Any/any and execute/import PowerShell runner commands."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: tools}
|
|
evidence:
|
|
auto: ["core/modules/PwSh/tests/testsPwSh.cpp", "core/modules/PwSh/tests/functional/testsPwShFunctional.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run pwSh init, pwSh command, and pwSh script with rdm.dll from Tools/Any/any."]
|
|
|
|
- id: MODULE-SCRIPT-CONTRACT-001
|
|
area: Modules
|
|
feature: script
|
|
scenario: "Execute Scripts-backed Windows/Linux scripts with server-side script artifact resolution."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: scripts}
|
|
evidence:
|
|
auto: ["core/modules/Script/tests/testsScript.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run script with a Windows script and a Linux script on matching beacons."]
|
|
|
|
- id: MODULE-CHISEL-CONTRACT-001
|
|
area: Modules
|
|
feature: chisel
|
|
scenario: "Resolve fixed chisel binary from Tools for beacon arch and manage chisel start/status/stop."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: tools}
|
|
evidence:
|
|
auto: ["core/modules/Chisel/tests/testsChisel.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run chisel start/status/stop after placing chisel.exe under Tools/Windows/x64."]
|
|
|
|
- id: MODULE-DOTNETEXEC-CONTRACT-001
|
|
area: Modules
|
|
feature: dotnetExec
|
|
scenario: "Load .NET assemblies from Tools, execute loaded assemblies, and autocomplete load artifacts."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: tools}
|
|
evidence:
|
|
auto: ["core/modules/DotnetExec/tests/testsDotnetExec.cpp", "core/modules/DotnetExec/tests/functional/testsDotnetExecFunctional.cpp", "C2Client/tests/test_console_panel.py"]
|
|
manual: ["Run dotnetExec load <tool.dll> then execute a command from the loaded assembly."]
|
|
|
|
- id: MODULE-PSEXEC-CONTRACT-001
|
|
area: Modules
|
|
feature: psExec
|
|
scenario: "Resolve service executable from Tools or UploadedArtifacts, handle credentials, and execute remote service command."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: tools}
|
|
evidence:
|
|
auto: ["core/modules/PsExec/tests/testsPsExec.cpp", "core/modules/PsExec/tests/functional/testsPsExecFunctional.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run psExec against a lab Windows host with a Tools or UploadedArtifacts service binary."]
|
|
|
|
- id: MODULE-KERBEROSUSETICKET-CONTRACT-001
|
|
area: Modules
|
|
feature: kerberosUseTicket
|
|
scenario: "Load kirbi ticket from UploadedArtifacts and apply it on Windows beacon."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: uploaded}
|
|
evidence:
|
|
auto: ["core/modules/KerberosUseTicket/tests/testsKerberosUseTicket.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Upload a test .kirbi file and run kerberosUseTicket <artifact>."]
|
|
|
|
- id: MODULE-COFFLOADER-CONTRACT-001
|
|
area: Modules
|
|
feature: coffLoader
|
|
scenario: "Load COFF object from Tools and execute with packed arguments."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: tools}
|
|
evidence:
|
|
auto: ["core/modules/CoffLoader/tests/testsCoffLoader.cpp", "teamServer/tests/TeamServerCommandPreparationServiceTests.cpp"]
|
|
manual: ["Run coffLoader with a known test COFF artifact from Tools/Windows/x64."]
|
|
|
|
- id: MODULE-KEYLOGGER-CONTRACT-001
|
|
area: Modules
|
|
feature: keyLogger
|
|
scenario: "Start/stop keylogger and collect key output safely."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: generated}
|
|
evidence:
|
|
auto: ["core/modules/KeyLogger/tests/testsKeyLogger.cpp"]
|
|
manual: ["Run keyLogger start/stop in lab and verify expected output behavior."]
|
|
|
|
- id: MODULE-KEYLOGGER-GENERATED-ARTIFACT-002
|
|
area: Modules
|
|
feature: keyLogger generated artifact
|
|
scenario: "Persist keylogger follow-up output incrementally into GeneratedArtifacts/keylogger with host/timestamp naming."
|
|
priority: medium
|
|
validation: planned
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: generated}
|
|
evidence:
|
|
auto: []
|
|
manual: ["Planned feature from TODO; validate after implementation."]
|
|
|
|
- id: MODULE-REVERSEPORTFORWARD-CONTRACT-001
|
|
area: Modules
|
|
feature: reversePortForward
|
|
scenario: "Start/stop reverse port forwarding and emit recurring traffic chunks."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/ReversePortForward/tests/testsReversePortForward.cpp"]
|
|
manual: ["Open a reverse port forward through a live beacon and verify bidirectional traffic."]
|
|
|
|
- id: MODULE-SIMPLE-FILESYSTEM-001
|
|
area: Modules
|
|
feature: Simple filesystem modules
|
|
scenario: "Validate cat, cd, ls, mkdir, remove, tree, pwd, upload, download, and path error handling."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: any}
|
|
evidence:
|
|
auto: ["core/modules/Cat/tests/testsCat.cpp", "core/modules/ChangeDirectory/tests/testsChangeDirectory.cpp", "core/modules/ListDirectory/tests/testsListDirectory.cpp", "core/modules/MkDir/tests/testsMkDir.cpp", "core/modules/Remove/tests/testsRemove.cpp", "core/modules/Tree/tests/testsTree.cpp", "core/modules/PrintWorkingDirectory/tests/testsPrintWorkingDirectory.cpp"]
|
|
manual: ["Run pwd, ls, cd, cat, mkDir, remove, tree, upload, and download on Windows and Linux beacons."]
|
|
|
|
- id: MODULE-SIMPLE-SYSTEM-001
|
|
area: Modules
|
|
feature: Simple system info/process modules
|
|
scenario: "Validate whoami, getEnv, ipConfig, netstat, ps/listProcesses, killProcess, shell, and run."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Whoami/tests/testsWhoami.cpp", "core/modules/GetEnv/tests/testsGetEnv.cpp", "core/modules/IpConfig/tests/testsIpConfig.cpp", "core/modules/Netstat/tests/testsNetstat.cpp", "core/modules/ListProcesses/tests/testsListProcesses.cpp", "core/modules/KillProcess/tests/testsKillProcess.cpp", "core/modules/Shell/tests/testsShell.cpp", "core/modules/Run/tests/testsRun.cpp"]
|
|
manual: ["Run whoami, getEnv, ipConfig, netstat, ps, killProcess on a safe dummy PID, shell, and run."]
|
|
|
|
- id: MODULE-WINDOWS-EXEC-001
|
|
area: Modules
|
|
feature: Windows remote execution modules
|
|
scenario: "Validate cimExec, dcomExec, sshExec, winRm, and wmiExec parameter validation plus functional remote execution where available."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/CimExec/tests/testsCimExec.cpp", "core/modules/CimExec/tests/functional/testsCimExecFunctional.cpp", "core/modules/DcomExec/tests/testsDcomExec.cpp", "core/modules/DcomExec/tests/functional/testsDcomExecFunctional.cpp", "core/modules/SshExec/tests/testsSshExec.cpp", "core/modules/SshExec/tests/functional/testsSshExecFunctional.cpp", "core/modules/WinRM/tests/testsWinRM.cpp", "core/modules/WinRM/tests/functional/testsWinRMFunctional.cpp", "core/modules/WmiExec/tests/testsWmiExec.cpp", "core/modules/WmiExec/tests/functional/testsWmiExecFunctional.cpp"]
|
|
manual: ["Run one controlled lab command for each available remote execution method."]
|
|
|
|
- id: MODULE-WINDOWS-PRIVILEGE-001
|
|
area: Modules
|
|
feature: Windows privilege/token modules
|
|
scenario: "Validate makeToken, stealToken, rev2self, spawnAs, and related error handling."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/MakeToken/tests/testsMakeToken.cpp", "core/modules/StealToken/tests/testsStealToken.cpp", "core/modules/Rev2self/tests/testsRev2self.cpp", "core/modules/SpawnAs/tests/testsSpawnAs.cpp", "core/modules/SpawnAs/tests/functional/testsSpawnAsFunctional.cpp"]
|
|
manual: ["Run token operations in a lab VM with known local users and safe target process."]
|
|
|
|
- id: MODULE-WINDOWS-ADMIN-001
|
|
area: Modules
|
|
feature: Windows admin modules
|
|
scenario: "Validate registry, taskScheduler, evasion, enumerateShares, and enumerateRdpSessions."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Registry/tests/testsRegistry.cpp", "core/modules/TaskScheduler/tests/testsTaskScheduler.cpp", "core/modules/TaskScheduler/tests/functional/testsTaskSchedulerFunctional.cpp", "core/modules/Evasion/tests/testsEvasion.cpp", "core/modules/Evasion/tests/functional/testsEvasionFunctional.cpp", "core/modules/EnumerateShares/tests/testsEnumerateShares.cpp", "core/modules/EnumerateRdpSessions/tests/testsEnumerateRdpSessions.cpp", "core/modules/EnumerateRdpSessions/tests/functional/testsEnumerateRdpSessionsFunctional.cpp"]
|
|
manual: ["Run read-only registry/query/enumeration commands and one safe task scheduler create/delete cycle."]
|
|
|
|
- id: MODULE-CAT-CONTRACT-001
|
|
area: Modules
|
|
feature: cat
|
|
scenario: "Read a remote file and report readable errors for missing paths."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Cat/tests/testsCat.cpp"]
|
|
manual: ["Run cat on an existing and missing file on Windows/Linux golden paths."]
|
|
|
|
- id: MODULE-CD-CONTRACT-001
|
|
area: Modules
|
|
feature: cd
|
|
scenario: "Change current working directory and reject invalid paths clearly."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/ChangeDirectory/tests/testsChangeDirectory.cpp"]
|
|
manual: ["Run cd into an existing directory, then pwd, then cd to a missing path."]
|
|
|
|
- id: MODULE-LS-CONTRACT-001
|
|
area: Modules
|
|
feature: ls
|
|
scenario: "List remote directory contents with stable formatting and path error handling."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/ListDirectory/tests/testsListDirectory.cpp"]
|
|
manual: ["Run ls on default directory, explicit directory, and missing directory."]
|
|
|
|
- id: MODULE-MKDIR-CONTRACT-001
|
|
area: Modules
|
|
feature: mkDir
|
|
scenario: "Create remote directories and report existing/invalid path failures."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/MkDir/tests/testsMkDir.cpp"]
|
|
manual: ["Run mkDir for a new temp path and verify it appears in ls."]
|
|
|
|
- id: MODULE-REMOVE-CONTRACT-001
|
|
area: Modules
|
|
feature: remove
|
|
scenario: "Remove remote files/directories and report safe errors for missing paths."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Remove/tests/testsRemove.cpp"]
|
|
manual: ["Create a temp file/directory, run remove, then verify it is gone."]
|
|
|
|
- id: MODULE-TREE-CONTRACT-001
|
|
area: Modules
|
|
feature: tree
|
|
scenario: "Render recursive directory tree output without breaking console formatting."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Tree/tests/testsTree.cpp"]
|
|
manual: ["Run tree on a small controlled directory."]
|
|
|
|
- id: MODULE-PWD-CONTRACT-001
|
|
area: Modules
|
|
feature: pwd
|
|
scenario: "Return current working directory once, without duplicate console output."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/PrintWorkingDirectory/tests/testsPrintWorkingDirectory.cpp"]
|
|
manual: ["Run pwd and verify one queued line, one done line, and one output block."]
|
|
|
|
- id: MODULE-WHOAMI-CONTRACT-001
|
|
area: Modules
|
|
feature: whoami
|
|
scenario: "Return current user identity with clear output."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Whoami/tests/testsWhoami.cpp"]
|
|
manual: ["Run whoami on Windows and Linux golden paths."]
|
|
|
|
- id: MODULE-GETENV-CONTRACT-001
|
|
area: Modules
|
|
feature: getEnv
|
|
scenario: "Return environment variables or a selected variable with clear missing-value handling."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/GetEnv/tests/testsGetEnv.cpp"]
|
|
manual: ["Run getEnv PATH or equivalent safe variable on Windows/Linux."]
|
|
|
|
- id: MODULE-IPCONFIG-CONTRACT-001
|
|
area: Modules
|
|
feature: ipConfig
|
|
scenario: "Return interface/network information without truncating important data."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/IpConfig/tests/testsIpConfig.cpp"]
|
|
manual: ["Run ipConfig and compare with local OS network information."]
|
|
|
|
- id: MODULE-NETSTAT-CONTRACT-001
|
|
area: Modules
|
|
feature: netstat
|
|
scenario: "Return network connection/listening information in a readable format."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Netstat/tests/testsNetstat.cpp"]
|
|
manual: ["Run netstat and verify expected local listener/client connections appear."]
|
|
|
|
- id: MODULE-PS-CONTRACT-001
|
|
area: Modules
|
|
feature: ps
|
|
scenario: "List processes with PID/name metadata and no console formatting breakage."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/ListProcesses/tests/testsListProcesses.cpp"]
|
|
manual: ["Run ps and verify the beacon process or a known process appears."]
|
|
|
|
- id: MODULE-KILLPROCESS-CONTRACT-001
|
|
area: Modules
|
|
feature: killProcess
|
|
scenario: "Kill a safe dummy process and reject invalid PID values clearly."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/KillProcess/tests/testsKillProcess.cpp"]
|
|
manual: ["Start a harmless dummy process, run killProcess <pid>, verify it exits."]
|
|
|
|
- id: MODULE-SHELL-CONTRACT-001
|
|
area: Modules
|
|
feature: shell
|
|
scenario: "Execute shell commands with stdout/stderr capture and startup failure handling."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Shell/tests/testsShell.cpp"]
|
|
manual: ["Run shell whoami/echo and an invalid command on Windows/Linux."]
|
|
|
|
- id: MODULE-RUN-CONTRACT-001
|
|
area: Modules
|
|
feature: run
|
|
scenario: "Run local process commands with stdout/stderr capture and startup failure handling."
|
|
priority: high
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Run/tests/testsRun.cpp"]
|
|
manual: ["Run a safe command and an invalid executable path."]
|
|
|
|
- id: MODULE-CIMEXEC-CONTRACT-001
|
|
area: Modules
|
|
feature: cimExec
|
|
scenario: "Validate CIM execution parameters and execute a controlled remote command when lab target exists."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/CimExec/tests/testsCimExec.cpp", "core/modules/CimExec/tests/functional/testsCimExecFunctional.cpp"]
|
|
manual: ["Run cimExec against a controlled Windows lab host."]
|
|
|
|
- id: MODULE-DCOMEXEC-CONTRACT-001
|
|
area: Modules
|
|
feature: dcomExec
|
|
scenario: "Validate DCOM execution parameters and execute a controlled remote command when lab target exists."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/DcomExec/tests/testsDcomExec.cpp", "core/modules/DcomExec/tests/functional/testsDcomExecFunctional.cpp"]
|
|
manual: ["Run dcomExec against a controlled Windows lab host."]
|
|
|
|
- id: MODULE-SSHEXEC-CONTRACT-001
|
|
area: Modules
|
|
feature: sshExec
|
|
scenario: "Validate SSH execution parameters and execute a controlled remote command when lab target exists."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/SshExec/tests/testsSshExec.cpp", "core/modules/SshExec/tests/functional/testsSshExecFunctional.cpp"]
|
|
manual: ["Run sshExec against a controlled SSH lab host."]
|
|
|
|
- id: MODULE-WINRM-CONTRACT-001
|
|
area: Modules
|
|
feature: winRm
|
|
scenario: "Validate WinRM execution parameters and execute a controlled remote command when lab target exists."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/WinRM/tests/testsWinRM.cpp", "core/modules/WinRM/tests/functional/testsWinRMFunctional.cpp"]
|
|
manual: ["Run winRm against a controlled Windows lab host."]
|
|
|
|
- id: MODULE-WMIEXEC-CONTRACT-001
|
|
area: Modules
|
|
feature: wmiExec
|
|
scenario: "Validate WMI execution parameters and execute a controlled remote command when lab target exists."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/WmiExec/tests/testsWmiExec.cpp", "core/modules/WmiExec/tests/functional/testsWmiExecFunctional.cpp"]
|
|
manual: ["Run wmiExec against a controlled Windows lab host."]
|
|
|
|
- id: MODULE-MAKETOKEN-CONTRACT-001
|
|
area: Modules
|
|
feature: makeToken
|
|
scenario: "Create a logon token from credentials and report authentication failures clearly."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/MakeToken/tests/testsMakeToken.cpp"]
|
|
manual: ["Run makeToken with known lab credentials and then whoami or a token-aware check."]
|
|
|
|
- id: MODULE-STEALTOKEN-CONTRACT-001
|
|
area: Modules
|
|
feature: stealToken
|
|
scenario: "Impersonate token from a safe process and report invalid PID/access errors clearly."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/StealToken/tests/testsStealToken.cpp"]
|
|
manual: ["Run stealToken against a controlled process in a lab VM."]
|
|
|
|
- id: MODULE-REV2SELF-CONTRACT-001
|
|
area: Modules
|
|
feature: rev2self
|
|
scenario: "Revert impersonation back to the original token."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Rev2self/tests/testsRev2self.cpp"]
|
|
manual: ["Run makeToken or stealToken, then rev2self, then verify identity."]
|
|
|
|
- id: MODULE-SPAWNAS-CONTRACT-001
|
|
area: Modules
|
|
feature: spawnAs
|
|
scenario: "Spawn a process as supplied credentials and handle invalid packed parameters."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/SpawnAs/tests/testsSpawnAs.cpp", "core/modules/SpawnAs/tests/functional/testsSpawnAsFunctional.cpp"]
|
|
manual: ["Run spawnAs with known lab credentials and safe command."]
|
|
|
|
- id: MODULE-REGISTRY-CONTRACT-001
|
|
area: Modules
|
|
feature: registry
|
|
scenario: "Read/query registry keys and handle missing keys or malformed packed commands safely."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Registry/tests/testsRegistry.cpp"]
|
|
manual: ["Run a read-only query for HKCU/HKLM known key and a missing key."]
|
|
|
|
- id: MODULE-TASKSCHEDULER-CONTRACT-001
|
|
area: Modules
|
|
feature: taskScheduler
|
|
scenario: "Create/query/delete a scheduled task and validate parameter errors."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/TaskScheduler/tests/testsTaskScheduler.cpp", "core/modules/TaskScheduler/tests/functional/testsTaskSchedulerFunctional.cpp"]
|
|
manual: ["Create and delete a harmless lab scheduled task."]
|
|
|
|
- id: MODULE-EVASION-CONTRACT-001
|
|
area: Modules
|
|
feature: evasion
|
|
scenario: "Run supported evasion actions and report unsupported or failed actions clearly."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/Evasion/tests/testsEvasion.cpp", "core/modules/Evasion/tests/functional/testsEvasionFunctional.cpp"]
|
|
manual: ["Run supported evasion command in isolated lab VM and verify output only."]
|
|
|
|
- id: MODULE-ENUMERATESHARES-CONTRACT-001
|
|
area: Modules
|
|
feature: enumerateShares
|
|
scenario: "Enumerate network shares with readable output and safe error handling."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/EnumerateShares/tests/testsEnumerateShares.cpp"]
|
|
manual: ["Run enumerateShares against localhost or a controlled lab host."]
|
|
|
|
- id: MODULE-ENUMERATERDPSESSIONS-CONTRACT-001
|
|
area: Modules
|
|
feature: enumerateRdpSessions
|
|
scenario: "Enumerate RDP sessions with readable output and safe error handling."
|
|
priority: medium
|
|
validation: auto+manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: n/a}
|
|
evidence:
|
|
auto: ["core/modules/EnumerateRdpSessions/tests/testsEnumerateRdpSessions.cpp", "core/modules/EnumerateRdpSessions/tests/functional/testsEnumerateRdpSessionsFunctional.cpp"]
|
|
manual: ["Run enumerateRdpSessions on a lab Windows host with known session state."]
|
|
|
|
- id: MODULE-COMMANDSPEC-COVERAGE-001
|
|
area: Modules
|
|
feature: CommandSpec coverage
|
|
scenario: "Every user-facing module command has a CommandSpec JSON with assistant-renderable command_template metadata."
|
|
priority: critical
|
|
validation: auto
|
|
axes: {os: teamserver, arch: n/a, listener: n/a, artifact_category: command_specs}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandCatalogTests.cpp", "C2Client/tests/assistant_agent/test_command_specs.py", "C2Client/tests/assistant_agent/test_command_help_tool.py", "C2Client/tests/assistant_agent/test_module_state_tool.py", "C2Client/tests/assistant_agent/test_tool_registry.py"]
|
|
manual: []
|
|
|
|
- id: RELEASE-WINDOWS-ARTIFACTS-001
|
|
area: Release
|
|
feature: Windows release artifacts
|
|
scenario: "Build/release output contains WindowsBeacons/<arch>, WindowsModules, Tools, Scripts, CommandSpecs, and TeamServer data layout."
|
|
priority: critical
|
|
validation: manual
|
|
axes: {os: windows, arch: any, listener: n/a, artifact_category: any}
|
|
evidence:
|
|
auto: []
|
|
manual: ["Run clean release build and inspect build/artifacts/Release/data plus Windows artifact roots."]
|
|
|
|
- id: RELEASE-LINUX-ARTIFACTS-001
|
|
area: Release
|
|
feature: Linux release artifacts
|
|
scenario: "Build/release output contains LinuxBeacons/<arch>, LinuxModules/<arch>, Tools/Linux/<arch>, Scripts/Linux, and CommandSpecs."
|
|
priority: critical
|
|
validation: manual
|
|
axes: {os: linux, arch: any, listener: n/a, artifact_category: any}
|
|
evidence:
|
|
auto: []
|
|
manual: ["Run clean release build and inspect Linux artifacts with arch subfolders."]
|
|
|
|
- id: VALIDATION-GOLDEN-PATH-WINDOWS-001
|
|
area: Validation
|
|
feature: Windows golden path
|
|
scenario: "End-to-end Windows x64 HTTPS validation: connect, load module, run commands, use artifacts, generate output, host artifact."
|
|
priority: critical
|
|
validation: manual
|
|
axes: {os: windows, arch: x64, listener: https, artifact_category: any}
|
|
evidence:
|
|
auto: []
|
|
manual: ["Run the predetermined Windows golden path checklist once manual-results.yaml exists."]
|
|
|
|
- id: VALIDATION-GOLDEN-PATH-LINUX-001
|
|
area: Validation
|
|
feature: Linux golden path
|
|
scenario: "End-to-end Linux x64 HTTPS validation: connect, run commands, upload/download, script, and module lifecycle."
|
|
priority: critical
|
|
validation: manual
|
|
axes: {os: linux, arch: x64, listener: https, artifact_category: any}
|
|
evidence:
|
|
auto: []
|
|
manual: ["Run the predetermined Linux golden path checklist once manual-results.yaml exists."]
|
|
|
|
- id: VALIDATION-ERROR-HANDLING-001
|
|
area: Validation
|
|
feature: Error handling
|
|
scenario: "Reject invalid commands, missing artifacts, missing tools, invalid listener fields, and failed module preparation with clear messages."
|
|
priority: critical
|
|
validation: auto+manual
|
|
axes: {os: any, arch: any, listener: any, artifact_category: any}
|
|
evidence:
|
|
auto: ["teamServer/tests/TeamServerCommandPreparationServiceTests.cpp", "C2Client/tests/test_listener_panel.py", "C2Client/tests/test_console_panel.py"]
|
|
manual: ["Attempt missing tool, missing script, invalid listener port, and unknown command from UI."]
|