What are the first things to do when creating a new payload type in Mythic?
The first step is to copy the
/Mythic/Example_Payload_Typefolder into the
/Mythic/Payload_Types/folder and rename it to match the name of your new agent. For the purposes here, let's assume your new agent is called
my_agent. So you'd copy that directory as
The next thing you need to do is edit the builder file (https://github.com/its-a-feature/Mythic/blob/master/Example_Payload_Type/mythic/agent_functions/builder.py) to reflect the information for your new agent. Specifically, you'll want to edit it like:
from mythic_payloadtype_container.MythicCommandBase import *
from mythic_payloadtype_container.PayloadBuilder import *
from distutils.dir_util import copy_tree
# define your payload type class here, it must extend the PayloadType class though
name = "my_agent" # name that would show up in the UI
file_extension = "exe" # default file extension to use when creating payloads
author = "@YourHandleHere" # author of the payload type
supported_os = [ # supported OS and architecture combos
SupportedOS.Windows, SupportedOS.Linux # update this list with all the OSes your agent supports
wrapper = False # does this payload type act as a wrapper for another payloads inside of it?
# if the payload supports any wrapper payloads, list those here
wrapped_payloads =  # ex: "service_wrapper"
note = "Any note you want to show up about your payload type in the UI"
supports_dynamic_loading = False # setting this to True allows users to only select a subset of commands when generating a payload
build_parameters = [
# these are all the build parameters that will be presented to the user when creating your payload
# we'll leave this blank for now
# the names of the c2 profiles that your agent supports
c2_profiles = ["http"]
# after your class has been instantiated by the mythic_service in this docker container and all required build parameters have values
# then this function is called to actually build the payload
async def build(self) -> BuildResponse:
# this function gets called to create an instance of your payload
resp = BuildResponse(status=BuildStatus.Error)
More information on each component in the file can be found in Payload Type Info. Now you can run
sudo ./mythic-cli payload add my_agentand
sudo ./mythic-cli payload start MyNewAgentand you'll see the container build, start, and you'll see it sync with the Mythic server (more about that process at Container Syncing).