EXFIL
ZIP ARCHIVE
HTTP POST
FIRST SEEN
DetectionBlue TeamSOCOctober 12, 2026•9 min read

Detecting Stealer C2 Exfiltration of Credential Archives

A stealer’s whole job ends in one upload. The archive is small, the destination is new and the process is unsigned, and those three facts are enough.

Scroll

After collection, stealers bundle logs into an archive, often in memory and sometimes on disk, and send it to the operator over HTTP(S) or a web service. Exfiltration volume is small compared with ordinary business uploads, so volume thresholds fail. What does not fail is context: who sent it, to where, how rare the destination is and what the process just did.

Signals at a Glance

SignalWhereATT&CK
Archive (zip) created in a temp or user-writable path by an unsigned processSysmon 11, EDR file eventsT1560.001
HTTP POST with an archive body from a user-writable binaryTLS-inspecting proxy, EDR networkT1041
First-seen destination contacted once by a process that then exitsProxy, DNS, EDR networkT1567
POST to a raw IP or newly registered domain without a browser user agentProxyT1071.001
Archive built in memory: no file, but collection reads followed by one uploadEDR correlated timelineT1041

Correlating the Archive and the Upload

The strongest detection ties the archive to the connection. Look for a process that created an archive and then made an outbound connection within minutes:

// Microsoft Defender (KQL) - archive created then outbound connection by the same process
let Archives = DeviceFileEvents
| where ActionType == "FileCreated"
| where FileName endswith ".zip" or FileName endswith ".rar" or FileName endswith ".7z"
| where FolderPath has_any ("\\AppData\\", "\\Temp\\", "\\ProgramData\\", "\\Users\\Public\\")
| where InitiatingProcessFolderPath has_any ("\\AppData\\", "\\Temp\\", "\\ProgramData\\", "\\Users\\Public\\")
| project DeviceId, ArchTime = Timestamp, FileName, InitiatingProcessId, InitiatingProcessFileName;
Archives
| join kind=inner (
    DeviceNetworkEvents
    | where ActionType == "ConnectionSuccess" and RemotePort in (80, 443, 8080)
    | project DeviceId, NetTime = Timestamp, RemoteIP, RemoteUrl, InitiatingProcessId
) on DeviceId, InitiatingProcessId
| where NetTime between (ArchTime .. ArchTime + 10m)
// tune/validate: exclude sanctioned backup and sync clients by signer

Destination Rarity and Proxy Hunting

When the archive never touches disk, fall back to the upload itself. At the proxy, find POSTs that carry a file body to destinations nobody in the organisation has used before:

index=proxy http_method=POST bytes_out>20000 NOT http_user_agent="Mozilla/5.0*"
| eval dest=coalesce(dest_host, dest_ip)
| stats count sum(bytes_out) AS out dc(src) AS sources min(_time) AS first BY dest, http_user_agent, http_content_type
| where sources=1 AND count<=3
| where match(http_content_type, "(?i)(zip|octet-stream|multipart)")
`comment("tune/validate: join with a 30-day destination baseline to keep only first-seen hosts")`
Vetted sources

Use SigmaHQ proxy and archive-creation rules, Elastic detections for exfiltration over web services, Splunk ESCU analytics for data staging, and MITRE CAR analytics on archive creation. Baseline legitimate uploads (backup, telemetry, crash reporters) in your own environment; they are the main false-positive source.

Build Detections That Fire

Mjolnir Security helps blue teams turn threat intelligence into high-fidelity detections across endpoint, network, identity and cloud telemetry.

Detection EngineeringManaged Detection & ResponseThreat HuntingIncident ResponsePurple Teaming
  • Detection Engineering We build and tune detections mapped to ATT&CK from your own telemetry.
  • Threat Hunting as a Service Hypothesis-driven hunts for the behaviours on this page.
  • 24/7 Incident Response Containment when a detection fires. Call +1 833 403 5875.
Written by: Mjolnir Threat Research (MTAC)  |  Published: October 12, 2026  |  Last reviewed: October 12, 2026