Ektoplasma npm Ynstallearje Hooks Dat stelle AWS-ynloggegevens

Ektoplasma: npm ynstallaasje hooks dy't AWS-gegevens sammelje efter in trigger dy't allinich foar konteners is

TL; DR

In kluster fan fiif npm-pakketten, publisearre oer twa akkounthandgrepen, ferstjoerd in postinstall heak dy't de cloud-gegevens fan 'e host lêst en se direkt út 'e doaze ferstjoert. De pakketten hawwe spoek-en-piratennammen - coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — en serialisearje wat se sammelje yn in nep ecto_module: YAML manifest foardat it ferstjoerd wurdt. Wy folgje it kluster as Ektoplasma.

De lading rint allinich as it in spesifike omjouwing detektearret: in host waans namme in is 12-tekens heksadesimale tekenrige en in wurkmap ûnder /app/node_modules — de foarm fan in kontenerisearre bou of CI-wurker. As dy poarte foarby giet, freget de heak de AWS-eksimplaarmetadatatsjinst (IMDSv2) foar IAM-rolgegevens, enumerearret AWS Geheimenbehearder oer trije regio's, dumpt omjouwingsfariabelen, lêst bestannen ûnder /app, en skrapt nei snaren om de flagge te fangen. It filteret it resultaat dan op twa manieren út: in beaken nei in webhook.site samler en in manifest PUT nei in raw-IP-eindpunt, mei in list mei localhost-earst fallbacks.

De lettere pakketbeskriuwingen lêze "CTF payload for verdaccio supply-chain testing." Wy melde dy selsbeskriuwing as in waarnimber feit. It gedrach sels - live útgong nei in iepenbier IP, echte IMDS-gegevenslêzingen, echte Secrets Manager-opropen - is wat it is, nettsjinsteande it label, en is de reden dat dizze ferzjes as kwea-aardich klassifisearre waarden.

Ien namme yn it kluster, coral-wraith, stoppe net by ien útjefte. It waard yn in pear oeren yn rap tempo opnij publisearre fia tsientallen ferzjes - 1.0.0 klimmen nei 6.0.0 — en in eardere útjefte mei deselde namme hie opblaasd brûkt 9999.0.x ferzjenûmers, de klassike foarm fan in ôfhinklikens-betizingspogingOer dy kearn hinne is de lading sichtber folwoeksen wurden: fan in ienmalige host-enumeraasjebeacon nei in folsleine AWS-akkreditaasjepivot ynpakt yn omjouwingskontrôles dy't it stil hâlde bûten it bedoelde doel.

Packages 5 nammen; coral-wraith allinnich opnij publisearre yn tsientallen ferzjes
Ekosysteem npm
Ynstallearje vektor postinstall libbensyklusskript
Primêr doel AWS IAM-rolgegevens + geheime wearden fan Secrets Manager, omjouwingsfariabelen, /app bestannen
Eksfil webhook.site beacon + rau-IP C2 PUT
Triggerpoarte 12-heksadezimal hostnamme + /app/node_modules cwd, plus in omjouwingskontrôle dy't de lading bûten dy kontekst ûnderdrukt
Severity heech — wolkgegevens en beheard geheim iepenbiering fan kontenerisearre bouw- en runtime-omjouwings

Oanfalsanatomy

Elk pakket yn it kluster is op deselde wize boud: in hast leech index.js (module.eksport = {}), in ien-line pakket.json skript — "postinstall": "knooppunt postinstall.js" - en de lading yn postinstall.jsIt ynstallearjen fan it pakket is genôch om de hook út te fieren; gjin ymport of oprop is fereaske.

De doelpoarte. Foardat se wat dogge, kontrolearret de lading fan 'e ecto-famylje syn omjouwing:

function isAppWorker():   host = os.hostname()   if host does NOT match /^[0-9a-f]{12}$/  -> exit   if cwd does NOT contain "/app/node_modules" -> exit   if cwd contains "/tmp/npm-safe"            -> exit   otherwise -> proceed

