T1030

Data Transfer Size Limits

Exfiltration Last updated:

Adversaries may exfiltrate data in fixed size chunks instead of whole files, or limit packet sizes below certain thresholds, to avoid triggering network data transfer threshold alerts. Techniques include splitting archives into equal-sized volumes (e.g., 7-Zip -v flag, RAR split volumes), using tools like Rclone with chunker overlay, scripting custom byte-range reads, or configuring C2 implants with fixed send-buffer sizes. Real-world actors including APT28, LuminousMoth, Threat Group-3390, Play ransomware, and malware families like Cobalt Strike, POSHSPY, OopsIE, and StealBit all employ this technique. Detection pivots to file-system artifacts (sequentially numbered archive parts), process command-line analysis (volume-size flags on compression utilities), and network behavioral analysis (repeated uniform-size connections to the same external host).

What is T1030 Data Transfer Size Limits?

Data Transfer Size Limits (T1030) maps to the Exfiltration tactic — the adversary is trying to steal data in MITRE ATT&CK.

This page provides production-ready detection logic for Data Transfer Size Limits, covering the data sources and telemetry it touches: Process: Process Creation, File: File Creation, Microsoft Defender for Endpoint. The queries below are rated medium severity at medium confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.

MITRE ATT&CK

Tactic
Exfiltration
Technique
T1030 Data Transfer Size Limits
Canonical reference
https://attack.mitre.org/techniques/T1030/
Microsoft Sentinel / Defender
kusto
// T1030 — Data Transfer Size Limits
// Part 1: Process creation — compression/transfer tools with volume/chunk-size flags
let SplittingTools = dynamic(["7z.exe","7za.exe","7zr.exe","rar.exe","winrar.exe","rclone.exe","split"]);
let VolumeFlagPatterns = dynamic([
  " -v", "/v", "-volume", "--max-size", "--chunk-size",
  "chunker", "split -b", "split -n", "--bytes",
  "-v10m","-v50m","-v100m","-v500m","-v1g","-v1024"
]);
let ChunkResults =
  DeviceProcessEvents
  | where Timestamp > ago(24h)
  | where FileName in~ (SplittingTools)
      or (FileName in~ ("cmd.exe","powershell.exe","pwsh.exe","bash","sh") and ProcessCommandLine has_any (VolumeFlagPatterns))
  | where ProcessCommandLine has_any (VolumeFlagPatterns)
  | extend SignalType = case(
      FileName =~ "rclone.exe" and ProcessCommandLine has "chunker", "RcloneChunker",
      FileName =~ "rclone.exe" and ProcessCommandLine has "--max-size", "RcloneMaxSize",
      FileName in~ ("7z.exe","7za.exe","7zr.exe") and ProcessCommandLine has_any ("-v","/v"), "SevenZipVolume",
      FileName in~ ("rar.exe","winrar.exe") and ProcessCommandLine has_any ("-v","/v"), "RarVolume",
      ProcessCommandLine has_any ("split -b","split -n","--bytes"), "UnixSplit",
      "GenericChunkFlag"
    )
  | project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine,
           InitiatingProcessFileName, InitiatingProcessCommandLine, SignalType;
// Part 2: File creation — sequentially numbered archive chunk files appearing in bursts
let ChunkFileResults =
  DeviceFileEvents
  | where Timestamp > ago(24h)
  | where ActionType == "FileCreated"
  | where FileName matches regex @"(?i)\.(00[1-9]|0[1-9][0-9]|[0-9]{3})$"
      or FileName matches regex @"(?i)\.(7z|zip|rar|tar|gz|bz2)\.[0-9]{1,3}$"
      or FileName matches regex @"(?i)\.part[0-9]{1,4}$"
      or FileName matches regex @"(?i)\.r[0-9]{2}$"
  | summarize
      ChunkCount = count(),
      FirstSeen = min(Timestamp),
      LastSeen = max(Timestamp),
      SampleFiles = make_set(FileName, 10),
      FolderPaths = make_set(FolderPath, 5)
    by DeviceName, AccountName, InitiatingProcessFileName, bin(Timestamp, 10m)
  | where ChunkCount >= 3
  | extend SignalType = "SequentialChunkFilesCreated"
  | project
      Timestamp = FirstSeen, DeviceName, AccountName,
      FileName = tostring(SampleFiles),
      ProcessCommandLine = strcat("ChunkCount=", ChunkCount, " Folder=", tostring(FolderPaths)),
      InitiatingProcessFileName,
      InitiatingProcessCommandLine = "",
      SignalType;
