Havoc is a modern open-source C2 framework developed by Paul Ungur (5pider) with a focus on evasion and advanced post-exploitation techniques. It features a Qt-based GUI client that connects to a remote teamserver — similar in model to Cobalt Strike. Havoc’s agents (called Demons) are written in C and include features like indirect syscalls and sleep obfuscation, making it well-suited for practicing modern detection and evasion techniques. Access model: The Havoc GUI client runs directly on the Havoc server inside an XFCE4 desktop session. You access it through Guacamole via VNC — no local client install is required.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/BaddKharma/redStack/llms.txt
Use this file to discover all available pages before exploring further.
The goal here is not to learn Havoc. The objective is to confirm the environment works end-to-end: get a Windows
.exe Demon calling back through the redirector. Once you have a callback, the lab is proven functional. For full documentation, see the Havoc Framework docs.Step 1: Build Havoc
Connect to the Havoc server via Guacamole → Havoc C2 Server (SSH), then run the build script:~/havoc_build.log. It is safe to re-run if anything fails.
What the build script does:
- Installs Go 1.22.5 to
/usr/local/go/ - Clones the latest Havoc release from GitHub to
/opt/Havoc/ - Copies the pre-configured teamserver profile to
/opt/Havoc/profiles/default.yaotl - Builds the teamserver binary:
/opt/Havoc/teamserver/teamserver - Builds the Qt5 GUI client:
/opt/Havoc/client/Havoc - Creates the
havoc-clientwrapper script at/usr/local/bin/havoc-client - Enables and starts the
havocsystemd service
Step 2: Verify the teamserver
The build script starts the teamserver automatically. Confirm it is running:40056 using the profile at /opt/Havoc/profiles/default.yaotl.
Operator credentials (same lab password used across all machines — retrieve from terraform output deployment_info):
| Field | Value |
|---|---|
| Username | operator |
| Password | <lab-password from deployment_info> |
Step 3: Connect the Havoc client
Havoc has two separate Guacamole connections. Havoc C2 Server (SSH) gives terminal-only access for checking service status and logs. Havoc C2 Desktop (VNC) opens the full XFCE4 desktop where the GUI client runs. The Havoc client can only be used from the VNC session.
| Field | Value |
|---|---|
| Name | operator |
| Host | localhost |
| Port | 40056 |
| Username | operator |
| Password | <lab-password> |
Step 4: Create a listener
Before creating the listener, retrieve yourX-Request-ID token — it gets baked into the Demon at generation time:
| Field | Value |
|---|---|
| Payload | Http |
| Hosts | yourdomain.tld — or <REDIR_PUBLIC_IP> for closed/IP-only environments — then click Add |
| Host (Bind) | 0.0.0.0 |
| PortBind | 80 |
| PortConn | 80 |
| Uris | /edge/cache/assets/update — then click Add (all URIs must start with /edge/cache/assets/) |
| Headers | X-Request-ID: <token> — then click Add (no quotes around the token value) |
The Hosts value is the callback address baked into the Demon. The Uris and Headers are embedded in every Demon generated from this listener. The Apache redirector validates the URI prefix and the
X-Request-ID header, then forwards the full path (prefix intact) as plain HTTP to Havoc on port 80.Unlike Mythic and Sliver, Havoc receives the full URI path including the prefix. This is why all URIs must start with /edge/cache/assets/.Step 5: Generate a Demon
In the Havoc client, navigate to Attack → Payloads.Configure injection settings
Expand the Injection section and fill in both spawn process fields:
| Field | Value |
|---|---|
| Spawn64 | C:\Windows\System32\notepad.exe |
| Spawn32 | C:\Windows\SysWOW64\notepad.exe |
Step 6: Deploy and test
Transfer the Demon to the Windows workstation
From the Windows workstation (via Guacamole RDP or MobaXterm), pull the file from the Havoc server:Authenticate with the lab SSH password when prompted.
Confirm callback
In the Havoc client, watch the Sessions panel. A new session should appear within a few seconds.
Run a test command
Right-click the session → Interact. In the terminal that opens, run:Expected output:
win-operator\administratorVerify all three C2 backends
With all three C2 listeners running, confirm the redirector can reach all backends:OK.
Teamserver profile reference
The teamserver profile is pre-configured at deploy time and copied to/opt/Havoc/profiles/default.yaotl by the build script.
View the teamserver profile
View the teamserver profile
| Setting | Value |
|---|---|
| Teamserver host | 0.0.0.0 (all interfaces) |
| Teamserver port | 40056 |
| Compiler (64-bit) | /usr/bin/x86_64-w64-mingw32-gcc |
| Compiler (32-bit) | /usr/bin/i686-w64-mingw32-gcc |
| Assembler | /usr/bin/nasm |
| Demon sleep | 2 seconds |
| Demon jitter | 0 |
| Operator user | operator |
Check teamserver logs
Check teamserver logs
Reference
Havoc Framework docs
Official documentation for the Havoc C2 framework.
Havoc on GitHub
Source code for the Havoc teamserver and client.
Redirector security layers
How the Apache redirector validates headers and routes URI prefixes.
Troubleshooting
Debug Havoc build failures, service crashes, and callback issues.
