Home/Blog/Malware C2 Traffic Analysis: Decrypting TLS, DTLS, and QUIC Command-and-Control Channels
Malware AnalysisC2TLSDTLSQUICTCPReverse EngineeringNetwork Interception

Malware C2 Traffic Analysis: Decrypting TLS, DTLS, and QUIC Command-and-Control Channels

How to intercept and decrypt encrypted malware C2 traffic over TCP, TLS, DTLS, and QUIC in a sandbox using InterceptSuite. See beacon payloads, C2 protocols, and exfiltration data in plaintext.

I

InterceptSuite Team

July 3, 2026·9 min read

Modern malware rarely talks to its command-and-control server in plaintext. Cobalt Strike beacons run over TLS. Custom loaders use raw TCP with XOR-obfuscated payloads. Newer C2 frameworks are moving to QUIC and DTLS specifically because most inspection tooling can't decrypt them. If you can't see inside the encrypted channel, you can't extract IOCs, tasking data, or exfiltrated content - you're stuck watching opaque bytes cross the wire.

Burp Suite and other HTTP-focused proxies only understand HTTP/HTTPS. They cannot MITM a raw TCP beacon, a DTLS-wrapped implant, or a QUIC-based C2 channel - which is exactly where a growing share of modern malware operates. InterceptSuite is a native GUI MITM proxy built for this: it intercepts TCP, TLS, DTLS, QUIC, and UDP traffic, making it usable for behavioral malware analysis in a controlled sandbox.


Why C2 Traffic Analysis Needs More Than an HTTP Proxy

A typical malware analysis workflow already includes static analysis, dynamic analysis in an isolated VM, and network capture with tools like Wireshark or tcpdump. The gap is decryption. Wireshark can show you that a TLS handshake happened; it doesn't decrypt the session unless you already have the key material, and it has no MITM capability of its own. Extracting SSLKEYLOGFILE values only works for processes that respect the environment variable - many malware samples statically link their own TLS stack and ignore it entirely.

InterceptSuite sits as an active MITM proxy in the traffic path. It terminates the TLS/DTLS connection from the sample, decrypts it, and re-encrypts it to the real (or sinkholed) C2 endpoint - so you see plaintext on both sides without depending on the sample cooperating with key logging.

This matters across all four transport patterns malware uses for C2:

  • TCP - raw socket C2 with custom framing, common in loaders and simple backdoors
  • TLS - the default for most modern frameworks (Cobalt Strike, Sliver, Mythic, custom implants) to blend in with normal HTTPS traffic
  • DTLS - increasingly used by IoT-targeting malware and some UDP-based C2 kits to add encryption without TCP's overhead
  • QUIC - adopted by newer C2 tooling specifically because QUIC's TLS 1.3 handshake is harder for legacy inspection tools to intercept, and its multiplexed streams over UDP evade some IDS signatures tuned for TCP

InterceptSuite's SOCKS5 proxy and ProxyBridge's transparent redirection support all four, so a sample making a raw TCP connection, a TLS-wrapped POST, a DTLS handshake, or a QUIC stream is captured the same way.


Sandbox Setup: Routing a Malware Sample Through InterceptSuite

Run this only in an isolated VM or sandbox network with no route to production systems. Treat the sample as hostile at every step.

Prerequisites

  • InterceptSuite installed in the analysis VM (SOCKS5 proxy on 127.0.0.1:4444 by default)
  • ProxyBridge for transparent, system-wide redirection (no per-sample proxy configuration needed)
  • An isolated network segment with no route to your real infrastructure - a sinkhole or an internet-connected sandbox VLAN depending on whether you need the C2 to respond

Step 1 - Start InterceptSuite in the Sandbox VM

Open InterceptSuite and confirm the SOCKS5 listener shows Listening on the Proxy tab. Keep this VM isolated from anything you can't afford to lose.

Step 2 - Configure ProxyBridge for Transparent Redirection

  1. Open ProxyBridge and go to Proxy → Proxy Settings
  2. Set Proxy Type to SOCKS5
  3. Set Host to 127.0.0.1, Port to 4444
  4. Click Save Changes

Step 3 - Add Proxy Rules

Rule 1: InterceptSuite goes direct (prevents a routing loop)

Field Value
Applications InterceptSuite.exe
Target Ports *
Action DIRECT

Rule 2: Route the malware sample's traffic through the proxy

Field Value
Applications malware_sample.exe (or * to catch everything)
Target Ports *
Protocol TCP & UDP
Action PROXY

Routing by process name isolates the sample's traffic from the rest of the VM's background noise, which keeps Proxy History readable when a sample also does DNS lookups or unrelated system traffic.

Step 4 - Install the CA Certificate for TLS/DTLS Interception

