TL; DR
Grupp ta' ħames pakketti npm, ippubblikat fuq żewġ handle tal-kont, bagħat a postinstall hook li jaqra l-kredenzjali tal-cloud mill-host u jibgħathom barra mill-kaxxa. Il-pakketti jġorru ismijiet ta' ghost u pirati — coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — u jisserjalizzaw dak kollu li jiġbru f'dokument falz ecto_module: Manifest YAML qabel ma nittrażmettuh. Aħna nsegwu l-cluster bħala Ektoplażma.
Il-payload jaħdem biss meta jiskopri ambjent speċifiku: host li ismu huwa Sekwenza eżagonali ta' 12-il karattru u direttorju tax-xogħol taħt /app/node_modules — il-forma ta' bini f'kontenitur jew ħaddiem tas-CI. Meta dik il-bieba tgħaddi, il-ganċ jistaqsi lill- Servizz ta' metadata tal-istanza tal-AWS (IMDSv2) għall-kredenzjali tar-rwol tal-IAM, jelenka Maniġer tas-Sigrieti AWS fi tliet reġjuni, jaħżen il-varjabbli tal-ambjent, jaqra l-fajls taħt /app, u jfittex kordi ta' qbid tal-bandiera. Imbagħad jesfiltra r-riżultat b'żewġ modi: minn beacon għal webhook.site kollettur u manifest PUT għal endpoint ta' IP mhux ipproċessat, b'lista ta' fallbacks ta' localhost-first.
Id-deskrizzjonijiet tal-pakketti aktar tard jaqraw "CTF payload għall-ittestjar tal-katina tal-provvista ta' verdaccio." Aħna nirrappurtaw dik l-awtodeskrizzjoni bħala fatt osservabbli. L-imġiba nnifisha — ħruġ dirett għal IP pubbliku, qari reali tal-kredenzjali tal-IMDS, sejħiet reali ta' Secrets Manager — hija dak li hi irrispettivament mit-tikketta, u hija r-raġuni għaliex dawn il-verżjonijiet ġew ikklassifikati bħala malizzjużi.
Isem wieħed fil-grupp, coral-wraith, ma waqafx b'rilaxx wieħed. Irrepubblika f'suċċessjoni rapida permezz ta' għexieren ta' verżjonijiet fi ftit sigħat — 1.0.0 tixbit lejn 6.0.0 — u ġirja preċedenti bl-istess isem kienet użat minfuħa 9999.0.x numri tal-verżjoni, il-forma klassika ta' tentattiv ta' konfużjoni dwar id-dipendenzaMadwar dak it-taqlib, il-payload immatura b'mod viżibbli: minn beacon ta' enumerazzjoni tal-host ta' darba għal pern sħiħ tal-kredenzjali tal-AWS imgeżwer f'kontrolli ambjentali li jżommuh kwiet barra l-mira maħsuba tiegħu.
| Pakketti | 5 ismijiet; coral-wraith waħdu ppubblikat mill-ġdid f'għexieren ta' verżjonijiet |
| Ekosistema | npm |
| Installa l-vettur | postinstall skript taċ-ċiklu tal-ħajja |
| Mira primarja | Kredenzjali tar-rwol tal-AWS IAM + valuri sigrieti ta' Secrets Manager, varjabbli tal-ambjent, /app fajls |
| Esfil | webhook.site beacon + IP mhux ipproċessat C2 PUT |
| Bieb tal-attivazzjoni | Isem tal-host b'12-il eżagramma + /app/node_modules cwd, flimkien ma' kontroll tal-ambjent li jrażżan il-payload barra minn dak il-kuntest |
| Severità | għolja — żvelar ta' kredenzjali tal-cloud u sigrieti ġestiti minn ambjenti ta' bini u runtime f'kontenituri |
Anatomija tal-attakk
Kull pakkett fil-klaster huwa mibni bl-istess mod: kważi vojt index.js (modulu.esportazzjonijiet = {}), linja waħda package.json skript — "postinstall": "node postinstall.js" — u l-piż utli fi postinstall.jsL-installazzjoni tal-pakkett hija biżżejjed biex tħaddem il-hook; mhi meħtieġa l-ebda importazzjoni jew sejħa.
Il-bieb tal-immirar. Qabel ma tagħmel xi ħaġa, il-payload tal-ecto-family tiċċekkja l-inħawi ta' madwarha:
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 Isem ta' host ta' 12-il eżagramma huwa l-forma awtomatika li Docker jassenja lil kontenitur, u /app/node_modules hija mogħdija konvenzjonali ta' installazzjoni fil-kontenitur. It-tielet klawżola titneħħa jekk il-mogħdija tidher qisha direttorju ta' estrazzjoni sandboxed. L-effett nett huwa li l-payload tibqa' rieqda fuq laptop tal-iżviluppatur jew sandbox tal-analiżi u tiġi attivata biss ġewwa build jew runtime worker f'kontenitur — it-tip ta' ambjent li x'aktarx iġorr kredenzjali live cloud. L-aktar pakkett bikri fil-klaster, spettru tal-qroll, m'għandux bieb bħal dan u jmexxi l-ġbir (aktar sempliċi) tiegħu mingħajr kundizzjonijiet.
ġbirMeta l-bieb jgħaddi, il-ganċ joħroġ minn ġo fih execFileSync(“/bin/sh”, [“-c”, …]) u jħaddem kmand kompost wieħed li, fl-ordni li ġejja:
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) Il-passi 1–3 huma rkupru tal-IMDSv2 skont it-test: itlob token tas-sessjoni, imbagħad waħħalha bħala Token tal-metadejta X-aws-ec2 header biex jiġbed ir-rwol IAM tal-istanza u ċ-ċwievet ta' aċċess temporanji ta' dak ir-rwol. L-għażla li jiġi implimentat l-IMDSv2 minflok l-IMDSv1 mhux awtentikat aktar sempliċi IKOLLOK Ta' min jinnota dan — ifisser li l-payload jaħdem anke fuq istanzi kkonfigurati biex jeħtieġu aċċess għall-metadata bbażat fuq tokens, li huwa t-tisħiħ rakkomandat mill-AWS. Il-kredenzjali rritornati mill-pass 3 huma ta' żmien qasir AccessKeyId/SecretAccessKey/Token triples b'ambitu għar-rwol tal-istanza; dak kollu li jista' jagħmel dak ir-rwol, id-detentur ta' dawk iċ-ċwievet jista' jagħmlu għat-tul tal-ħajja tal-kredenzjali.
Il-passi 4–6 iwessgħu t-teħid. L- NS Id-dump jaqbad kull ħaġa li l-proċess tal-bini jew tar-runtime wiret — fil-prattika dan huwa fejn ħafna drabi jinsabu t-tokens tar-reġistru, il-kordi tal-konnessjoni tad-database, u ċ-ċwievet tal-API. /app il-mixja tal-fajls taqra sa ħmistax-il fajl tal-applikazzjoni barra node_modules, li jista' juri l-konfigurazzjoni tal-wiċċ, .a V fajls, jew sors. Sejħiet tal-Pass 6 lista tas-sigrieti tal-aws secretmanager fi tliet reġjuni; il-kredenzjali miġbuda fil-passi 1–3 huma eżattament dak li jawtentika dawk is-sejħiet, għalhekk il-qari tal-IMDS u l-enumerazzjoni tas-Secrets Manager jingħaqdu flimkien f'eskalazzjoni waħda: rwol tal-istanza → inventarju tas-sigriet immaniġġjat. Il-pass 7 huwa referenza għall-qafas tal-qbid tal-bandiera — meta HTB{…} Meta tinstab bandiera, tintbagħat waħedha, inkella l-blob mhux ipproċessat miġbur jinqasam f'erba' biċċiet u jintbagħat.
Verżjonijiet aktar tard fil-klaster ikomplu bl-eskalazzjoni. Minflok ma jieqfu f'inventarju, huma janalizzaw ir-rispons tal-IMDS, jesportaw iċ-ċwievet temporanji bħala AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN varjabbli tal-ambjent, ikkonferma l-identità b' aws sts get-caller-identity, u mbagħad iftaħ kull sigriet li jirritorna lista-sigrieti sejħa aws secretsmanager get-secret-value fuq kull wieħed — billi jirkupraw il-kontenut sigriet, mhux biss isimhom. L-istess verżjonijiet jaqraw ukoll binarji ta' bandiera sostitwiti mill-proċess (/aqra l-bandiera u ħbieb) u pprova ġirja ta' ħlas kontra kwalunkwe proġett Rust li jinstab taħt /app, u jwessgħu l-ħsad lil hinn mill-kredenzjali tas-sħab għal dak kollu li jesponi l-ambjent tal-bini.
Dawn il-verżjonijiet aktar reċenti jaċċessaw lilhom infushom b'mod aktar aggressiv. Minbarra l-isem tal-host ta' 12-il eżagramma u /app/node_modules kontrolli, il-payload jispezzjona l-konfigurazzjoni attiva tar-reġistru tal-pakketti u l-mogħdija tad-direttorju tax-xogħol u joħroġ fis-skiet meta jindikaw kuntest ta' analiżi jew mera minflok mira ħajja. L-effett ikkombinat huwa payload li ma jagħmel xejn osservabbli fil-biċċa l-kbira tal-ambjenti ta' spezzjoni u jħaddem il-kollezzjoni sħiħa tiegħu biss fejn jiġġudika lilu nnifsu li jinsab fuq host ġenwinament f'kontejners.
EsfiltrazzjoniId-dejta miġbura titlaq mill-host fuq żewġ kanali. L-ewwel, beacon POST għal fiss webhook.sit kollettur, li jġorr l-isem tal-host, l-UID numeriku, id-direttorju tax-xogħol, u sa 120 KB ta' dejta miġbura. It-tieni, id-dejta tintewa f'"manifest tal-modulu" YAML falz u PUT għal /api/moduli/ fuq server fil-mira:
ecto_module: name: "<flag-or-chunk-0>" version: "1.0.0" power_level: "<chunk-1>" ship_deck: "<chunk-2>" cargo_hold: "<chunk-3>" L-ismijiet tal-oqsma tal-manifest (livell_ta'_qawwa, gverta_tal-vapur, ħażna_tal-merkanzija) huma dekorazzjoni — id-dejta misruqa tirkeb ġewwa l-valuri tal-istring, u huwa għalhekk li monitor tan-netwerk jara dak li jidher qisu upload beninn tal-manifest tar-reġistru tal-pakketti aktar milli dump tad-dejta ovvju. Il-kanal tal-beacon iġorr aktar: il- POST ġisem biex webhook.sit jinkludi l-isem tal-host, l-UID numeriku, id-direttorju tax-xogħol, u sa 120 KB tal-blob miġbur, għalhekk anke beacon wieħed ta' suċċess jagħti r-riżultat sħiħ. webhook.sit huwa servizz ta' spezzjoni ta' talbiet bla ħlas; l-użu tiegħu bħala kollettur ifisser li l-operatur qatt ma jkollu għalfejn iwaqqaf l-infrastruttura ta' riċeviment tiegħu stess għal dak il-kanal, u t-talbiet irreġistrati jippersistu fil-bin tas-servizz.
Il-manifest PUT timxi fuq lista ta' riżerva li tibda b'diversi 127.0.0.1/localhost portijiet u mbagħad jaqa' għal tliet indirizzi pubbliċi fil-`154.57.164.0/24` firxa, u jieqaf fl-ewwel endpoint li jwieġeb bi status 2xx. L-ordni localhost-first hija konsistenti mad-deskrizzjoni personali "verdaccio testing" (reġistru lokali fuq loopback), iżda l-fallbacks public-IP ifissru li d-dejta titlaq mill-host kull meta l-loopback ma jkunx qed jisma' — jiġifieri, fuq kwalunkwe magna li mhijiex ir-rig tat-test tal-awtur stess.
Kronoloġija
Il-grupp juri tkabbir inkrementali tal-kapaċità aktar milli tnaqqis wieħed. Aħna nordnawh skont l-imġiba osservata, mhux skont l-arloġġ tal-ħajt tal-pubblikazzjoni:
| Traineeship | Pakketti / Verżjonijiet | Behavior |
|---|---|---|
| Ġirja bikrija | coral-wraith 9999.0.x | Numri ta' verżjoni minfuħin konsistenti ma' tentattiv ta' konfużjoni ta' dipendenza; enumerazzjoni fil-ħin tal-installazzjoni u exfil |
| Żerriegħa | coral-wraith 1.0.0 | postinstall jiġbor fajls id/env/flag; PUT wieħed għal 154[.]57[.]164[.]71:30782, markatur ECT-472839 |
| Iterazzjoni rapida | coral-wraith 1.0.1 → 6.0.0 | Għexieren ta’ rilaxxi f’sigħat; it-tagħbija utli tikseb il- isAppWorker() bieb, ġibda tal-kredenzjali tal-IMDSv2, il-verżjoni sħiħa get-secret-value pivot, il-verifika tal-ambjent tar-reġistru/mogħdija, u markaturi doppji tas-sink |
| Ismijiet paralleli | ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 | L-istess tagħbija b'gate; webhook.site lista ta' beacons u fallbacks b'ħafna endpoints |
| Varjanti | ecto-rust-read-f3a9c1 1.0.1–1.0.2 | Iżżid markaturi żejda tas-sink ECT-987654, ECT-654321, ECT-839201 |
| Varjanti | ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 | L-istess tagħbija b'gate, l-istess C2 u beacon |
Il-karatteristika li tiddefinixxi l-grupp hija l-kadenza tal-pubblikazzjoni tiegħu: minflok pakkett wieħed u verżjoni waħda, l-istess isem jiġi ppubblikat mill-ġdid darba wara l-oħra f'suċċessjoni rapida, kull rilaxx varjazzjoni żgħira fuq l-aħħar wieħed, flimkien ma' numru żgħir ta' aħwa b'ismijiet differenti li jġorru l-istess tagħbija. Fi ħdan il- whisper familja l-kodiċi jinqasam f'żewġ marki tas-swaba' qrib xulxin — sett wieħed li jattiva żewġ ditekzzjonijiet kritiċi, ieħor tlieta (sink addizzjonali għall-qari tal-fajl) — iżda t-tnejn jirriżolvu għall-istess payload; id-differenza hija d-drift tal-kodiċi, mhux furketta tal-imġieba. Verżjonijiet ta' whisper lil hinn mill-medda analizzata (sa mill-inqas 1.0.25 fil-ħin tal-kitba) ġew osservati live fuq ir-reġistru, u l- spettru tal-qroll L-isem kompla jitla’ s-sellum tal-verżjoni tiegħu stess fuq l-istess tieqa.
Indikaturi ta' kompromess
L-indikaturi kollha hawn taħt ġew estratti mis-sors tal-pakkett fuq id-diska. L-indikaturi tan-netwerk huma mneħħija mill-modalità.
Netwerk
| Indikatur | Rwol |
|---|---|
hxxp://154[.]57[.]164[.]71:30782 | Mira C2 PUT (coral-wraith) |
hxxp://154[.]57[.]164[.]80:30543 | C2 PUT ta' riserva (ecto-*) |
hxxp://154[.]57[.]164[.]82:31250 | C2 PUT ta' riserva (ecto-*) |
hxxp://154[.]57[.]164[.]71:31289 | C2 PUT ta' riserva (ecto-*) |
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 | Kollettur tal-beacons |
169[.]254[.]169[.]254/latest/... | Qari tal-kredenzjali tal-IMDSv2 (min-naħa tal-mira, metadata tal-AWS) |
Komportamentali/fajl
| Indikatur | Rwol |
|---|---|
"postinstall": "node postinstall.js" | Installa l-vettur |
ecto_module: YAML bi power_level / ship_deck / cargo_hold ċwievet | Skema tal-manifest Exfil |
Markaturi tas-sink ECT-472839, ECT-987654, ECT-654321, ECT-839201 | Segment tal-mogħdija C2 /api/modules/<marker> |
isAppWorker() bieb: ospitanti /^[0-9a-f]{12}$/, is-cwd fih /app/node_modules | Kundizzjoni ta' attivazzjoni |
aws secretsmanager list-secrets fuq us-east-1, eu-west-1, eu-central-1 | Enumerazzjoni tas-sigrieti |
HTB{...} skrappjar tar-regex | Ħsad tal-qbid tal-bandiera |
Hashes tal-fajls (sha256, maqbuda fil-ħin tal-analiżi)
| File | sha256 |
|---|---|
coral-wraith/postinstall.js | ce5ff035cfdfed1d0015446424b352c27b66bcb77e9fdb0a51e4245199146824 |
ecto-corsair-whisper-6f3b9 1.0.18/postinstall.js | b58432acba376aa6976f0490d9a1c04257ccdbc856d8390260c50322d63e31c3 |
Attribuzzjoni u mġiba osservata
Il-ħames ismijiet tal-pakketti ġew ippubblikati taħt żewġ handles tal-kont npm, iżda jaqsmu biżżejjed infrastruttura biex jittrattawhom bħala cluster wieħed: l-istess ecto_module skema manifesta, l-istess ECT-472839 markatur tas-sink primarju, l-istess webhook.sit ID tal-kollettur, u endpoints C2 fl-istess Blokk 154.57.164.0/24`. Il-pakkett taż-żerriegħa (`qroll-wraith, aktar sempliċi u mingħajr gated) u l-ekto-familja b'gated għalhekk tinqara' bħala iterazzjonijiet fuq toolkit waħda aktar milli sforzi indipendenti.
Il-pakketti jiddeskrivu lilhom infushom, f'verżjonijiet aktar tard, bħala "Tagħbija CTF għall-ittestjar tal-katina tal-provvista ta' verdaccio." Aħna npoġġu dik it-tikketta fuq il-wiċċ bħala fatt osservabbli u ma niddikjarawhiex mill-ġdid bħala sejba dwar l-iskop. Dak li jagħmel il-kodiċi huwa ċar u indipendenti minn kif huwa ttikkettat: jaqra l-kredenzjali tar-rwol tal-IAM mis-servizz tal-metadata tal-istanza, jelenka s-sigrieti ġestiti fi tliet reġjuni tal-AWS, u jittrażmetti r-riżultati lil IP pubbliku u kollettur tal-webhook ta' parti terza. Test harness ġenwinament ta' loopback biss ma jkollux bżonn il-lista ta' fallback tal-IP pubbliku, il-qari tal-kredenzjali tal-IMDS, jew is-sejħiet ta' Secrets Manager bejn ir-reġjuni. Minħabba li l-ħruġ u l-firxa tal-kredenzjali huma reali, il-verżjonijiet gated ġew ikklassifikati bħala malizzjużi.
Il-bieb tal-kontejners biss huwa l-aktar karatteristika notevoli operazzjonalment. Huwa kemm miżura ta' evażjoni — li tibqa' sieket fuq laptops u f'sandboxes tal-analiżi — kif ukoll miżura ta' mira, li tispara biss fejn rwol IAM reali u sigrieti ħajjin x'aktarx ikunu preżenti. L-analisti li jħaddmu dawn il-pakketti f'sandbox ġeneriku ma josservaw xejn; l-imġiba timmanifesta ruħha biss taħt isem ta' host stil Docker u mogħdija ta' installazzjoni fil-kontejner.
Impatt, xejriet u gwida għad-difensuri
L-espożizzjoni hawnhekk hija l-kredenzjali tal-cloud u l-iżvelar tas-sigrieti ġewwa l-kontenituri tal-bini u tar-runtime. Kredenzjali ta' rwol IAM miġbuda mill-IMDS iġġorr kwalunkwe permess li jkollu dak ir-rwol; maniġer tas-sigrieti: Lista tas-Sigrieti (u kwalunkwe segwitu IksebValurSigriet) iwessa' dan għal sigrieti tal-applikazzjoni maħżuna. Id-dumps varjabbli tal-ambjent spiss iġorru tokens tar-reġistru, URLs tad-database, u ċwievet tal-API. F'kuntest ta' CI jew kontenitur — eżattament dak li jagħżel il-bieb — installazzjoni tranżittiva waħda ta' wieħed minn dawn il-pakketti hija biżżejjed biex tnixxi dak il-materjal.
Ectoplasm jaqbel ma' mudell li nkomplu naraw: payloads fil-ħin tal-installazzjoni li jilħqu l-metadata tas-sħab u s-sigrieti ġestiti minflok il-fajls lokali, u li jinteraġixxu waħedhom biex jattivaw biss f'ambjenti ta' valur għoli. Wara dan, żewġ osservazzjonijiet difensivi.
- Il-forma hija skoperta. Ganċ ta' installazzjoni npm/PyPI li l-grafu tas-sejħiet tiegħu jilħaq kemm API tas-sigrieti tal-cloud (maniġer tas-sigrieti tal-aws, sigrieti tal-gcloud, az keyvault) jew l-indirizz tal-IMDS u sink tal-ħruġ tan-netwerk huwa mudell dejjaq u ta' sinjal għoli — kważi qatt ma jseħħ fi skript leġittimu taċ-ċiklu tal-ħajja. Analiżi tal-fluss statiku tista' timmarkaha mingħajr ma tiddependi fuq xi dominju jew IP speċifiku.
- It-twebbis tal-ambjent itaffih. L-infurzar tal-IMDSv2 b'limitu ta' hop ta' 1 jipprevjeni li t-tagħbijiet tax-xogħol tal-kontejners jilħqu l-metadata tal-istanza; l-ambitu tar-rwoli tal-IAM għall-inqas privileġġ jillimita r-raġġ tal-blast ta' kwalunkwe kredenzjali li tnixxi; u t-tħaddim ta' installazzjonijiet b' –jinjora-skripts fis-CI tneħħi l-vettur install-hook għalkollox għall-pakketti li ma jeħtiġuhx.
Għad-difensuri, il-verifiki prattiċi huma: twissija dwar konnessjonijiet ħerġin minn kontejners tal-bini/CI għal IPs pubbliċi mhux elenkati waqt npm jinstallaw; oqgħod attent għall-aċċess tal-IMDS li joriġina minn skripts taċ-ċiklu tal-ħajja tal-pakkett; u ttratta kwalunkwe hook tal-installazzjoni li jintbagħat lil cloud CLI bħala suspettuż sakemm jiġi ppruvat mod ieħor.
Żewġ noti oħra speċifiċi għal dan il-klaster. L-ewwel, minħabba li l-attivazzjoni hija limitata għal ambjenti kontejnerizzati, pakkett li jidher inert meta jiġi vverifikat fuq workstation jista' xorta jkun ħaj fil-produzzjoni — il-verifika teħtieġ li tirriproduċi l-isem tal-host tal-kontejner u l-kundizzjonijiet tal-mogħdija, jew taqra s-sors direttament, aktar milli tiddependi fuq "Installajtu u ma ġara xejn." It-tieni, l-użu ta' servizz pubbliku ta' spezzjoni tat-talbiet bħala kollettur tal-beacons ifisser li parti mid-dejta esfiltrata tista' tkun irkuprabbli għal rispons għall-inċidenti: organizzazzjoni li ssib wieħed minn dawn il-pakketti fis-siġra tad-dipendenza tagħha tista' tirraġuna dwar x'kien ikun fih beacon ta' suċċess mil-loġika tal-ġbir tal-payload, u għandha ddawwar kwalunkwe kredenzjali tar-rwol tal-IAM, tokens tar-reġistru, u sigrieti ġestiti li kienu aċċessibbli mill-ambjent tal-bini jew tar-runtime affettwat. Rotazzjoni tal-kredenzjali, mhux it-tneħħija tal-pakkett, hija r-rimedju operattiv ladarba tkun ħadmet installazzjoni.





