New Parameter group based command parsing when tasking
Users can tab-complete command parameters
Parameter Groups allow for conditional parameter sets
Tasking tracks if issued from command line, parsed cli, modals, browser scripts
Updated MITRE ATT&CK mappings
Reporting updated to use LaTeX for PDF generation
can generate PDF, raw LaTeX, or JSON output
Reporting can now filter out callbacks, users, or hosts
Reporting has an option for a MITRE ATT&CK overview with counts at the end
Browser Scripting updated
Browser scripts now return dictionaries instead of raw HTML
Users can issue follow-on tasks right from browser scripts
Browser Scripts can generate tables, download links, links to search pages, and screenshot buttons
Improved search page
Can search across tasking, callbacks, files, screenshots, tokens, and more
Searches can be saved and linked to via the updated URL bar
Translation containers now tracked in the UI and indicated when they are associated or not associated to payload type containers
Improved information for C2 profile status (container running vs internal server running)
Payloads page shows which C2 profiles are loaded into the payloads and if those profiles are currently running or not
You can re-trigger a payload to build from the payloads page without having to go through all the steps again
C2 profiles can expose redirect rules and check agent configurations to make sure everything aligns well between the two. These functions exist within the C2 Profile container and are taskable through the payloads page in the UI.
The main callbacks page has new icons for the egress route of agents (wifi or link icon) that, when clicked, will show a graph view of the egress path of that agent’s traffic.
The main callbacks page can track the sleep information for a callback automatically (based on the agent updating it for the callback) and display it (orange or blue alarm clock icon)
All columns on the main callbacks page are filterable based on data or can be hidden completely by right clicking on the column headers.
This also applies to all of the tables generated via browser scripting
Response output is now paginated to help reduce the stress of streaming a lot of output for agents
Response tables in from browser scripts are now virtualized to help reduce the stress of displaying hundreds or thousands of rows at a time
Normal output is now displayed via an Ace editor, so if the output is JSON, you can collapse/expand sections like a normal text editor
Graph view now uses Dagre for D3 rendering of graphs and automatically groups agents together on the same host for easier reading
The display can be changed via the dropdown on the top left for:
Left-to-right or bottom-to-top directions
Showing all callbacks or just the active ones
Showing all edges or only the active edges
The resulting graph can be saved as a PNG for easier inclusion in reports
GraphQL endpoints have been added for the new React user interface
the scripting PyPi package will eventually move to use these instead of the REST endpoints
“translation container” support for agent’s that want their own custom c2 message spec and support for arbitrary other encryption outside of the default Mythic supported ones
OPSEC scripting checks, logging, bypasses for tasking
Alpha version of new back-end/UI updates for nginx reverse proxy, hasura graphql, and react
All Payload Types moved out of main Mythic repo and into Mythic Agents organization
Track sleep information in UI in easy-to-see form (new UI only)
Track linked agent info in the table ui form of working with callbacks (new ui only)
New way of viewing linked agents in the UI using dagre-d3 instead of raw d3 (new ui only)
Commands track which OS they support. This helps things payload types like poseidon that might have os-specific commands since golang can compile to multiple operating systems
Deleted payloads can’t be used to create new callbacks - instead, mythic will generate a warning in the UI alerting you with information about the payload, but the agent will get a 404 and blank message back.
De-duplication of alert messages
Tasks can change their display_params in the create_tasking function to alter what user’s see - this helps with ugly large json blocks from using structured input. The original parameters can still be queried through the UI if the user wants to see the original JSON
Tasks can set stdout/stderr during create_tasking to help with debugging or recreating artifacts
Payload creation can track its own build_message , build_stderr , and build_stdoutfor stdout and stderr messages to make it easier to see what happened during creation. This split information is also viewable via the Created Payloads page.
Command parameters can opt to have their choices be all commands for a payload type or all loaded commands
Command parameters can filter down their choices based on command attributes (supported os and if they support process injection)
Password policy now added - requires all passwords to be at least 12 characters long
Mythic scripting (i.e. the mythic PyPi package) has been updated to version 0.0.19 to support these changes
C2 Profile specific OPSEC checks - provide an opsec function to your C2 Profiles to check if the parameters that the operator selected pass your risk-level before even allowing a payload to be created.
RPC Calls are updated within the Payload Type containers to allow for dynamic queries and updates. New RPC calls just import one file
Removed ability for users to create new accounts on the login page
Re-build payload option from the created payloads page
Export payload from created payloads page and import it in the payloads creation page to trigger a new payload
Starting Mythic with MYTHIC_DEBUG environment variable or debug set to true in the mythic-docker/config.json file will cause mythic to be extremely verbose in agent messages to help with debugging development
Merged in a pull request to update ATT&CK to ATT&CK v9
The following are the breaking changes for this version
For detailed steps on how to make updates as a developer, check out the updating guide for how to take your 2.1.* agent into the 2.2.2 Mythic
All Payload Types and C2 Profiles are split out from the main Mythic repo. If you just install mythic and start it, there will be no payload types or c2 profiles that sync in. You need to leverage the installer script to install additional agents from GitHub
To help support this and keep track of these sorts of updates, containers now have “versions” and the main Mythic server has a range of supported container versions. If you have a container that tries to check in that’s outside that range, you’ll get a warning in the Mythic UI.
All Payload Types need to do the following:
Control for container files have been moved into PyPi packages rather than just raw files on disk so that updating them will be easier going forward. The current version needed for this is version 0.0.42 (yes, lots of development has been going on): pip install mythic_payloadtype_container==0.0.42.
If you are using a DockerImage from the itsafeaturemythic repo, update to the latest:
csharp_payload==0.0.11
python38_payload==0.0.4
xgolang_payload==0.0.9
leviathan_payload==0.0.4
Updating to using a PyPi package instead of local files means that you need to adjust the imports for all of the Python files for your agents. It’s nothing too crazy, but you’ll update like so: Payload Type Info
All C2 Profiles need to do the following:
Control for container files has been moved into PyPi packages rather than just raw files on disk so that updating them will be easier going forward. The current version needed for this is version 22: pip install mythic_c2_container==0.0.22
Updating to using a PyPi packages instead of local files means that you need to adjust the imports for all of the Python files for your C2 profiles. It’s nothing too crazy, but you’ll need to update like so if you’ve created your own C2 profiles: C2 Docker Containers.
Mythic crypto is defined by the Payload Type now rather than the C2 profile. This is part of a change to keep each container in charge of just one thing. Payload Types by default have Mythic handle their crypto, to have a Payload Type do something other than what Mythic does, set mythic_encrypts = False in the builder file for your Payload Type.
To more easily support various crypto components going forward, the selection and usage of Crypto parameters in C2 profiles has changed slightly. There’s no longer a requirement that the parameter name be AESPSK. Instead, there is another field you can specify for any parameter that crypto_type=True. This specifies that the resulting thing that the user selects/inputs defines what kind of crypto to use. This is simply a boolean value so that you can still leverage the C2 Parameter as normal (string input, choose one, etc) with the expectation that the final value is the type of crypto. In the case of Mythic’s standard crypto, the value would be aes256_hmac. This means that Mythic no longer auto-generates a base64 of an AES256 key when displayed to the user, this happens behind the scenes if the resulting type is aes256_hmac.
This also causes some variation when building your payload. Normally, you get a dictionary of {“key”: “value”} for each C2 Profile parameter for you to leverage when building your payload. For crypto though, this could be highly variable and the components that you want to leverage could vary widely. So, if the parameter has crypto_type=True, then you’ll get a dictionary of values. This is split out by type, encryption key, and decryption key because you might want to leverage some pub/priv key asymmetric crypto where those pieces are different or you might want to leverage some other kind of symmetric crypto.
{ "key": { "crypto_type": "the value that the user selected, like aes256_hmac", "enc_key": "base64 of the encryption key", "dec_key": "base64 of the decryption key" }}
Make sure you update your pip install of the mythic==0.0.19 package for scripting to handle the updated aspects of these objects.
Toggle timestamp view in the UI to see either UTC timestamps or localized timestamps
Persistent, unified processes listings based on the host
Persistent, unified file browser
Badges to see the number of new tasks on a callback you’re not currently viewing
More malleable HTTP-based C2 profile with a JSON config
Cookie Support
Arbitrary transforms to text (base64, append, prepend, add random values, etc etc)
Proxy Support
User Agent strings
Slack notifications on new callbacks
The ability to have this only fire for specific payloads (i.e. you might not want it to happen for all of your lateral movement payloads, but do want it to fire for your phishing payloads)
Exportable search results (just export the page or the entire results of a search query)
Exportable artifact search results (just the page or the entire results)
More granular search controls
Filter search by operator
Duplicate saved parameters for c2 profiles to make quick edits
Edit credentials that are saved in the database
Add comments to the saved credentials
Export final report in JSON format
Export information about downloaded / uploaded files
Automatically calculate MD5/SHA1 of files
Badge notifications and searching for Keylogging
Task comments shown when viewing files
Download command output as a text file
Selective caching of responses so large output doesn’t slow down the entire callback
Confirmation for mass exit/remove via the UI of callbacks
Issuing a command that causes a parameter popup will first try to auto-populate the values with the last instance of the command you ran on that callback
Save current browsing view in main callback window across refreshes (open tabs)
8hr default token expiration and browser will auto-renew periodically so that there are fewer interruptions in longer ops
Use tab to select autocomplete option and up/down arrows to toggle through autocomplete options
Use ctrl+[ and ctrl+] to navigate previous/next tab in the active callbacks tab.
set callback description from command line via set description my description and reset it back to the default for the payload with set description reset
Your open tabs for the active callbacks view will be remembered per-browser
View Apfell’s web log from within the main web UI
Only start select payload type containers when starting Apfell - ./start_apfell.sh viper will only start the viper payload type container, but all of the c2 profiles and main containers will still start.
Turn arbitrary VMs into Apfell compatible containers
Import and export single commands at a time instead of the whole payload type
C2 profiles support jitter percentages
Kill Dates in C2 profiles
Bulk download files from downloads page as zip file
Strict argument checking on tasking to make sure required parameters are given
Provide a single streaming list of tasking for all callbacks combined that the operation lead can watch
Filter callback viewable tasks to a single operator or all operators, certain command, and certain task ranges
Add new buttons for hiding or exiting multiple callbacks at once
C2 profiles have associated Notes, Sample Server configuration, and Sample Client configurations that are present from the main UI to give context and base configuration information. This will be particularly useful as C2 profiles grow more complex.
Provide and an interface for supporting P2P communications and visualizations
Provide a recommended style guide for how to create new payloads to best fit in and leverage all of Apfell’s features
Integration of Poseidon Agent
Integration of Atlas Agent
Integration of Chrome-extension Agent
Introduction of command-line short-hands such as swap_filenames to allow operators to type uploaded filenames, but have agents get file IDs instead.
All files are now contained within the Apfell folder, no more docker volumes mounted in weird spots automatically
Edit C2 profile code and configurations right in the browser
Included an ‘event log’ to see all events Apfell is doing behind the scenes as well as allow operators to ‘chat’ and store messages within their operation. If an operator sends a message on this screen, it’ll be shown to all operators in that operation that are on the Active Callbacks page.
Included a ‘web log’ to see all the web requests to Apfell in the UI
Broke out transforms for commands and create/load operations to mirror the style of browser scripts
Exporting/Importing a payload type will bring along with it: payload code, all associated transforms, all command code, all browser scripts, and all c2 profile associated code.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Mythic","colors":{"primary":"#6D70A7","light":"#50B071","dark":"#6D70A7"},"logo":{"light":"https://mintcdn.com/specterops-3/3s2YOrygh-Ut9KJD/logo/mythic.png?fit=max\u0026auto=format\u0026n=3s2YOrygh-Ut9KJD\u0026q=85\u0026s=9dc129a1531ec4f44de0b0e79ad03679","dark":"https://mintcdn.com/specterops-3/3s2YOrygh-Ut9KJD/logo/mythic.png?fit=max\u0026auto=format\u0026n=3s2YOrygh-Ut9KJD\u0026q=85\u0026s=9dc129a1531ec4f44de0b0e79ad03679","href":"https://docs.mythic-c2.net/"},"favicon":"https://mintcdn.com/specterops-3/I6wn8nE0SX0nqRFZ/favicon.png?fit=max\u0026auto=format\u0026n=I6wn8nE0SX0nqRFZ\u0026q=85\u0026s=20b11a663bf17cfc5bedb978b1f77b77","appearance":{"default":"dark"},"background":{"decoration":"windows"},"navbar":{"links":[{"href":"https://github.com/its-a-feature/Mythic","label":"Get the Code"}],"primary":{"type":"button","label":"Issues","href":"https://github.com/its-a-feature/Mythic/issues"}},"footer":{"socials":{"x":"https://twitter.com/its_a_feature_","github":"https://github.com/its-a-feature/Mythic","slack":"https://slack.specterops.io"}},"fonts":{"heading":{"family":"Nunito Sans","weight":900,"source":"https://fonts.gstatic.com/s/nunitosans/v15/pe0TMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp7t1R-s.woff2","format":"woff2"}},"styling":{"codeblocks":"system","latex":false},"integrations":{"plausible":{"domain":"docs.mythic-c2.net"}},"thumbnails":{"appearance":"dark","background":"https://mintcdn.com/specterops-3/3s2YOrygh-Ut9KJD/logo/thumbnail.png?fit=max\u0026auto=format\u0026n=3s2YOrygh-Ut9KJD\u0026q=85\u0026s=c1d77133045e590ac2a1e944608a0a37"},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/its-a-feature/Mythic"},{"anchor":"#mythic Community","icon":"slack","href":"https://slack.specterops.io"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"specterops-3","hasAudioNarration":false,"actualSubdomain":"specterops-3","customDomains":["docs.mythic-c2.net"],"gitSource":{"type":"github","owner":"mythicmeta","repo":"mintlify_documentation","deployBranch":"primary","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a96ebe38cf6faeffe797f36","collectionId":"1e9319b1-0b78-415d-bb0b-3066e8fc4515","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6a96ebe38cf6faeffe797f36"},"feedback":{"thumbs":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6a96ebe38cf6faeffe797f36","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"Development","count":153},{"language":"default","tag":"overview","count":153},{"language":"default","tag":"Documentation","count":126},{"language":"default","tag":"Overview","count":111},{"language":"default","tag":"1. Payload Type Development","count":58},{"language":"default","tag":"Operational Pieces","count":58},{"language":"default","tag":"Hooking Features","count":42},{"language":"default","tag":"2. C2 Development","count":28},{"language":"default","tag":"4. Create Tasking \u0026 Comms Format","count":22},{"language":"default","tag":"Agent Messages","count":20}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"version-2.3/common-qa/change-log","slug":"/version-2.3/common-qa/change-log","pageMetadata":{"title":"Change Log","description":null,"href":"/version-2.3/common-qa/change-log","hidden":false},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`what’s-new-for-2-3`,children:`What’s new for 2.3?`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`New React-based User Interface`}),`\n`,_jsxs(_components.li,{children:[`New Parameter group based command parsing when tasking`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Users can tab-complete command parameters`}),`\n`,_jsx(_components.li,{children:`Parameter Groups allow for conditional parameter sets`}),`\n`,_jsx(_components.li,{children:`Tasking tracks if issued from command line, parsed cli, modals, browser scripts`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{children:`Updated MITRE ATT\u0026CK mappings`}),`\n`,_jsxs(_components.li,{children:[`Reporting updated to use LaTeX for PDF generation`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`can generate PDF, raw LaTeX, or JSON output`}),`\n`,_jsx(_components.li,{children:`Reporting can now filter out callbacks, users, or hosts`}),`\n`,_jsx(_components.li,{children:`Reporting has an option for a MITRE ATT\u0026CK overview with counts at the end`}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Browser Scripting updated`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Browser scripts now return dictionaries instead of raw HTML`}),`\n`,_jsx(_components.li,{children:`Users can issue follow-on tasks right from browser scripts`}),`\n`,_jsx(_components.li,{children:`Browser Scripts can generate tables, download links, links to search pages, and screenshot buttons`}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Improved search page`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Can search across tasking, callbacks, files, screenshots, tokens, and more`}),`\n`,_jsx(_components.li,{children:`Searches can be saved and linked to via the updated URL bar`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{children:`Translation containers now tracked in the UI and indicated when they are associated or not associated to payload type containers`}),`\n`,_jsx(_components.li,{children:`Improved information for C2 profile status (container running vs internal server running)`}),`\n`,_jsx(_components.li,{children:`Payloads page shows which C2 profiles are loaded into the payloads and if those profiles are currently running or not`}),`\n`,_jsx(_components.li,{children:`You can re-trigger a payload to build from the payloads page without having to go through all the steps again`}),`\n`,_jsx(_components.li,{children:`C2 profiles can expose redirect rules and check agent configurations to make sure everything aligns well between the two. These functions exist within the C2 Profile container and are taskable through the payloads page in the UI.`}),`\n`,_jsx(_components.li,{children:`The main callbacks page has new icons for the egress route of agents (wifi or link icon) that, when clicked, will show a graph view of the egress path of that agent’s traffic.`}),`\n`,_jsx(_components.li,{children:`The main callbacks page can track the sleep information for a callback automatically (based on the agent updating it for the callback) and display it (orange or blue alarm clock icon)`}),`\n`,_jsxs(_components.li,{children:[`All columns on the main callbacks page are filterable based on data or can be hidden completely by right clicking on the column headers.`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`This also applies to all of the tables generated via browser scripting`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{children:`Response output is now paginated to help reduce the stress of streaming a lot of output for agents`}),`\n`,_jsx(_components.li,{children:`Response tables in from browser scripts are now virtualized to help reduce the stress of displaying hundreds or thousands of rows at a time`}),`\n`,_jsx(_components.li,{children:`Normal output is now displayed via an Ace editor, so if the output is JSON, you can collapse/expand sections like a normal text editor`}),`\n`,_jsxs(_components.li,{children:[`Graph view now uses Dagre for D3 rendering of graphs and automatically groups agents together on the same host for easier reading`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The display can be changed via the dropdown on the top left for:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Left-to-right or bottom-to-top directions`}),`\n`,_jsx(_components.li,{children:`Showing all callbacks or just the active ones`}),`\n`,_jsx(_components.li,{children:`Showing all edges or only the active edges`}),`\n`,_jsx(_components.li,{children:`The resulting graph can be saved as a PNG for easier inclusion in reports`}),`\n`]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`GraphQL endpoints have been added for the new React user interface`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`the scripting PyPi package will eventually move to use these instead of the REST endpoints`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`what’s-new-for-2-2`,children:`What’s new for 2.2?`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`“translation container” support for agent’s that want their own custom c2 message spec and support for arbitrary other encryption outside of the default Mythic supported ones`}),`\n`,_jsx(_components.li,{children:`OPSEC scripting checks, logging, bypasses for tasking`}),`\n`,_jsxs(_components.li,{children:[`Solidified P2P spec - `,_jsx(_components.a,{href:`/version-2.3/customizing/c2-related-development/c2-profile-code/agent-side-coding/delegates`,children:`Delegates`}),` and `,_jsx(_components.a,{href:`/version-2.3/customizing/hooking-features/action-p2p_info`,children:`P2P Connections`})]}),`\n`,_jsx(_components.li,{children:`Alpha version of new back-end/UI updates for nginx reverse proxy, hasura graphql, and react`}),`\n`,_jsx(_components.li,{children:`All Payload Types moved out of main Mythic repo and into Mythic Agents organization`}),`\n`,_jsx(_components.li,{children:`Track sleep information in UI in easy-to-see form (new UI only)`}),`\n`,_jsx(_components.li,{children:`Track linked agent info in the table ui form of working with callbacks (new ui only)`}),`\n`,_jsx(_components.li,{children:`New way of viewing linked agents in the UI using dagre-d3 instead of raw d3 (new ui only)`}),`\n`,_jsx(_components.li,{children:`Commands track which OS they support. This helps things payload types like poseidon that might have os-specific commands since golang can compile to multiple operating systems`}),`\n`,_jsx(_components.li,{children:`Deleted payloads can’t be used to create new callbacks - instead, mythic will generate a warning in the UI alerting you with information about the payload, but the agent will get a 404 and blank message back.`}),`\n`,_jsx(_components.li,{children:`De-duplication of alert messages`}),`\n`,_jsxs(_components.li,{children:[`Tasks can change their `,_jsx(_components.code,{children:`display_params`}),` in the `,_jsx(_components.code,{children:`create_tasking`}),` function to alter what user’s see - this helps with ugly large json blocks from using structured input. The original parameters can still be queried through the UI if the user wants to see the original JSON`]}),`\n`,_jsxs(_components.li,{children:[`Tasks can set stdout/stderr during `,_jsx(_components.code,{children:`create_tasking`}),` to help with debugging or recreating artifacts`]}),`\n`,_jsxs(_components.li,{children:[`Payload creation can track its own `,_jsx(_components.code,{children:`build_message`}),` , `,_jsx(_components.code,{children:`build_stderr`}),` , and `,_jsx(_components.code,{children:`build_stdout`}),`for stdout and stderr messages to make it easier to see what happened during creation. This split information is also viewable via the Created Payloads page.`]}),`\n`,_jsx(_components.li,{children:`Command parameters can opt to have their choices be all commands for a payload type or all loaded commands`}),`\n`,_jsx(_components.li,{children:`Command parameters can filter down their choices based on command attributes (supported os and if they support process injection)`}),`\n`,_jsx(_components.li,{children:`Password policy now added - requires all passwords to be at least 12 characters long`}),`\n`,_jsxs(_components.li,{children:[`Mythic scripting (i.e. the `,_jsx(_components.code,{children:`mythic`}),` PyPi package) has been updated to version 0.0.19 to support these changes`]}),`\n`,_jsxs(_components.li,{children:[`C2 Profile specific OPSEC checks - provide an `,_jsx(_components.code,{children:`opsec`}),` function to your C2 Profiles to check if the parameters that the operator selected pass your risk-level before even allowing a payload to be created.`]}),`\n`,_jsx(_components.li,{children:`RPC Calls are updated within the Payload Type containers to allow for dynamic queries and updates. New RPC calls just import one file`}),`\n`,_jsx(_components.li,{children:`Removed ability for users to create new accounts on the login page`}),`\n`,_jsx(_components.li,{children:`Re-build payload option from the created payloads page`}),`\n`,_jsx(_components.li,{children:`Export payload from created payloads page and import it in the payloads creation page to trigger a new payload`}),`\n`,_jsxs(_components.li,{children:[`Starting Mythic with `,_jsx(_components.code,{children:`MYTHIC_DEBUG`}),` environment variable or `,_jsx(_components.code,{children:`debug`}),` set to true in the `,_jsx(_components.code,{children:`mythic-docker/config.json`}),` file will cause mythic to be extremely verbose in agent messages to help with debugging development`]}),`\n`,_jsx(_components.li,{children:`Merged in a pull request to update ATT\u0026CK to ATT\u0026CK v9`}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`The following are the breaking changes for this version`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`For detailed steps on how to make updates as a developer, check out the `,_jsx(_components.a,{href:`https://github.com/MythicMeta/Documentation/blob/primary/updating/mythic-2.1-greater-than-2.2-updates/agents-2.1.-greater-than-2.2.2`,children:`updating guide`}),` for how to take your 2.1.* agent into the 2.2.2 Mythic`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`All Payload Types and C2 Profiles are split out from the main Mythic repo. If you just install mythic and start it, there will be `,_jsx(_components.em,{children:`no`}),` payload types or c2 profiles that sync in. You need to leverage the installer script to install additional agents from GitHub`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`To help support this and keep track of these sorts of updates, containers now have “versions” and the main Mythic server has a range of supported container versions. If you have a container that tries to check in that’s outside that range, you’ll get a warning in the Mythic UI.`}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`All Payload Types need to do the following:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Control for container files have been moved into PyPi packages rather than just raw files on disk so that updating them will be easier going forward. The current version needed for this is version 0.0.42 (yes, lots of development has been going on): `,_jsx(_components.code,{children:`pip install mythic_payloadtype_container==0.0.42`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`If you are using a DockerImage from the `,_jsx(_components.code,{children:`itsafeaturemythic`}),` repo, update to the latest:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`csharp_payload==0.0.11`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`python38_payload==0.0.4`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`xgolang_payload==0.0.9`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`leviathan_payload==0.0.4`}),`\n`]}),`\n`]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Updating to using a PyPi package instead of local files means that you need to adjust the imports for all of the Python files for your agents. It’s nothing too crazy, but you’ll update like so: `,_jsx(_components.a,{href:`/version-2.3/customizing/payload-type-development/payload-type-info#building`,children:`Payload Type Info`})]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`All C2 Profiles need to do the following:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Control for container files has been moved into PyPi packages rather than just raw files on disk so that updating them will be easier going forward. The current version needed for this is version 22: `,_jsx(_components.code,{children:`pip install mythic_c2`}),`_container`,_jsx(_components.code,{children:`==0.0.22`})]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Updating to using a PyPi packages instead of local files means that you need to adjust the imports for all of the Python files for your C2 profiles. It’s nothing too crazy, but you’ll need to update like so if you’ve created your own C2 profiles: `,_jsx(_components.a,{href:`/version-2.3/customizing/c2-related-development/c2-profile-code/server-side-coding/c2-docker-containers#c-2-profile-class`,children:`C2 Docker Containers`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Mythic crypto is defined by the Payload Type now rather than the C2 profile. This is part of a change to keep each container in charge of just one thing. Payload Types by default have Mythic handle their crypto, to have a Payload Type do something `,_jsx(_components.em,{children:`other`}),` than what Mythic does, set `,_jsx(_components.code,{children:`mythic_encrypts = False`}),` in the builder file for your Payload Type.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`To more easily support various crypto components going forward, the selection and usage of Crypto parameters in C2 profiles has changed slightly. There’s no longer a requirement that the parameter name be `,_jsx(_components.code,{children:`AESPSK`}),`. Instead, there is another field you can specify for any parameter that `,_jsx(_components.code,{children:`crypto_type=True`}),`. This specifies that the resulting thing that the user selects/inputs defines what kind of crypto to use. This is simply a boolean value so that you can still leverage the C2 Parameter as normal (string input, choose one, etc) with the expectation that the final value is the type of crypto. In the case of Mythic’s standard crypto, the value would be `,_jsx(_components.code,{children:`aes256_hmac`}),`. This means that Mythic no longer auto-generates a base64 of an AES256 key when displayed to the user, this happens behind the scenes if the resulting type is `,_jsx(_components.code,{children:`aes256_hmac`}),`.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`This also causes some variation when building your payload. Normally, you get a dictionary of {“key”: “value”} for each C2 Profile parameter for you to leverage when building your payload. For crypto though, this could be highly variable and the components that you want to leverage could vary widely. So, if the parameter has `,_jsx(_components.code,{children:`crypto_type=True`}),`, then you’ll get a dictionary of values. This is split out by type, encryption key, and decryption key because you might want to leverage some pub/priv key asymmetric crypto where those pieces are different or you might want to leverage some other kind of symmetric crypto.`]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"crypto_type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"the value that the user selected, like aes256_hmac\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"enc_key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"base64 of the encryption key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"dec_key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"base64 of the decryption key\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Make sure you update your pip install of the `,_jsx(_components.code,{children:`mythic==0.0.19`}),` package for scripting to handle the updated aspects of these objects.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-changed-for-2-0`,children:`What Changed for 2.0?`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Rebranded Apfell to Mythic`}),`\n`,_jsx(_components.li,{children:`Added File Browser support to the apfell and poseidon agents`}),`\n`,_jsx(_components.li,{children:`Added SOCKS5 support to poseidon`}),`\n`,_jsx(_components.li,{children:`Added user roles during operations (operator, developer, spectator)`}),`\n`,_jsx(_components.li,{children:`Added a documentation docker container with more verbose details including overviews, traffic flows, opsec considerations, and detailed help/info`}),`\n`,_jsx(_components.li,{children:`Updated the general UI for Mythic`}),`\n`,_jsx(_components.li,{children:`Updated the event logging system for “warnings” that can be resolved`}),`\n`,_jsx(_components.li,{children:`Added ability for search to look through file browsing and eventing data as well`}),`\n`,_jsx(_components.li,{children:`Operator feedback if their parameters don’t meet certain validation requirements before the commands even make it to the agents`}),`\n`,_jsx(_components.li,{children:`Complete restructuring of how a developer uses/creates agents/c2 profiles`}),`\n`,_jsx(_components.li,{children:`Added RPC call functionality from payload type and c2 profile containers to the main mythic instance to start hooking into the back-end for scripting`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-changed-for-1-4`,children:`What changed for 1.4?`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Toggle timestamp view in the UI to see either UTC timestamps or localized timestamps`}),`\n`,_jsx(_components.li,{children:`Persistent, unified processes listings based on the host`}),`\n`,_jsx(_components.li,{children:`Persistent, unified file browser`}),`\n`,_jsx(_components.li,{children:`Badges to see the number of new tasks on a callback you’re not currently viewing`}),`\n`,_jsxs(_components.li,{children:[`More malleable HTTP-based C2 profile with a JSON config`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Cookie Support`}),`\n`,_jsx(_components.li,{children:`Arbitrary transforms to text (base64, append, prepend, add random values, etc etc)`}),`\n`,_jsx(_components.li,{children:`Proxy Support`}),`\n`,_jsx(_components.li,{children:`User Agent strings`}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Slack notifications on new callbacks`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The ability to have this only fire for specific payloads (i.e. you might not want it to happen for all of your lateral movement payloads, but do want it to fire for your phishing payloads)`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{children:`Exportable search results (just export the page or the entire results of a search query)`}),`\n`,_jsx(_components.li,{children:`Exportable artifact search results (just the page or the entire results)`}),`\n`,_jsxs(_components.li,{children:[`More granular search controls`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Filter search by operator`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{children:`Duplicate saved parameters for c2 profiles to make quick edits`}),`\n`,_jsx(_components.li,{children:`Edit credentials that are saved in the database`}),`\n`,_jsx(_components.li,{children:`Add comments to the saved credentials`}),`\n`,_jsx(_components.li,{children:`Export final report in JSON format`}),`\n`,_jsx(_components.li,{children:`Export information about downloaded / uploaded files`}),`\n`,_jsx(_components.li,{children:`Automatically calculate MD5/SHA1 of files`}),`\n`,_jsx(_components.li,{children:`Badge notifications and searching for Keylogging`}),`\n`,_jsx(_components.li,{children:`Task comments shown when viewing files`}),`\n`,_jsx(_components.li,{children:`Download command output as a text file`}),`\n`,_jsx(_components.li,{children:`Selective caching of responses so large output doesn’t slow down the entire callback`}),`\n`,_jsx(_components.li,{children:`Confirmation for mass exit/remove via the UI of callbacks`}),`\n`,_jsx(_components.li,{children:`Issuing a command that causes a parameter popup will first try to auto-populate the values with the last instance of the command you ran on that callback`}),`\n`,_jsx(_components.li,{children:`Save current browsing view in main callback window across refreshes (open tabs)`}),`\n`,_jsx(_components.li,{children:`8hr default token expiration and browser will auto-renew periodically so that there are fewer interruptions in longer ops`}),`\n`,_jsx(_components.li,{children:`Use tab to select autocomplete option and up/down arrows to toggle through autocomplete options`}),`\n`,_jsxs(_components.li,{children:[`Use `,_jsx(_components.code,{children:`ctrl+[`}),` and `,_jsx(_components.code,{children:`ctrl+]`}),` to navigate previous/next tab in the `,_jsx(_components.code,{children:`active callbacks`}),` tab.`]}),`\n`,_jsxs(_components.li,{children:[`set callback description from command line via `,_jsx(_components.code,{children:`set description my description`}),` and reset it back to the default for the payload with `,_jsx(_components.code,{children:`set description reset`})]}),`\n`,_jsx(_components.li,{children:`Your open tabs for the active callbacks view will be remembered per-browser`}),`\n`,_jsx(_components.li,{children:`View Apfell’s web log from within the main web UI`}),`\n`,_jsxs(_components.li,{children:[`Only start select payload type containers when starting Apfell - `,_jsx(_components.code,{children:`./start_apfell.sh viper`}),` will only start the `,_jsx(_components.code,{children:`viper`}),` payload type container, but all of the c2 profiles and main containers will still start.`]}),`\n`,_jsx(_components.li,{children:`Turn arbitrary VMs into Apfell compatible containers`}),`\n`,_jsx(_components.li,{children:`Import and export single commands at a time instead of the whole payload type`}),`\n`,_jsx(_components.li,{children:`C2 profiles support jitter percentages`}),`\n`,_jsx(_components.li,{children:`Kill Dates in C2 profiles`}),`\n`,_jsx(_components.li,{children:`Bulk download files from downloads page as zip file`}),`\n`,_jsx(_components.li,{children:`Strict argument checking on tasking to make sure required parameters are given`}),`\n`,_jsx(_components.li,{children:`Provide a single streaming list of tasking for all callbacks combined that the operation lead can watch`}),`\n`,_jsx(_components.li,{children:`Filter callback viewable tasks to a single operator or all operators, certain command, and certain task ranges`}),`\n`,_jsx(_components.li,{children:`Add new buttons for hiding or exiting multiple callbacks at once`}),`\n`,_jsx(_components.li,{children:`C2 profiles have associated Notes, Sample Server configuration, and Sample Client configurations that are present from the main UI to give context and base configuration information. This will be particularly useful as C2 profiles grow more complex.`}),`\n`,_jsx(_components.li,{children:`Provide and an interface for supporting P2P communications and visualizations`}),`\n`,_jsx(_components.li,{children:`Provide a recommended style guide for how to create new payloads to best fit in and leverage all of Apfell’s features`}),`\n`,_jsx(_components.li,{children:`Integration of Poseidon Agent`}),`\n`,_jsx(_components.li,{children:`Integration of Atlas Agent`}),`\n`,_jsx(_components.li,{children:`Integration of Chrome-extension Agent`}),`\n`,_jsx(_components.li,{children:`Introduction of command-line short-hands such as swap_filenames to allow operators to type uploaded filenames, but have agents get file IDs instead.`}),`\n`,_jsx(_components.li,{children:`All files are now contained within the Apfell folder, no more docker volumes mounted in weird spots automatically`}),`\n`,_jsx(_components.li,{children:`Edit C2 profile code and configurations right in the browser`}),`\n`,_jsx(_components.li,{children:`Included an ‘event log’ to see all events Apfell is doing behind the scenes as well as allow operators to ‘chat’ and store messages within their operation. If an operator sends a message on this screen, it’ll be shown to all operators in that operation that are on the Active Callbacks page.`}),`\n`,_jsx(_components.li,{children:`Included a ‘web log’ to see all the web requests to Apfell in the UI`}),`\n`,_jsx(_components.li,{children:`Broke out transforms for commands and create/load operations to mirror the style of browser scripts`}),`\n`,_jsx(_components.li,{children:`Exporting/Importing a payload type will bring along with it: payload code, all associated transforms, all command code, all browser scripts, and all c2 profile associated code.`}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Change Log","description":null,"href":"/version-2.3/common-qa/change-log","hidden":false}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What’s new for 2.3?","slug":"what’s-new-for-2-3","depth":2,"children":[]},{"title":"What’s new for 2.2?","slug":"what’s-new-for-2-2","depth":2,"children":[]},{"title":"What Changed for 2.0?","slug":"what-changed-for-2-0","depth":2,"children":[]},{"title":"What changed for 1.4?","slug":"what-changed-for-1-4","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"specterops-3","siteName":"Mythic","title":"Change Log - Mythic","navMaps":{"firstHrefInVersion":{"version 4.0":{"href":"/version-2.3/common-qa/change-log","matchLevel":0},"version 3.3":{"href":"/home","matchLevel":4}},"firstHrefInLanguage":{}},"lastModified":"2025-10-08T13:15:11.951Z","originalFileLocation":"version-2.3/common-qa/change-log.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Mythic\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Change Log - Mythic\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Mythic\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.mythic-c2.net/version-2.3/common-qa/change-log\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://specterops-3.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Change+Log\u0026amp;theme=cfca8a284e14b6c3ed528a84\u0026amp;signature=52b95deb15ba2f785d6e653cfd0643eba9a656da0ae08c5643d856de97b67c03\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Change Log - Mythic\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://specterops-3.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Change+Log\u0026amp;theme=cfca8a284e14b6c3ed528a84\u0026amp;signature=52b95deb15ba2f785d6e653cfd0643eba9a656da0ae08c5643d856de97b67c03\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/specterops-3/CtO7omxk-GskQdbQ/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Mythic\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6D70A7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.mythic-c2.net/version-2.3/common-qa/change-log\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/version-2.3/common-qa/change-log.md\">","siteName":"Mythic","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/its-a-feature/Mythic"},{"anchor":"#mythic Community","icon":"slack","href":"https://slack.specterops.io"}]},"versions":[{"version":"version 4.0","tabs":[{"tab":"Documentation","groups":[{"group":"Overview","pages":[{"title":"Mythic 4.0","href":"/version-4.0/home"},{"title":"Operators","href":"/version-4.0/operators"},{"group":"Installation","pages":[{"title":"Overview","href":"/version-4.0/installation"},{"title":"Connecting","href":"/version-4.0/installation/connecting"},{"title":"A note about containers","href":"/version-4.0/installation/a-note-about-containers"},{"title":"Offline Installation","href":"/version-4.0/installation/offline-installation"},{"title":"Updating Mythic","href":"/version-4.0/installation/updating-mythic"}]},{"title":"Installed Service Documentation","href":"/version-4.0/internal-documentation"},{"title":"Quick Usage","href":"/version-4.0/quick-usage"},{"group":"Operational Pieces","pages":[{"title":"Operator Guide","href":"/version-4.0/operational-pieces"},{"title":"MITRE ATT\u0026CK","href":"/version-4.0/operational-pieces/mitre-att-and-ck"},{"title":"Operations","href":"/version-4.0/operational-pieces/operations"},{"title":"Operation Chat","href":"/version-4.0/operational-pieces/operation-chat"},{"title":"Operator Aliases","href":"/version-4.0/operational-pieces/operator-aliases"},{"title":"Browser Scripts","href":"/version-4.0/operational-pieces/browser-scripts"},{"title":"Active Callbacks","href":"/version-4.0/operational-pieces/active-callbacks"},{"title":"Files","href":"/version-4.0/operational-pieces/files"},{"title":"Interactive File Editor","href":"/version-4.0/operational-pieces/file-editor"},{"title":"Search","href":"/version-4.0/operational-pieces/search"},{"title":"File Browser","href":"/version-4.0/operational-pieces/file-browser"},{"title":"Socks Proxy","href":"/version-4.0/operational-pieces/socks-proxy"},{"title":"Credentials","href":"/version-4.0/operational-pieces/credentials"},{"title":"Comments","href":"/version-4.0/operational-pieces/comments"},{"title":"Tags","href":"/version-4.0/operational-pieces/tags"},{"title":"Expanded Callbacks","href":"/version-4.0/operational-pieces/split-callbacks"},{"title":"Screenshots","href":"/version-4.0/operational-pieces/screenshots"},{"title":"Event Feed","href":"/version-4.0/operational-pieces/event-feed"},{"group":"Understanding Commands","pages":[{"title":"Overview","href":"/version-4.0/operational-pieces/understanding-commands"},{"title":"Basic Information","href":"/version-4.0/operational-pieces/understanding-commands/basic-information"},{"title":"Parameters","href":"/version-4.0/operational-pieces/understanding-commands/parameters"},{"title":"Tasking References","href":"/version-4.0/operational-pieces/understanding-commands/tasking-references"},{"title":"MITRE ATT\u0026CK in Commands","href":"/version-4.0/operational-pieces/understanding-commands/mitre-att-and-ck"}]},{"group":"Payload Types","pages":[{"title":"Overview","href":"/version-4.0/operational-pieces/payload-types"},{"title":"Containers","href":"/version-4.0/operational-pieces/payload-types/containers"}]},{"group":"C2 Profiles","pages":[{"title":"Overview","href":"/version-4.0/operational-pieces/c2-profiles"},{"title":"C2 Server Utilities","href":"/version-4.0/operational-pieces/c2-profiles/opsec-checks"},{"title":"Egress vs P2P","href":"/version-4.0/operational-pieces/c2-profiles/egress-vs-p2p"},{"title":"HTTP","href":"/version-4.0/operational-pieces/c2-profiles/http"},{"title":"Save Parameters","href":"/version-4.0/operational-pieces/c2-profiles/save-parameters"}]},{"title":"API Tokens","href":"/version-4.0/operational-pieces/api-tokens"}]},{"group":"Message Flow","pages":[{"title":"Overview","href":"/version-4.0/message-flow"},{"title":"Building Payloads","href":"/version-4.0/message-flow/building-payloads"},{"title":"Agent Sends Message","href":"/version-4.0/message-flow/agent-sends-message"},{"title":"File Upload Mythic->Agent","href":"/version-4.0/message-flow/file-upload-mythic-greater-than-agent"},{"title":"File Download Agent → Mythic","href":"/version-4.0/message-flow/file-download-agent-greater-than-mythic"},{"title":"P2P Messages","href":"/version-4.0/message-flow/p2p-messages"},{"title":"Operator Submits Tasking","href":"/version-4.0/message-flow/operator-submits-tasking"},{"title":"Authenticated Container RPC","href":"/version-4.0/message-flow/container-rpc-authentication"}]},{"group":"Reporting","pages":[{"title":"Overview","href":"/version-4.0/reporting"},{"title":"Artifacts","href":"/version-4.0/reporting/artifacts"},{"title":"MITRE ATT\u0026CK","href":"/version-4.0/reporting/mitre-att-and-ck"},{"title":"Reports","href":"/version-4.0/reporting/reports"}]},{"title":"Presentations / Webinars","href":"/version-4.0/presentations-webinars"},{"title":"Common Errors","href":"/version-4.0/common-errors"}]},{"group":"Common Questions and Answers","pages":[{"title":"FAQ / Troubleshooting Tips","href":"/version-4.0/common-questions-and-answers/faq-troubleshooting-tips"},{"title":"Change Log","href":"/version-4.0/common-questions-and-answers/change-log"}]},{"group":"Updating","pages":[{"title":"Mythic 3.4 -> 4.0 Updates","sidebarTitle":"Mythic 3.4 -> 4.0 Updates","href":"/version-4.0/updating/mythic-3.4-greater-than-4.0-updates"},{"title":"Mythic 3.3->3.4 Updates","href":"/version-4.0/updating/mythic-3.3-greater-than-3.4-updates"},{"title":"Mythic 3.2->3.3 Updates","href":"/version-4.0/updating/mythic-3.2-greater-than-3.3-updates"},{"group":"Mythic 2.3 -> 3.0 Updates","pages":[{"title":"Overview","href":"/version-4.0/updating/mythic-2.3-greater-than-3.0-updates"},{"title":"Agents 2.3 -> 3.0","href":"/version-4.0/updating/mythic-2.3-greater-than-3.0-updates/agents-2.3-greater-than-3.0"}]},{"group":"Mythic 2.2 -> 2.3 Updates","pages":[{"title":"Overview","href":"/version-4.0/updating/mythic-2.2-greater-than-2.3-updates"},{"title":"Agents 2.2 -> 2.3","href":"/version-4.0/updating/mythic-2.2-greater-than-2.3-updates/agents-2.2-greater-than-2.3"}]},{"group":"Mythic 2.1 -> 2.2 Updates","pages":[{"title":"Mythic 2.1 -> 2.2 Updates","href":"/version-4.0/updating/mythic-2.1-greater-than-2.2-updates"},{"group":"Agents 2.1.* -> 2.2.8","pages":[{"title":"Overview","href":"/version-4.0/updating/mythic-2.1-greater-than-2.2-updates/agents-2.1.-greater-than-2.2.2"},{"title":"MythicRPC","href":"/version-4.0/updating/mythic-2.1-greater-than-2.2-updates/agents-2.1.-greater-than-2.2.2/mythicrpc"}]}]}]}]},{"tab":"GraphQL API","groups":[{"group":"Overview","pages":[{"title":"Scripting and GraphQL","href":"/version-4.0/scripting/home"},{"title":"Hasura Console","href":"/version-4.0/scripting/hasura"},{"title":"Database Schema","href":"/version-4.0/scripting/database-schema"}]},{"group":"Scripting","pages":[{"title":"Python Scripting","href":"/version-4.0/scripting/scripting"}]}]},{"tab":"Development","groups":[{"group":"overview","pages":[{"title":"Overview","href":"/version-4.0/customizing/customizing-public-agent"},{"group":"Hooking Features","pages":[{"title":"Overview","href":"/version-4.0/customizing/hooking-features"},{"title":"Actions","href":"/version-4.0/customizing/hooking-features/actions"},{"group":"Linking Agents","pages":[{"title":"Overview","href":"/version-4.0/customizing/hooking-features/linking-agents"},{"title":"P2P Connections","href":"/version-4.0/customizing/hooking-features/linking-agents/action-p2p_info"}]},{"title":"Process Browser","href":"/version-4.0/customizing/hooking-features/process_list"},{"title":"Artifacts","href":"/version-4.0/customizing/hooking-features/artifacts"},{"title":"Credentials","href":"/version-4.0/customizing/hooking-features/credentials"},{"title":"File Downloads (Agent -> Mythic)","href":"/version-4.0/customizing/hooking-features/download"},{"title":"File Uploads (Mythic -> Agent)","href":"/version-4.0/customizing/hooking-features/action-upload"},{"title":"Screenshots","href":"/version-4.0/customizing/hooking-features/screenshots"},{"title":"Add / Remove Commands","href":"/version-4.0/customizing/hooking-features/commands"},{"title":"Keylog","href":"/version-4.0/customizing/hooking-features/keylog"},{"title":"File Browser","href":"/version-4.0/customizing/hooking-features/file-browser"},{"title":"Tokens","href":"/version-4.0/customizing/hooking-features/tokens"},{"title":"Alerts","href":"/version-4.0/customizing/hooking-features/alerts"},{"title":"SOCKS","href":"/version-4.0/customizing/hooking-features/socks"},{"title":"RPFWD","href":"/version-4.0/customizing/hooking-features/rpfwd"},{"title":"Interactive Tasking","href":"/version-4.0/customizing/hooking-features/interactive-tasking"},{"title":"Task status","href":"/version-4.0/customizing/hooking-features/task-status"},{"title":"OnContainerStart","href":"/version-4.0/customizing/hooking-features/oncontainerstart"},{"title":"Task Context Tracking","href":"/version-4.0/customizing/hooking-features/context-tracking"}]},{"group":"1. Payload Type Development","pages":[{"title":"1. Overview","href":"/version-4.0/customizing/payload-type-development"},{"group":"2. Payload Type Definition","pages":[{"title":"Payload Type Definition","href":"/version-4.0/customizing/payload-type-development/payload-type-info/payload-type-definition"},{"title":"Dynamic Build Parameters \u0026 C2 Variations","href":"/version-4.0/customizing/payload-type-development/payload-type-info/dynamic-build-parameters"},{"title":"JSONString Parameters","href":"/version-4.0/customizing/payload-type-development/payload-type-info/json-string-parameters"},{"title":"Wrapper Compatibility","href":"/version-4.0/customizing/payload-type-development/payload-type-info/wrapper-compatibility"},{"title":"Container Syncing","href":"/version-4.0/customizing/payload-type-development/payload-type-info/container-syncing"},{"title":"Turning a VM into a Container","href":"/version-4.0/customizing/payload-type-development/payload-type-info/turning-a-vm-into-a-container"}]},{"group":"3. Adding Commands","pages":[{"title":"Overview","href":"/version-4.0/customizing/payload-type-development/adding-commands"},{"title":"Commands","href":"/version-4.0/customizing/payload-type-development/adding-commands/commands"}]},{"group":"4. Create Tasking \u0026 Comms Format","pages":[{"title":"Overview","href":"/version-4.0/customizing/payload-type-development/create_tasking"},{"group":"Agent Messages","pages":[{"title":"Overview","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding"},{"title":"1. Agent Message Format","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/agent-message-format"},{"title":"2. Checkin","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/initial-checkin"},{"title":"3. Get Tasking","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/action_get_tasking"},{"title":"4. Submitting Responses","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/action-post_response"},{"title":"5. SOCKS","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/socks"},{"title":"6. Reverse Port Forward","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/rpfwd"},{"title":"7. Peer-to-peer messages","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/delegates"},{"title":"8. Interactive Tasking","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/8.-interactive-tasking"},{"title":"9. Agent RPC","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/agent-rpc"},{"title":"10. File Editor Protocol","href":"/version-4.0/customizing/payload-type-development/create_tasking/agent-side-coding/file-editor-protocol"}]}]},{"title":"5. Browser Scripting","href":"/version-4.0/customizing/payload-type-development/browser-scripting"},{"title":"6. Dynamic Command Parameter Values","href":"/version-4.0/customizing/payload-type-development/dynamic-parameter-values"},{"title":"7. Sub-tasking / Task Callbacks","href":"/version-4.0/customizing/payload-type-development/sub-tasking-task-callbacks"},{"title":"8. OPSEC Checking","href":"/version-4.0/customizing/payload-type-development/opsec-checking"},{"title":"9. Translation Containers","href":"/version-4.0/customizing/payload-type-development/translation-containers"},{"title":"10. Process Response","href":"/version-4.0/customizing/payload-type-development/process-response"},{"title":"11 TypedArray Parse Function","href":"/version-4.0/customizing/payload-type-development/12-typedarray-parse-function"},{"title":"12. SOCKS","href":"/version-4.0/customizing/payload-type-development/socks"},{"title":"13. Reverse PortFwd","href":"/version-4.0/customizing/payload-type-development/reverse-portfwd"},{"title":"14. Interactive Tasking","href":"/version-4.0/customizing/payload-type-development/15.-interactive-tasking"}]},{"group":"2. C2 Development","pages":[{"group":"2.1 Getting Started","pages":[{"title":"1. Getting Started","href":"/version-4.0/customizing/c2-related-development/mythic-definition/2.1.1-c2-class-definition"},{"title":"2. Parameters","href":"/version-4.0/customizing/c2-related-development/mythic-definition/2.1.2-c2-parameters"},{"title":"3. Running","href":"/version-4.0/customizing/c2-related-development/mythic-definition/2.1.3-c2-running"},{"title":"4. Server Code","href":"/version-4.0/customizing/c2-related-development/mythic-definition/2.1.4-c2-server-code"}]},{"group":"2.2 Advanced Features","pages":[{"title":"1. Configuration Files","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.1-c2-configuration-files"},{"title":"2. OPSEC Checks","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.2-opsec-checks-for-c2-profiles"},{"title":"3. Configuration Checks","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.3-configuration-checks"},{"title":"4. Sample Message","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.4-sample-message"},{"title":"5. File Hosting","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.5-file-hosting"},{"title":"6. Redirect Rules","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.6-redirect-rules"},{"title":"7. Get IOC","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.7-get-ioc"},{"title":"8. Push C2","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.8-push-c2"},{"title":"9. Custom RPC","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.2.9-custom-rpc"}]},{"group":"2.3 Docker","pages":[{"title":"1. Docker Containers","href":"/version-4.0/customizing/c2-related-development/server-side-coding/2.3.1-c2-docker-containers"}]}]},{"group":"3. Consuming Containers","pages":[{"title":"Overview","href":"/version-4.0/customizing/3.-consuming-containers"},{"title":"Webhooks","href":"/version-4.0/customizing/3.-consuming-containers/webhooks"},{"title":"Logging","href":"/version-4.0/customizing/3.-consuming-containers/logging"},{"group":"Eventing","pages":[{"title":"Overview","href":"/version-4.0/customizing/3.-consuming-containers/eventing"},{"title":"Operator Context (run_as)","href":"/version-4.0/customizing/3.-consuming-containers/eventing/operator-context-run_as"},{"title":"Workflow Triggers","href":"/version-4.0/customizing/3.-consuming-containers/eventing/workflow-triggers"},{"title":"Steps","href":"/version-4.0/customizing/3.-consuming-containers/eventing/steps"}]},{"title":"Auth","href":"/version-4.0/customizing/3.-consuming-containers/auth"},{"title":"Chat Containers","href":"/version-4.0/customizing/3.-consuming-containers/chat"}]},{"title":"4. Extending Agent Commands","href":"/version-4.0/customizing/4.-extending-agent-commands"},{"title":"5. Custom Browsers","href":"/version-4.0/customizing/5.-custom-browsers"},{"title":"Mythic UI Development","href":"/version-4.0/customizing/mythic-ui-development"}]}]},{"tab":"MythicRPC","groups":[{"group":"Overview","pages":[{"title":"MythicRPC","href":"/version-4.0/mythicrpc/mythicrpc"}]}]}]},{"version":"version 3.3","pages":[{"title":"version 3.3","href":"/home"}]},{"version":"version 3.0","tabs":[{"tab":"Documentation"}]},{"version":"version 2.3","tabs":[{"tab":"Documentation"}]}]},"title":"Change Log - Mythic","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":[],"chunks":[]}