union ChunkResults, ChunkFileResults
| sort by Timestamp desc

Detects data chunking for exfiltration via two correlated signals: (1) process creation events where compression or sync tools (7-Zip, WinRAR, Rclone, Unix split) are invoked with volume-size or chunk-size flags that indicate deliberate file splitting, and (2) file creation bursts of sequentially numbered archive parts (e.g., .001/.002/.003, .part1/.part2, .r00/.r01) appearing within a 10-minute window. Results from both signals are unioned with a SignalType label so analysts can quickly distinguish command-line evidence from filesystem artifacts.

medium severity medium confidence

Data Sources

Process: Process Creation File: File Creation Microsoft Defender for Endpoint

Required Tables

DeviceProcessEvents DeviceFileEvents

False Positives

  • Legitimate backup software (Veeam, Backup Exec, Acronis) that splits archive volumes by size for storage media compatibility
  • IT administrators manually splitting large log archives or database exports for transfer to off-site storage or ticketing systems
  • Cloud sync tools (Rclone, rsync wrappers) configured by ops teams to use chunk uploads to cloud storage (S3, GCS, Azure Blob) for large dataset transfers
  • Software release pipelines splitting large installation packages into volumes for distribution via CD/DVD-size constraints
  • Developers using split/7z for legitimate data migration tasks, especially around quarter-end when large data sets are archived

Sigma rule & cross-platform mapping

The detection logic for Data Transfer Size Limits (T1030) above is provided in a vendor-neutral form so you can deploy it on any SIEM. The same logic is shipped here as native KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the following logsource:

logsource:
  category: process_creation
  product: windows

Browse the community-maintained Sigma rules for this technique:


Testing Methodology

Validate this detection against 4 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1Split file into fixed-size chunks using Unix split command

    Expected signal: Linux auditd SYSCALL records for execve() invoking dd and split with arguments. Sysmon for Linux (if deployed) Event ID 1 (ProcessCreate) with Image=/usr/bin/split, CommandLine containing '-b 102400'. File creation events (Sysmon Event ID 11) for /tmp/argus_chunk_00, /tmp/argus_chunk_01, etc. The ls output confirms 5 files of approximately 100KB each.

  2. Test 2Create split 7-Zip archive with volume size flag

    Expected signal: Sysmon Event ID 1 (Process Create): Image=C:\Program Files\7-Zip\7z.exe, CommandLine containing 'a -v1m' and the target path. Sysmon Event ID 11 (File Create): Multiple events for argus_exfil_chunks.7z.001 through .005 in %TEMP%. Security Event ID 4688 (if command line auditing enabled) with same process details. PowerShell/cmd parent process event visible if launched from a script.

  3. Test 3PowerShell fixed-size file chunking script (implant-style)

    Expected signal: Sysmon Event ID 1 (Process Create): Image=powershell.exe, CommandLine containing ReadAllBytes, WriteAllBytes, and chunkSize=2048. Sysmon Event ID 11 (File Create): Multiple events for argus_chunk_000, argus_chunk_001, etc. in %TEMP%. PowerShell ScriptBlock Log Event ID 4104 will capture the full chunking logic. No compression tool invocation — this tests the file-creation-based detection branch.

  4. Test 4Rclone file exfiltration with chunk size limit

    Expected signal: Sysmon Event ID 1 (Process Create): Image=rclone.exe (or full path), CommandLine containing 'copy', '--max-size', '--transfers'. Security Event ID 4688 (if command line auditing enabled). Sysmon Event ID 3 (Network Connection) would fire if targeting a real remote — absent here due to local target. If rclone is not present the test exits gracefully with a message.


Response Playbook

