Namestitev ektoplazme npm Hooks Ki kradejo poverilnice AWS

Ektoplazma: namestitev npm hooks ki zbirajo poverilnice AWS za sprožilcem, ki deluje samo v vsebniku

TL; DR

Grozd pet npm paketov, objavljeno prek dveh uporabniških imen računov, poslano postinstall kavelj, ki prebere poverilnice za oblak z gostitelja in jih pošlje takoj po namestitvi. Paketi imajo lažna imena – coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit – in vse, kar zberejo, serijsko pretvorijo v ponaredek ecto_module: manifest YAML pred njegovim prenosom. Sledimo grozdu kot Ektoplazma.

Koristni bremen se zažene le, ko zazna določeno okolje: gostitelja, katerega ime je 12-mestni šestnajstiški niz in delovni imenik pod /app/node_modules — obliko kontejnerizirane gradnje ali CI delavca. Ko ta vrata preidejo, kavelj poizveduje o Storitev metapodatkov primerkov AWS (IMDSv2) za poverilnice vloge IAM našteva Upravitelj skrivnosti AWS v treh regijah, izpiše spremenljivke okolja, bere datoteke pod /appin poišče nize za zajemanje zastavice. Nato rezultat izvleče na dva načina: kot svetilnik do webhook.site zbiralnik in manifest PUT na končno točko surovega IP-ja s seznamom nadomestnih nastavitev localhost-first.

V kasnejših opisih paketov piše »CTF koristni tovor za testiranje dobavne verige verdaccio«. Ta samoopis poročamo kot opazno dejstvo. Samo vedenje – izhod v živo na javni IP, branje pravih poverilnic IMDS, pravi klici upravitelja skrivnosti – je to, kar je, ne glede na oznako, in je razlog, zakaj so bile te različice označene kot zlonamerne.

Eno ime v skupini, coral-wraith, se ni ustavila pri eni sami izdaji. V nekaj urah je bila v hitrem zaporedju ponovno izdana v več deset različicah – 1.0.0 plezanje do 6.0.0 – in prejšnja serija z istim imenom je uporabila napihnjene 9999.0.x številke različic, klasična oblika poskus zmede zaradi odvisnostiMed tem preobratom je koristni tovor vidno dozorel: od enkratnega svetilnika za naštevanje gostiteljev do polnopravnega pivota poverilnic AWS, ovitega v preverjanja okolja, ki ga ohranjajo tihega zunaj predvidenega cilja.

Paketi 5 imen; coral-wraith sam ponovno objavljen v več deset različicah
Ekosistem npm
Namestite vektor postinstall skript življenjskega cikla
Primarni cilj Poverilnice vloge AWS IAM + tajne vrednosti upravitelja skrivnosti, spremenljivke okolja, /app datoteke
Izgnanstvo webhook.site svetilnik + surovi IP C2 PUT
Sprožilna vrata 12-hestnajstiško ime gostitelja + /app/node_modules cwd, plus preverjanje okolja, ki prepreči prenos koristnega tovora zunaj tega konteksta
Resnost visoko — razkritje poverilnic v oblaku in upravljane tajne podatkov iz kontejnerizirana okolja za gradnjo in izvajanje

Anatomija napada

Vsak paket v gruči je zgrajen na enak način: skoraj prazen index.js (modul.izvozi = {}), enovrstični paket.json scenarij — »postinstall«: »vozlišče postinstall.js« — in koristni tovor v postinstall.jsNamestitev paketa je dovolj za zagon hook-a; uvoz ali klic ni potreben.

Ciljna vrata. Preden karkoli stori, koristni tovor ecto-družine preveri svojo okolico:

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

12-hestnajstiško ime gostitelja je privzeta oblika, ki jo Docker dodeli vsebniku, in /aplikacija/moduli_vozlišč je običajna pot za namestitev v vsebniku. Tretji stavek se izklopi, če je pot videti kot imenik za ekstrakcijo v peskovniku. Končni učinek je, da koristni tovor ostane neaktiven na prenosniku razvijalca ali v peskovniku za analizo in se aktivira le znotraj vsebnika za gradnjo ali izvajalca – vrste okolja, ki najverjetneje vsebuje aktivne poverilnice v oblaku. Najzgodnejši paket v gruči, koralni prikazen, nima takšnih vrat in svojo (preprostejšo) zbirko izvaja brezpogojno.

CollectionKo vrata gredo mimo, se kavelj izvleče skozi execFileSync(»/bin/sh«, [»-c«, …]) in izvede en sam sestavljeni ukaz, ki po vrsti:

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)

