🎯 Contexte
Publié le 3 avril 2026 par SafeDep, cet article documente une campagne de supply chain attack via npm ciblant spécifiquement les déploiements Strapi CMS d’une plateforme de paiement en cryptomonnaies identifiée comme Guardarian. La campagne s’est déroulée sur une fenêtre de 13 heures le 3 avril 2026.
📦 Vecteur d’attaque
Trente-six packages npm malveillants ont été publiés via 4 comptes sock-puppet (umarbek1233, kekylf12, tikeqemif26, umar_bektembiev1), tous imitant la convention de nommage strapi-plugin-* avec la version 3.6.8 pour paraître légitimes. Chaque package contient 3 fichiers (package.json, index.js, postinstall.js), le payload s’exécutant automatiquement via le hook postinstall sans interaction utilisateur.
🔧 8 variantes de payloads
- Payload 1 (strapi-plugin-cron) : Exploitation Redis RCE via
CONFIG SETpour injecter des entrées crontab, écrire des webshells PHP et reverse shells Node.js, injecter des clés SSH, lire le disque brut viamknod+dd, et exfiltrer un module API Guardarian - Payload 2 (strapi-plugin-config) : Redis + évasion Docker via overlay filesystem, reverse shell Python sur port 4444, recherche de
HOT_WALLET,COLD_WALLET,MNEMONICsur disque brut - Payload 3 (4 packages) : Reverse shells directs bash (port 4444) et Python (port 8888), conditionné au hostname contenant
prod - Payload 4 (strapi-plugin-monitor) : Collecte de credentials en 8 phases, chasse aux connection strings PostgreSQL, boucle C2 de 2,5 minutes
- Payload 5 (strapi-plugin-events) : Collecte complète en 11 phases : vol de
.env, dump d’environnement, configs Strapi, dump Redis, reconnaissance réseau, secrets Docker/Kubernetes, clés privées, boucle C2 de 5 minutes - Payload 6 (strapi-plugin-seed) : Connexion PostgreSQL directe avec credentials hardcodés (
user_strapi/1QKtYPp18UsyU2ZwInVM), dump des tables Strapi, énumération de toutes les BDD, sondage explicite deguardarian,guardarian_payments,exchange,custody - Payload 7 (strapi-plugin-api@3.6.8) : Implant persistant conditionné au hostname exact
prod-strapi, écriture de/tmp/.node_gc.js, persistance crontab - Payload 8 (strapi-plugin-api@3.6.9) : Reverse shell fileless via
node -e, ciblage de/var/www/nowguardarian-strapi/et/opt/secrets/strapi-green.env, référence à un pipeline Jenkins
🏗️ Infrastructure C2
Toutes les communications transitent en HTTP non chiffré vers 144.31.107.231:9999. Les ports 4444 (bash) et 8888 (Python) sont utilisés pour les reverse shells. Les chemins C2 incluent /exfil/, /c2/<id>/, /db/<id>/, /shell/, /build/<id>/, /bshell/.
🎯 Cible confirmée
La cible est identifiée comme Guardarian, une plateforme de paiement en cryptomonnaies, via : le répertoire /app/exteranl-apis (typo correspondant à l’infrastructure réelle), les chemins /var/www/nowguardarian-strapi/, les credentials PostgreSQL hardcodés, et les références explicites aux bases guardarian_payments, exchange, custody.
📊 Type d’article
Analyse technique détaillée d’une campagne de supply chain attack npm, documentant l’évolution en temps réel des payloads et fournissant l’ensemble des IoCs pour la détection et la réponse à incident.
🧠 TTPs et IOCs détectés
TTP
- T1195.002 — Supply Chain Compromise: Compromise Software Supply Chain (Initial Access)
- T1059.004 — Command and Scripting Interpreter: Unix Shell (Execution)
- T1059.006 — Command and Scripting Interpreter: Python (Execution)
- T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
- T1053.003 — Scheduled Task/Job: Cron (Persistence)
- T1505.003 — Server Software Component: Web Shell (Persistence)
- T1098.004 — Account Manipulation: SSH Authorized Keys (Persistence)
- T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)
- T1041 — Exfiltration Over C2 Channel (Exfiltration)
- T1552.001 — Unsecured Credentials: Credentials In Files (Credential Access)
- T1552.007 — Unsecured Credentials: Container API (Credential Access)
- T1082 — System Information Discovery (Discovery)
- T1083 — File and Directory Discovery (Discovery)
- T1046 — Network Service Discovery (Discovery)
- T1613 — Container and Resource Discovery (Discovery)
- T1611 — Escape to Host (Privilege Escalation)
- T1552.004 — Unsecured Credentials: Private Keys (Credential Access)
- T1005 — Data from Local System (Collection)
- T1190 — Exploit Public-Facing Application (Initial Access)
- T1036.005 — Masquerading: Match Legitimate Name or Location (Defense Evasion)
- T1027.011 — Obfuscated Files or Information: Fileless Storage (Defense Evasion)
- T1543 — Create or Modify System Process (Persistence)
IOC
- IPv4 :
144.31.107.231— AbuseIPDB · VT · ThreatFox - URLs :
http://144.31.107.231:9999/exfil/— URLhaus - URLs :
http://144.31.107.231:9999/shell.sh— URLhaus - URLs :
http://144.31.107.231:9999/c2/— URLhaus - URLs :
http://144.31.107.231:9999/db/— URLhaus - URLs :
http://144.31.107.231:9999/shell/— URLhaus - URLs :
http://144.31.107.231:9999/build/— URLhaus - URLs :
http://144.31.107.231:9999/bshell/poll— URLhaus - URLs :
http://144.31.107.231:9999/bshell/result— URLhaus - Emails :
cla4d@sharebot.net - Emails :
w1gtd@sharebot.net - Fichiers :
postinstall.js - Fichiers :
shell.php - Fichiers :
revshell.js - Fichiers :
.node_gc.js - Fichiers :
redis_exec.sh - Fichiers :
vps_shell.sh - Fichiers :
.hooks.js - Fichiers :
strapi-green.env - Chemins :
/tmp/.node_gc.js - Chemins :
/tmp/redis_exec.sh - Chemins :
/tmp/vps_shell.sh - Chemins :
/app/public/uploads/shell.php - Chemins :
/app/public/uploads/revshell.js - Chemins :
/app/node_modules/.hooks.js - Chemins :
/opt/secrets/strapi-green.env - Chemins :
/var/www/nowguardarian-strapi/.env - Chemins :
/opt/secrets/
Malware / Outils
- strapi-plugin-cron (other)
- strapi-plugin-config (other)
- strapi-plugin-server (backdoor)
- strapi-plugin-database (backdoor)
- strapi-plugin-core (backdoor)
- strapi-plugin-hooks (backdoor)
- strapi-plugin-monitor (stealer)
- strapi-plugin-events (stealer)
- strapi-plugin-seed (stealer)
- strapi-plugin-api (backdoor)
- .node_gc.js (rat)
IOCs confirmés externellement :
144.31.107.231(ip) → VT (5/94 détections) + ThreatFox (Unknown malware)
🔗 Source originale : https://safedep.io/malicious-npm-strapi-plugin-events-c2-agent/