Executive Summary
| Family | VECT 2.0 |
| Platform | Windows x64 (PE32+, MinGW-w64 / C++) |
| Encryption | ChaCha20 stream cipher, libsodium-derived |
| Sophistication (Operational) | High — full Active Directory tradecraft, ten distinct PowerShell lateral primitives, Safe Mode persistence, comprehensive killchain |
| Sophistication (Cryptographic) | Low — hardcoded universal key, lost-nonce bug |
| Exfiltration | None observed — no socket / HTTP / DNS / SMTP transport in the binary, despite the ransom note's leak threat |
| Recovery feasibility | Partial — small files trivially decryptable with the extracted key; large files structurally destroyed |
| Sample SHA-256 | 01881ad57dec5254c53334a63a6c7216edc3dcf0dce02536856bcff9d66fef5d |
Critical Weaknesses
1. Hardcoded universal ChaCha20 key
The 256-bit key used to encrypt every file in this build is statically embedded in .text at the crypto-state initializer. A cosmetic randomization gesture XORs an unrelated 64-byte region with a single random byte, but the actual cipher key (offsets 64..95 of the 97-byte state) is never modified at runtime.
6A 51 09 57 F1 BF 8E CE D9 AA E3 AA 5E 86 12 15
2D 0A BB F1 11 FC D2 A3 9F 02 FF E6 00 0F 6B E8
Impact: any victim of this build whose files are smaller than 128 KiB can be decrypted immediately. No cryptanalysis required, no operator cooperation needed.
2. Lost-nonce flaw → irreversible destruction of large files
For files > 128 KiB the ransomware encrypts four 32 KiB chunks (at file_size × {0, ¼, ½, ¾}) using four independent random 12-byte nonces — but the same stack-local buffer is reused for each call to RtlGenRandom. Only the last nonce ends up appended as the EOF footer. The first three nonces are not stored on disk, not transmitted, not derivable.
Impact: 75 % of every encrypted document, database, virtual disk, or backup archive larger than 128 KiB is cryptographically unrecoverable, regardless of payment. VECT 2.0 functions as a wiper on enterprise data sets. The operator cannot honour a "we will decrypt after payment" promise even if they wanted to.
3. Ransom-note exfiltration claim is not backed by code
The ransom note threatens public release of stolen data. The binary contains:
- No
socket/connect/send/WSAStartup/WinHttp*/WinInet*/bcrypt/crypt32imports - No URL outside
.onionfor the chat portal - No staging directory, no archive, no compression for outbound exfil
The only network-adjacent activity is SMB share mounting (MPR.dll!WNetAddConnection2A) for local read/write file access during encryption, and WS2_32 address-string utilities. The leak threat is bluff in this build.
Sample Fingerprint
| SHA-256 | 01881ad57dec5254c53334a63a6c7216edc3dcf0dce02536856bcff9d66fef5d |
| MD5 | 5cce0d983f04d51d102a91b8353717fa |
| Size | 1,456,128 bytes |
| Toolchain | MinGW-w64 / GCC libstdc++, Itanium mangling, no PDB |
| Image base | 0x140000000 |
| Encryption library | libsodium-derived (ChaCha20, BLAKE2b, X25519, Poly1305 statically linked) |
| String obfuscation | per-string 64-bit XOR cycle-of-8, lazy decrypt + atexit re-encrypt |
| Mutex | none |
Killchain at a Glance
[1] Stage gate C:\ProgramData\.vect must exist (presence-only check)
[2] Privilege OpenProcessToken + GetTokenInformation(TokenElevation)
[3] Recon ADSI 'objectCategory=computer' + 192.168.1.0/24 fallback
[4] Weaken Set-MpPreference (Defender), vssadmin delete shadows /all /quiet,
wevtutil cl, kill 28 services, kill 8 processes
[5] Persist Run\<basename>, SafeBoot\Minimal\<basename>.exe = "Service",
SafeBoot\Network\<basename>.exe = "Service"
[6] Pivot (--gpo) Three parallel std::thread workers iterate 10 PowerShell
lateral primitives over discovered hosts
[7] Encrypt For each drive: max(4, n/8) scanner threads + max(12, n - n_scan)
encryptor threads; producer/consumer queue
[8] Visual stamp Render dvm3_wall.bmp 1920x1080 with VECT 2.0 + victim_id;
SystemParametersInfoW(SPI_SETDESKWALLPAPER)
[9] Note drop !!!READ_ME!!!.txt in every visited directory
[10] Self-delete cmd /c ping -n 3 127.0.0.1 > nul & del %0
Lateral Movement (10 PowerShell Primitives)
All ten share the same ADSI domain enumeration preamble and the same staging convention \\<host>\C$\ProgramData\<filename>. Five require credentials passed via --creds, five do not.
| # | Technique | Remote primitive |
|---|---|---|
| 1 | SMB stage only | Copy-Item to admin share |
| 2 | SMB + cmdkey | Copy-Item + local cmdkey /generic:$pc /user:$u /pass:$p |
| 3 | WMI Win32_Process Create | Invoke-WmiMethod -Class Win32_Process -Name Create |
| 4 | WMI Win32_Process Create (variant B) | duplicate with reordered init |
| 5 | DCOM CIM Win32_Process | New-CimSessionOption -Protocol Dcom + Invoke-CimMethod |
| 6 | DCOM MMC20.Application | [activator]::CreateInstance(...).Document.ActiveView.ExecuteShellCommand(..., '7') |
| 7 | WinRM Invoke-Command | Invoke-Command -Credential $cred -ScriptBlock { Start-Process } |
| 8 | Service install | sc.exe \\$pc create $svc binPath= ... start= auto, then start, then delete |
| 9 | schtasks | schtasks /create /s $pc /ru SYSTEM /f, /run, /delete |
| 10 | DCOM scheduled task SYSTEM | CIM session over DCOM + Register-ScheduledTask -Principal SYSTEM RunLevel Highest |
Service names follow the pattern DM[A-Z]{4} (random uppercase). PowerShell timeouts at 60 seconds via WaitForSingleObject.
Detection & Response
Priority IOCs
| Type | Value |
|---|---|
| File extension | .vect (appended after original extension) |
| Ransom note | !!!READ_ME!!!.txt (in every encrypted directory) |
| Wallpaper artefact | %TEMP%\dvm3_wall.bmp (1920×1080, 24-bit) |
| Stage gate marker | C:\ProgramData\.vect (zero-byte presence check) |
| Tor chat | vectordntlcrlmfkcm4alni734tbcrnd5lk44v6sp4lqal6noqrgnbyd.onion |
| Backup contact | Tox 1A51DCBB33FBF603B385D223F599C6D64545E631F7C870FFEA320D84CE5DAF076C1F94100B5B |
| Campaign ID | 5cb9f0f9-e171-403f-bed9-a3cd6ce36d1f (in chat URL /chat/<uuid>) |
| Encrypted file footer | trailing 12 random bytes (ChaCha20 nonce of last chunk) |
High-signal behaviours
bcdedit /set {default} safeboot minimalfrom a non-admin-tool processvssadmin delete shadows /all /quietSet-MpPreference -DisableRealtimeMonitoring $true ...fromcmd.exeparentwevtutil cl Application/Security/System/'Windows PowerShell'- Service stop sweep covering CommVault, Veeam, MSSQL, Oracle, MySQL, MongoDB, QuickBooks
- Process kill sweep covering
sql.exe,oracle.exe,mysqld.exe, Office (excel.exe,winword.exe,outlook.exe), browsers (firefox.exe,thunderbird.exe) - Registry write to
HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\<basename>.exe - Registry write to
HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\<basename>.exe Copy-Itemto\\<host>\C$\ProgramData\from a non-administrative tool- Scheduled task created with name
DM[A-Z]{4}and immediately deleted - Service name pattern
DM[A-Z]{4}created, started, deleted within seconds - Self-delete pattern
cmd.exe /c ping -n N 127.0.0.1 > nul & del <path>
Hunting queries (Sigma-style sketch)
title: VECT 2.0 — Safe Mode Persistence Write
detection:
selection:
EventID: 13 # Sysmon RegistryEvent
TargetObject|contains:
- '\Control\SafeBoot\Minimal\'
- '\Control\SafeBoot\Network\'
Details: 'Service'
condition: selection
title: VECT 2.0 — Stage Gate Drop
detection:
selection:
EventID: 11 # Sysmon FileCreate
TargetFilename: 'C:\ProgramData\.vect'
condition: selection
title: VECT 2.0 — Wallpaper Artefact
detection:
selection:
EventID: 11
TargetFilename|endswith: '\dvm3_wall.bmp'
condition: selection
Response priorities
- Containment: isolate hosts where
\\*\C$\ProgramData\.vectwas created in the last 24 h. - Triage encrypted files: anything ≤ 128 KiB is decryptable with the universal key extracted from this build. Anything > 128 KiB is structurally non-recoverable — do not pay; payment cannot recover the lost-nonce chunks.
- Hunt for the stage gate marker
C:\ProgramData\.vectacross the estate — its presence indicates pre-execution staging. - Audit Safe Mode boot configuration on all reachable hosts (
bcdedit /enum {default}); Safe Mode persistence is designed to survive standard EDR remediation. - Pull all 28 service stops and 8 process terminations from EDR telemetry as a single anomaly cluster — that pattern is highly distinctive.
Threat Positioning
The operational profile reads as a competent red-team operator with strong Active Directory tradecraft: the lateral-movement toolkit (10 distinct primitives covering SMB, WMI, DCOM, WinRM, native scheduled tasks, services, MMC) is broader than the typical commodity ransomware loader, the kill list is curated (CommVault and Veeam alongside MSSQL/Oracle/MySQL/QuickBooks suggests deliberate enterprise targeting), and the persistence chain anticipates Safe Mode boot as an EDR-bypass vector.
The cryptographic engineering, by contrast, reads as work by a developer who has heard of "intermittent encryption" and "ChaCha20" but has not implemented either correctly:
- A static-init helper writes a fixed 32-byte block and treats the surrounding 64 bytes (which the cipher never reads) as the "randomized" portion. This is a misunderstanding of which region of the state the cipher uses.
- A four-chunk encryption loop writes its nonces to a stack local that is overwritten on each iteration, with no awareness that the lost nonces are required for decryption.
- ChaCha20 is used without authentication (no Poly1305) despite Poly1305 being statically linked into the binary.
- A 35-entry analysis-tool exe-name blocklist is compiled into
.databut referenced by no executable code path.
The mismatch between the two skill sets — operationally sharp, cryptographically incompetent — is the dominant signature of this build. It is consistent with a small operator team where the AD tradecraft is owned by one author and the encryption module by another (or by an LLM-assisted developer with no review).
MITRE ATT&CK
| ID | Technique |
|---|---|
| T1486 | Data Encrypted for Impact |
| T1490 | Inhibit System Recovery (vssadmin delete shadows, wevtutil cl) |
| T1562.001 | Disable Tools (Set-MpPreference) |
| T1547.001 | Registry Run Keys (HKLM\…\Run\<basename>) |
| T1547.001 | Safe Mode Persistence (SafeBoot\Minimal/Network) |
| T1059.001 | PowerShell |
| T1021.002 | SMB / Admin Shares (lateral copy) |
| T1021.003 | DCOM (MMC20.Application, CIM Win32_Process) |
| T1021.006 | WinRM |
| T1047 | WMI (Win32_Process Create) |
| T1053.005 | Scheduled Task / Job (schtasks, Register-ScheduledTask) |
| T1543.003 | Windows Service (sc.exe \\$pc create) |
| T1087.002 | Domain Account Discovery (ADSI) |
| T1135 | Network Share Discovery (NetShareEnum, WNetEnumResource) |
| T1491.001 | Internal Defacement (wallpaper replacement) |
| T1070.001 | Windows Event Log Clearing (wevtutil cl) |
| T1070.003 | Clear Command History (PSReadLine\ConsoleHost_history.txt) |
| T1070.004 | File Deletion (self-delete via ping & del) |
| T1027 | Obfuscated Files or Information (XOR string obfuscation) |
Verdict
| Axis | Score |
|---|---|
| Operational tradecraft | High |
| Cryptographic engineering | Poor |
| Exfiltration capability | Absent |
| Persistence robustness | High (Safe Mode) |
| Recovery feasibility for the victim | Partial — small files yes, large files no |
| Threat to enterprise environments | High (despite the broken crypto) |
VECT 2.0 should be treated as a destructive incident, not a recoverable encryption event. Do not rely on payment as a recovery path: the operator does not possess the means to restore the lost-nonce chunks even with intent. Treat any host carrying .vect-suffixed files larger than 128 KiB as having lost that data.