Triage

  1. Identify the splitting tool and command line in full — note the volume size (e.g., -v100m = 100MB chunks, -v1500b = 1500-byte chunks). Unusually small chunk sizes (below 10MB) are more suspicious as they suggest threshold evasion rather than media compatibility.
  2. Determine what data was being split — review the source path/filename in the command line. Is it a staging directory (e.g., C:\Users\Public\, C:\ProgramData\, /tmp/)? Are the source files named to suggest recently collected data (e.g., 'loot', 'exfil', 'creds', 'dump')?
  3. Check whether the chunks were subsequently transmitted — query DeviceNetworkEvents or firewall logs for outbound connections from the same device within 30 minutes following the splitting activity. HTTP POST or FTP connections to external IPs are strong corroboration.
  4. Review the parent process — was the compression tool launched by a scripting engine (cmd.exe, powershell.exe, bash, python), an Office application, a remote management tool, or a scheduled task? Adversaries rarely invoke split/archive tools interactively.
  5. Assess the user account context — is this a standard user, service account, or administrator? Would this user/system have legitimate reasons to create split archives? Check for concurrent lateral movement or credential access activity from the same account.
  6. Check for preceding reconnaissance or collection activity — search DeviceProcessEvents in the prior 1–2 hours for discovery commands (dir /s, find, ls -R, Get-ChildItem), data staging (xcopy, robocopy, cp with wildcard patterns), or credential dumping. T1030 is a late-stage exfil-preparation technique.

Containment

  1. If active exfiltration is suspected: immediately isolate the endpoint using EDR network isolation or VLAN quarantine to prevent chunk transmission while preserving the host for forensic collection.
  2. If chunks have already been transmitted: block the destination IP/domain at the perimeter firewall and proxy. Notify the security team to request IP intelligence on the destination.
  3. If a compromised account is identified: disable the account in Active Directory/Azure AD, revoke active sessions and OAuth tokens, and rotate any credentials that may have been staged for exfiltration.
  4. Preserve all chunk files in place — do not delete them until forensic imaging is complete. The files themselves may contain sensitive data that needs to be catalogued for breach notification purposes.
  5. If rclone was used: locate the rclone configuration file (typically %APPDATA%\rclone\rclone.conf or ~/.config/rclone/rclone.conf) — it may contain cloud storage credentials for attacker-controlled accounts. Revoke those cloud credentials immediately.

Evidence Collection

  1. Chunk files on disk — collect all files matching the sequential naming pattern from the staging directory. Hash each file (SHA-256) and record sizes, timestamps (created/modified/accessed via $STANDARD_INFORMATION and $FILE_NAME in NTFS MFT).
  2. Process creation logs — Sysmon Event ID 1 or Security Event ID 4688 (with command line auditing enabled) for the compression/split tool invocation and its parent process chain.
  3. File system timeline — extract $MFT via tools like mftdump or Velociraptor to build a timeline of file creation/deletion in the staging directory. Deleted chunk files may still have MFT records with timestamps.
  4. Prefetch files — C:\Windows\Prefetch\7Z.EXE-*.pf, RAR.EXE-*.pf, RCLONE.EXE-*.pf contain execution timestamps and referenced file paths, confirming tool use even if logs have been cleared.
  5. Rclone configuration — if rclone was involved, collect %APPDATA%\rclone\rclone.conf which contains remote storage definitions, access keys, and possibly destination paths that identify the attacker's infrastructure.
  6. Network telemetry — proxy/firewall logs for outbound connections from the affected host in the 1–2 hour window after chunk creation. Look for repeated POST requests with similar content-length values or FTP/SFTP/SCP sessions.
  7. Shell history — Windows: PSReadLine history at %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt; Linux/macOS: ~/.bash_history, ~/.zsh_history — may reveal the full command used to initiate splitting.

Escalation Criteria

  • ! Chunk files contain or are named to suggest sensitive data (credentials, PII, financial records, source code, configuration files with secrets).
  • ! Network evidence confirms chunks were transmitted to an external host — particularly cloud storage services (S3, Mega, Dropbox, OneDrive) not approved for corporate data, or raw IP addresses.
  • ! The rclone configuration file references attacker-controlled remote storage targets (personal cloud accounts, known threat actor infrastructure).
  • ! The chunk size matches a known malware family pattern (1500 bytes = OopsIE, 2048 bytes = POSHSPY, 27 characters = Kevin/Lyceum, 102400 bytes = RDAT) suggesting an active implant rather than manual operator activity.
  • ! Multiple hosts on the network exhibit the same splitting pattern within a short time window, indicating automated lateral propagation (e.g., ransomware with built-in exfiltration like Play or a worm-like implant).
  • ! Evidence of prior collection stage: data aggregated from network shares, database exports, or credential stores before splitting, indicating a targeted, multi-stage intrusion.

