Works with any Mythic agent
Sage is built to drive any Mythic payload type, not one agent wrapped in a tool layer. It does not carry a hardcoded command list for any agent. It learns each agent’s interface from Mythic itself, at runtime:1
Find the installed payload types
get_payload_names and get_all_payload_info list every payload type installed in Mythic.
list_callbacks reports which agent each live callback runs.2
List each agent's commands
get_all_command_names_for_payloadtype and get_all_commands_for_payloadtype return the
commands that payload type advertises. Before tasking, Sage also reads the commands actually
loaded on the callback it plans to use.3
Read each command's argument schema
get_all_command_args_for_payloadtype returns a command’s parameters with their names, types,
required flags, defaults, allowed choices, and validation patterns, grouped into Mythic’s
mutually exclusive parameter groups so the model picks one tasking form instead of mixing them.4
Build a structured task from that schema
Before
issue_task_and_waitfor_task_output sends anything, Sage resolves the proposed
arguments against the live schema: it maps aliases to each parameter’s CLI name, selects the
parameter group, fills declared defaults, and checks required parameters and allowed choices.
A task that does not fit comes back to the model as a specific correction instead of a
rejected Mythic task. In supervised mode, the resolved command is what the approval card shows.get_ttp_guidance tailors a TTP’s arguments and examples to how
the target callback’s agent runs the tool.
Payload adapters
On top of that agent-agnostic path, Sage ships small per-payload adapters that capture lessons learned from running Sage with specific agents. They are polish, not a requirement: an agent without an adapter is still tasked through the discovery path above.
The adapters matter most for the capability layer, whose packaged
attack-chain steps encode payload-specific command forms. Automated graph collection
(
collect-graph) runs only on footholds with an adapter. You can still run SharpHound on any agent
through ordinary tasking and ingest the result with ingest_collection.
Tools
Every tool the Sage agents can call is either read-only or guarded, never both. Read-only tools never prompt for approval and cannot change target or Mythic state. Guarded tools are approval-gated in supervised mode and denied in conversation mode. Sage also checks each guarded tool against a preflight scope on your channel token and disables the tool up front when the scope is missing, rather than letting it fail mid-run. Every tool carries its classification in source, CI fails if one is missing, and an unclassified method defaults to guarded at runtime. The preflight scope is Sage’s own gate. The Mythic API calls behind a tool can need other scopes, including read scopes for read-only tools; see Minimum bot token scopes for the full set.
Each agent receives only its share of this list: the Mythic Operator handles callbacks, tasking,
files, credentials, tradecraft, and capabilities; the Mythic Payload agent handles payloads and C2
profiles; and the Sandbox agent holds
sandbox_exec. The discovery tools are available to both
Mythic agents. Type /tools in chat for the current list; it is deterministic and makes no model
call.
BloodHound graph tools come from the external BloodHound MCP server, not from Sage’s own code. See
BloodHound and MCP servers.
Minimum bot token scopes
Sage acts with the scopes of the API token you attach to the chat channel. For each session it mints a token from that channel token, and the minted token inherits exactly the channel token’s scopes, so the channel token is the whole permission boundary. In Mythic, a.write scope
includes its .read scope, and a token can only grant scopes it already holds. See Mythic’s
API tokens documentation
for how to create a scoped token; the full scope catalog is in
scopes.go.
Baseline
chat-ai.write and apitoken.write are hard requirements: without them Sage cannot answer in
the channel. The read scopes back the read-only tools. A missing read scope does not raise an
error: Mythic filters those records out, so Sage sees no callbacks, no task output, or no files.
Payload type, command, and command-parameter metadata need no scope, so the discovery tools work
with any token.
Required for the guarded tools you want
Example sets
callback.write includes callback.read, task.write includes task.read, and file.write
includes file.read, so the tasking set omits those reads. This mapping is derived from the Sage
and Mythic source for Mythic v4.0.0rc5. A write call missing its scope fails with a Mythic
missing_scope error; a missing read scope returns empty results instead.
The capability layer
On top of the tools sits a typed capability layer: actions with preconditions, effects, and structured verifiers that the planner chains from observed state. It models an attack chain generically (collect graph, escalate through controlled execution, extend rights, harvest credentials, forge tickets), and each step advances only on verified proof of the previous one. Nothing is recorded on assertion alone, and no benchmark-specific paths are baked into the product. Sage derives candidate capabilities at runtime from observed BloodHound and Mythic state, so the set the planner offers at any moment is the subset whose preconditions currently hold.execute_capability runs one action and records its effect to the engagement ledger only when the
capability’s verifier accepts the proof; build_capability_commands shows the Mythic parameters an
action would use without running it.
The 15 capabilities
Extension points
Three parts of Sage are plain files in the Sage repository, meant for you to edit rather than rebuild:- Agent prompts. Each agent’s system prompt is a markdown file in
Payload_Type/sage/prompts/, one per agent fromsupervisor.mdtosandbox.md. Edit a file and start a new chat: each new session re-reads every prompt, so your change takes effect without a restart. A restart is only needed for code changes. This is how you ship your own playbook with an engagement. - The TTP library.
Payload_Type/sage/ttps/holds over two hundred markdown tradecraft files covering Active Directory attack paths, ADCS abuse, ACL chains, and failure triage, among others. The agents plan from this library; editing it tunes what Sage knows. - The tool drop zone. Covered below:
Payload_Type/sage/tools/stages operator-supplied binaries into Mythic on demand.
Tool drop zone
Payload_Type/sage/tools/ is an operator drop zone for tool binaries. It ships empty. Sage
bundles no offensive binaries. When a TTP names a binary, ensure_tool_uploaded stages it from
this folder into Mythic on demand, so you do not have to upload it by hand. Name the file exactly
as the TTP’s binary_filename does (for example, SharpHound.exe). download_tool can also
fetch a pinned, sha256-verified binary from its TTP source into this folder, with your approval.