Koraki 1–3 so učbeniško pridobivanje IMDSv2: zahtevajte žeton seje in ga nato priložite kot Žeton-metapodatkov X-aws-ec2 glava za pridobitev vloge IAM instance in začasnih dostopnih ključev te vloge. Možnost implementacije IMDSv2 namesto enostavnejšega neoverjenega IMDSv1 GET je vredno omeniti – to pomeni, da koristni tovor deluje tudi na instancah, konfiguriranih tako, da zahtevajo dostop do metapodatkov na podlagi žetonov, kar je utrjevanje, ki ga priporoča AWS. Poverilnice, ki jih vrne 3. korak, so kratkotrajne. ID dostopnega ključa/SkrivniKljučDostopa/Žeton trojke, omejene na vlogo instance; karkoli lahko ta vloga naredi, lahko imetnik teh ključev naredi v času trajanja poverilnice.

Koraki 4–6 razširijo obseg. env Datoteka dump zajame vse, kar je podedoval proces gradnje ali izvajanja – v praksi se tukaj najpogosteje nahajajo žetoni registra, nizi za povezavo z bazo podatkov in ključi API-ja. / app Sprehod datotek prebere do petnajst aplikacijskih datotek zunaj node_module, ki lahko konfigurira površino, .env datoteke ali vir. Korak 6 klici aws secretsmanager seznam-secrets v treh regijah; poverilnice, pridobljene v korakih 1–3, so točno tisto, kar overja te klice, zato se branje IMDS in naštevanje upravitelja skrivnosti združita v eno samo eskalacijo: vloga primerka → inventar upravljanih skrivnosti. Korak 7 je namig na okvirjanje zajemanja zastavice – ko HTB{…} Če se najde zastavica, se pošlje sama, sicer se surovi zbrani blob razdeli na štiri dele in pošlje.

Kasnejše različice v gruči še dodatno eskalirajo. Namesto da bi se ustavile pri inventarju, razčlenijo odgovor IMDS in izvozijo začasne ključe kot AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / ŽETON_SEJE_AWS okoljske spremenljivke, potrdite identiteto z aws sts pridobi identiteto klicateljain nato zanko prešteje vsako skrivnost, ki jo vrne seznam-skrivnosti kliče aws secretsmanager pridobi-skrivno-vrednost na vsakem – pridobivanje tajne vsebine, ne le njihovih imen. Iste različice berejo tudi binarne datoteke z zastavicami, ki jih nadomeščajo procesi (/readflag in prijatelji) in poskusite polnjenje proti kateremu koli projektu Rust, ki ga najdete pod / app, s čimer se pridobivanje podatkov razširi preko poverilnic v oblaku na vse, kar razkrije okolje gradnje.

Te novejše različice se tudi bolj agresivno zapirajo. Poleg 12-hestnega imena gostitelja in /aplikacija/moduli_vozlišč Pri preverjanjih koristni tovor pregleda aktivno konfiguracijo registra paketov in pot delovnega imenika ter se tiho zapre, ko označujeta kontekst analize ali zrcaljenja namesto aktivnega cilja. Kombinirani učinek je koristni tovor, ki v večini inšpekcijskih okolij ne naredi ničesar opaznega in zažene svojo celotno zbirko le tam, kjer presodi, da je na pristnem vsebniku gostitelja.

EksfiltracijaZbrani podatki zapustijo gostitelja po dveh kanalih. Najprej se oddaja signal. POST na fiksno webhook.site zbiralnik, ki vsebuje ime gostitelja, numerični UID, delovni imenik in do 120 KB zbranih podatkov. Drugič, podatki so zloženi v lažni YAML »manifest modula« in PUT do /api/moduli/ na ciljnem strežniku:

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

Imena polj manifesta (raven_moč, ladijska paluba, tovorni_sklad) so okras – ukradeni podatki se nahajajo znotraj nizovnih vrednosti, zato omrežni nadzornik vidi nekaj, kar je videti kot neškodljivo nalaganje manifesta registra paketov in ne kot očiten izpis podatkov. Kanal svetilnika prenaša več: POST telo do webhook.site vključuje ime gostitelja, numerični UID, delovni imenik in do 120 KB zbranega bloba, tako da že en sam uspešen oddajnik zagotovi celoten posnetek. webhook.site je brezplačna storitev za pregled zahtev; če jo uporabljate kot zbiralnik, operaterju ni treba nikoli graditi lastne infrastrukture za sprejem tega kanala, zabeležene zahteve pa ostanejo v košu storitve.

Manifest PUT sprehodi se po rezervnem seznamu, ki se začne z več 127.0.0.1/localhost vrata in nato pade na tri javne naslove v `154.57.164.0/24` obseg, ki se ustavi na prvi končni točki, ki odgovori s statusom 2xx. Vrstni red localhost-first je skladen s samoopisom »verdaccio testing« (lokalni register na povratni zanki), vendar nadomestni javni IP-naslovi pomenijo, da podatki zapustijo gostitelja, kadar povratna zanka ne posluša – torej na katerem koli računalniku, ki ni avtorjeva lastna testna oprema.