In 12-hex hostnamme is de standertfoarm dy't Docker oan in kontener tawiist, en /app/knooppunt_modules is in konvinsjoneel ynstallaasjepad yn in kontener. De tredde klausule falt út as it paad derút sjocht as in sandbox-ekstraksjemap. It netto-effekt is dat de lading sliepend bliuwt op in ûntwikkelderslaptop of in analysesandbox en allinich aktivearret binnen in kontenerisearre build of runtime-wurker - it soarte omjouwing dat it wierskynlikst live wolkgegevens befettet. It ierste pakket yn it kluster, koraal-wraith, hat gjin sokke poarte en rint syn (ienfâldiger) kolleksje sûnder betingsten.

SamlingAs de poarte foarby giet, skeart de heak dertrochhinne execFileSync("/bin/sh", ["-c", ...]) en fiert in inkele gearstalde kommando út dy't, yn folchoarder:

1. PUT /latest/api/token to 169.254.169.254          (IMDSv2 token request) 2. GET .../iam/security-credentials/                  (IAM role name) 3. GET .../iam/security-credentials/<role>            (temporary credentials) 4. dump env | sort                                    (environment variables) 5. list /app (excl. node_modules) + cat first 15      (application files) 6. aws secretsmanager list-secrets                    (us-east-1, eu-west-1, eu-central-1) 7. scrape readable files for HTB{...}                 (capture-the-flag strings)

Stappen 1–3 binne in learboek IMDSv2-opheljen: freegje in sesjetoken oan, en hechtsje it dan oan as de X-aws-ec2-metadata-token header om de IAM-rol fan it eksimplaar en de tydlike tagongssleutels fan dy rol op te heljen. De kar om IMDSv2 te ymplementearjen ynstee fan de ienfâldiger net-autentisearre IMDSv1 KRIJE is it neamen wurdich - it betsjut dat de lading sels wurket op ynstânsjes dy't konfigurearre binne om tagong ta metadata op basis fan tokens te fereaskjen, wat de troch AWS oanrikkemandearre ferhurding is. De ynloggegevens dy't weromjûn wurde troch stap 3 binne koart libbensduur. AccessKeyId/SecretAccessKey/token trijefâldichheden binne beheind ta de rol fan it eksimplaar; wat dy rol ek dwaan kin, kin de hâlder fan dy kaaien dwaan foar de libbensduur fan 'e ynloggegevens.

Stappen 4–6 ferbreedzje de yngong. De sawat dump fangt alles dat it build- of runtime-proses erfde - yn 'e praktyk is dit wêr't registertokens, databaseferbiningstrings en API-kaaien it meast foarkomme. /app triemkuier lêst oant fyftjin applikaasjebestannen bûten node_modules, dy't oerflakkonfiguraasje kin hawwe, .en V bestannen, of boarne. Stap 6 ropt op aws geheimbehearder list-geheimen yn trije regio's; de ynloggegevens dy't yn stappen 1-3 helle binne, binne presys wat dy oprop autentisearje, sadat it IMDS-lêzen en de Secrets Manager-enumeraasje gearwurkje yn ien eskalaasje: ynstânsjerol → behearde-geheime ynventaris. Stap 7 is in knipeach nei it capture-the-flag-framing - as in HTB{…} flagge fûn wurdt, wurdt it apart ferstjoerd, oars wurdt de rau sammele blob yn fjouwer stikken opdield en ferstjoerd.

Lettere ferzjes yn it kluster drage de eskalaasje fierder. Ynstee fan te stopjen by in ynventarisaasje, parse se it IMDS-antwurd, eksportearje de tydlike kaaien as AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN omjouwingsfariabelen, befêstigje de identiteit mei aws sts krije-beller-identiteit, en dan oer elk geheim weromjûn troch list-geheimen calling aws geheimbehearder krije-geheime-wearde op elk - it opheljen fan 'e geheime ynhâld, net allinich har nammen. Deselde ferzjes lêze ek proses-ferfangende flaggebinêre bestannen (/lêsflagge en freonen) en besykje in charge run tsjin elk Rust-projekt fûn ûnder /app, en wreidzje de rispinge út fierder as wolkgegevens nei wat de bouomjouwing bleatstelt.

