T1573.001

Symmetric Cryptography

Adversaries may employ a known symmetric encryption algorithm to conceal command and control traffic rather than relying on any inherent protections provided by a communication protocol. Symmetric encryption algorithms use the same key for plaintext encryption and ciphertext decryption. Common symmetric encryption algorithms include AES, DES, 3DES, Blowfish, and RC4. Real-world malware families using this technique include Dridex (RC4), SMOKEDHAM (RC4), LockBit 3.0 (AES), Emotet (RSA+AES hybrid), SysUpdate (DES), Prikormka (Blowfish), Azorult (XOR), Bisonal (RC4/XOR), and InvisiMole (XOR). Detection cannot rely on payload inspection since the data is opaque; instead it must focus on behavioral proxies: crypto library usage by unexpected processes, beaconing patterns, process genealogy anomalies combined with external connections, and known cipher-specific implementation artifacts.

Microsoft Sentinel / Defender
kusto
// T1573.001 — Symmetric Cryptography C2
// Correlates Windows crypto library loads from non-system, non-browser processes
// with subsequent outbound connections to public IPs on non-standard ports.
// Designed to surface processes that load encryption APIs and then communicate externally —
// the behavioral signature common to AES/RC4/DES-based C2 frameworks.
let CryptoLibraries = dynamic([
  "rsaenh.dll",
  "bcrypt.dll",
  "bcryptprimitives.dll",
  "cryptsp.dll",
  "ncrypt.dll"
]);
let ExcludedSystemProcs = dynamic([
  "lsass.exe", "svchost.exe", "services.exe", "spoolsv.exe", "csrss.exe",
  "winlogon.exe", "smss.exe", "wininit.exe", "MsMpEng.exe", "NisSrv.exe",
  "SecurityHealthService.exe", "SearchIndexer.exe", "fontdrvhost.exe",
  "dwm.exe", "sihost.exe", "taskhostw.exe", "RuntimeBroker.exe"
]);
let ExcludedBrowsers = dynamic([
  "chrome.exe", "firefox.exe", "msedge.exe", "iexplore.exe",
  "opera.exe", "brave.exe", "vivaldi.exe"
]);
let StandardPorts = dynamic([
  80, 443, 8080, 8443, 53, 22, 21, 20, 25, 587, 465, 993, 995, 110, 143, 3389
]);
// Step 1 — processes loading crypto libraries (excluding known-legitimate)
let CryptoLoaders = DeviceImageLoadEvents
| where Timestamp > ago(24h)
| where FileName in~ (CryptoLibraries)
| where not(InitiatingProcessFileName in~ (ExcludedSystemProcs))
| where not(InitiatingProcessFileName in~ (ExcludedBrowsers))
| project
    LoadTime = Timestamp,
    DeviceName,
    DeviceId,
    ProcessName = InitiatingProcessFileName,
    ProcessId = InitiatingProcessId,
    ProcessCmd = InitiatingProcessCommandLine,
    AccountName = InitiatingProcessAccountName,
    ProcessSHA256 = InitiatingProcessSHA256,
    CryptoLib = FileName;
// Step 2 — outbound connections to public IPs on non-standard ports
let SuspiciousConns = DeviceNetworkEvents
| where Timestamp > ago(24h)
| where ActionType == "ConnectionSuccess"
| where RemoteIPType == "Public"
| where not(RemotePort in (StandardPorts))
| project
    ConnTime = Timestamp,
    DeviceName,
    DeviceId,
    ConnProcess = InitiatingProcessFileName,
    ConnProcessId = InitiatingProcessId,
    RemoteIP,
    RemotePort,
    BytesSent = SentBytes,
    BytesReceived = ReceivedBytes;
// Step 3 — correlate: crypto load followed by external connection within 15 minutes
CryptoLoaders
| join kind=inner (SuspiciousConns)
    on DeviceName, $left.ProcessId == $right.ConnProcessId
| where ConnTime between (LoadTime .. (LoadTime + 15m))
| summarize
    CryptoLibsLoaded = make_set(CryptoLib),
    RemoteIPs = make_set(RemoteIP),
    RemotePorts = make_set(RemotePort),
    ConnectionCount = count(),
    TotalBytesSent = sum(BytesSent),
    TotalBytesReceived = sum(BytesReceived),
    FirstConnection = min(ConnTime),
    LastConnection = max(ConnTime)
    by DeviceName, ProcessName, ProcessCmd, AccountName, ProcessSHA256
| extend DataTransferMB = round(toreal(TotalBytesSent + TotalBytesReceived) / 1048576, 2)
| extend DurationMinutes = datetime_diff('minute', LastConnection, FirstConnection)
| extend AvgIntervalSeconds = iif(
    ConnectionCount > 1,
    toreal(DurationMinutes * 60) / toreal(ConnectionCount - 1),
    0.0)
| extend BeaconLikely = AvgIntervalSeconds between (30.0 .. 3600.0) and ConnectionCount >= 5
| sort by ConnectionCount desc
high severity medium confidence

Data Sources

Module: Module Load Network Traffic: Network Connection Creation Microsoft Defender for Endpoint — DeviceImageLoadEvents Microsoft Defender for Endpoint — DeviceNetworkEvents

Required Tables

DeviceImageLoadEvents DeviceNetworkEvents

False Positives

  • Security agents (CrowdStrike, Carbon Black, SentinelOne, Cylance) that load crypto libraries to encrypt their own telemetry streams and communicate with backend cloud services
  • Enterprise backup agents (Veeam, Commvault, Veritas) that perform AES-encrypted data transfers to off-site repositories on non-standard ports
  • Software update mechanisms (Autodesk, Adobe, JetBrains) that use TLS on non-443 ports (e.g., 7443, 8444) and load bcrypt.dll as part of update verification
  • VPN and proxy clients (Cisco AnyConnect, GlobalProtect, ZScaler) that load crypto libraries before establishing tunnels to public infrastructure
  • Developer IDEs and language runtimes (Visual Studio, IntelliJ, Python interpreters) loading cryptographic libraries during normal operation

Unlock Pro Content

Get the full detection package for T1573.001 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections