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
| Signal | Where | ATT&CK |
|---|---|---|
| Archive (zip) created in a temp or user-writable path by an unsigned process | Sysmon 11, EDR file events | T1560.001 |
| HTTP POST with an archive body from a user-writable binary | TLS-inspecting proxy, EDR network | T1041 |
| First-seen destination contacted once by a process that then exits | Proxy, DNS, EDR network | T1567 |
| POST to a raw IP or newly registered domain without a browser user agent | Proxy | T1071.001 |
| Archive built in memory: no file, but collection reads followed by one upload | EDR correlated timeline | T1041 |
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")`
- Use a first-seen filter over a 30-day destination baseline; it removes most legitimate uploaders cheaply.
- Block uploads from user-writable binaries at the proxy where you can identify the process (EDR network containment or a process-aware proxy).
- Record the archive path and process so incident response can estimate which stores were collected.
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 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.
Stay ahead of emerging threats. Get notified when we publish new intelligence reports and advisories.
Subscribe to Alerts