PhantomBot De la furtul de acreditări la botnet

PhantomBot: O campanie Typosquat care a trecut de la furtul de acreditări la un kit de botnet la cheie

TL; DR

Un singur editor npm, deadcode09284814, a derulat o campanie typosquat împotriva legitimului axios și chalk-template pachete de la mijlocul lunii mai 2026.

Campania a început ca un furt convențional de acreditări și portofele, exfiltrând date către un Tunelul HTTPS Serveo.

On 2026-05-17, Cu axois-utils:1.0.9, operatorul a schimbat complet sarcina utilă: aceeași schelă triplă de instalare, același editor, același nume de pachet.

Dar scriptul de instalare este acum o recrutare pentru botnet-ul DDoS multi-platformă.

Sarcina utilă vorbește despre un localhost.run tunel și acceptă comenzi de tip flood, transformând mediile infectate într-o parte a unei botnet-uri compatibile cu DDoS.

Operatorul a expediat chiar și Binarul serverului C2 în interiorul fișierului tarball, arătând o escaladare clară de la furtul de acreditări la infrastructura activă a botnet-ului.

Două pachete, patru versiuni încă active în registru și un operator care rulează acum ambele module în paralel.

Severitate: ridicată.

Titlu CIO Orice versiune axois-utils sau chalk-tempalte de la editorul deadcode09284814

Atacul: Cum funcționează

Campania este construită pe o schelă de livrare deliberat plictisitoare: două nume de pachete typosquat, cu o literă diferită de pachetele cu sute de milioane de descărcări săptămânale (Axios, șablon de cretă) și instalare triplă hooks care garantează execuția. Ceea ce este interesant este ce schelă poartă — și faptul că operatorul a modificat încărcătura fără a schimba nimic altceva.

Schela comună

Fiecare versiune publicată a ambelor pachete declară aceleași trei cicluri de viață hooks in pachet.json:

"scripts": {    "preinstall":  "node <payload>.js",    "install":     "node <payload>.js",    "postinstall": "node <payload>.js"  } 

Listarea sarcinii utile sub toate cele trei hooks este exagerat — postinstalare singur ar funcționa în mod implicit npm installAlegerea contează: npm install –ignore-scripts omite scripturile, dar mai multe fluxuri de lucru comune (restaurări din cache-ul CI care reexecută ciclul de viață hooks selectiv sau dezvoltatori care doar auditează postinstalare) fac ca o declarație triplă redundantă să fie cea mai sigură variantă pentru atacator.

cretă-tempalte adaugă un al doilea mecanism: declară axois-utils:^1.0.7 ca un timp de execuție dependenţăInstalarea typosquatted-ului șablon de cretă prin urmare, extrage și typosquat-ul surori, iar ambele sarcini utile rulează. Cele două pachete sunt o pereche coordonată, nu listări independente.

Faza A — hoț de acreditări / portofele (15.05.2026 → prezent)

Faza A este sarcina utilă originală. Încărcătorul este un încărcător scurt postinstall.js care indică un tunel invers Serveo HTTPS:

// chalk-tempalte/postinstall.js:11-13  const C2_HOST = "f04a273bd84c0622-80-200-28-28.serveousercontent.com";  const C2_PORT = 443;  const C2_PATH = '/collect'; 

Subdomeniul Serveo codifică adresa IP de destinație (80.200.28.28) direct în numele gazdei — o convenție recognoscibilă pentru serviciul respectiv. Operatorul rotește prefixul aleatoriu al subdomeniului între versiuni pentru a evita listele de blocare a domeniilor naive, dar adresa IP subiacentă nu se mută niciodată. (cretă-template:1.0.14 utilizat 8a3e818ea8f11186-80-200-28-28…; utilizare 1.0.16 / 1.0.19 / 1.0.20 f04a273bd84c0622-….)

postinstall.js mâinile libere către phantom.js, un modul „colector” inclus în pachet, cu 7,667 de linii. phantom.js plimbă gazda pentru:

Chei private SSH (~/.ssh/*)
.npmrc conținut și orice npm_* jetoane de mediu
Fișiere de acreditări AWS, GCP și Azure
expresia regulată pentru jetonul de acces personal pe GitHub (ghp_*, gho_*, ghu_*, ghs_*)
Artefacte de portofel cripto pentru Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash
Un recursiv .env* umbla prin ~/projects, ~/dev, ~/code, ~/workspaceși instalarea cwd
Istoricul Shell și integral process.env

Pachetul este trimis prin POST către tunelul Serveo la / colectareaNu există ofuscare, nicio logică anti-VM, nicio punere în scenă — pariul operatorului este pe volum și viteză.

Faza B — Recrutare PhantomBot DDoS (17.05.2026, doar axois-utils:1.0.9)

Faza B înlocuiește phantom.js + postinstall.js cu un singur fișier numit distrube.js (greșeala de scriere aparține operatorului). Schela cu trei hook-uri din package.json este neschimbată; pachetul păstrează același nume, domeniu de aplicare și model de versiune-bump. Din exterior, axois-utils:1.0.9 pare o continuare minoră a versiunii 1.0.6. În interior, este o familie diferită de programe malware.

distrube.js se deschide cu un bloc de configurare care denumește propria marcă a operatorului:

// axois-utils-1.0.9/distrube.js:11-15
// Use your localhost.run HTTPS URL (the tunnel handles HTTP internally)
const C2_HOST = 'b94b6bcfa27554.lhr.life'; // Your localhost.run tunnel
const C2_PORT = 443; // HTTPS port - tunnel handles SSL
const BOT_ID = `${os.hostname()}_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;

Comentariile sunt adresate unui viitor operator care va rula kitul („Utilizați adresa URL HTTPS localhost.run”). Aceasta, plus ceea ce este inclus lângă clientul bot, este indicatorul că nu este vorba doar de o sarcină utilă pentru victimă - este kitul în sine.

Fluxul:

  1. Persistență rulează primul. Scriptul se instalează în trei moduri diferite pentru fiecare sistem de operare (registry Alerga + Folderul de pornire + schtask-uri pe Windows; crontab + phantom-bot.service unitate systemd + .bashrc/.zshrc adăugare + /etc/rc.local pe Linux; LaunchAgent com.phantom.bot.plist pe macOS). Numele serviciului de persistență și eticheta LaunchAgent sunt ambele robot fantomă / com.phantom.bot, de unde provine și numele campaniei.
  2. Informații despre sistem exfil rulează o singură dată — o amprentă POST cu o singură comandă către b94b6bcfa27554.lhr.life:443/collect care conține numele de gazdă, platforma, arhitectura, numele de utilizator, CPU/RAM, interfețele de rețea, process.env, cwd, homedir, versiunea nodului și adresa IP publică. Aceasta este mult mai puțin agresivă decât Faza A: fără SSH, fără portofele, fără recursiune .env. Sarcina botului este să se înscrie, nu să fure.
  3. Bucla bătăilor inimii deschide un mesaj HTTPS POST la fiecare 30 de secunde către b94b6bcfa27554.lhr.life:443/. Agentul utilizator este PhantomBot/1.0. Verificarea TLS este dezactivată explicit (rejectUnauthorized: false). Răspunsul C2 este analizat ca JSON de forma {type, target, port, duration, threads, method} și expediat.
  4. Arsenalul inundațiilor este conectat la șase comenzi:
Tipul comenzii Module notițe
ping Răspuns la Liveness Botul se identifică
http Flux HTTP Inundație de cereri de nivel 7
https Inundație HTTPS La fel ca http, încapsulat în TLS
tcp inundație TCP Spam cu sarcină utilă aleatorie de 65 KB
udp Inundație UDP Pachete UDP de 65,507 octeți
rapid Resetare rapidă HTTP/2 pentru DoS Tehnica CVE-2023-44487 din 2023

Toate cele cinci module de inundație au o ţintă, port, durată și fire argument — botul este un flooder generic, contra cost, care nu vizează nicio victimă anume. Lista de victime a operatorului se află pe C2, nu în pachet.

Noutăți aici — fișierul binar C2 livrat

Faza A are o formă familiară: furt de acreditări, hook de instalare, C2 tunelizat de furnizor. Faza B este de asemenea o formă familiară — botnet-urile DDoS au fost un element prezent în pachetele npm rău intenționate de ani de zile. Ceea ce este neobișnuit este că operatorul a livrat partea de server din kitul din interiorul fișierului tar npm:

  • c2 — un fișier binar Go ELF compilat de 4 megaocteți
  • c2.go — sursa Go de 426 de linii pentru acel binar

Niciunul dintre fișiere nu este invocat de vreun hook de instalare. Nu fac parte din sarcina victimei. Se află în directorul pachetului, în același mod în care ar face-o un fișier de documentație. Cea mai plauzibilă interpretare este că operatorul și-a mutat arborele de lucru de dezvoltare la npm fără a gestiona lista de fișiere - o adevărată eroare OpSec - iar ceea ce a fost livrat este kitul complet cu două fețe: clientul pe care îl rulează o victimă și serverul pe care îl rulează operatorul.

Aceasta este partea din poveste care justifică formularea de „kit de botnet la cheie”. Oricine a descărcat axois-utils:1.0.9 „Before takedown” nu are doar o mostră de victimă — are și un server C2 funcțional.

Pivotul, într-o singură propoziție

Aceeași editură, aceleași nume de pachete, aceeași schelă triplă, aceeași marcă „fantomă” - dar sarcina utilă și-a schimbat modelul de monetizare peste noaptede la „recoltarea secretelor pe care le pot revinde” la „închirierea capacității de inundare pe care o pot închiria”. TTP-urile la momentul instalării pe care apărătorii ar trebui să le urmărească sunt aproape identice în ambele faze; apărări bazate pe semnături, conectate la șirurile de cale a portofelului din Faza A sau la phantom.jsColectorul de 7,667 de linii al lui ar fi ratat complet Faza B.

Data (UTC) eveniment
2026-05-15 Prima publicație: axois-utils:1.0.4 (Construcție de test LAN, platformă de dezvoltare la 192.168.129.19)
2026-05-15 axois-utils:1.0.6 publicat — Faza A C2 a fost schimbată în 80.200.28.28 prin tunelul Serveo; comentariul sursă // Change to '80.200.28.28' for public confirmă schimbarea dev→prod
2026-05-16 chalk-tempalte:1.0.14 și 1.0.16 publicat — declararea încărcătorului în lanț axois-utils:^1.0.7 ca dependență de execuție; subdomeniul Serveo a fost rotit
2026-05-16 Campanie de Faza A descoperită în timpul scanării npm de rutină; verdicte confirmate - rău intenționate aplicate
2026-05-17 axois-utils:1.0.9 publicat — pivotul sarcinii utile: recrutarea DDoS a lui PhantomBot prin tunelul localhost.run; din partea operatorului c2 binar şi c2.go sursa livrată în fișierul tar
2026-05-17 chalk-tempalte:1.0.19 și 1.0.20 publicat — încă Faza A (furător); operatorul rulează acum ambele module în paralel
2026-05-17 Descoperirea Fazei B în timpul scanării de rutină; verdictele s-au aplicat în toate cazurile 2026-05-17 Versiunile
(În curs de desfășurare) Rapoartele de eliminare sunt în așteptare; toate cele patru pachete publicate rămân disponibile în registru la momentul scrierii.

Indicatori de compromis

Pachete

SnowGem Pachet versiuni
NPM axois-utils (typosquat al lui axios) 1.0.4, 1.0.6, 1.0.9
NPM chalk-tempalte (typosquat al șablonului de cretă) 1.0.14, 1.0.16, 1.0.19, 1.0.20

Identitatea autorului

Câmp Valoare
editor npm deadcode09284814
Adresă de e-mail a editorului phantomdeadcode@tutamail.com
SCM verificare nici unul

Comandă și control

Fază Punct final Transport
A f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect Tunelul HTTPS Serveo
A 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect Tunelul HTTPS Serveo (versiunea anterioară)
A 80.200.28.28:443/collect Punct final VPS subiacent
B b94b6bcfa27554.lhr.life:443/ localhost.run tunel invers HTTPS

Rezumate de fișiere (SHA-256)

Fișier SHA-256 notițe
c2 (Accesați ELF, 4 MB) 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 Server C2 pe partea operatorului, livrat în interior axois-utils:1.0.9
c2.go (426 de linii) 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 Accesați sursa pentru fișierul binar C2
distrube.js 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 Clientul bot de faza B
phantom.js (chalk-tempalte:1.0.19) 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 Colector de acreditări / portofele de faza A
phantom.js (chalk-tempalte:1.0.20) d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 Colector faza A (varianta 1.0.20)
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 Încărcător de faza A, identic la octeți în ambele versiuni

Atribuire și motivație

Urmărim această campanie ca PhantomBot, preluând propria marcă a operatorului de la Agent utilizator: PhantomBot/1.0 antetul inimii, phantom-bot.service unitatea systemd, com.phantom.bot eticheta LaunchAgent și phantomdeadcode@ handle de e-mail. Operatorul este consecvent în ceea ce privește acest nume în cel puțin patru artefacte.

Catalog de semnale

  • Editor - cod mort09284814 pe npm. Cont cu un singur utilizator, e-mail de unică folosință Tutamail, nu SCM verificare. Nu există istoric de publicații anterioare în afara acestei campanii.
  • Reutilizarea brandingului — „fantomă” apare în e-mailul editorului, în numele fișierului colectorului din Faza A (phantom.js), în numele serviciului de persistență din Faza B (phantom-bot.service), în eticheta LaunchAgent (com.phantom.bot), și în bot-ul User-Agent (PhantomBot/1.0).
  • Infrastructură — Un singur VPS la 80.200.28.28 se află în fața Fazei A prin rotația subdomeniului Serveo; Faza B se mută la un localhost.run tunel invers (b94b6bcfa27554.lhr.lifeAmbele servicii ale furnizorilor sunt gratuite și necesită doar SSH de ieșire din partea operatorului, în concordanță cu configurațiile cu buget redus și OpSec redus.
  • Stilul codului — JavaScript simplu peste tot; fără ofuscare, fără codificare de șiruri de caractere, fără verificări anti-VM. Numele variabilelor sunt descriptive (fură informații de sistem, executăComandă, httpFlood). Comentarii în distrube.js se adresează direct unui operator viitor („Utilizați adresa URL HTTPS localhost.run”), sugerând că fișierul era destinat a fi redistribuit ca un kit, nu utilizat de un singur atacator.
  • Fișă OpSec — Tarball-ul Fazei B conține atât clientul bot, cât și serverul C2 de pe partea operatorului (c2 ELF + c2.go (sursă). Acest lucru este în concordanță cu un operator care și-a mutat arborele de lucru la npm fără a audita lista de fișiere. Fie operatorul nu are experiență, fie kitul este a însemnat să fie distribuit public, iar fișierul binar C2 face parte din produs.
  • Autoconfirmare - axois-utils:1.0.4 conține comentariul sursă // Schimbare la '80.200.28.28' pentru public pe linia 12, confirmând progresia dezvoltării / staging-ului / producției pe care operatorii o neagă de obicei.

motivaţia

Sarcina utilă din Faza A este un furt financiar direct: acreditările, cheile cloud, token-urile GitHub și portofelele cripto au toate piețe de revânzare lichide. Faza B este, de asemenea, financiară, dar indirectă: serviciile DDoS-contra-preț („booter”) închiriază capacitate de inundare la minut, iar boții precum cel livrat aici reprezintă inventarul pe care rulează aceste servicii. Pulsul de 30 de secunde, genericul ţintă/port/durată schema de comandă și arsenalul de inundații cu cinci protocoale sunt standard produsul unui operator de bootare.

Rularea ambelor module în paralel — cretă-template:1.0.19 și 1.0.20 continuă să expedieze hoțul în timp ce axois-utils:1.0.9 livrează botul — sugerează că operatorul își acoperă fluxurile de venituri în loc să abandoneze Faza A. Pivotul este un plus, nu un înlocuitor.

Ceea ce nu pretindem

Nu am putut confirma o identitate reală în spatele cod mort09284814 handle și nu atribuim această campanie niciunui actor, grup sau țară anume care să prezinte amenințări. Brandingul „fantomă” este suficient de consistent în toate artefactele pentru a sugera un singur operator, dar livrarea în stil kit a fișierului binar C2 lasă deschisă posibilitatea ca viitoarele pachete de la handle-uri fără legătură să reutilizeze același cod.

Impact

Țintele legitime de ocupare ilegală Axios și șablon de cretă sunt utilizate pe scară largă în ecosistemul JavaScript; Axios se numără printre primele treizeci de pachete npm cele mai descărcate. Numele typosquat sunt la o apăsare de tastă distanță de cele reale (axoisAxios, templateșablon), și ambele sunt greșeli de ortografie plauzibile din punct de vedere lingvistic.

Nu am reușit să obținem statistici fiabile despre descărcări pentru versiunile rău intenționate înainte de eliminare — npm nu reține numărul de descărcări per versiune după ce un pachet este anulat de publicare și npms.ioProxy-urile de tip - sunt zgomotoase la această scară. Orice organizație al cărei fișier de blocare se rezolvă într-un pachet numit axois-utils or cretă-tempalte de la editor cod mort09284814 ar trebui tratate ca fiind compromise: rotiți fiecare acreditare prezentă în proces.env pe gazda afectată, verificați vectorii de persistență per sistem de operare (consultați „Ce ar trebui să facă apărătorii” mai jos) și eliminați dependența.

Tipare emergente

Această campanie exemplifică o schimbare pe care am observat-o în mai multe incidente recente legate de NPM: Schela cu cârlig de instalare este un bun durabilsarcina utilă este interschimbabilăAceeași editură, același pachet, același preinstalare / instala / postinstalare triplu, și chiar aceeași cadență de creștere a vitezei de pe versiune — singurul lucru care s-a schimbat între axois-utils:1.0.6 și axois-utils:1.0.9 a fost fișierul hooks alergare. Detectare bazată pe semnătură, conectată la sarcina utilă din Faza A (șiruri de cale pentru portofel, phantom.jsColectorul de 7,667 de linii al lui , gazda Serveo C2) ar fi semnalat primele trei versiuni și ar fi ratat complet Faza B.

Același model este vizibil și în alte campanii din 2026 pe care le-am urmărit: un singur operator cu o structură stabilă, alternând între furtul de acreditări, clienți care copiază examenele, exfiltrarea de roboți Telegram și acum recrutarea DDoS. Apărătorii care se bazează pe semnături de payload vor continua să piardă a doua rundă a fiecărei campanii.

Corolarul este că TTP-urile în timpul instalării sunt un semnal mai bunDeclarații triple de hook-uri de instalare, scripturi de instalare care importă https or proces_copil, instalați scripturi care scriu în folderele de pornire ale utilizatorilor și instalați scripturi care rezolvă numele de gazdă pe serviciile gratuite de tunel invers (Serveo, localhost.run, ngrok, cloudflared) sunt rare în pachetele legitime și comune în cele rău intenționate.

Ce ar trebui să facă apărătorii

  • Audit fișier de blocare. Căutați în fiecare Pachet-lock.json / yarn.lock / pnpm-lock.yaml în organizația dumneavoastră pentru șirurile exacte axois-utils și cretă-tempalteTratează orice meci ca pe un compromis.
  • Rotește secretele asupra gazdelor afectate. Faza A a recoltat în bloc acreditări SSH, cloud, GitHub, npm și portofel. Presupuneți fiecare acreditare prezentă vreodată în proces.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .config, sau oricare .env* fișierul de pe gazda afectată este expus.
  • Eliminați persistența (Faza B). Pe Windows, ștergeți HKCU\Software\Microsoft\Windows\Versiune curentă\Executare\Actualizare sistem, elimina %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\system-update.bat și schtasks /delete /tn SystemUpdate /fPe Linux, crontab -e și scoateți @reboot nod …, systemctl –utilizator dezactivare –now phantom-bot.service apoi ștergeți ~/.config/systemd/user/phantom-bot.service, frecat .bashrc / .zshrc / /etc/rc.localPe macOS, lansare_descărcare ~/Bibliotecă/LaunchAgents/com.phantom.bot.plist apoi ștergeți plistul.
  • Blocați gazdele C2. Adăugați cele patru puncte finale C2 din tabelul IOC la lista de blocări de ieșire. *.serveousercontent.com și *.lhr.life poate fi blocat în gros dacă mediul dumneavoastră nu are o utilizare legitimă pentru serviciile de tunel invers.
  • Vânătoare după TTP în momentul instalării, nu sarcină utilă. Intrări în fișierul de blocare al inventarului ale căror pachet.json declară preinstalare, instala și postinstalare toate indicând același script. Verificați vechimea pachetului și starea de verificare a editorului. Acest model este rar în pachetele legitime și este cel mai fiabil semnal pe care PhantomBot îl reutilizează.
  • Audit pentru binarul C2. Oricine a descărcat axois-utils:1.0.9 are serverul C2 al operatorului (c2 ELF, sha256 165fa92d…) pe disc. Scanează cache-urile și depozitele de artefacte CI. Fișierul binar este inactiv de la sine, dar prezența sa pe o stație de lucru este o dovadă clară că pachetul a fost instalat.

Linie de închidere

Același operator, același pachet și același hook de instalare pot genera amenințări complet diferite în 48 de ore. Urmăriți schela, nu sarcina utilă.

sca-tools-software-instrumente-de-analiză-a-compoziției
Prioritizați, remediați și securizați riscurile software
Obține-ți contul gratuit.
Nu este necesar un card de credit.

Securizează-ți dezvoltarea și livrarea de software

cu suita de produse Xygeni