SHEET#CREEP — APT36 / Transparent Tribe Google Sheets API RAT
Executive Summary
SHEET#CREEP is an ongoing espionage campaign tracked by Securonix Threat Research, attributed with moderate confidence to APT36 / Transparent Tribe (Pakistan-aligned), a group historically targeting Indian government and military entities. The campaign delivers a compact (~20 KB) C# remote access trojan that abuses the Google Sheets API as its entire command-and-control channel. The malware family was first documented by Zscaler ThreatLabz (Jan 2026); the current Securonix analysis is a continuation/evolution with new obfuscation and evasion.
Initial access is a diplomatic-themed ISO lure (e.g. a UAE–India strategic-partnership theme, UAE-India_Strategic_Partnership_Week.iso) containing a LNK shortcut masquerading as a PDF. When the user double-clicks the mounted ISO, the LNK launches a C# dropper that shows a decoy PDF while installing the RAT (vaultsvc.exe) into %LOCALAPPDATA%\Microsoft\Vault\ with Hidden+System attributes, then self-deletes. Persistence is a COM-created scheduled task WindowsVaultSyncService with a deliberately confusing description mixing Edge/Windows/Discord terms.
For C2, the RAT authenticates to a single attacker-owned spreadsheet using an embedded GCP service-account RSA-2048 private key (JWT/OAuth2), then uses one spreadsheet tab per victim (keyed by a username-hostname-4charhash id). Operators write Base64-encoded commands to one column; the victim returns Base64 output in another column. To all network monitoring this looks like ordinary Google Workspace traffic to sheets.googleapis.com / oauth2.googleapis.com.
Two evolutions raise the bar for defenders: (1) C2 config strings (spreadsheet ID, service-account creds) that were previously plaintext are now XOR-obfuscated with the key "discrete" and decrypted only at runtime, defeating static config-string hunting; and (2) the RAT executes PowerShell entirely in-process via the System.Management.Automation namespace — no child powershell.exe is ever spawned. Researchers extracted the embedded creds, authenticated to the live sheet, and found 91 active victim tabs (including a high-confidence target in Islamabad, Pakistan), alongside numerous sandbox/researcher tabs.
Defender priority: The in-process PowerShell design removes the usual child-process command-line signal — this is a deliberate detection gap. Pivot the hunt to the durable spine: (1) a non-browser / unsigned .NET process talking to the Google Sheets API, and (2) the load points — execution from a mounted ISO/removable volume, a binary running out of %LOCALAPPDATA%\Microsoft\Vault\, and the WindowsVaultSyncService scheduled task. Any one confirmed hit is a probable live RAT — treat as active espionage intrusion.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| 1 · Vendor | Securonix Threat Research — "SHEET#CREEP Evolved" | Primary report: APT36 attribution (moderate), Google Sheets C2, embedded GCP key, XOR key "discrete", in-process PowerShell, 91 victim tabs, full IOCs. | Yes |
| 1 · Vendor | Zscaler ThreatLabz (Jan 2026) | First documentation of the SHEET#CREEP malware family / Google Sheets RAT — origin baseline. | Yes |
| 2 · Press | Cyber Security News | SHEET#CREEP C# RAT abuses Google Sheets API; hardcoded service account, Base64 columns, XOR "discrete", in-process execution, vaultsvc.exe IOCs. | Yes |
| 2 · Press | SOC Prime — config-obfuscation analysis | Malware returns with new config obfuscation (plaintext → XOR), detection content emphasis. | Yes |
| 2 · Press | GBHackers — UAE–India diplomatic lure | Diplomatic ISO lure theme; targeting context. | Partial |
Web-hunter note: Atomic file hashes and the C2 spreadsheet ID/service account ARE published and durable enough to block/hunt today, but APT36 routinely re-tools — the campaign-specific creds and ISO names will rotate. Lead with behavioral detection (network-to-Google-API by a non-browser .NET process; load-point execution) and treat the published hashes/IDs as high-value but perishable. The XOR-"discrete" config string is now obfuscated in memory, so do not rely on static plaintext config hunts.
Hunt Brief & Attack Chain
Hypotheses (ordered by fidelity)
- H1 (high): A non-browser process makes DNS / network connections to
sheets.googleapis.com/oauth2.googleapis.com/www.googleapis.com— the signature Google Sheets API C2 channel (T1102.002). Strongest angle; tune hard by excluding browsers and legitimate Google API/sync clients. - H2 (high): A payload executes from a mounted ISO/IMG or removable volume (.exe / .lnk / .NET assembly) shortly after a disk-mount — the lure detonation (T1566.001 + T1204.002 + T1027.006).
- H3 (high): A process runs from
%LOCALAPPDATA%\Microsoft\Vault\(e.g.vaultsvc.exe) — the dropped RAT load point, an unusual execution path for a CLR-hosted binary. - H4 (high): A scheduled task named WindowsVaultSyncService is created (or runs) pointing at a user-writable Vault path — the persistence mechanism (T1053.005).
- H5 (medium): An unsigned / user-path .NET (CLR-hosted) binary beacons on an interval to googleapis endpoints — correlate CLR load + repeating Google-API connections from the same image.
- H6 (medium): A freshly written PE in a user-writable/temp/Vault path is executed soon after (T1105 / T1204) — the dropper-to-RAT staging.
- H7 (low): Known atomic IOCs present — file hashes for the ISO/dropper/RAT, the C2 spreadsheet ID, or the service-account string (perishable; APT36 re-tools).
Attack chain
| Step | Telemetry | Hunt Angle |
|---|---|---|
| 1 · Spearphish delivers diplomatic-themed ISO | Email / file write of *.iso; FileCreateInfo TargetFileName | H2 — ISO landing then mount |
| 2 · User mounts ISO, runs LNK-as-PDF | DiskMount-type events; ProcessRollup2 ImageFileName on mounted drive letter | H2 — exec from mounted volume |
| 3 · C# dropper shows decoy PDF, drops RAT, self-deletes | PeFileWritten / FileCreateInfo TargetFileName under Vault; ProcessRollup2 | H6 — PE written then executed |
| 4 · RAT lands in %LOCALAPPDATA%\Microsoft\Vault\ (Hidden+System) | ProcessRollup2 ImageFileName; file events | H3 — exec from Vault path |
| 5 · Persistence: COM scheduled task WindowsVaultSyncService | ScheduledTask / RegGenericValueUpdate / TaskScheduler tree | H4 — named task creation |
| 6 · C2 over Google Sheets API (Base64 columns, JWT auth) | DnsRequest DomainName; NetworkConnectIP4 RemoteAddressIP4 | H1/H5 — non-browser .NET → googleapis |
| 7 · In-process PowerShell command execution (no child proc) | Detection gap — System.Management.Automation in-memory | Pivot to H1/H3/H4 (no child powershell.exe) |
Known detection gap: Because the RAT runs PowerShell in-process (no powershell.exe child, no script-block command line on a child), the classic "office app spawns powershell" / child-command-line hunts will NOT fire. Coverage is deliberately pivoted to the network (Google-API) and load-point (ISO mount, Vault path, scheduled task) angles. Where available, AMSI/script-block telemetry on the host CLR process is the only in-process visibility.
Consolidated IOC Table
APT36 re-tools frequently. The file hashes, spreadsheet ID, and service-account string below are published by Securonix and usable today, but are perishable — validate in your own telemetry and pair with the behavioral signatures, which survive rotation. The C2 IP is a shared Google front (do NOT block).
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| behavior | Non-browser / unsigned .NET process connects to sheets.googleapis.com / oauth2.googleapis.com | high | detect | Google Sheets API C2 (H1/H5) |
| behavior | Process executes from a mounted ISO/IMG or removable volume | high | detect | Lure detonation (H2) |
| path | %LOCALAPPDATA%\Microsoft\Vault\vaultsvc.exe | high | detect | Dropped RAT load point (H3) |
| task | WindowsVaultSyncService (scheduled task) | high | detect | Persistence (H4) |
| sha256 | 1ba67bb1cfad42446880cca53cbd05fe66d7514b2bb139b48e5c63adff14be7b | medium | hunt | Lure ISO (perishable) |
| sha256 | 2cc7c2d8653c98e5bac32fcaf5e45b861efb4bb87df3b3f96285edb475e75bba | medium | hunt | C# dropper (perishable) |
| sha256 | 62d62950ff7a0e43550a5d0ba55d32d5083b9de5538e0f012e406b6d951e16aa | medium | hunt | RAT vaultsvc.exe (perishable) |
| spreadsheet | 1Lb5BEIsehbCGe8p1jkfWf5Mw1dBAcw5RHWFdga5gFq8 | medium | hunt | C2 Google Sheet ID (perishable) |
| account | sheet5-495707@appspot.gserviceaccount.com | medium | hunt | Embedded GCP service account (perishable) |
| mutex | Global\WinSync_<username>-<hostname>-<4char-hash> | medium | hunt | RAT single-instance mutex |
| ipv4 | 142.251.223.42 (Google LLC, AS15169) | low | enrich | Shared Google front — DO NOT block |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows endpoints (user workstations — diplomatic / government targets) | Falcon for Windows — ProcessRollup2 | Critical | Low |
| Endpoint network egress to Google APIs | NetworkConnectIP4 (RemoteAddressIP4), DnsRequest (DomainName) | Critical | Low |
| Removable / mounted-image execution | ProcessRollup2 ImageFileName on mounted drive; DiskMount events | High | Med — mount-event coverage varies |
| Dropped payload / file writes (Vault, temp) | FileCreateInfo / PeFileWritten (TargetFileName) | High | Med — PE-write telemetry coverage varies |
| Persistence (scheduled task / Run key) | ScheduledTask events, RegGenericValueUpdate / RegKeyCreate | High | Low |
| In-process PowerShell (no child process) | AMSI / ScriptControlScanTelemetry on the CLR host (if enabled) | Medium | High — in-memory, often invisible |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1566.001 — Spearphishing Attachment | Diplomatic-themed ISO with LNK-as-PDF | Q1 · S12 |
| Execution | T1204.002 — User Execution: Malicious File | User mounts ISO, runs the LNK | Q1 · Q3 |
| Execution | T1059.001 — PowerShell (in-process) | System.Management.Automation, no child proc | GAP · Q5 |
| Defense Evasion | T1027.006 / T1027.013 — Obfuscation (HTML smuggling / XOR config) | ISO container; XOR "discrete" config | Q1 · Q4 |
| Defense Evasion | T1564.001 / T1036.005 — Hidden files / Masquerading | Hidden+System in Vault; benign-looking task name | Q3 · Q6 |
| Persistence | T1053.005 — Scheduled Task | WindowsVaultSyncService at logon | Q6 |
| Command & Control | T1102.002 — Web Service: Bidirectional Comm | Google Sheets API, Base64 columns | Q2 · Q4 · Q5 |
| Command & Control | T1573.002 — Encrypted Channel (asymmetric) | JWT/OAuth2 over TLS to googleapis | Q2 · Q5 |
| Exfiltration | T1041 — Exfil Over C2 Channel | Base64 output written to victim tab | Q2 · Q5 |
Native Audit-Log Hunts (non-CQL)
Checks that do not require building CQL — run these directly on the host or via Falcon RTR sweeps:
- Vault directory sweep: on suspect hosts, list
%LOCALAPPDATA%\Microsoft\Vault\for any EXE (especially Hidden+System). The legitimate Windows Credential Vault does not place executables here. RTR:ls -force "$env:LOCALAPPDATA\Microsoft\Vault". - Scheduled-task review: enumerate tasks for
WindowsVaultSyncServiceor any task whose description mixes Edge/Windows/Discord terms or points at a user-writable Vault path. RTR:schtasks /query /fo LIST /vthen grep forVault/WinSync. - ISO landing review: search Downloads / mail-attachment caches for recently written
.iso/.imgfiles with diplomatic-themed names; correlate with a subsequent mount. - Mutex check: look for a running handle matching
Global\WinSync_*as a quick live-RAT tell. - Proxy / firewall logs: review egress to
sheets.googleapis.comandoauth2.googleapis.comand identify which process initiated it — a non-browser client to the Sheets API on a host with no Google Workspace use case is suspect.
CrowdStrike LogScale CQL Hunt Queries
Looks for: a process (.exe / .NET assembly) whose ImageFileName sits on a non-system drive letter (D:–Z:) — the typical mount point for a double-clicked ISO/IMG lure (H2). FP: legitimate software on USB/optical media, portable apps. Tune by excluding known admin/installer media and scoping to interactive user sessions.
// HUNT: Process execution from a mounted ISO/IMG / removable volume (lure detonation) // MITRE: T1566.001, T1204.002, T1027.006 // CONF: high FP: medium COST: low | REQUIRES: Falcon for Windows ProcessRollup2 // FALSE POSITIVES: portable apps / installers run from USB or optical media // TUNING: exclude known software-distribution media; favor .NET/LNK-launched children #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ImageFileName=/^[D-Z]:\\.*\.(exe|scr|com|dll|lnk)$/i | ImageFileName!=/\\(Program Files|Windows)\\/i | table([@timestamp, ComputerName, aid, UserName, ImageFileName, ParentBaseFileName, CommandLine], limit=200)
Looks for: a DNS request to sheets.googleapis.com / oauth2.googleapis.com / www.googleapis.com made by a process that is NOT a known browser or Google sync/API client — the signature Google Sheets API C2 channel (H1, T1102.002). This is the strongest angle; the in-process-PowerShell evasion does not hide it. FP-prone — tune hard.
// HUNT: Non-browser process resolves the Google Sheets / OAuth API (C2 channel) // MITRE: T1102.002, T1573.002, T1041 // CONF: high FP: medium COST: medium | REQUIRES: DnsRequest with ContextBaseFileName // FALSE POSITIVES: browsers, Google Drive/Backup&Sync, gcloud SDK, dev tooling, Office add-ins // TUNING: extend the browser/Google-client exclusion list to your fleet's approved apps #event_simpleName=DnsRequest | DomainName=/(sheets|oauth2|www)\.googleapis\.com$/i | ContextBaseFileName!=/^(chrome|msedge|firefox|brave|opera|iexplore|googledrivesync|googledrivefs|backupandsync|gcloud|gsutil|bq|python|svchost|onedrive|teams|outlook|excel)\.exe$/i | table([@timestamp, ComputerName, aid, UserName, ContextBaseFileName, DomainName], limit=200)
Looks for: any process executing with an ImageFileName under \AppData\Local\Microsoft\Vault\ (H3) — the RAT's drop location (vaultsvc.exe). The legitimate Windows Credential Vault is a system store, not an execution directory. FP: very low — investigate every hit.
// HUNT: Binary executing from the user Microsoft\Vault directory (dropped RAT) // MITRE: T1204.002, T1564.001, T1036.005 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: rare; the Vault dir is not a normal execution path // TUNING: none required; broaden to other AppData drop dirs if scoping a wider campaign #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ImageFileName=/\\AppData\\Local\\Microsoft\\Vault\\.*\.exe$/i | table([@timestamp, ComputerName, aid, UserName, ImageFileName, ParentBaseFileName, CommandLine, SHA256HashData], limit=200)
Looks for: outbound TCP/443 connections to Google's 142.251.0.0/16 / 142.250.0.0/15 fronts from a process that is not a known browser (H1 corroboration via NetworkConnectIP4, complementing the DNS angle in Q2). FP: the IP is a shared Google front — do NOT block on it; use it only to pivot to the initiating image. Pair with Q2/Q5.
// HUNT: Non-browser process opens TCP/443 to Google API IP fronts (C2 corroboration) // MITRE: T1102.002, T1571 // CONF: medium FP: medium COST: medium | REQUIRES: NetworkConnectIP4 // FALSE POSITIVES: ANY Google-backed app shares these IPs — pivot, never block on IP // TUNING: join to ContextBaseFileName/process; exclude approved browsers + Google clients #event_simpleName=NetworkConnectIP4 | RemotePort=443 | RemoteAddressIP4=/^142\.(250|251)\./ | ContextBaseFileName!=/^(chrome|msedge|firefox|brave|opera|googledrivesync|googledrivefs|backupandsync|onedrive)\.exe$/i | table([@timestamp, ComputerName, aid, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: a process running from a user-writable path (AppData / Temp / mounted volume) that repeatedly resolves the Google APIs — the dropped C# RAT beaconing on its poll interval (H5). Aggregating by image + distinct-time bins surfaces the steady-cadence beacon that distinguishes C2 from one-off API use. FP: low once scoped to user-path images.
// HUNT: User-path binary repeatedly resolving the Google API (RAT beacon cadence) // MITRE: T1102.002, T1573.002 // CONF: high FP: low COST: medium | REQUIRES: DnsRequest with ContextBaseFileName/ContextImageFileName // FALSE POSITIVES: low; user-path apps legitimately hitting Google APIs are rare in a managed fleet // TUNING: raise the count threshold for noisy hosts; widen window for slow beacons #event_simpleName=DnsRequest | DomainName=/(sheets|oauth2|www)\.googleapis\.com$/i | ContextImageFileName=/\\(AppData|Temp|Windows\\Temp)\\/i | groupBy([aid, ComputerName, ContextBaseFileName, ContextImageFileName], function=count(as=resolves)) | resolves>=5 | table([ComputerName, aid, ContextBaseFileName, ContextImageFileName, resolves], limit=200)
Looks for: creation/modification of a scheduled task or Run-key value referencing WindowsVaultSyncService, WinSync, or the Vault path (H4, T1053.005). Catches the persistence registration directly. FP: low — these strings are campaign-specific.
// HUNT: Persistence registration for the SHEET#CREEP RAT (task / Run key) // MITRE: T1053.005, T1547.001 // CONF: high FP: low COST: low | REQUIRES: RegGenericValueUpdate / RegKeyCreate / ScheduledTask telemetry // FALSE POSITIVES: low; key on the specific names + Vault path // TUNING: add other observed task names as the campaign evolves #event_simpleName=/RegGenericValueUpdate|RegKeyCreate|ScheduledTask.*/ | RegStringValue=/(WindowsVaultSyncService|WinSync|\\Microsoft\\Vault\\)/i OR TaskName=/(WindowsVaultSyncService|WinSync)/i OR TaskExecutable=/\\Microsoft\\Vault\\/i | table([@timestamp, ComputerName, aid, UserName, RegObjectName, RegStringValue, TaskName, TaskExecutable], limit=200)
Looks for: any process whose SHA256HashData matches the published ISO/dropper/RAT hashes (H7). Highest precision, lowest durability — APT36 re-tools, so a clean result does not clear the host. Run alongside the behavioral queries. FP: none.
// HUNT: Known SHEET#CREEP file hashes present in process telemetry // MITRE: T1204.002, T1059.001 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 with SHA256HashData // FALSE POSITIVES: none (exact-match hashes) // TUNING: perishable — refresh hashes as Securonix/Zscaler publish new samples #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | SHA256HashData=/^(2cc7c2d8653c98e5bac32fcaf5e45b861efb4bb87df3b3f96285edb475e75bba|62d62950ff7a0e43550a5d0ba55d32d5083b9de5538e0f012e406b6d951e16aa)$/i | table([@timestamp, ComputerName, aid, UserName, ImageFileName, SHA256HashData, ParentBaseFileName], limit=200)
CrowdStrike Custom IOA Recommendations
Promotion candidates from the hunt queries above (Windows platform, Process Create rule type unless noted):
| IOA Name | Pattern | Exclusions | Action / Deployment |
|---|---|---|---|
| Exec From Microsoft\Vault (SHEET#CREEP) | ImageFileName under \AppData\Local\Microsoft\Vault\*.exe | None known | Detect → Block (from Q3; low FP) |
| Exec From Mounted/Removable Volume | Grandparent explorer.exe; ImageFileName on drive D:–Z: outside Program Files/Windows | Approved distribution media | Detect after baseline (from Q1) |
| Vault Sync Persistence | schtasks/svc task create referencing WindowsVaultSyncService / Vault path | None | Detect → Block (from Q6) |
The Google-Sheets-API C2 queries (Q2/Q4/Q5) are best deployed as scheduled-search detections / NGSIEM correlation rules, not Process-Create IOAs — they key on DNS/network telemetry and need the per-fleet browser/Google-client exclusion list maintained over time. Because the RAT runs PowerShell in-process, there is no child-process IOA for the command execution itself — that gap is covered by the network and load-point IOAs instead.
Machine-Readable IOC Appendix
One-click copy blocks for ingestion. File hashes and the C2 sheet ID are published but perishable (APT36 re-tools); the Google IP is a shared front — enrich only, never block.
type,value,action,severity,expiration,description,tags sha256,1ba67bb1cfad42446880cca53cbd05fe66d7514b2bb139b48e5c63adff14be7b,detect,high,2026-12-22,SHEETCREEP lure ISO,campaign:SHEETCREEP sha256,2cc7c2d8653c98e5bac32fcaf5e45b861efb4bb87df3b3f96285edb475e75bba,detect,critical,2026-12-22,SHEETCREEP C# dropper,campaign:SHEETCREEP sha256,62d62950ff7a0e43550a5d0ba55d32d5083b9de5538e0f012e406b6d951e16aa,detect,critical,2026-12-22,SHEETCREEP RAT vaultsvc.exe,campaign:SHEETCREEP
non_browser_proc -> DNS/conn: sheets.googleapis.com | oauth2.googleapis.com # C2 proc_exec FROM mounted ISO/IMG / removable volume (D:-Z:) # lure proc_exec FROM %LOCALAPPDATA%\Microsoft\Vault\*.exe # RAT load point scheduled_task: WindowsVaultSyncService (Vault path target) # persistence mutex: Global\WinSync_<user>-<host>-<4char> # live RAT tell NOTE: PowerShell runs in-process (no child powershell.exe) — DETECTION GAP
SHEET#CREEP — APT36 / Transparent Tribe (moderate confidence) Lure: diplomatic-themed ISO (e.g. UAE-India_Strategic_Partnership_Week.iso) w/ LNK-as-PDF RAT: vaultsvc.exe (~20 KB C#) in %LOCALAPPDATA%\Microsoft\Vault\ (Hidden+System) C2: Google Sheets API; one tab per victim; Base64 cmd/response columns Auth: embedded GCP service account + RSA-2048 PKCS#8 key (JWT/OAuth2) Config: XOR-obfuscated, key = "discrete" | Exec: in-process PowerShell, no child proc Persistence: scheduled task WindowsVaultSyncService
# Google Sheets API C2 (hunt / enrich — do NOT block the shared Google IP) c2_sheet_id = 1Lb5BEIsehbCGe8p1jkfWf5Mw1dBAcw5RHWFdga5gFq8 service_account = sheet5-495707@appspot.gserviceaccount.com c2_domains = sheets.googleapis.com oauth2.googleapis.com www.googleapis.com c2_ip_shared = 142.251.223.42 (Google LLC AS15169 — ENRICH ONLY) mutex = Global\WinSync_<username>-<hostname>-<4char-hash> xor_config_key = discrete
Detection Validation Gates
| Gate | Check | Pass Criteria |
|---|---|---|
| 1 · Telemetry ready | Falcon for Windows on target endpoints; ProcessRollup2, DnsRequest, NetworkConnectIP4 flowing | Events seen from every in-scope host in last 24h |
| 2 · Benign baseline | Run Q2/Q4/Q5 over 7–14 days; enumerate every legitimate process that talks to googleapis (browsers, Drive sync, gcloud, Office add-ins) | Approved Google-client allowlist built & excluded |
| 3 · Positive test | In a lab VM, mount a benign ISO and run a benign EXE from it; drop a benign EXE into %LOCALAPPDATA%\Microsoft\Vault\ and run it; create a test task named WindowsVaultSyncService | Q1, Q3 and Q6 each fire on the test action |
| 4 · Promotion | Q3/Q6 FP rate effectively zero after review; Q2 allowlist stable | Promote Q3 & Q6 to blocking IOAs; keep Q2/Q4/Q5 as investigate-only correlation |
Hardening — Tiered
- Block ISO/IMG/VHD auto-mount on double-click for standard users — strips the primary delivery vector (mark-of-the-web bypass via disk image). Deploy the registry/GPO in S13·A. (T1566.001 / T1204.002; M1042 — Disable or Remove Feature.)
- Deploy Q3 (Vault-path exec) and Q6 (WindowsVaultSyncService) as detections immediately — both are low-FP and catch live infections regardless of the in-process-PowerShell evasion. (M1040 — Behavior Prevention on Endpoint.)
- User awareness blast on the diplomatic-lure phishing: warn government/diplomatic staff specifically about ISO/IMG attachments and "PDF" shortcuts inside mounted images. (M1017 — User Training.)
- Application control / WDAC to block unsigned .NET execution from user paths: deny execution of binaries under
AppData/Temp/ removable volumes — stops the dropped C# RAT from running at all. (M1038 — Execution Prevention; Microsoft WDAC / AppLocker.) - Attack Surface Reduction (ASR) rules: enable "Block executable files from running unless they meet a prevalence/age/trusted-list criterion", "Block untrusted/unsigned processes from USB", and the Office child-process/script rules. (M1042; Microsoft Defender ASR — see S13·C.)
- Treat mounted-image execution as suspicious: alert on any process launched from a mounted ISO volume even where you cannot fully block auto-mount. (M1042.)
- Egress governance for Google APIs: you cannot block
googleapis.comoutright, but you can route it through an inspecting proxy and alert on anomalous Sheets-API usage by non-Workspace processes — the SaaS-as-C2 (T1102) blind spot. Monitor service-account JWT auth patterns. (M1037 — Filter Network Traffic / monitor web service C2.) - Privileged-account & least-privilege baseline: non-admin users by default; restrict scheduled-task creation. Reduces persistence options. (M1026 / M1018.)
- Phishing-resistant program for high-risk staff: recurring diplomatic-lure simulations, hardened mail filtering that quarantines ISO/IMG/VHD attachments by default. (M1017 / M1031.)
Deployable Playbooks
A · Block ISO / IMG / VHD double-click auto-mount (GPO / registry)
Removes the mount handler so standard users can't detonate an image lure by double-clicking. Deploy via GPO Preferences or Intune:
# Disable Explorer mount verb for .iso / .img / .vhd / .vhdx reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\RemovableStorageDevices" /v Deny_All /t REG_DWORD /d 0 /f # Strip the default "mount" handler for disk images: reg delete "HKCR\Windows.IsoFile\shell\mount" /f 2>nul reg delete "HKCR\Windows.VhdFile\shell\mount" /f 2>nul # (Optional) block image mounting policy where supported: reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Explorer" /v NoUseStoreOpenWith /t REG_DWORD /d 1 /f
B · WDAC / AppLocker — deny unsigned .NET from user paths
# AppLocker EXE rule (deny) — block execution from AppData, Temp and removable media # Computer Config > Windows Settings > Security > Application Control Policies > AppLocker # Executable Rules: DENY Everyone # Path: %OSDRIVE%\Users\*\AppData\* # Path: %OSDRIVE%\Windows\Temp\* # Path: %REMOVABLE%\* # Enforce signing for the rest: # Publisher rule: ALLOW signed by your trusted publishers; default-deny remainder Set-AppLockerPolicy -XmlPolicy .\sheetcreep-applocker.xml -Merge
C · Microsoft Defender ASR rules (PowerShell)
# Block untrusted/unsigned processes from USB Add-MpPreference -AttackSurfaceReductionRules_Ids b2b3f03d-6a65-4f7b-a9c7-1c7ef74a9ba4 -AttackSurfaceReductionRules_Actions Enabled # Block executable files unless prevalence/age/trusted-list criteria met Add-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25 -AttackSurfaceReductionRules_Actions Enabled # Block Office apps from creating child processes (covers doc-launched chains) Add-MpPreference -AttackSurfaceReductionRules_Ids d4f940ab-401b-4efc-aadc-ad5f3c50688a -AttackSurfaceReductionRules_Actions Enabled
D · Live triage / IOC sweep (Falcon RTR)
# Vault drop + persistence + mutex sweep on a suspect host
ls -force "$env:LOCALAPPDATA\Microsoft\Vault"
schtasks /query /fo LIST /v | findstr /i "WindowsVaultSyncService WinSync Vault"
Get-ScheduledTask | Where-Object { $_.TaskName -match 'VaultSync|WinSync' }
# confirm what process is talking to the Sheets API:
Get-NetTCPConnection -RemotePort 443 | Sort-Object OwningProcess
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host in Falcon; preserve memory + disk before reboot (the RAT and decrypted XOR config live in memory). Snapshot if virtual. | SOC / IR | Falcon containment record; memory image; snapshot ID |
| Hunt the C2 pattern | Run Q2–Q7 fleet-wide to find every host beaconing to the Sheets API or running from Vault. The actor uses one spreadsheet tab per victim (91 active tabs observed) — assume more than one host. Map the full victim set before eradicating. | IR / Threat Hunt | Host list; per-host process + DNS evidence |
| Eradicate | Remove vaultsvc.exe from %LOCALAPPDATA%\Microsoft\Vault\; delete the WindowsVaultSyncService task; clear the Global\WinSync_* mutex by terminating the RAT process; remove the lure ISO/LNK. | IR / Endpoint | Removed-file inventory; task-delete log; process tree |
| Rotate & block | Rotate credentials and tokens for any account used on the host. Report the C2 spreadsheet ID + service account to Google for takedown. Add the file hashes to IOC blocking. Do NOT block the Google IP — proxy-alert on the non-browser Sheets-API path instead. | IR / IdAM / Network | Rotation log; Google abuse report ref; IOC entries |
| Recover & report | Rebuild from known-clean image if integrity uncertain; lift containment; monitor Q2/Q3/Q5 for 14 days. Treat as nation-state espionage — assess data accessed and notify per policy. | SOC / IR lead | Rebuild log; post-recovery hunt results; incident report |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1566.001 / T1204.002 | Diplomatic ISO lure → exec from mounted volume | Q1 | Q1 (after baseline) | Good |
| T1102.002 / T1573.002 | Google Sheets API C2 (non-browser → googleapis) | Q2, Q4, Q5 | — | Good — FP allowlist must be maintained |
| T1564.001 / T1036.005 | RAT in Microsoft\Vault (Hidden+System) | Q3 | Q3 (block) | Good |
| T1053.005 / T1547.001 | WindowsVaultSyncService persistence | Q6 | Q6 (block) | Good |
| T1041 | Base64 exfil over the Sheets C2 channel | Q2, Q5 (channel-level) | — | Partial — visible as channel, not content |
| T1059.001 | In-process PowerShell (no child process) | — (AMSI only, if enabled) | — | GAP — by design; pivot to network + load-points |
Validation: The load-point spine (Q1/Q3/Q6) is strong and low-FP — a confirmed hit on any is a probable live RAT. The C2 spine (Q2/Q4/Q5) is the signature angle but FP-prone: it only stays clean if the browser/Google-client allowlist is maintained per fleet. The in-process PowerShell execution is an intentional detection gap — there is no child powershell.exe and no child command line, so command execution itself is only visible via AMSI/script-block telemetry on the CLR host where enabled; detection is deliberately pivoted to the network (Google-API) and load-point (ISO/Vault/task) angles. Validate all field names (esp. ContextBaseFileName, RegStringValue, TaskName/TaskExecutable) against your tenant before deploying.
Hunt Summary Ticket
TITLE: Hunt — SHEET#CREEP (APT36/Transparent Tribe) Google Sheets API C# RAT
SEVERITY: High (nation-state espionage; moderate-confidence APT36 attribution)
SCOPE: Windows endpoints — gov/diplomatic users; Falcon for Windows telemetry
HYPOTHESIS: Diplomatic ISO lure detonates a C# RAT that beacons to the Google
Sheets API (1 tab/victim, Base64) with in-process PowerShell (no child proc).
QUERIES: Q1 exec-from-mounted-ISO | Q2 non-browser->googleapis | Q3 Vault-path exec |
Q4 google-IP-from-non-browser | Q5 user-path .NET beacon | Q6 VaultSync task |
Q7 known-hash sweep
DO FIRST: 1) Deploy Q3 + Q6 as detections now (low-FP, catch live RAT)
2) Build the Q2 browser/Google-client allowlist, then run Q2/Q4/Q5 fleet-wide
3) Any hit = treat as active espionage -> containment runbook (S14)
GAP: In-process PowerShell -> NO child powershell.exe (T1059.001 detection gap).
Pivot to network (Google-API) + load-points (ISO/Vault/task).
FINDINGS: <fill: hosts, Vault binaries, beaconing processes, scheduled tasks, victim tabs>
ACTIONS: Block ISO auto-mount; WDAC deny user-path .NET; ASR; report C2 sheet to Google
OWNER: HuntPack
VERSION: v0.2 · 2026-06-22
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| 1 · Vendor | Securonix Threat Research — SHEET#CREEP Evolved: Google Sheets RAT | Primary intel: attribution, C2 mechanism, XOR config, in-process exec, 91 tabs, IOCs | 2026-06-22 |
| 2 · Press | Cyber Security News — SHEET#CREEP C# RAT abuses Google Sheets API | RAT mechanics, hardcoded service account, Base64 columns, vaultsvc.exe IOCs | 2026-06-22 |
| 2 · Press | SOC Prime — SHEET#CREEP returns with new config obfuscation | Plaintext → XOR config evolution; detection content | 2026-06-22 |
| 2 · Press | GBHackers — UAE–India diplomatic lure | Lure theme and targeting context | 2026-06-22 |
| 1 · Vendor | Zscaler ThreatLabz (Jan 2026) | Origin baseline — first documentation of the SHEET#CREEP family | 2026-06-22 |