Investigation Guide

Forensic Artifacts

  • > NTFS $MFT records for sequentially named chunk files — even after deletion, MFT entries persist and reveal creation timestamps, sizes, and parent directory references.
  • > Windows Prefetch: C:\Windows\Prefetch\7Z.EXE-*.pf, RAR.EXE-*.pf, RCLONE.EXE-*.pf — confirm tool execution with timestamps and files referenced during execution.
  • > Rclone configuration: %APPDATA%\rclone\rclone.conf (Windows) or ~/.config/rclone/rclone.conf (Linux/macOS) — contains remote storage targets and access credentials.
  • > Shell history: PSReadLine ConsoleHost_history.txt (Windows), ~/.bash_history, ~/.zsh_history, /root/.bash_history — may contain the exact split/archive command used.
  • > Windows Event Log: Security Event ID 4663 (Object Access) — if auditing is enabled on staging directories, records file creation events for chunk files.
  • > Windows Event Log: Sysmon Event ID 11 (FileCreate) and Event ID 23 (FileDelete) — tracks creation and deletion of chunk files.
  • > LNK / Jump List files: %APPDATA%\Microsoft\Windows\Recent\ and %APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\ — may contain references to split source files.
  • > Linux auditd: /var/log/audit/audit.log — SYSCALL records for execve() calls invoking split, tar, or gzip with size-limiting flags, plus open()/write() for chunk file creation.
  • > Network flow records (NetFlow/IPFIX): consistent payload sizes in repeated flows to the same external IP are a strong indicator of chunked exfiltration even when payload is encrypted.

Tuning Guidance

Begin by profiling legitimate archive-splitting activity in your environment. The primary legitimate sources are: (1) backup software (Veeam, Acronis, Windows Server Backup) — typically running as SYSTEM from backup service executables with consistent schedules; (2) IT-sanctioned Rclone deployments — establish an allowlist of known rclone remote configurations and run accounts; (3) developer tooling in CI/CD pipelines — often evident from build agent parent processes. To reduce false positives in the file-creation query, scope the FolderPath filter to exclude known backup staging directories and increase the ChunkCount threshold to 5 or more if your backup tooling creates 3-4 part files routinely. For the network uniformity query, tune the SizeVarianceRatio threshold based on observed variance in your environment's legitimate HTTP traffic — start conservative at 0.05 and widen to 0.20 if needed. Consider suppressing alerts where the initiating process is a known backup agent (veeam.exe, robocopy.exe in a scheduled context, vss writers). The most reliable signal in this technique is Rclone with cloud remote targets — apply the strictest tuning here last, as legitimate business use of Rclone copying to personal cloud accounts is itself a risk regardless of T1030.


Hunting Queries

Hunt for three or more sequential chunk files created in user-writable staging directories (Temp, Public, ProgramData, /tmp) within a 60-minute window. Limiting scope to high-risk staging paths and requiring at least three chunks reduces false positives from ad-hoc archiving while catching adversaries rapidly splitting staged data for upload. DurationMinutes helps distinguish burst splitting (rapid exfil) from spread-out backup jobs.

Hunting — KQL
kql
// Hunt: Staged chunk files in user-writable temp/public directories
DeviceFileEvents
| where Timestamp > ago(7d)
| where ActionType == "FileCreated"
| where FolderPath has_any ("\\Temp\\", "\\tmp\\", "\\Public\\", "\\ProgramData\\", "\\AppData\\Local\\Temp\\", "/tmp/", "/var/tmp/")
| where FileName matches regex @"(?i)\.(00[1-9]|0[1-9][0-9]|[0-9]{3}|part[0-9]+|r[0-9]{2}|z[0-9]{2})$"
    or FileName matches regex @"(?i)\.(7z|zip|rar|tar|gz|bz2)\.[0-9]{1,3}$"
| summarize
    ChunkCount = count(),
    TotalFileSize = sum(FileSize),
    FileNames = make_set(FileName, 20),
    StagingPaths = make_set(FolderPath, 5),
    Earliest = min(Timestamp),
    Latest = max(Timestamp)
  by DeviceName, AccountName, InitiatingProcessFileName
