Volexity disclosed on June 4, 2026 that a Chinese espionage group tracked as VerdantBamboo — overlapping with Mandiant's UNC5221 and Google's WARP PANDA — had maintained persistent access to a U.S. victim's Microsoft 365 environment for at least 18 months before detection in March 2025. The actor deployed three distinct custom backdoors across network appliances, NAS devices, and cloud infrastructure, none of which relied on a single exploitable CVE for their persistence.
The intrusion began with credential theft targeting an Egnyte Storage Sync service via the victim's managed services provider. From there, VerdantBamboo pivoted laterally to Microsoft 365, a pfSense firewall, a Synology NAS, and archived GroupWise email servers — using Brickstorm (Go/Rust, WebSocket C2), Plenet/Grimbolt (.NET Core, multiplex C2), and AgentPSD (Python, HTTPS reverse shell) to maintain access across multiple failure scenarios.
This post is a complete DFIR investigation: threat actor profile, full intrusion timeline, malware technical breakdown, C2 infrastructure fingerprinting, detection logic, and IOCs for immediate defensive action.
◈ Table of Contents
Phase 1 — Threat Actor Profile
ATTRIBUTION| Attribute | Detail |
|---|---|
| Primary Name | VerdantBamboo (Volexity) |
| Aliases | UNC5221 (Mandiant/Google), WARP PANDA (CrowdStrike), UTA0178 |
| Suspected Origin | People's Republic of China (PRC) — state-sponsored espionage |
| Active Since | At least 2023 — exploited zero-day vulnerabilities in edge devices |
| Primary Motivation | Cyber espionage — persistent access for intelligence collection |
| Preferred Targets | Legal services, SaaS providers, business process outsourcers, U.S. technology companies, MSPs |
| TTPs Signature | Edge device implants (firewalls, NAS), WebSocket C2, MSP compromise for lateral reach, long dwell times |
| Malware Arsenal | Brickstorm (Go/Rust), Plenet/Grimbolt (.NET), AgentPSD (Python), earlier: LIGHTWIRE, WIREFIRE |
| Operational Discipline | High — infrastructure rotated on detection, DNS-over-HTTPS used to bypass monitoring, Cloudflare-fronted C2 |
Legal Sector
Law firms targeted for privileged client communications, litigation strategy, M&A intel, and attorney-client privileged material with geopolitical value.
SaaS & Technology
SaaS providers and tech companies attacked for IP, source code, customer data, and as pivot points to downstream victims in shared infrastructure.
MSPs as Force Multipliers
Managed service providers compromised to gain trusted access to dozens of client environments simultaneously — one MSP breach can mean many victim organizations.
Phase 2 — Intrusion Timeline
TIMELINE- 1~Sept 2023 (est.): VerdantBamboo compromises the victim's managed services provider via credential theft targeting the Egnyte Storage Sync service. Default service account
egnyteservicehad its password changed but still carried a sudoers misconfiguration allowing rootteewrites. Brickstorm implanted at/usr/sbin/luserput. - 22023–2024 (sustained): Actor uses Brickstorm's SOCKS5 proxying capabilities, running from the Egnyte system, to blend M365 authentication traffic with legitimate organizational activity. Conditional Access policies bypassed. Over one year of undetected M365 access follows.
- 32024 (mid-year est.): Victim removes the compromised SSL VPN. Rather than losing access, VerdantBamboo pivots — uses stolen admin credentials (which lacked MFA) to configure a custom web-based SSL VPN for re-entry. Deploys Brickstorm's FreeBSD variant on the victim's pfSense firewall at
/usr/local/libexec/ipsec/blacklist. - 4Late 2024: Plenet (.NET backdoor) deployed to Synology NAS via SSH. AgentPSD (Python reverse shell) deployed on the Egnyte system as fallback at
/usr/local/bin/egnyte/egnyte_host_monitor_client. Actor now has three independent persistence mechanisms across different OS platforms. - 5September 18–23, 2025: All VerdantBamboo C2 servers previously matching the Volexity Censys fingerprint disable their services on port 443 simultaneously — suggesting the actor detected or anticipated discovery. Infrastructure rotated.
- 6March 2025 (disclosed retrospectively): Volexity identifies the breach during an incident response engagement. Determines initial access occurred "at least 18 months" prior. Full malware analysis and IOC extraction completed.
- 7June 4, 2026: Volexity publishes full public disclosure. Google Cloud Threat Intelligence publishes corroborating analysis attributing Plenet/Grimbolt to the same actor cluster. BleepingComputer, The Hacker News report widely.
Phase 3 — Initial Access via Egnyte Storage Sync
INITIAL ACCESSThe initial foothold exploited a combination of credential theft and a privilege escalation path in Egnyte Storage Sync v13.12 and earlier. The attack vector was the victim's SSL VPN, which gave VerdantBamboo network-level access to the MSP's internal Egnyte system. From there, a misconfigured sudoers entry provided root filesystem write access.
- 1Credential theft: Credentials for the
egnyteserviceservice account were stolen. This account had its password changed from the default but retained a sudoers misconfiguration present in Egnyte Storage Sync prior to v13.13. - 2Sudoers exploitation: The misconfiguration allowed
egnyteserviceto execute/usr/bin/teeas root via sudo. Sinceteewrites stdin to a file, this provided arbitrary root-level filesystem write access. - 3Brickstorm implantation: Using the root write path, VerdantBamboo wrote the Brickstorm Linux ELF binary to
/usr/sbin/luserputand configured persistence via cron. The binary was 5.6 MB, obfuscated with gobfuscate. - 4SSH access: SSH access to the Egnyte system was combined with the sudoers escalation to maintain persistent shell access alongside the Brickstorm C2 channel.
Egnyte Storage Sync v13.13 fixes this sudoers misconfiguration. Any deployment running v13.12 or earlier is vulnerable to this exact escalation path. Patch immediately and audit all service account sudoers entries for NOPASSWD write utilities (tee, cp, install, dd).
Phase 4 — Malware Arsenal Technical Deep Dive
MALWARE ANALYSISBrickstorm is VerdantBamboo's primary persistence and espionage tool. Initially written in Go and obfuscated with gobfuscate, the actor has since produced Rust variants — suggesting active development and investment in platform sustainability. Its core architecture uses WebSocket for C2, making it difficult to distinguish from legitimate encrypted web traffic.
| Attribute | Linux ELF Variant | FreeBSD Variant (pfSense) |
|---|---|---|
| Language | Go (obfuscated with gobfuscate) | Go (obfuscated with gobfuscate) |
| File Size | 5.6 MB | Not disclosed |
| SHA-256 | 40d264cf9c73923932c3dfd52d20f46ff602be3fea8dc6ecc71aca46e6067bf5 | f70abe93112637d3ec2f6c5e058ccac0307ebf63e496f38588cbfd17a8f8a264 |
| MD5 | 58d4eccc982c9e9b1b98aa62c514e53a | 84ad78b2bab946c3677fdc28ebd8a774 |
| SHA1 | f4d77958a12a0778283d3e679b24b18f82e332c4 | 681075027553546c119ec447eb8df84633dcffce |
| Deploy Location | /usr/sbin/luserput (Egnyte); cron on Linux systems | /usr/local/libexec/ipsec/blacklist (pfSense) |
| Persistence | Cron job | Modified /etc/rc.d/cron on pfSense |
| C2 Protocol | WebSocket over HTTPS (port 443) | WebSocket over HTTPS (port 443) |
| Capabilities | Interactive shell, remote command exec, file manipulation, C2 switching, SOCKS5 proxy, web server for filesystem exposure | Same as Linux variant |
The SOCKS5 proxy capability in Brickstorm is the most dangerous feature for M365 defenders. Traffic from the C2 implant running on a trusted internal system is indistinguishable from legitimate M365 authentication at the identity provider level. Conditional Access policies based purely on IP or device compliance will not catch this pattern.
Plenet — tracked by Google Threat Intelligence as "Grimbolt" — is a cross-platform .NET Core Native AOT backdoor offering equivalent functionality to Brickstorm on a different runtime. Volexity assesses VerdantBamboo chose .NET Core to provide an additional obfuscation layer and platform independence, deployed when the actor sought secondary persistence after Brickstorm was at risk.
| Attribute | Detail |
|---|---|
| Language | .NET Core with Native AOT compilation |
| File Size | 2.5 MB |
| SHA-256 | eb141a43958802727a6c813452450c10b92fc2e8 (SHA1) |
| MD5 | 95dc2289427ed29b8b996d0e3d1b78cb |
| Obfuscation | UPX-packed with data hydration |
| C2 Protocol | WebSocket with Nerdbank.Streams multiplexing — enables simultaneous data streams over single connection |
| Deployment | Synology NAS via SSH — deployed after Brickstorm implant on pfSense |
| Capabilities | Interactive shell, remote code execution, file manipulation, C2 server switching |
AgentPSD is a simple but effective fallback persistence mechanism. If both Brickstorm and Plenet are neutralized, AgentPSD provides an independent HTTPS reverse shell connecting to a separate C2 domain. Its hard-coded parsing pattern makes it trivially identifiable in memory and traffic analysis.
| Attribute | Detail |
|---|---|
| Language | Python (compiled to Linux ELF via PyInstaller) |
| File Size | 6.4 MB ELF executable |
| SHA-256 | ee41e06ed96182ce80cd4544a6abd5d7719c4a5c0e5ddb266a83842d39b99b0a |
| MD5 | 98ee964edeb5a988c3bba8ea1e57fe0e |
| SHA1 | e952c18272efa1c3d73d0a5381bcf443c02743fe |
| Deploy Location | /usr/local/bin/egnyte/egnyte_host_monitor_client (Egnyte system) |
| C2 Protocol | HTTPS POST with Base64-encoded responses |
| C2 Parsing | Searches response for hardcoded marker string PoRaSGw3jzQ8YSaz — commands follow this delimiter |
| Commands | interval updates, duration limits, shell execution via subprocess |
| DNS | Uses Google DNS-over-HTTPS (8.8.8.8) to resolve C2 domains, bypassing internal DNS monitoring |
Phase 5 — Lateral Movement to M365 & MSP
LATERAL MOVEMENTVerdantBamboo's most sophisticated technique in this intrusion was not the malware itself — it was using Brickstorm's SOCKS5 proxy capability to route M365 authentication traffic through a trusted internal IP address, defeating Conditional Access policies designed to restrict cloud access to known corporate network ranges.
- 1Brickstorm as SOCKS5 proxy: With Brickstorm deployed on the Egnyte system (a trusted internal host), VerdantBamboo configured the malware's proxy capability to tunnel HTTPS requests through the internal network IP. From Microsoft's perspective, the authentication originated from a legitimate corporate IP address.
- 2Stolen credentials + proxy bypass: Credentials stolen from the Egnyte system (or obtained via network monitoring) were then used to authenticate to M365 via the SOCKS5 tunnel. Conditional Access policies requiring "compliant device" or "known network" checks were satisfied by the proxy routing.
- 3MSP breach via M365 access: Volexity assesses with medium confidence that VerdantBamboo's access to the victim's MSP was achieved partly through M365-hosted data obtained during the initial victim compromise — likely shared credentials, MSP admin access portals, or service principals stored in M365.
- 4pfSense firewall implant: After the original SSL VPN was removed, VerdantBamboo used stolen admin credentials lacking MFA to directly access and implant the pfSense firewall. Brickstorm's FreeBSD variant was deployed, modified /etc/rc.d/cron for persistence, giving the actor a second independent C2 channel.
Phase 6 — C2 Infrastructure & Censys Fingerprinting
INFRASTRUCTUREVerdantBamboo's C2 infrastructure follows a consistent profile detectable via Censys and Shodan. Servers are Cloudflare-fronted, expose minimal services, and use OpenBSD SSH clients — a pattern unusual enough to fingerprint at scale. Volexity developed an active fingerprinting query that identified the full infrastructure, which then went dark on detection.
- 1Minimal service exposure: Servers expose 4 or fewer TCP ports. VerdantBamboo limits attack surface on C2 nodes to reduce exposure.
- 2Zero-length HTTP response: Port 443 returns a zero-length body — a Golang HTTP server default when no route matches. This is the primary distinguishing fingerprint.
- 3OpenBSD SSH client: C2 servers have OpenBSD-flavor SSH client banners present — unusual on Linux VPS infrastructure, suggesting a specific OS image preference or toolchain.
- 4Cloudflare certificates: All C2 domains resolved to Cloudflare IP ranges. Domain fronting provides both DDoS protection and IP attribution difficulty.
- 5Infrastructure shutdown response: Between September 18–23, 2025, all previously fingerprinted servers simultaneously disabled port 443 services — a coordinated response suggesting actor awareness of Volexity's research. This is a tell for a sophisticated, monitored operation.
DNS-based threat intel feeds and SIEM rules that rely on internal DNS query logs will not detect AgentPSD C2 communications. All hostname resolution is performed directly against Google's DoH endpoint at 8.8.8.8. Monitor for HTTPS requests to 8.8.8.8 from server processes — legitimate internal servers rarely query external DoH endpoints.
Phase 7 — DFIR Investigation Steps
INVESTIGATIONThe single most important lesson from this intrusion: EDR tools do not run on edge devices, firewalls, or NAS appliances. VerdantBamboo knew this. Start your investigation where no EDR exists.
- 1pfSense/FreeBSD firewalls: Search for unexpected files in
/usr/local/libexec/,/usr/local/bin/, and/usr/sbin/. Runfind / -newer /etc/passwd -type f 2>/dev/nullto identify files modified after OS installation. Check/etc/rc.d/cronfor unauthorized additions. - 2NAS devices (Synology, QNAP): Review SSH auth logs for interactive sessions from unusual IPs. Check for new binaries in system paths. Synology:
/usr/local/bin/,/usr/bin/. Review scheduled tasks and package manager for unauthorized installations. - 3Linux storage sync systems (Egnyte, etc.): Audit sudoers configuration for NOPASSWD entries granting write utilities. Check service account home directories for unexpected files. Review cron jobs under all user contexts, not just root.
- 4Volexity scanner: Volexity and Google have released a shell script scanner for BRICKSTORM indicators on Linux and BSD systems. Run it across all appliances:
bash brickstorm_scanner.sh— reference the Volexity GitHub threat-intel repository. - 5Network traffic baseline deviation: Correlate edge device outbound connections against a 90-day baseline. Look for persistent low-volume HTTPS connections to Cloudflare-fronted IPs, especially on unusual ports or from processes that normally have no network activity.
- 1Export Unified Audit Log: In Microsoft Purview Compliance Portal, export all audit log entries for the past 90 days. Filter for authentication events, mail access, and file access from internal IP addresses. VerdantBamboo's proxy routes all traffic through a trusted internal IP, so geographic anomaly detection will not trigger.
- 2Identify credential reuse across services: The Egnyte service account likely had credentials reused or accessible to M365 service principals. Audit all service principals and app registrations for unusual permissions. Check last-used dates for dormant service principals — these may be attacker-maintained access paths.
- 3Conditional Access gap analysis: Map all Conditional Access policies. Identify which policies would pass authentication from a trusted internal IP. Specifically check whether any policies allow named locations (internal IP ranges) to bypass MFA — this is the bypass VerdantBamboo exploited.
- 4Email and SharePoint access patterns: Look for bulk email reads, unusual SharePoint download volumes, or forward/delegate rules created during the suspected intrusion window. These are primary intelligence collection behaviors for an espionage actor maintaining long-term access.
- 5MSP admin access review: If your organization uses an MSP, audit which MSP accounts have admin-level access to your M365 tenant. VerdantBamboo pivoted from the primary victim to the MSP's other clients via this trusted relationship. Review delegated admin privileges and partner relationships in Microsoft Partner Center.
- Edge device binaries at known deployment paths (see Phase 8 IOCs)
- Cron jobs added to /etc/cron.d/ or /etc/rc.d/cron on non-standard appliances
- HTTPS connections from edge appliances to Cloudflare IPs with zero HTTP response body
- M365 sign-ins from internal IP addresses outside business hours
- DNS-over-HTTPS queries to 8.8.8.8 from server-class systems
- Strings matching "PoRaSGw3jzQ8YSaz" in process memory or HTTPS payloads
Phase 8 — Indicators of Compromise
IOCs| Type | Indicator | Malware / Notes |
|---|---|---|
| SHA-256 | 40d264cf9c73923932c3dfd52d20f46ff602be3fea8dc6ecc71aca46e6067bf5 | Brickstorm Linux ELF |
| SHA-256 | f70abe93112637d3ec2f6c5e058ccac0307ebf63e496f38588cbfd17a8f8a264 | Brickstorm FreeBSD variant (pfSense) |
| SHA-256 | ee41e06ed96182ce80cd4544a6abd5d7719c4a5c0e5ddb266a83842d39b99b0a | AgentPSD Python ELF (6.4MB) |
| SHA-1 | eb141a43958802727a6c813452450c10b92fc2e8 | Plenet .NET Core (2.5MB) |
| MD5 | 98ee964edeb5a988c3bba8ea1e57fe0e | AgentPSD |
| MD5 | 95dc2289427ed29b8b996d0e3d1b78cb | Plenet |
| File Path | /usr/sbin/luserput | Brickstorm on Egnyte Linux |
| File Path | /usr/local/bin/egnyte/egnyte_host_monitor_client | AgentPSD masquerading as Egnyte process |
| File Path | /usr/local/libexec/ipsec/blacklist | Brickstorm FreeBSD on pfSense |
| String | PoRaSGw3jzQ8YSaz | AgentPSD hardcoded C2 response delimiter |
| String | wssoft | Brickstorm internal package name — present in binary strings |
| Network | HTTPS to 8.8.8.8 from server processes | AgentPSD DNS-over-HTTPS C2 resolution |
| Network | Zero-length HTTP/HTTPS responses on port 443 | Brickstorm/Plenet C2 server fingerprint |
| Network | WebSocket upgrade requests from edge devices | Brickstorm or Plenet C2 beaconing |
| Behavior | sudo tee writing to system binary paths | Egnyte sudoers exploitation |
Phase 9 — Detection & Hunt Queries
DETECTIONPhase 10 — MITRE ATT&CK Mapping
ATT&CK| Technique ID | Technique Name | VerdantBamboo Implementation |
|---|---|---|
| T1190 | Exploit Public-Facing Application | Egnyte Storage Sync sudoers misconfiguration via network-accessible service |
| T1078 | Valid Accounts | Stolen egnyteservice credentials; stolen admin credentials for pfSense re-entry |
| T1098 | Account Manipulation | Custom SSL VPN configuration added after original VPN removal |
| T1505.003 | Server Software Component: Web Shell | Brickstorm web server component exposing filesystem via HTTP |
| T1090.001 | Proxy: Internal Proxy | Brickstorm SOCKS5 proxy routing M365 auth through trusted internal IP |
| T1550.001 | Use Alternate Authentication Material | Stolen credentials used via SOCKS5 proxy to bypass Conditional Access |
| T1071.001 | Application Layer Protocol: Web Protocols | Brickstorm and Plenet WebSocket C2; AgentPSD HTTPS C2 |
| T1048.002 | Exfiltration Over Alternative Protocol | DNS-over-HTTPS to 8.8.8.8 for C2 domain resolution |
| T1546.004 | Event Triggered Execution: Unix Shell Configuration | Cron persistence on Linux; /etc/rc.d/cron modification on FreeBSD |
| T1036.005 | Masquerading: Match Legitimate Name | AgentPSD deployed as egnyte_host_monitor_client |
| T1133 | External Remote Services | Custom web-based SSL VPN configured by attacker for persistent access |
| T1199 | Trusted Relationship | MSP compromise leveraged to reach primary victim via delegated admin access |
Phase 11 — Sources & References
SOURCESScan your edge devices for Brickstorm indicators now
Use the CyberHawk IOC Scanner to match VerdantBamboo file hashes and network patterns against your telemetry. Full APT detection packs and hunt rules available at cyberhawkthreatintel.com/threats.
◈ Stay Connected
Follow CyberHawk Threat Intel for threat intelligence, deployment guides and hands-on SOC tooling content.
"They can't exploit you if you are the Exploit."