PhantomBot fra legitimationstyveri til botnet

PhantomBot: En Typosquat-kampagne, der gik fra at være tyveri af legitimationsoplysninger til et færdigt botnet-kit

TL; DR

En enkelt npm-udgiver, deadcode09284814, har kørt en typosquat-kampagne mod den legitime axios og chalk-template pakker siden midten af ​​maj 2026.

Kampagnen begyndte som en konventionel tyveri af legitimationsoplysninger og tegnebøger, hvor data blev stjålet til en Serveo HTTPS-tunnel.

On 2026-05-17, med axois-utils:1.0.9, byttede operatøren nyttelasten fuldstændigt om: samme triple install-hook scaffold, samme udgiver, samme pakkenavn.

Men installationsscriptet er nu en DDoS-botnet-rekruttering på tværs af platforme.

Nyttelasten taler til en localhost.run tunnel og accepterer oversvømmelseskommandoer, hvilket forvandler inficerede miljøer til en del af et DDoS-kompatibelt botnet.

Operatøren sendte endda C2-server binær inde i tar-filen, hvilket viser en klar eskalering fra tyveri af legitimationsoplysninger til aktiv botnet-infrastruktur.

To pakker, fire versioner stadig aktive i registreringsdatabasen, og én operatør kører nu begge moduler parallelt.

Sværhedsgrad: høj.

Overskrift IOC Enhver axois-utils- eller chalk-tempalte-version fra udgiveren deadcode09284814

Angrebet: Sådan fungerer det

Kampagnen er bygget på et bevidst kedeligt leveringsstillads: to typosquat-pakkenavne, et bogstavforskydning fra pakker med hundredvis af millioner ugentlige downloads (Axios, kridtskabelon), og tredobbelt installation hooks der garanterer udførelse. Det interessante er, hvad stilladset bærer — og det faktum, at operatøren ændrede lasten uden at ændre noget andet.

Det delte stillads

Hver publiceret version af begge pakker erklærer de samme tre livscyklusser hooks in pakke.json:

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

Angivelse af nyttelasten under alle tre hooks er overdrevet – efterinstallation alene ville køre som standard npm installereValget er vigtigt: npm install –ignore-scripts springer scripts over, men flere almindelige arbejdsgange (CI-cache-gendannelser, der kører livscyklussen igen hooks selektivt, eller udviklere, der kun reviderer efterinstallation) lave en tredobbelt redundant erklæring er det sikreste bud for angriberen.

kridtskabelon tilføjer en anden mekanisme: den erklærer axois-utils:^1.0.7 som en runtime afhængighedInstallation af typosquatted kridtskabelon trækker derfor også den søskende typosquat ind, og begge nyttelaster kører. De to pakker er et koordineret par, ikke uafhængige lister.

Fase A — legitimationsoplysninger / tegnebogstyver (2026-05-15 → nutid)

Fase A er den oprindelige nyttelast. Læsseren er en kort postinstall.js der peger på en Serveo HTTPS reverse-tunnel:

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

Serveo-underdomænet koder destinations-IP'en (80.200.28.28) direkte i værtsnavnet — en genkendelig konvention for den pågældende tjeneste. Operatoren roterer det tilfældige underdomænepræfiks mellem versioner for at undgå naive domæneblokeringslister, men den underliggende IP flyttes aldrig.kridtskabelon: 1.0.14 anvendte 8a3e818ea8f11186-80-200-28-28…brug ; 1.0.16 / 1.0.19 / 1.0.20 f04a273bd84c0622-….)

postinstall.js hænderne væk til phantom.js, et bundtet "samler"-modul med 7,667 linjer. phantom.js går med værten for:

SSH private nøgler (~/.ssh/*)
.npmrc indhold og evt. npm_* miljøtokens
AWS-, GCP- og Azure-legitimationsfiler
GitHub personlig adgangstoken regex (ghp_*, gho_*, ghu_*, ghs_*)
Krypto-wallet-artefakter til Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash
En rekursiv .env* går igennem ~/projects, ~/dev, ~/code, ~/workspaceog installations-cwd'en
Shells historier og den fulde process.env

Bundtet sendes til Serveo-tunnelen kl. / indsamleDer er ingen forvirring, ingen anti-VM-logik, ingen staging – operatørens satsning er på volumen og hastighed.

Fase B — PhantomBot DDoS-rekruttering (2026-05-17, kun axois-utils:1.0.9)

Fase B erstatter phantom.js + postinstall.js med en enkelt fil ved navn distrube.js (tastefejlen er operatorens). Triple-hook-scaffoldet i package.json er uændret; pakken beholder samme navn, omfang og versionsbump-mønster. Udefra set ligner axois-utils:1.0.9 en mindre efterfølger til 1.0.6. Indvendigt er det en anden malware-familie.

distrube.js åbner med en konfigurationsblok, der navngiver operatørens eget branding:

// 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')}`;

Kommentarerne er rettet til en fremtidig operatør, der kører kittet ("Brug din localhost.run HTTPS URL"). Det, plus det, der vises ved siden af ​​botklienten, er et tegn på, at dette ikke bare er en offernyttelast - det er kittet.

Strømmen:

  1. Vedholdenhed kører først. Scriptet installerer sig selv på tre forskellige måder pr. operativsystem (registreringsdatabasen Kør + Startmappe + opgaver på Windows; crontab + phantom-bot.service systemd-enhed + .bashrc/.zshrc tilføj + /etc/rc.local på Linux; LaunchAgent com.phantom.bot.plist på macOS). Navnet på persistenstjenesten og LaunchAgent-etiketten er begge fantombot / com.phantom.bot, hvilket også er derfra kampagnenavnet stammer.
  2. Systeminfo exfil kører én gang — en one-shot fingeraftryks-POST til b94b6bcfa27554.lhr.life:443/collect, der indeholder værtsnavn, platform, arch, brugernavn, CPU/RAM, netværksgrænseflader, process.env, cwd, homedir, nodeversion og offentlig IP. Dette er meget mindre aggressivt end Fase A: ingen SSH, ingen wallets, ingen .env-rekursion. Bottens opgave er at tilmelde, ikke at stjæle.
  3. Hjerteslagsløjfe åbner et HTTPS POST hvert 30. sekund til b94b6bcfa27554.lhr.life:443/. Brugeragenten er PhantomBot/1.0. TLS-verifikation er eksplicit deaktiveret (rejectUnauthorized: false). C2-svaret parses som JSON af formatet {type, target, port, duration, threads, method} og afsendes.
  4. Oversvømmelsesarsenal er forbundet til seks kommandoer:
Kommandotype Moduler Noter
ping Livlighedssvar Bot identificerer sig selv
http HTTP oversvømmelse Lag-7 anmodningsoversvømmelse
https HTTPS-oversvømmelse Samme som http, TLS-indpakket
tcp TCP-oversvømmelse 65 KB tilfældig nyttelast spam
uDP UDP-oversvømmelse 65,507-byte UDP-pakker
hurtige HTTP/2 hurtig nulstilling af DoS 2023 CVE-2023-44487-teknikken

Alle fem oversvømmelsesmoduler tager en mål, port, varighedog tråde argument — botten er en generisk lejebottle, ikke rettet mod et bestemt offer. Operatørens offerliste findes på C2, ikke i pakken.

Nyheder her — den leverede C2-binære fil

Fase A er en velkendt form: tyveri af legitimationsoplysninger, installationshook, leverandørtunneleret C2. Fase B er også en velkendt form — DDoS-botnets har været en fast bestanddel af ondsindede npm-pakker i årevis. Det usædvanlige er, at operatøren sendte serversiden af kittet inde i npm tarballen:

  • c2 — en 4-megabyte kompileret Go ELF binærfil
  • c2.go — Go-kildekoden på 426 linjer for den binære fil

Ingen af ​​filerne kaldes af nogen installationshook. De er ikke en del af offerets nyttelast. De sidder i pakkemappen på samme måde som en dokumentationsfil ville. Den mest plausible læsning er, at operatøren pushede deres udviklingsarbejdstræ til npm uden at kuratere fillisten - en rigtig OpSec-fejl - og det, der blev leveret, er det komplette tosidede sæt: klienten, som et offer kører, og serveren, som operatøren kører.

Det er den del af historien, der retfærdiggør fremstillingen af ​​"nøglefærdigt botnet-sæt". Enhver, der downloadede axois-utils:1.0.9 før nedtagningen ikke kun har en offerprøve — de har en fungerende C2-server.

Omdrejningspunktet, i én sætning

Samme udgiver, samme pakkenavne, samme triple-hook-scaffold, samme "fantom"-branding - men nyttelasten ændrede monetiseringsmodellen natten over: fra "høsthemmeligheder jeg kan videresælge" til "leje oversvømmelseskapacitet jeg kan lease". De TTP'er på installationstidspunktet, som forsvarere bør holde øje med, er næsten identiske på tværs af begge faser; signaturbaserede forsvar, der er knyttet til Fase A's tegnebogssti-strenge eller til phantom.js's 7,667-linjers samler ville have gået glip af Fase B helt.

Dato (UTC) Begivenhed
2026-05-15 Første udgivelse: axois-utils:1.0.4 (LAN-testbygning, udviklingsrigg hos 192.168.129.19)
2026-05-15 axois-utils:1.0.6 udgivet — Fase A C2 ombyttet til 80.200.28.28 via Serveo-tunnelen; kildekommentaren // Change to '80.200.28.28' for public bekræfter dev→prod-byttet
2026-05-16 chalk-tempalte:1.0.14 og 1.0.16 udgivet — kædet læsser erklærer axois-utils:^1.0.7 som en runtime-afhængighed; Serveo-underdomæne roteret
2026-05-16 Fase A-kampagne opdaget under rutinemæssig npm-scanning; bekræftede skadelige domme anvendt
2026-05-17 axois-utils:1.0.9 udgivet — nyttelast-pivot: PhantomBot DDoS-rekruttering via localhost.run-tunnel; operatørside c2 binær og c2.go kildekode leveret i tarballen
2026-05-17 chalk-tempalte:1.0.19 og 1.0.20 udgivet — stadig Fase A (tyver); operatøren kører nu begge moduler parallelt
2026-05-17 Opdagelse af fase B under rutinemæssig scanning; vurderinger anvendt på tværs af alle 2026-05-17 versioner
(igangværende) Fjernelsesrapporter afventer; alle fire udgivne pakker er stadig tilgængelige i registreringsdatabasen på tidspunktet for skrivningen

Indikatorer for kompromis

Pakker

Ecosystem Pakke versioner
NPM axois-utils (typosquat af axios) 1.0.4, 1.0.6, 1.0.9
NPM chalk-tempalte (typosquat af kridtskabelon) 1.0.14, 1.0.16, 1.0.19, 1.0.20

Forfatteridentitet

Felt Værdi
npm-udgiver deadcode09284814
Udgiverens e-mail phantomdeadcode@tutamail.com
SCM verifikation ingen

Kommando-og-kontrol

Fase Endpoint Transport
A f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect Serveo HTTPS-tunnel
A 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect Serveo HTTPS-tunnel (tidligere version)
A 80.200.28.28:443/collect Underliggende VPS-slutpunkt
B b94b6bcfa27554.lhr.life:443/ localhost.run HTTPS omvendt tunnel

Filsammendrag (SHA-256)

File (Felt) SHA-256 Noter
c2 (Gå ELF, 4 MB) 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 Operatørside C2-server, leveres indeni axois-utils:1.0.9
c2.go (426 linjer) 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 Gå til kildekoden for C2-binærfilen
distrube.js 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 Fase B botklient
phantom.js (chalk-tempalte:1.0.19) 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 Fase A-legitimationsoplysninger / tegnebogsindsamler
phantom.js (chalk-tempalte:1.0.20) d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 Fase A-kollektor (variant 1.0.20)
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 Fase A-loader, byte-identisk på tværs af begge versioner

Attribuering og motivation

Vi følger denne kampagne som PhantomBot, der tager operatørens eget branding fra Brugeragent: PhantomBot/1.0 hjerteslagsoverskriften, den phantom-bot.service systemd-enheden, com.phantom.bot LaunchAgent-mærkatet og fantomdødkode@ e-mailadresse. Operatoren er konsekvent omkring dette navn på tværs af mindst fire artefakter.

Signalkatalog

  • Forlæggerdeadcode09284814 på npm. Enkelthåndskonto, engangs-e-mail fra Tutamail, nej SCM verifikation. Ingen tidligere publikationshistorik ud over denne kampagne.
  • Genbrug af branding — “phantom” vises i udgiverens e-mail, i fase A-samlerens filnavn (phantom.js), i navnet på fase B-persistenstjenesten (phantom-bot.service), i LaunchAgent-etiketten (com.phantom.bot), og i bot-brugeragenten (PhantomBot/1.0).
  • Infrastruktur — En enkelt VPS kl. 80.200.28.28 fronter Fase A via Serveo underdomænerotation; Fase B bevæger sig til en localhost.run omvendt tunnel (b94b6bcfa27554.lhr.lifeBegge leverandørtjenester er gratis og kræver kun udgående SSH fra operatørens side, hvilket er i overensstemmelse med lavbudget- og lav-OpSec-opsætninger.
  • kode stil — Almindelig JavaScript overalt; ingen obfuskation, ingen strengkodning, ingen anti-VM-tjek. Variabelnavne er beskrivende (stjæleSystemInfo, udførKommando, httpFloodKommentarer i distrube.js direkte adressere en fremtidig operator ("Brug din localhost.run HTTPS URL"), hvilket antyder, at filen var beregnet til at blive videredistribueret som et kit, ikke brugt af en enkelt angriber.
  • OpSec-slip — Fase B-tarballen leverer både botklienten og C2-serveren på operatørsiden (c2 ELF + c2.go kilde). Dette stemmer overens med en operator, der pushede sit arbejdstræ til npm uden at revidere fillisten. Enten er operatoren uerfaren, eller også er kittet betød skal distribueres offentligt, og C2-binærfilen er en del af produktet.
  • Selvbekræftelseaxois-utils:1.0.4 indeholder kildekommentaren // Ændr til '80.200.28.28' for offentligheden på linje 12, der bekræfter den udviklings-/staging-/produktionsprogression, som operatører typisk benægter.

Motivation

Fase A-nyttelasten er simpelt finansielt tyveri: legitimationsoplysninger, cloudnøgler, GitHub-tokens og krypto-wallets har alle likvide videresalgsmarkeder. Fase B er også finansiel, men indirekte: DDoS-for-hire ("booter")-tjenester lejer oversvømmelseskapacitet minut for minut, og bots som den, der leveres her, er det inventar, disse tjenester kører på. 30-sekunders hjerteslaget, den generiske mål/port/varighed kommandoskemaet, og oversvømmelsesarsenalet med fem protokoller er standard produkt fra en booter-operatør.

Kørsel af begge moduler parallelt — kridtskabelon: 1.0.19 og 1.0.20 fortsætte med at sende tyveren, mens axois-utils:1.0.9 sender botten — antyder, at operatøren afdækker indtægtsstrømme i stedet for at opgive fase A. Pivot er en Desuden, ikke en erstatning.

Hvad vi ikke påstår

Vi har ikke været i stand til at bekræfte en virkelig identitet bag deadcode09284814 handle, og vi tilskriver ikke denne kampagne til nogen navngiven trusselsaktør, gruppe eller land. "Fantom"-brandingen er ensartet nok på tværs af artefakter til at antyde en enkelt operator, men den kit-lignende levering af C2-binærfilen åbner muligheden for, at fremtidige pakker fra ikke-relaterede handle vil genbruge den samme kode.

Impact

De legitime squat-mål Axios og kridtskabelon er i vid udstrækning afhængige af i JavaScript-økosystemet; Axios alene er blandt de 30 mest downloadede npm-pakker. Typosquat-navnene er ét tastetryk væk fra de rigtige (axoisAxios, skabelonskabelon), og begge er sprogligt plausible stavefejl.

Vi kunne ikke indhente pålidelige downloadstatistikker for de skadelige versioner før fjernelse — npm gemmer ikke antallet af downloads pr. version, efter at en pakke er blevet depubliceret, og npms.io-style proxyer er støjende i denne skala. Enhver organisation, hvis låsefil omdannes til en pakke med navnet axois-utils or kridtskabelon fra udgiveren deadcode09284814 bør behandles som kompromitteret: roter alle tilstedeværende legitimationsoplysninger i proces.env på den berørte vært, revidér persistensvektorer pr. operativsystem (se "Hvad forsvarere bør gøre" nedenfor), og fjern afhængigheden.

Nye mønstre

Denne kampagne eksemplificerer et skift, vi har set i flere nylige npm-hændelser: Installationskrogstilladset er det holdbare aktivnyttelasten kan udskiftesDen samme udgiver, den samme pakke, den samme forudinstallation / installere / efterinstallation tredobbelt, og endda den samme versionsbump-kadence — det eneste, der ændrede sig mellem axois-utils:1.0.6 og axois-utils:1.0.9 var filen den hooks kørsel. Signaturbaseret detektion nøglet til Fase A-nyttelasten (wallet-path-strenge, phantom.js's 7,667-linjers samler, Serveo C2-værten) ville have markeret de første tre versioner og helt misset Fase B.

Det samme mønster er synligt på tværs af andre kampagner i 2026, som vi har fulgt: en enkelt operatør med et stabilt scaffold, der skifter mellem tyveri af legitimationsoplysninger, eksamenssnydende klienter, Telegram-bot exfil og nu DDoS-rekruttering. Forsvarere, der er afhængige af payload-signaturer, vil blive ved med at tabe anden runde af hver kampagne.

Konsekvensen er, at TTP'er på installationstidspunktet er det bedre signalTriple install-hook-deklarationer, installationsscripts der importerer https or barn_proces, installer scripts, der skriver til brugerens opstartsmapper, og installer scripts, der fortolker værtsnavne på gratis reverse-tunnel-tjenester (Serveo, localhost.run, ngrok, cloudflared) er alle sjældne i legitime pakker og almindelige på tværs af ondsindede pakker.

Hvad forsvarere bør gøre

  • Låsefilrevision. Søg hver package-lock.json / garn.lås / pnpm-lock.yaml i din organisation for de præcise strenge axois-utils og kridtskabelonBetragt ethvert match som et kompromis.
  • Roter hemmeligheder på berørte værter. Fase A masseindsamlede SSH-, cloud-, GitHub-, npm- og wallet-legitimationsoplysninger. Antag, at alle legitimationsoplysninger, der nogensinde er til stede i proces.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .config, eller hvilket som helst .env* Filen på den berørte vært er eksponeret.
  • Fjern vedholdenhed (Fase B). Slet på Windows HKCU\Software\Microsoft\Windows\CurrentVersion\Kør\Systemopdatering, fjern %APPDATA%\Microsoft\Windows\Startmenu\Programmer\Opstart\system-update.batog schtasks /delete /tn Systemopdatering /fPå Linux, crontab -e og fjern @genstart-node …, systemctl –bruger deaktiver –now phantom-bot.service derefter slette ~/.config/systemd/bruger/phantom-bot.service, skrubbe .bashrc / .zshrc / /etc/rc.localPå macOS, launchctl unload ~/Bibliotek/LaunchAgents/com.phantom.bot.plist slet derefter plisten.
  • Bloker C2-værterne. Tilføj de fire C2-slutpunkter i IOC-tabellen til din udgående blokeringsliste. *.serveousercontent.com og *.lhr.liv kan blokeres i sin helhed, hvis dit miljø ikke har nogen legitim anvendelse til reverse-tunnel-tjenester.
  • Søge efter TTP på installationstidspunktet, ikke nyttelast. Lagerlåsefilposter, hvis pakke.json erklærer forudinstallation, installereog efterinstallation alle peger på det samme script. Krydstjek mod pakkens alder og udgiverens verifikationsstatus. Dette mønster er sjældent i legitime pakker og er det mest pålidelige signal, som PhantomBot genbruger.
  • Revision for C2-binærfilen. Enhver, der downloadede axois-utils:1.0.9 har operatørens C2-server (c2 ELF, sha256 165fa92d…) på disk. Scan cacher og CI-artefaktlagre. Den binære fil er inaktiv i sig selv, men dens tilstedeværelse på en arbejdsstation er et utvetydigt bevis på, at pakken blev installeret.

Afslutningslinje

Den samme operatør, den samme pakke og den samme installationshook kan levere helt forskellige trusler inden for 48 timer. Hold øje med scaffoldet, ikke nyttelasten.

sca-tools-software-kompositionsanalyseværktøjer
Prioriter, afhjælp og sørg for dine softwarerisici
Få din gratis konto.
Der kræves ikke noget kreditkort.

Sikr din softwareudvikling og -levering

med Xygeni-produktsuite