| where ChunkCount >= 3
| extend DurationMinutes = datetime_diff('minute', Latest, Earliest)
| where DurationMinutes <= 60
| sort by ChunkCount desc
Hunting — SPL
spl
index=wineventlog sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=11
  (TargetFilename="*\\Temp\\*" OR TargetFilename="*\\Public\\*" OR TargetFilename="*\\ProgramData\\*" OR TargetFilename="*/tmp/*")
  (TargetFilename="*.001" OR TargetFilename="*.002" OR TargetFilename="*.003"
   OR TargetFilename="*.part1" OR TargetFilename="*.part2" OR TargetFilename="*.r00"
   OR TargetFilename="*.r01" OR TargetFilename="*.7z.001" OR TargetFilename="*.rar.001")
| stats count as ChunkCount, values(TargetFilename) as FileNames, 
        earliest(_time) as FirstSeen, latest(_time) as LastSeen
    by host, User, Image
| where ChunkCount >= 3
| eval DurationMins=round((LastSeen - FirstSeen) / 60, 1)
| where DurationMins <= 60
| sort - ChunkCount

Hunt for repeated successful outbound connections to the same external IP over a 1-hour window where sent byte counts are suspiciously uniform (less than 15% variance). This pattern is characteristic of implants like OopsIE (1500-byte blocks), POSHSPY (2048-byte chunks), and RDAT (102,400-byte portions) that use fixed-size send buffers. SizeVarianceRatio below 0.15 distinguishes deliberate chunking from normal HTTP request variability.

Hunting — KQL
kql
// Hunt: Uniform-size repeated outbound network connections (chunked HTTP/S upload pattern)
DeviceNetworkEvents
| where Timestamp > ago(7d)
| where ActionType == "ConnectionSuccess"
| where RemoteIPType == "Public"
| where RemotePort in (80, 443, 8080, 8443, 21, 22, 2222, 2121)
| where SentBytes > 1000 and SentBytes < 10000000  // filter trivial keep-alives and huge single transfers
| summarize
    ConnectionCount = count(),
    MinSent = min(SentBytes),
    MaxSent = max(SentBytes),
    TotalSent = sum(SentBytes),
    Ports = make_set(RemotePort, 5)
  by DeviceName, InitiatingProcessFileName, RemoteIP, bin(Timestamp, 1h)
| where ConnectionCount >= 5
| extend SizeVarianceRatio = todouble(MaxSent - MinSent) / todouble(MaxSent)
| where SizeVarianceRatio < 0.15  // less than 15% variance = suspiciously uniform chunk sizes
| extend TotalSentMB = round(todouble(TotalSent) / 1048576, 2)
| sort by TotalSentMB desc
Hunting — SPL
spl
index=wineventlog sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=3
  NOT (DestinationIp="10.*" OR DestinationIp="172.16.*" OR DestinationIp="172.17.*"
       OR DestinationIp="172.18.*" OR DestinationIp="172.31.*" OR DestinationIp="192.168.*"
       OR DestinationIp="127.*")
  (DestinationPort=80 OR DestinationPort=443 OR DestinationPort=8080
   OR DestinationPort=8443 OR DestinationPort=21 OR DestinationPort=22)
| stats count as ConnectionCount, 
        values(DestinationPort) as Ports,
        dc(DestinationIp) as UniqueIPs
    by host, Image, DestinationIp, span(_time, 1h)
| where ConnectionCount >= 5 AND UniqueIPs = 1
| sort - ConnectionCount

Hunt for Rclone executions that reference cloud storage remote targets (S3, Google Drive, OneDrive, Dropbox, Mega, Backblaze B2, WebDAV, SFTP) combined with copy/sync/move operations. Rclone is heavily used by threat actors including Conti, Black Basta, ALPHV, and Play ransomware groups for exfiltration to attacker-controlled cloud storage. HasChunking flags when --chunk-size or --max-size arguments further suggest deliberate size-limiting behavior.

