PhantomBot fra legitimasjonstyveri til botnett

PhantomBot: En Typosquat-kampanje som gikk fra legitimasjonstyveri til et nøkkelferdig botnett-sett

TL; DR

En enkelt npm-utgiver, deadcode09284814, har kjørt en typosquat-kampanje mot det legitime axios og chalk-template pakker siden midten av mai 2026.

Kampanjen startet som en konvensjonell legitimasjons- og lommeboktyveri, som stjal data til en Serveo HTTPS-tunnel.

On 2026-05-17med axois-utils:1.0.9, byttet operatøren nyttelasten fullstendig: samme trippel installasjonskrok-scaffold, samme utgiver, samme pakkenavn.

Men installasjonsskriptet er nå en DDoS-botnett-rekruttering på tvers av plattformer.

Nyttelasten snakker til en localhost.run tunnel og aksepterer flomkommandoer, noe som gjør infiserte miljøer til en del av et DDoS-kompatibelt botnett.

Operatøren sendte til og med C2-server binær inne i tar-filen, som viser en tydelig eskalering fra tyveri av påloggingsinformasjon til aktiv botnettinfrastruktur.

To pakker, fire versjoner fortsatt aktive i registeret, og én operatør kjører nå begge modulene parallelt.

Alvorlighetsgrad: høy.

Overskrift IOC Enhver axois-utils- eller chalk-tempalte-versjon fra utgiver deadcode09284814

Angrepet: Hvordan det fungerer

Kampanjen er bygget på et bevisst kjedelig leveringsstillas: to typosquat-pakkenavn, én bokstav unna pakker med hundrevis av millioner ukentlige nedlastinger (Axios, krittmal), og trippelinstallasjon hooks som garanterer utførelse. Det som er interessant er hva stillaset bærer — og det faktum at operatøren endret lasten uten å endre noe annet.

Det delte stillaset

Hver publiserte versjon av begge pakkene erklærer de samme tre livssyklusene hooks in pakke.json:

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

Liste over nyttelasten under alle tre hooks er overdrevent – etterinstallasjon alene ville kjøre som standard npm installasjonValget er viktig: npm install –ignore-scripts hopper over skript, men flere vanlige arbeidsflyter (gjenoppretting av CI-hurtigbuffer som kjører livssyklusen på nytt hooks selektivt, eller utviklere som bare reviderer etterinstallasjon) å lage en trippel redundant erklæring er det sikreste alternativet for angriperen.

krittmal legger til en andre mekanisme: den erklærer axois-utils:^1.0.7 som en kjøretid avhengighetInstallere typosquatted krittmal trekker derfor også inn den søskenlignende typosquaten, og begge nyttelastene kjører. De to pakkene er et koordinert par, ikke uavhengige oppføringer.

Fase A — legitimasjon / lommeboktyver (2026-05-15 → nåtid)

Fase A er den opprinnelige nyttelasten. Lasteren er en kort postinstall.js som peker mot en Serveo HTTPS revers-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-underdomenet koder destinasjons-IP-en (80.200.28.28) direkte i vertsnavnet – en gjenkjennelig konvensjon for den tjenesten. Operatøren roterer det tilfeldige underdomeneprefikset mellom versjoner for å unngå naive domeneblokkeringslister, men den underliggende IP-adressen flyttes aldri.krittmal: 1.0.14 brukt 8a3e818ea8f11186-80-200-28-28…; 1.0.16 / 1.0.19 / 1.0.20 bruk f04a273bd84c0622-….)

postinstall.js hendene av til phantom.js, en samlet «samler»-modul med 7 667 linjer. phantom.js går med verten for:

SSH private nøkler (~/.ssh/*)
.npmrc innhold og eventuelle npm_* miljøtokener
AWS-, GCP- og Azure-legitimasjonsfiler
GitHub personlig tilgangstoken regex (ghp_*, gho_*, ghu_*, ghs_*)
Kryptolommebok-artefakter for Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash og Dash
En rekursiv .env* gå gjennom ~/projects, ~/dev, ~/code, ~/workspace, og installasjons-cwd
Shell-historier og hele process.env

Pakken sendes til Serveo-tunnelen kl. / samle innDet er ingen forvirring, ingen anti-VM-logikk, ingen oppsetning – operatørens veddemål er på volum og hastighet.

Fase B — PhantomBot DDoS-rekruttering (17.05.2026, kun axois-utils:1.0.9)

Fase B erstatter phantom.js + postinstall.js med én enkelt fil kalt distrube.js (skrivefeilen er operatorens). Trippelkrok-scaffoldet i package.json er uendret; pakken beholder samme navn, omfang og versjonsbump-mønster. Sett utenfra ser axois-utils:1.0.9 ut som en mindre oppfølger til 1.0.6. Innvendig er det en annen skadevarefamilie.

distrube.js åpnes med en konfigurasjonsblokk som navngir operatørens egen merkevarebygging:

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

Kommentarene er rettet mot en fremtidig operatør som kjører settet («Bruk din localhost.run HTTPS URL»). Det, pluss det som følger ved siden av botklienten, er et tegn på at dette ikke bare er en offernyttelast – det er settet.

Flyten:

  1. Utholdenhet kjører først. Skriptet installerer seg selv på tre forskjellige måter per operativsystem (register Kjør + Oppstartsmappe + oppgaver på Windows; crontab + phantom-bot.service systemd-enhet + .bashrc/.zshrc legg til + /etc/rc.local på Linux; LaunchAgent com.phantom.bot.plist på macOS). Navnet på persistenstjenesten og LaunchAgent-etiketten er begge fantombot / com.phantom.bot, som også er derfra kampanjenavnet kommer.
  2. Systeminfo-eksfil kjører én gang – en fingeravtrykks-POST til b94b6bcfa27554.lhr.life:443/collect med vertsnavn, plattform, arch, brukernavn, CPU/RAM, nettverksgrensesnitt, process.env, cwd, homedir, nodeversjon og offentlig IP. Dette er mye mindre aggressivt enn Fase A: ingen SSH, ingen lommebøker, ingen .env-rekursjon. Botens jobb er å registrere, ikke å stjele.
  3. Hjerteslagsløkke åpner et HTTPS POST hvert 30. sekund til b94b6bcfa27554.lhr.life:443/. Brukeragenten er PhantomBot/1.0. TLS-verifisering er eksplisitt deaktivert (rejectUnauthorized: false). C2-svaret analyseres som JSON av formatet {type, target, port, duration, threads, method} og sendes.
  4. Flomarsenal er koblet til seks kommandoer:
Kommando type Moduler Merknader
ping Liveness-svar Bot identifiserer seg selv
http HTTP-flom Lag-7 forespørselsflom
https HTTPS-flom Samme som http, TLS-pakket
tcp TCP-flom 65 KB tilfeldig nyttelast-spam
udp UDP-flom 65 507-byte UDP-pakker
rask HTTP/2 hurtigtilbakestilling av DoS 2023 CVE-2023-44487-teknikken

Alle fem flommodulene tar en mål, havn, varighetog tråder argument – ​​boten er en generisk «leie»-flooder, ikke rettet mot et bestemt offer. Operatørens offerliste ligger på C2, ikke i pakken.

Hva er nytt her – den leverte C2-binærfilen

Fase A er en kjent form: legitimasjonstyveri, installasjonshook, leverandørtunnelert C2. Fase B er også en kjent form – DDoS-botnett har vært en del av ondsinnede npm-pakker i årevis. Det uvanlige er at operatøren sendte serversiden av settet inne i npm-tarballen:

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

Ingen av filene kalles av noen installasjonshook. De er ikke en del av offerets nyttelast. De ligger i pakkekatalogen på samme måte som en dokumentasjonsfil ville gjort. Den mest plausible lesningen er at operatøren flyttet utviklingstreet sitt til npm uten å kuratere fillisten – en skikkelig OpSec-tabbe – og det som ble levert er det komplette tosidige settet: klienten som et offer kjører, og serveren som operatøren kjører.

Dette er den delen av historien som rettferdiggjør omtalen av «nøkkelferdig botnett-sett». Alle som lastet ned axois-utils:1.0.9 før nedtakelsen ikke bare har et offereksempel – de har en fungerende C2-server.

Vippepunktet, i én setning

Samme utgiver, samme pakkenavn, samme trippelkrok-stillas, samme «fantom»-branding – men Nyttelasten endret inntektsmodellen over natten: fra «innhøstingshemmeligheter jeg kan videreselge» til «leie flomkapasitet jeg kan lease». Installasjonstids-TTP-ene som forsvarere bør følge med på er nesten identiske i begge fasene; signaturbaserte forsvar nøkkelt til Fase As lommeboksti-strenger eller til phantom.jss samler på 7 667 linjer ville ha gått glipp av fase B fullstendig.

Dato (UTC) Event
2026-05-15 Første publikasjon: axois-utils:1.0.4 (LAN-testbygging, utviklingsrigg på 192.168.129.19)
2026-05-15 axois-utils:1.0.6 publisert — Fase A C2 byttet til 80.200.28.28 via Serveo-tunnelen; kildekommentaren // Change to '80.200.28.28' for public bekrefter dev→prod-byttet
2026-05-16 chalk-tempalte:1.0.14 og 1.0.16 publisert — lenket laster erklærer axois-utils:^1.0.7 som en kjøretidsavhengighet; Serveo-underdomenet rotert
2026-05-16 Fase A-kampanje oppdaget under rutinemessig npm-skanning; bekreftede skadelige dommer iverksatt
2026-05-17 axois-utils:1.0.9 publisert — nyttelast-pivot: PhantomBot DDoS-rekruttering via localhost.run-tunnel; operatørside c2 binær og c2.go kildekoden ble levert i tarballen
2026-05-17 chalk-tempalte:1.0.19 og 1.0.20 publisert – fortsatt fase A (tyver); operatøren kjører nå begge modulene parallelt
2026-05-17 Oppdagelse av fase B under rutinemessig skanning; dommer anvendt på tvers av alle 2026-05-17 versjoner
(pågående) Fjerningsrapporter venter; alle fire publiserte pakkene er fortsatt tilgjengelige i registeret i skrivende stund

Indikatorer for kompromiss

Nettsidepakker

Økosystem Pakke versjoner
NPM axois-utils (typosquat av axios) 1.0.4, 1.0.6, 1.0.9
NPM chalk-tempalte (typosquat av krittmal) 1.0.14, 1.0.16, 1.0.19, 1.0.20

Forfatteridentitet

Felt Verdi
npm-utgiver deadcode09284814
Utgiverens e-postadresse phantomdeadcode@tutamail.com
SCM verifikasjon none

Kommando-og-kontroll

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 versjon)
A 80.200.28.28:443/collect Underliggende VPS-endepunkt
B b94b6bcfa27554.lhr.life:443/ localhost.run HTTPS omvendt tunnel

Filsammendrag (SHA-256)

filet SHA-256 Merknader
c2 (Gå ELF, 4 MB) 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 Operatørside C2-server, levert inni 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-legitimasjon / lommebokinnsamler
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-laster, byte-identisk på tvers av begge versjoner

Attribusjon og motivasjon

Vi sporer denne kampanjen som PhantomBot, og tar operatørens egen merkevarebygging fra Brukeragent: PhantomBot/1.0 hjerteslagsoverskriften, den phantom-bot.service systemd-enheten, den com.phantom.bot LaunchAgent-etiketten og fantomdødkode@ e-postadresse. Operatoren er konsistent om dette navnet på tvers av minst fire artefakter.

Signalkatalog

  • Publisher - dødkode09284814 på npm. Enkelthåndskonto, engangs-e-post fra Tutamail, nei SCM verifisering. Ingen tidligere publikasjonshistorikk utover denne kampanjen.
  • Gjenbruk av merkevarebygging — «phantom» vises i utgiverens e-post, i fase A-samlerfilnavnet (phantom.js), i navnet på fase B-persistenstjenesten (phantom-bot.service), i LaunchAgent-etiketten (com.phantom.bot), og i boten User-Agent (PhantomBot/1.0).
  • Infrastruktur — En enkelt VPS på 80.200.28.28 fronter Fase A via Serveo-underdomenerotasjon; Fase B beveger seg til en localhost.run omvendt tunnel (b94b6bcfa27554.lhr.lifeBegge leverandørtjenestene er gratis og krever kun utgående SSH på operatørsiden, noe som er i samsvar med lavbudsjetts- og driftssikkerhetsoppsett.
  • kode stil — Ren JavaScript gjennomgående; ingen obfuskasjon, ingen strengkoding, ingen anti-VM-kontroller. Variabelnavn er beskrivende (stjeleSystemInfo, utførkommando, httpFloodKommentarer i distrube.js direkte adressere en fremtidig operator («Bruk din localhost.run HTTPS-URL»), noe som antyder at filen var ment å bli distribuert på nytt som et sett, ikke brukt av én enkelt angriper.
  • OpSec-slipp — Fase B-tarballen leverer både botklienten og C2-serveren på operatørsiden (c2 ELF + c2.go kilde). Dette stemmer overens med en operatør som sendte arbeidstreet sitt til npm uten å revidere fillisten. Enten er operatøren uerfaren, eller så er settet ment skal distribueres offentlig, og C2-binærfilen er en del av produktet.
  • Selvbekreftelse - axois-utils:1.0.4 inneholder kildekommentaren // Endre til '80.200.28.28' for offentlig på linje 12, som bekrefter utviklings-/oppsetnings-/produksjonsprogresjonen som operatører vanligvis benekter.

Motivasjon

Fase A-nyttelasten er rett og slett økonomisk tyveri: legitimasjon, skynøkler, GitHub-tokens og kryptolommebøker har alle likvide videresalgsmarkeder. Fase B er også økonomisk, men indirekte: DDoS-for-hire («booter»-tjenester) leier ut oversvømmelseskapasitet minutt for minutt, og roboter som den som sendes her er inventaret disse tjenestene kjører på. 30-sekunders hjerteslaget, den generiske mål/havn/varighet kommandoskjemaet, og flom-arsenalet med fem protokoller er standard produkt fra en oppstartsoperatør.

Kjøre begge modulene parallelt – krittmal: 1.0.19 og 1.0.20 fortsette å sende stjelen mens axois-utils:1.0.9 sender boten – antyder at operatøren sikrer inntektsstrømmer i stedet for å forlate fase A. Pivoten er en tillegg, ikke en erstatning.

Det vi ikke påstår

Vi har ikke klart å bekrefte en virkelig identitet bak dødkode09284814 håndtak, og vi tilskriver ikke denne kampanjen til noen navngitt trusselaktør, gruppe eller land. «Fantom»-merkevaren er konsistent nok på tvers av artefakter til å antyde en enkelt operatør, men den kit-lignende leveringen av C2-binærfilen åpner for muligheten for at fremtidige pakker fra urelaterte håndtak vil gjenbruke den samme koden.

Impact

De legitime knebøymålene Axios og krittmal er i stor grad avhengige av i JavaScript-økosystemet; Axios alene er blant de tretti mest nedlastede npm-pakkene. Typosquat-navnene er ett tastetrykk unna de ekte (axoisAxios, maltemal), og begge er språklig plausible stavefeil.

Vi klarte ikke å innhente pålitelig nedlastingsstatistikk for de skadelige versjonene før fjerning – npm lagrer ikke antall nedlastinger per versjon etter at en pakke er avpublisert, og npms.io-style proxyer er støyende på denne skalaen. Enhver organisasjon hvis låsefil løses til en pakke med navnet axois-utils or krittmal fra utgiver dødkode09284814 bør behandles som kompromittert: roter alle legitimasjonsopplysninger som er tilstede i prosess.env på den berørte verten, revider persistensvektorer per operativsystem (se «Hva forsvarere bør gjøre» nedenfor), og fjern avhengigheten.

Fremvoksende mønstre

Denne kampanjen eksemplifiserer et skifte vi har sett i flere nylige npm-hendelser: Installasjonskrokstillaset er den varige ressursennyttelasten kan byttes utSamme utgiver, samme pakke, samme forhåndsinstallering / installere / etterinstallasjon trippel, og til og med samme versjonsbump-kadens – det eneste som endret seg mellom axois-utils:1.0.6 og axois-utils:1.0.9 var filen den hooks kjør. Signaturbasert deteksjon nøkkelt til Fase A-nyttelasten (strenger for lommeboksti, phantom.js's samler på 7 667 linjer, Serveo C2-verten) ville ha flagget de tre første versjonene og gått glipp av fase B fullstendig.

Det samme mønsteret er synlig på tvers av andre 2026-kampanjer vi har sporet: én enkelt operatør med et stabilt stillas, som veksler mellom tyveri av legitimasjon, eksamensjukseklienter, Telegram-bot-exfil, og nå DDoS-rekruttering. Forsvarere som er avhengige av nyttelastsignaturer vil fortsette å tape den andre runden av hver kampanje.

Konsekvensen er at TTP-er ved installasjon er det bedre signaletTrippel install-hook-deklarasjoner, installasjonsskript som importerer https or barneprosess, installere skript som skriver til brukeroppstartsmapper, og installere skript som løser vertsnavn på gratis reverse-tunnel-tjenester (Serveo, localhost.run, ngrok, cloudflared) er alle sjeldne i legitime pakker og vanlige på tvers av skadelige pakker.

Hva forsvarere bør gjøre

  • Låsefilrevisjon. Søk i alle package-lock.json / garn.lås / pnpm-lock.yaml i organisasjonen din for de nøyaktige strengene axois-utils og krittmalBehandle enhver kamp som et kompromiss.
  • Roter hemmeligheter på berørte verter. Fase A massehøstet SSH-, sky-, GitHub-, npm- og lommeboklegitimasjon. Anta at alle legitimasjonsopplysninger som noen gang er tilstede i prosess.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .config, eller noe .konvolutt* filen på den berørte verten er eksponert.
  • Fjern vedvarende stoffer (fase B). Slett på Windows HKCU\Programvare\Microsoft\Windows\Gjeldende versjon\Kjør\Systemoppdatering, ta vekk %APPDATA%\Microsoft\Windows\Startmeny\Programmer\Oppstart\system-update.batog schtasks /delete /tn SystemUpdate /fPå Linux, crontab -e og fjern @reboot-node …, systemctl –bruker deaktiver –nå phantom-bot.service deretter slette ~/.config/systemd/bruker/phantom-bot.service, skrubb .bashrc / .zshrc / /etc/rc.localPå macOS, launchctl unload ~/Bibliotek/LaunchAgents/com.phantom.bot.plist slett deretter plisten.
  • Blokker C2-vertene. Legg til de fire C2-endepunktene i IOC-tabellen i utgangsblokkeringslisten din. *.serveousercontent.com og *.lhr.liv kan blokkeres i stor skala hvis miljøet ditt ikke har noen legitim bruk for omvendte tunneltjenester.
  • Søk etter TTP ved installasjonstidspunkt, ikke nyttelast. Lagerlåsefiloppføringer hvis pakke.json erklærer forhåndsinstallering, installereog etterinstallasjon alle peker på det samme skriptet. Kryssjekk mot pakkealder og utgiververifiseringsstatus. Dette mønsteret er sjeldent i legitime pakker og er det mest pålitelige signalet som PhantomBot bruker om igjen.
  • Revisjon for C2-binærfilen. Alle som lastet ned axois-utils:1.0.9 har operatørens C2-server (c2 ELF, sha256 165fa92d…) på disk. Skann hurtigbuffere og CI-artefaktlagre. Binærfilen er sovende i seg selv, men dens tilstedeværelse på en arbeidsstasjon er utvetydig bevis på at pakken ble installert.

Lukkelinje

Den samme operatøren, den samme pakken og den samme installasjonskroken kan levere helt forskjellige trusler innen 48 timer. Se på stillaset, ikke nyttelasten.

sca-tools-programvare-verktøy for komposisjonsanalyse
Prioriter, utbedre og sikre programvarerisikoene dine
Få din gratis konto.
Ingen kredittkort kreves.

Sikre programvareutviklingen og -leveringen din

med Xygeni-produktpakken