Dizze lettere ferzjes brûke harsels ek agressiver as poarte. Neist de 12-hex-hostnamme en /app/knooppunt_modules kontrolearret, de lading ynspektearret de aktive pakketregisterkonfiguraasje en it wurkmappaad en slút stil ôf as se in analyze- of spegelkontekst oanjaan ynstee fan in live doel. It kombineare effekt is in lading dy't neat waarnimber docht yn 'e measte ynspeksjeomjouwings en syn folsleine kolleksje allinich útfiert as it himsels beoardielt as op in echte kontenerisearre host.

ExfiltrationDe sammele gegevens ferlitte de host op twa kanalen. Earst, in beacon PEAL oan in fêst webhook.side samler, mei de hostnamme, numerike UID, wurkmap en maksimaal 120 KB oan sammele gegevens. Twadder wurde de gegevens yn in falsk YAML "module manifest" ynfold en put nei /api/modules/ op in doeltsjinner:

ecto_module:   name: "<flag-or-chunk-0>"   version: "1.0.0"   power_level: "<chunk-1>"   ship_deck: "<chunk-2>"   cargo_hold: "<chunk-3>"

De nammen fan de manifestfjilden (krêftnivo, skipdek, frachtromte) binne dekoraasje - de stellen gegevens sitte binnen de tekenrigewearden, dêrom sjocht in netwurkmonitor wat liket op in goedaardige upload fan in pakketregistermanifest ynstee fan in dúdlike gegevensdump. It beaconkanaal draacht mear: de PEAL lichem oan webhook.side omfettet de hostnamme, numerike UID, wurkmap en maksimaal 120 KB fan 'e sammele blob, sadat sels in inkele suksesfolle beacon de folsleine opname leveret. webhook.side is in fergese oanfraach-ynspeksjetsjinst; it brûken as in samler betsjut dat de operator noait in eigen ûntfangsynfrastruktuer foar dat kanaal hoecht op te setten, en de opnommen oanfragen bliuwe yn 'e bak fan' e tsjinst.

It manifest put rint in reservelist dy't begjint mei ferskate 127.0.0.1/localhost havens en falt dan troch nei trije iepenbiere adressen yn 'e `154.57.164.0/24` berik, en stoppet by it earste einpunt dat antwurdet mei in 2xx-status. De localhost-earst-oarder komt oerien mei de selsbeskriuwing fan "verdaccio testing" (in lokaal register op loopback), mar de fallbacks fan iepenbier IP betsjutte dat de gegevens de host ferlitte as loopback net harket - dat wol sizze, op elke masine dy't net de eigen testrig fan 'e auteur is.

Timeline

It kluster lit stapsgewijze kapasiteitsgroei sjen ynstee fan in inkele drip. Wy sortearje it op waarnommen gedrach, net op publikaasje-muorreklok:

Stage Pakketten / Ferzjes Hâlden en dragen
Iere rin coral-wraith 9999.0.x Opblaasde ferzjenûmers dy't oerienkomme mei in poging ta betizing fan ôfhinklikens; opsomming by ynstallaasjetiid en exfil
Sied coral-wraith 1.0.0 postinstall sammelet id/env/flag-bestannen; ienige PUT nei 154[.]57[.]164[.]71:30782, marker ECT-472839
Snelle iteraasje coral-wraith 1.0.1 → 6.0.0 Tsientallen frijlittingen yn oeren; lading krijt de isAppWorker() poarte, IMDSv2-akkreditaasjelûking, it folsleine get-secret-value pivot, de kontrôle fan it register/paad-omjouwing, en dûbele sink-markers
Parallelle nammen ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Deselde gated lading; webhook.site beacon en multi-endpoint fallback-list
Farianten ecto-rust-read-f3a9c1 1.0.1–1.0.2 Foeget ekstra sinkmarkers ta ECT-987654, ECT-654321, ECT-839201
Farianten ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Deselde gated lading, deselde C2 en beacon