Hunting — KQL
kql
// Hunt: Rclone execution with remote storage targets (cloud exfiltration)
DeviceProcessEvents
| where Timestamp > ago(7d)
| where FileName =~ "rclone.exe" or ProcessCommandLine has "rclone"
| extend HasRemoteTarget = ProcessCommandLine has_any ("copy", "sync", "move", "mount", "ls", "lsd")
| extend HasChunking = ProcessCommandLine has_any ("--chunk-size", "--max-size", "chunker:", "--transfers")
| extend HasCloudTarget = ProcessCommandLine has_any (
    "s3:", "drive:", "onedrive:", "dropbox:", "mega:", "b2:", 
    "sftp:", "ftp:", "http:", "webdav:", "azureblob:", "gcs:"
  )
| where HasRemoteTarget and HasCloudTarget
| project Timestamp, DeviceName, AccountName, ProcessCommandLine,
         InitiatingProcessFileName, InitiatingProcessCommandLine,
         HasChunking, HasCloudTarget
| sort by Timestamp desc
Hunting — SPL
spl
index=wineventlog sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1
  Image="*\\rclone.exe"
  (CommandLine="*copy*" OR CommandLine="*sync*" OR CommandLine="*move*")
  (CommandLine="*s3:*" OR CommandLine="*drive:*" OR CommandLine="*onedrive:*"
   OR CommandLine="*dropbox:*" OR CommandLine="*mega:*" OR CommandLine="*sftp:*"
   OR CommandLine="*ftp:*" OR CommandLine="*webdav:*" OR CommandLine="*azureblob:*"
   OR CommandLine="*b2:*")
| eval HasChunking=if(match(CommandLine,"(--chunk-size|--max-size|chunker:)"),1,0)
| table _time, host, User, Image, CommandLine, ParentImage, ParentCommandLine, HasChunking
| sort - _time

Atomic Red Team Tests

Test 1 Split file into fixed-size chunks using Unix split command
linux

Uses the Linux/macOS 'split' utility to divide a generated test file into 100KB chunks, simulating the file-splitting preparation phase used by threat actors before exfiltrating data in size-limited transfers. Creates a 500KB test file and splits it into 5 parts named with the .001-.005 suffix pattern.

Command

bash
dd if=/dev/urandom of=/tmp/argus_test_data.bin bs=1024 count=500 2>/dev/null && split -b 102400 -d /tmp/argus_test_data.bin /tmp/argus_chunk_ && ls -la /tmp/argus_chunk_*

Cleanup

bash
rm -f /tmp/argus_test_data.bin /tmp/argus_chunk_*

Expected Telemetry

Linux auditd SYSCALL records for execve() invoking dd and split with arguments. Sysmon for Linux (if deployed) Event ID 1 (ProcessCreate) with Image=/usr/bin/split, CommandLine containing '-b 102400'. File creation events (Sysmon Event ID 11) for /tmp/argus_chunk_00, /tmp/argus_chunk_01, etc. The ls output confirms 5 files of approximately 100KB each.

Expected Detection

KQL Part 2 (sequential chunk file creation) fires if Sysmon for Linux is deployed and forwarding to Sentinel. SPL query triggers on Sysmon Event ID 11 for chunk files in /tmp/. Hunting query 1 (staging path + sequential files) fires on /tmp/ path with 5+ chunk files within a 10-minute window.

Test 2 Create split 7-Zip archive with volume size flag
windows

Uses 7-Zip on Windows to create a multi-volume archive split into 1MB parts — the exact technique used by APT28 (split below 1MB), LuminousMoth (5MB limit bypass), and Play ransomware. The -v flag with a size unit is the primary command-line indicator for this technique.

Command

powershell
fsutil file createnew %TEMP%\argus_test_source.bin 5242880 && "C:\Program Files\7-Zip\7z.exe" a -v1m %TEMP%\argus_exfil_chunks.7z %TEMP%\argus_test_source.bin && dir %TEMP%\argus_exfil_chunks.7z.*

Cleanup

powershell
del /f /q "%TEMP%\argus_test_source.bin" "%TEMP%\argus_exfil_chunks.7z" "%TEMP%\argus_exfil_chunks.7z.001" "%TEMP%\argus_exfil_chunks.7z.002" "%TEMP%\argus_exfil_chunks.7z.003" "%TEMP%\argus_exfil_chunks.7z.004" "%TEMP%\argus_exfil_chunks.7z.005" 2>nul

Expected Telemetry

