TandemTrace
Signal file // INC-006Severity // CriticalConfidence // Confirmed
Public-safe true-positive investigation · Linux server

Linux web server compromise followed by persistence and credential theft

Confirmed malicious activity

Public-safe case study Customer names, domains, employee identifiers, exact addresses, hostnames, credentials, evidence locations, and case-specific identifiers have been removed or replaced. Quantitative findings and defensive lessons are retained for educational use.

Executive assessment

An internet-facing Ubuntu application server processed a crafted request that exploited a vulnerable upload component. The web worker spawned a shell, wrote a disguised PHP web shell, installed a systemd user service, read application environment files and SSH material, and sent an encrypted archive to a first-seen destination. The server was removed from the load balancer 8 minutes 37 seconds after confirmed command execution.

1Compromised server
8Attack stages
4Secrets exposed
326Linux hosts searched

95% autonomous investigation. 100% human authority.

TandemTrace AI agents completed 38 of 40 recorded investigation actions autonomously. The incident commander retained final verdict approval and production isolation authorization.

Investigation ownership

Agents connected web exploitation to host impact. A human controlled production isolation.

95% AI agents
38Autonomous actions2Human decisions
Investigation stageAIHuman
Host and web evidence110
Artifact enrichment70
Process correlation80
Hypothesis testing60
Fleet and identity scope60
Verdict approval01
Isolation authorization01

Investigation dataset

Case context
Alert
EDR · web process spawning shell
First observed
2026-07-31 18:42:16 UTC
Host
WEB-PRD-07 · Ubuntu 22.04 LTS
Service
Customer portal · nginx + PHP-FPM
Exposure
Internet-facing · production pool
Telemetry reviewed
Endpoint
3,114 process/file events · ±45m
Web
18,906 access/error rows · 2h
Authentication
612 SSH and PAM events · 24h
Network
29 DNS · 14 flow records
Fleet
326 Linux hosts · 30d
php-fpmcrafted upload
/bin/shwww-data
curltool retrieval
systemctluser persistence
tarcredential archive
ArtifactSanitized valuePrevalenceAssessment
Web shell.cache.php1 / 326 hostsDisguised in upload directory
Serviceuser-cache-sync.service1 hostExecutes hidden ELF
Payload SHA-256ca17…44e21 hostUnsigned first-seen binary
Destination203.0.113[.]119:4430 prior flowsTEST-NET replacement

Evidence that changed the verdict

Web-to-shell ancestry

PHP-FPM spawned /bin/sh with a decoded command from the exploited request body; this never occurred in the 30-day service baseline.

Durable persistence

The www-data account created and enabled a user systemd service pointing to a hidden ELF under the application cache.

Credential collection

The process read .env, cloud configuration, deployment tokens, and an SSH private key before creating an encrypted archive.

Confirmed egress

Network flow records show 1.7 MB sent to a first-seen destination immediately after archive creation.

Correlated timeline

18:42:16 · Exploit request

A crafted multipart request reaches the vulnerable upload route.

18:42:17 · Command execution

PHP-FPM launches a shell as www-data.

18:42:39 · Web shell written

A hidden PHP file is created and invoked by a second request.

18:44:08 · Persistence installed

A user systemd service is enabled and started.

18:45:21 · Credentials staged

Four secret-bearing files are read and archived.

18:46:02 · Outbound transfer

1.7 MB leaves the host over TLS.

18:50:53 · Production isolation

Node removed from rotation and network quarantine applied.

Competing hypotheses

HypothesisEvidence forEvidence againstOutcome
Deployment or maintenanceService account executed shell toolsNo pipeline, ticket, package signature, or approved pathRejected
Vulnerability scannerInternet request targeted upload routeSuccessful shell, persistence, secret reads, and egress exceed scanningRejected
External compromiseExploit-to-shell chain and post-exploitation actionsExact actor and exploit family unresolvedConfirmed

Scope and evidence boundary

QuestionResultMeaning
Same request elsewhere?0 / 11 peer web nodesObserved exploitation limited to one node
Same artifacts fleet-wide?0 / 326 hostsNo additional persistence found
Stolen SSH key used?0 matching successful loginsReuse not observed through cutoff
Archive contents exfiltrated?Transfer size consistentLikely, but encrypted payload prevents content proof

Evidence boundary The outbound transfer is confirmed and temporally linked, but packet contents were unavailable. Credential theft is confirmed by file access and staging; exact transferred content remains an analytical judgment.

Response actions

Remove the node from production and preserve disk and memory

Completed after incident-commander authorization.

Rotate all four exposed secrets and invalidate sessions

Prioritize deployment and cloud credentials.

Rebuild from a trusted image

Do not return the compromised filesystem to service.

Patch the upload component and add exploit regression tests

Block executable uploads and restrict the web-worker account.

Technical evidence

IDSourceEvent UTCEntityVerdict contribution
L-01nginx access18:42:16upload routeInitial access request
L-02EDR process18:42:17php-fpm → shExecution confirmed
L-03auditd18:44:08systemd user unitPersistence confirmed
L-04fanotify18:45:21secret-bearing filesCredential access confirmed
L-05network flow18:46:02external destinationEgress corroborated

MITRE ATT&CK mapping

TechniqueObserved behavior
T1190 · Exploit Public-Facing ApplicationCrafted request exploited an upload component.
T1505.003 · Web ShellHidden PHP shell provided repeatable command execution.
T1543.002 · Systemd ServiceUser service established persistence.
T1552.001 · Credentials In FilesEnvironment, cloud, deployment, and SSH secrets accessed.
T1560.001 · Archive via UtilityCredential material staged with tar and encryption.
T1041 · Exfiltration Over C2 ChannelOutbound transfer followed archive creation.