It definiearjende skaaimerk fan it kluster is de publikaasjekadens: ynstee fan ien pakket en ien ferzje, wurdt deselde namme hieltyd wer yn rappe opienfolging opnij publisearre, elke release in lytse fariaasje op 'e foarige, neist in hantsjefol ferskillend neamde sibben dy't deselde lading drage. Binnen de flústerje famylje splitste de koade him yn twa tichte fingerôfdrukken - ien set dy't twa krityske deteksjes útskeakele, in oare trije (in ekstra bestânslêssink) - mar beide lossen op nei deselde lading; it ferskil is koadedrift, net in gedrachsfork. Ferzjes fan flústerje bûten it analysearre berik (oant teminsten 1.0.25 op it momint fan skriuwen) waarden live waarnommen op it register, en de koraal-wraith namme bleau syn eigen ferzjeljedder oer itselde finster beklimme.

Yndikatoaren fan kompromis

Alle yndikatoaren hjirûnder binne helle út 'e pakketboarne op skiif. Netwurkyndikatoaren binne defangearre.

netwurk

indicator rol
hxxp://154[.]57[.]164[.]71:30782 C2 PUT-doel (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 C2 PUT fallback (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 C2 PUT fallback (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 C2 PUT fallback (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Beacon-kollektor
169[.]254[.]169[.]254/latest/... IMDSv2-gegevens lêzen (doelkant, AWS-metadata)

Gedrachs-/bestân

indicator rol
"postinstall": "node postinstall.js" Ynstallearje vektor
ecto_module: YAML mei power_level / ship_deck / cargo_hold kaaien Exfil manifestskema
Sinkmarkers ECT-472839, ECT-987654, ECT-654321, ECT-839201 C2 paadsegment /api/modules/<marker>
isAppWorker() poarte: gasthear /^[0-9a-f]{12}$/, cwd befettet /app/node_modules Aktivaasjebetingst
aws secretsmanager list-secrets oer us-east-1, eu-west-1, eu-central-1 Geheimen opsomming
HTB{...} regex-skrape Fang-de-flagge-rispinge

Triemhashes (sha256, fêstlein by analysetiid)

file sha256
coral-wraith/postinstall.js ce5ff035cfdfed1d0015446424b352c27b66bcb77e9fdb0a51e4245199146824
ecto-corsair-whisper-6f3b9 1.0.18/postinstall.js b58432acba376aa6976f0490d9a1c04257ccdbc856d8390260c50322d63e31c3

Attribúsje en waarnommen gedrach

De fiif pakketnammen waarden publisearre ûnder twa npm-akkounthandgrepen, mar se diele genôch ynfrastruktuer om se as ien kluster te behanneljen: itselde ecto_module manifest skema, itselde ECT-472839 primêre sinkmarker, itselde webhook.side samler-ID, en C2-eindpunten yn itselde 154.57.164.0/24` blok. It siedpakket (`coral-wraith, ienfâldiger en ûnpoarte) en de gated ekto-famylje lêzen dus as iteraasjes op ien toolkit ynstee fan ûnôfhinklike ynspanningen.

De pakketten beskriuwe harsels, yn lettere ferzjes, as "CTF-lading foar Verdaccio-leveringsketentesten." Wy bringe dat label nei foaren as in waarnimber feit en werhelje it net as in fynst oer doel. Wat de koade docht is ûndûbelsinnich en ûnôfhinklik fan hoe't it labeld is: it lêst IAM-rolgegevens fan 'e ynstânsjemetadatatsjinst, somt behearde geheimen op oer trije AWS-regio's, en stjoert de resultaten nei in iepenbier IP-adres en in webhook-kollektor fan tredden. In echt allinich-loopback-testharnas soe de fallbacklist foar iepenbier IP-adres, de IMDS-gegevenslêzingen, of de cross-region Secrets Manager-opropen net nedich hawwe. Omdat de útgong en it berik fan gegevens echt binne, waarden de gated-ferzjes as kwea-aardich klassifisearre.

De kontener-allinich poarte is de meast operasjoneel opmerklike eigenskip. It is sawol in ûntwykingsmaatregel - stil bliuwe op laptops en yn analyse-sandboxen - as in rjochte maatregel, allinich aktivearre wêr't in echte IAM-rol en live geheimen it wierskynlikst oanwêzich binne. Analysten dy't dizze pakketten yn in generike sandbox útfiere, soene neat fernimme; it gedrach manifestearret allinich ûnder in hostnamme yn Docker-styl en in ynstallaasjepad yn 'e kontener.