Timeline

Grozd kaže postopno rast zmogljivosti in ne enkratnega padca. Razvrščamo ga po opaženem vedenju, ne po času objave:

Stage Paketi / Različice Vedenje
Zgodnji tek coral-wraith 9999.0.x Napihnjene številke različic, skladne s poskusom zmede zaradi odvisnosti; naštevanje ob času namestitve in izpis
Seme coral-wraith 1.0.0 postinstall zbira datoteke id/env/flag; en sam PUT v 154[.]57[.]164[.]71:30782, označevalec ECT-472839
Hitra iteracija coral-wraith 1.0.1 → 6.0.0 Na desetine izpustov v urah; koristni tovor pridobi isAppWorker() vrata, prevzem poverilnic IMDSv2, celotno get-secret-value pivot, preverjanje okolja registra/poti in označevalci dvojnega pomivalnega korita
Vzporedna imena ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Enaka omejena koristna obremenitev; webhook.site seznam svetilnikov in rezervnih seznamov za več končnih točk
Variante ecto-rust-read-f3a9c1 1.0.1–1.0.2 Dodaja dodatne oznake za umivalnik ECT-987654, ECT-654321, ECT-839201
Variante ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Isti omejeni koristni tovor, isti C2 in oddajnik

Opredeljujoča značilnost grozda je njegova kadenca objavljanja: namesto enega paketa in ene različice se isto ime znova in znova objavlja v hitrem zaporedju, pri čemer je vsaka izdaja majhna različica prejšnje, poleg peščice različno poimenovanih sorodnikov, ki nosijo isti koristni tovor. Znotraj šepetati Družina kode se je razdelila na dva tesno povezana prstna odtisa – en niz sproži dve kritični zaznavi, drugi pa tri (dodatni odtok za branje datotek) – vendar se oba razrešita na isti koristni tovor; razlika je v premiku kode, ne v vedenjski razcepitvi. Različice šepetati zunaj analiziranega območja (vsaj do 1.0.25 v času pisanja) so bili v živo opaženi v registru in koralni prikazen Ime se je še naprej vzpenjalo po lastni lestvi različic čez isto okno.

Kazalniki kompromisa

Vsi spodnji indikatorji so bili izvlečeni iz izvorne kode paketa na disku. Omrežni indikatorji so odstranjeni.

mreža

Kazalec vloga
hxxp://154[.]57[.]164[.]71:30782 Cilj C2 PUT (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 Rezervni C2 PUT (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 Rezervni C2 PUT (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 Rezervni C2 PUT (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Zbiralec svetilnikov
169[.]254[.]169[.]254/latest/... Branje poverilnic IMDSv2 (na ciljni strani, metapodatki AWS)

Vedenjsko/datotečno

Kazalec vloga
"postinstall": "node postinstall.js" Namestite vektor
ecto_module: YAML z power_level / ship_deck / cargo_hold tipke Shema manifesta Exfil
Označevalci umivalnikov ECT-472839, ECT-987654, ECT-654321, ECT-839201 Odsek poti C2 /api/modules/<marker>
isAppWorker() vrata: gostitelj /^[0-9a-f]{12}$/, cwd vsebuje /app/node_modules Pogoj aktivacije
aws secretsmanager list-secrets več us-east-1, eu-west-1, eu-central-1 Naštevanje skrivnosti
HTB{...} strganje regularnih izrazov Žetev po principu »zajemi zastavo«

Zgoščene vrednosti datotek (sha256, zajete v času analize)

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

Pripisovanje in opazovano vedenje

Pet imen paketov je bilo objavljenih pod dvema ročkama npm računa, vendar si delijo dovolj infrastrukture, da jih je mogoče obravnavati kot eno gručo: enako ecto_module manifestna shema, ista ECT-472839 primarni označevalec ponora, enak webhook.site ID zbiralca in končne točke C2 v istem Blok 154.57.164.0/24`. Paket semen (`coral-wraith, enostavnejši in nezaprt) in zaprta ektodružina se tako bere kot iteracije na enem naboru orodij in ne kot neodvisna prizadevanja.

Paketi se v kasnejših različicah opisujejo kot "Koristni tovor CTF za testiranje dobavne verige Verdaccio." To oznako predstavimo kot opazno dejstvo in je ne navajamo kot ugotovitev o namenu. Kar koda počne, je nedvoumno in neodvisno od tega, kako je označena: prebere poverilnice vloge IAM iz storitve metapodatkov instance, našteje upravljane skrivnosti v treh regijah AWS in rezultate posreduje javnemu IP-ju in zbiralniku spletnih kavlja tretje osebe. Resnično testna zanka samo za povratno zanko ne bi potrebovala rezervnega seznama javnih IP-jev, branja poverilnic IMDS ali klicev upravitelja skrivnosti med regijami. Ker sta izhod in doseg poverilnic resnična, so bile različice z omejitvami opredeljene kot zlonamerne.