For samples using TLS or DTLS, install the InterceptSuite CA certificate so the MITM'd handshake completes instead of failing on a certificate mismatch - most malware doesn't validate certificates at all, but some frameworks pin a specific cert, in which case interception will surface that behavior itself as a finding.

Step 5 - Detonate the Sample

Execute the sample in the isolated VM. Whether it opens a raw TCP socket, negotiates TLS, performs a DTLS handshake, or opens a QUIC stream, ProxyBridge intercepts the connection transparently before it leaves the VM - no configuration inside the sample is required or possible, which is the point.

Step 6 - Inspect Decrypted Traffic in Proxy History

Open the Proxy History tab in InterceptSuite. Each connection shows the decrypted payload regardless of transport:

  • A TCP connection shows raw bytes as sent - useful for identifying custom framing or XOR/RC4-obfuscated beacon check-ins
  • A TLS connection shows the decrypted HTTP or custom payload underneath - this is where you'll see Cobalt Strike-style beacon metadata, base64-encoded tasking, or JSON-based C2 protocols
  • A DTLS connection shows the decrypted datagram payload - common for lightweight or IoT-targeting implants
  • A QUIC connection shows the decrypted stream data - QUIC v1 is fully supported

Click any connection to expand the full exchange and use PCAP Export to hand the decrypted capture to Wireshark for deeper protocol analysis or to attach to a report.


Parsing Custom C2 Protocols with Extensions

Most C2 frameworks use a proprietary wire format on top of the transport. Once InterceptSuite has decrypted the channel, a Python extension can parse the framework-specific structure instead of reading raw bytes by hand:

from InterceptSuite.Extensions.APIs.Logging import ExtensionLogger
import base64

class C2BeaconTab:
    def should_show_tab(self, data):
        raw = data.get("data", "")
        return len(raw) > 0

    def fetchdata(self, data):
        raw = data.get("data", "")
        try:
            b = raw.encode('latin-1') if isinstance(raw, str) else raw
            # Example: decode a base64-wrapped beacon check-in body
            decoded = base64.b64decode(b, validate=False)
            ExtensionLogger.Log(f"Decoded beacon payload: {len(decoded)} bytes")
            return f"[Decoded Beacon]\n{decoded}"
        except Exception:
            return f"[Raw]\n{raw}"

    def updatedata(self, data):
        return None

class InterceptSuiteExtension:
    def register_interceptor_api(self, interceptor):
        interceptor.set_extension_name("C2 Beacon Decoder")
        interceptor.set_extension_version("1.0.0")
        interceptor.AddDataViewerTab("C2 Beacon", C2BeaconTab())
        ExtensionLogger.Log("C2 Beacon Decoder loaded.")

This same pattern extends to XOR-keyed frames, custom TLV structures, or the specific encoding a given C2 framework uses for its tasking and check-in messages. See the Extension API reference for the full interface, and the ready-made community extensions repository for existing protocol dissectors you can adapt.


What to Look for in Decrypted C2 Traffic

Once the channel is decrypted, common artifacts worth extracting include:

  • Beacon interval and jitter - timing between check-ins, visible directly in Proxy History timestamps
  • C2 domain/IP and port reuse - indicators for blocklisting and threat intel sharing
  • Tasking commands - instructions sent from the C2 server to the implant, often base64 or hex-encoded in the payload
  • Exfiltrated data - files, credentials, or system information the sample uploads back to the C2
  • User-Agent and header fingerprints - many frameworks (Cobalt Strike, Sliver, Mythic) have distinctive default headers that survive even in custom profiles
  • Certificate details - self-signed or pinned certificates presented during the TLS/DTLS handshake, useful for fingerprinting infrastructure across samples
  • Protocol downgrade or fallback behavior - some implants attempt QUIC first and fall back to TLS, which is itself a useful behavioral indicator

Limitations to Know Before You Start

  • SNI-based routing and domain fronting can complicate MITM setup if the sample validates the front domain against a pinned identity; you may need to adjust DNS or routing rules in the sandbox.
  • Certificate pinning in more sophisticated frameworks will cause the connection to fail under MITM - that failure is itself informative, but it means you won't get payload visibility without patching the sample or hooking its TLS calls.
  • QUIC v2 is not supported yet; only QUIC v1 is currently decrypted. DTLS 1.3 is not supported yet - DTLS 1.0 and DTLS 1.2 are fully supported.
  • Always detonate in a fully isolated environment. InterceptSuite gives you visibility into the traffic; it does not sandbox or contain the sample itself.

Further Reading

Start your free trial to intercept and decrypt TCP, TLS, DTLS, and QUIC traffic in your malware analysis sandbox - no credit card required.

Ready to intercept non-HTTP traffic?

InterceptSuite is the only native GUI MITM proxy for TCP, TLS, DTLS & UDP - used by penetration testers and protocol engineers worldwide.