Sysmon Event ID 1 (Process Create): Image=C:\Program Files\7-Zip\7z.exe, CommandLine containing 'a -v1m' and the target path. Sysmon Event ID 11 (File Create): Multiple events for argus_exfil_chunks.7z.001 through .005 in %TEMP%. Security Event ID 4688 (if command line auditing enabled) with same process details. PowerShell/cmd parent process event visible if launched from a script.

Expected Detection

KQL Part 1 fires: FileName=7z.exe, ProcessCommandLine has '-v'. SignalType=SevenZipVolume. KQL Part 2 fires: .7z.001 through .7z.005 files created in Temp within 10 minutes (ChunkCount>=3). SPL union both branches fire. Hunting query 1 fires on Temp path with 5 chunk files.

Test 3 PowerShell fixed-size file chunking script (implant-style)
windows

Simulates the file-chunking behavior of C2 implants (e.g., POSHSPY 2048-byte chunks, RDAT 102400-byte portions) using a PowerShell script that reads a file and writes it in fixed-size byte arrays to numbered output files. This tests detection of script-based chunking without compression tool invocation.

Command

powershell
powershell.exe -Command "$chunkSize=2048; $src=\"$env:TEMP\\argus_implant_test.bin\"; [System.IO.File]::WriteAllBytes($src, [byte[]](1..200 | ForEach-Object { Get-Random -Max 256 })); $data=[System.IO.File]::ReadAllBytes($src); $i=0; $part=0; while($i -lt $data.Length){ $end=[Math]::Min($i+$chunkSize,$data.Length); $chunk=$data[$i..($end-1)]; [System.IO.File]::WriteAllBytes(\"$env:TEMP\\argus_chunk_$('{0:D3}' -f $part)\", $chunk); $i=$end; $part++ }; Write-Host \"Created $part chunks\""

Cleanup

powershell
powershell.exe -Command "Remove-Item $env:TEMP\argus_implant_test.bin,$env:TEMP\argus_chunk_* -ErrorAction SilentlyContinue"

Expected Telemetry

Sysmon Event ID 1 (Process Create): Image=powershell.exe, CommandLine containing ReadAllBytes, WriteAllBytes, and chunkSize=2048. Sysmon Event ID 11 (File Create): Multiple events for argus_chunk_000, argus_chunk_001, etc. in %TEMP%. PowerShell ScriptBlock Log Event ID 4104 will capture the full chunking logic. No compression tool invocation — this tests the file-creation-based detection branch.

Expected Detection

KQL Part 1 fires if the script process matches powershell.exe with chunking context. KQL Part 2 fires strongly: argus_chunk_000 through argus_chunk_NNN files created in Temp within minutes (ChunkCount >> 3). SPL EventCode=11 branch fires. Hunting query 1 (Temp staging path) triggers with high ChunkCount.

Test 4 Rclone file exfiltration with chunk size limit
windows

Demonstrates the Rclone chunker overlay technique used by ransomware groups (Conti, Black Basta, Play) and APT actors to split large files during cloud upload. Creates a local rclone remote configuration pointing to a local path (safe, no actual external upload) and performs a copy with explicit chunk-size parameter — generating the command-line artifacts without actual data exfiltration.

Command

powershell
rclone.exe copy %TEMP%\argus_rclone_test.txt :local:%TEMP%\argus_rclone_dest --max-size 500k --transfers 2 --log-level INFO 2>&1 || echo Rclone not installed — install from https://rclone.org/downloads/ to run this test

Cleanup

powershell
del /f /q "%TEMP%\argus_rclone_test.txt" 2>nul && rd /s /q "%TEMP%\argus_rclone_dest" 2>nul

Expected Telemetry

Sysmon Event ID 1 (Process Create): Image=rclone.exe (or full path), CommandLine containing 'copy', '--max-size', '--transfers'. Security Event ID 4688 (if command line auditing enabled). Sysmon Event ID 3 (Network Connection) would fire if targeting a real remote — absent here due to local target. If rclone is not present the test exits gracefully with a message.

Expected Detection

KQL Part 1 fires: FileName=rclone.exe, ProcessCommandLine has '--max-size'. SignalType=RcloneMaxSize. SPL EventCode=1 branch fires for rclone.exe with --max-size. Hunting query 3 (Rclone with cloud targets) would fire if a real cloud remote were specified — run that variant only in an authorized test environment.

Related Detections