Ynfloed, trends en begelieding foar ferdigeners

De bleatstelling hjir is cloud-referinsjele gegevens en geheime iepenbiering binnen build- en runtime-konteners. In IAM-rolreferinsje dy't út IMDS helle wurdt, draacht alle tagongsrjochten dy't dy rol hat; geheimbehearder: ListGeheimen (en alle opfolgjende GetSecretValue) wreidet dat út nei opsleine applikaasjegeheimen. Omjouwingsfariabele dumps befetsje faak registertokens, database-URL's en API-kaaien. Yn in CI- of kontenerkontekst - presys wat de gate selektearret - is ien transitive ynstallaasje fan ien fan dizze pakketten genôch om dat materiaal te lekken.

Ektoplasma past by in patroan dat wy bliuwe sjen: ynstallaasjetiid-loadloads dy't sykje nei wolkmetadata en behearde geheimen ynstee fan lokale bestannen, en dy't harsels allinich yn weardefolle omjouwings oansette om te fjoeren. Twa ferdigenjende observaasjes folgje.

  • De foarm is werkenberIn npm/PyPI-ynstallaasjehook waans opropgrafyk sawol in wolkgeheimen-API berikt (aws geheimbehearder, gcloud geheimen, az kaaikluis) of it IMDS-adres en in netwurkútgongssink is in smel patroan mei hege sinjalen - it komt hast noait foar yn in legitime libbensyklusskript. Statyske streamanalyse kin it markearje sûnder ôfhinklik te wêzen fan in spesifyk domein of IP.
  • Omjouwingsferhurding stompt it ôf. It hanthavenjen fan IMDSv2 mei in hoplimyt fan 1 foarkomt dat kontenerwurkloads de metadata fan 'e ynstânsje berikke; it scopen fan IAM-rollen nei de minste privileezjes beheint de eksploazjeradius fan alle ynloggegevens dy't lekt; en it útfieren fan ynstallaasjes mei –Ignorearje-skripts yn CI ferwideret de install-hook-fektor folslein foar pakketten dy't it net nedich binne.

Foar ferdigeners binne de praktyske kontrôles: warskôging foar útgeande ferbiningen fan build/CI-konteners nei net-tastiene iepenbiere IP's tidens npm ynstallearje; let op IMDS-tagong dy't ûntstiet út pakketlibbensyklusskripts; en behannelje elke ynstallaasjehook dy't nei in wolk-CLI útskeakelt as fertocht oant it tsjinoerstelde bewiisd is.

Twa fierdere notysjes spesifyk foar dit kluster. Earst, om't aktivearring is ôfsletten foar kontenerisearre omjouwings, kin in pakket dat ynert liket as it op in wurkstasjon kontrolearre wurdt, noch altyd live yn produksje wêze - kontrôle moat de hostnamme en paadbetingsten fan 'e kontener reprodusearje, of de boarne direkt lêze, ynstee fan te fertrouwen op "Ik haw it ynstalleare en der is neat bard." Twad, it gebrûk fan in iepenbiere oanfraach-ynspeksjetsjinst as in beacon-kollektor betsjut dat guon fan 'e eksfiltrearre gegevens weromhelle wurde kinne foar ynsidintreaksje: in organisaasje dy't ien fan dizze pakketten yn har ôfhinklikheidsbeam fynt, kin redenearje oer wat in suksesfol beacon soe befetsje út 'e sammellogika fan' e payload, en moat alle IAM-rolbewiisbrieven, registertokens en behearde geheimen rotearje dy't berikber wiene fanút de troffen build- of runtime-omjouwing. Rotaasje fan akkreditaasjebewiis, net it fuortheljen fan pakketten, is de operative remediaasje as in ynstallaasje útfierd is.

sca-tools-software-komposysje-analyse-ark
Prioritearje, ferhelpe en befeiligje jo softwarerisiko's
Krij jo fergese akkount.
Gjin kredytkaart nedich.

Befeiligje jo softwareûntwikkeling en levering

mei Xygeni Produkt Suite