Izhod, ki deluje samo v vsebniku, je operativno najbolj opazna lastnost. Je tako ukrep izogibanja – molk na prenosnikih in v peskovnikih za analizo – kot tudi ukrep ciljanja, ki sproži le tam, kjer je najverjetneje prisotna resnična vloga IAM in aktivne skrivnosti. Analitiki, ki te pakete izvajajo v generičnem peskovniku, ne bi opazili ničesar; vedenje se kaže le pod imenom gostitelja v slogu Dockerja in namestitveno potjo znotraj vsebnika.

Vpliv, trendi in smernice za zagovornike

Izpostavljenost tukaj je razkritje poverilnic v oblaku in tajnih podatkov znotraj vsebnikov za gradnjo in izvajanje. Poverilnica vloge IAM, pridobljena iz IMDS, vsebuje vsa dovoljenja, ki jih ima ta vloga; upravitelj skrivnosti:SeznamSkrivnosti (in morebitna nadaljnja PridobiSkrivnoVrednost) to razširi na shranjene skrivnosti aplikacij. Izpisi spremenljivk okolja pogosto vsebujejo žetone registra, URL-je baz podatkov in ključe API-ja. V kontekstu CI ali vsebnika – točno to, kar izberejo vrata – je ena sama tranzitivna namestitev enega od teh paketov dovolj, da pride do uhajanja te vsebine.

Ectoplasm ustreza vzorcu, ki ga še vedno vidimo: koristni tokovi v času namestitve, ki posegajo po metapodatki v oblaku in upravljanih skrivnostih namesto po lokalnih datotekah ter se sami sprožijo le v okoljih z visoko vrednostjo. Sledita dve obrambni ugotovitvi.

  • Oblika je zaznavnaNamestitveni kavelj npm/PyPI, katerega graf klicev doseže tako API skrivnosti v oblaku (upravitelj skrivnosti AWS, skrivnosti gclouda, az keyvault) ali naslov IMDS in izhodni odtok omrežja je ozek vzorec z visokim signalom – skoraj nikoli se ne pojavi v legitimnem skriptu življenjskega cikla. Analiza statičnega toka lahko ga označi brez odvisnosti od določene domene ali IP-ja.
  • Otrjevanje okolja ga otupuje. Uveljavljanje IMDSv2 z omejitvijo skoka 1 preprečuje, da bi delovne obremenitve vsebnikov dosegle metapodatke instance; določanje obsega vlog IAM na najmanjše privilegije omejuje polmer puščanja vseh poverilnic; in izvajanje namestitev z –Ignoriraj skripte V CI v celoti odstrani vektor namestitvenega kavlja za pakete, ki ga ne potrebujejo.

Za zagovornike so praktična preverjanja: opozorilo o odhodnih povezavah iz vsebnikov gradnje/CI do javnih IP-naslovov, ki niso na seznamu dovoljenih, med namestite npm; bodite pozorni na dostop do IMDS, ki izvira iz skriptov življenjskega cikla paketa; in obravnavajte vsak namestitveni kavelj, ki se nanaša na oblačni CLI, kot sumljiv, dokler se ne dokaže nasprotno.

Še dve opombi, specifični za to gručo. Prvič, ker je aktivacija omejena na kontejnerska okolja, je lahko paket, ki se ob preverjanju na delovni postaji zdi inerten, še vedno aktiven v produkciji – preverjanje mora reproducirati ime gostitelja in pogoje poti kontejnerja ali neposredno prebrati izvorno kodo, namesto da se zanaša na »Namestil sem ga in se ni nič zgodilo«. Drugič, uporaba javne storitve za pregled zahtev kot zbiralnika oddajnikov pomeni, da je nekatere izvlečene podatke mogoče obnoviti za odziv na incidente: organizacija, ki v svojem drevesu odvisnosti najde enega od teh paketov, lahko na podlagi logike zbiranja koristnega tovora sklepa o tem, kaj bi vseboval uspešen oddajnik, in mora zavrteti vse poverilnice vloge IAM, žetone registra in upravljane skrivnosti, ki so bile dosegljive iz prizadetega okolja gradnje ali izvajalnega okolja. Rotacija poverilnicOperativna sanacija po izvedbi namestitve je , ne odstranitev paketa.

orodja-za-analizo-sestave-programske-programske-orodja-sca
Določite prednostne naloge, odpravite in zavarujte tveganja programske opreme
Pridobite svoj brezplačni račun.
Ni potrebna kreditna kartica.

Zagotovite si razvoj in dostavo programske opreme

z Xygeni Product Suite