TL; DR
Komek ji pênc pakêtên npm, li ser du destên hesaban hate weşandin, şandiye postinstall çengelek ku nasnameyên ewr ji mêvandar dixwîne û wan ji qutiyê dişîne. Pakêt navên giyan û korsanan hildigirin - coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit - û her tiştê ku ew berhev dikin wekî sexteyekê rêz dikin ecto_module: Beriya şandina wê, manîfestoya YAML-ê nîşan dide. Em komê wekî dişopînin ektoplazma.
Barkêş tenê dema ku hawîrdorek taybetî tesbît dike dixebite: mêvandarek ku navê wî/wê rêza heksadeşî ya 12-karakterî û navnîşek xebatê di bin de /app/node_modules — şiklê avahiyek konteynerkirî an karkerê CI. Dema ku ew derî derbas dibe, çengel lêpirsînê dike Xizmeta metadataya mînaka AWS (IMDSv2) ji bo bawernameyên rola IAM, hejmartin dike Rêveberê Secrets AWS li ser sê herêman, guhêrbarên jîngehê datîne, pelên di bin de dixwîne /app, û li rêzikên girtina-ala-digere. Dûv re ew encamê bi du awayan derdixe: ji fenerê ber bi webhook.site berhevkar û PUT-ek manîfestoyê ji bo xala dawî ya IP-ya xav, bi lîsteyek ji vebijarkên paşîn ên localhost-pêşîn.
Danasînên pakêtên paşîn "Barkêşa CTF ji bo ceribandina zincîra dabînkirinê ya verdaccio" dixwînin. Em wê danasîna xwe wekî rastiyek çavdêrîkirî radigihînin. Reftar bi xwe - derketina zindî bo IP-yek giştî, xwendina bawernameyên rastîn ên IMDS, gazîkirinên rastîn ên Secrets Manager - bêyî ku etîket çi be ew e, û sedema ku ev guhertoyên wekî zirardar hatine dabeş kirin e.
Yek nav di komê de, coral-wraith, bi yek weşanê jî ranewestiya. Di nav çend demjimêran de bi lez û bez bi dehan guhertoyên cuda ji nû ve hate weşandin — 1.0.0 hilkişîna ber bi 6.0.0 - û rêzeyeke berê ya bi heman navî ya tepeserkirî bi kar anîbû 9999.0.x hejmarên guhertoyê, şiklê klasîk ê a hewldana tevliheviya girêdayîbûnêLi seranserê wê churnê, barkêş bi awayekî berbiçav gihîşt: ji nîşanek hejmartina mêvandar a yek-guleyî veguherî guhertoyek pejirandî ya AWS-ê ya tevahî ku di kontrolên jîngehê de pêçayî ye ku wê li derveyî hedefa xwe ya armanckirî bêdeng dihêle.
| pakêtên | 5 nav; coral-wraith bi tenê di dehan guhertoyan de ji nû ve hatiye weşandin |
| Ecosystem | npm |
| Vektor saz bike | postinstall senaryoya çerxa jiyanê |
| Armanca bingehîn | Bawernameyên rola AWS IAM + Nirxên veşartî yên Rêvebirê Veşartî, guhêrbarên jîngehê, /app files |
| Exfil | webhook.site îşaret + xav-IP C2 PUT |
| Deriyê tetikê | Navê mêvandarê 12-heksasî + /app/node_modules cwd, û her weha kontrolkirina jîngehê ku barkêşiya li derveyî wê çarçoveyê tepeser dike. |
| Severe | bilind — bawernameya ewr û eşkerekirina nehêniya birêvebirî ji avakirin û jîngehên xebitandinê yên konteynerkirî |
Anatomiya êrîşê
Her pakêtek di klusterê de bi heman awayî hatiye çêkirin: pakêtek hema hema vala index.js (module.exports = {}), rêzek yekane pakêt.json senaryo — "postinstall": "girêka postinstall.js" - û barkêşiya di nav de postinstall.jsSazkirina pakêtê ji bo xebitandina hookê bes e; pêdivî bi importkirin an gazîkirinê nîne.
Deriyê hedefgirtinê. Berî ku tiştekî bike, barkêşa malbata ekto derdora xwe kontrol dike:
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 Navekî mêvandar ê 12-heksasî şiklê xwerû ye ku Docker dide konteynerekê, û /app/node_modules rêyeke sazkirinê ya di konteynerê de ya kevneşopî ye. Bendê sêyemîn ji kar derdikeve ger rê dişibihe peldankek derxistinê ya sandboxkirî. Bandora netîce ew e ku barkêş li ser laptopek pêşdebir an sandboxek analîzê bêçalak dimîne û tenê di hundurê avahiyek konteynirkirî an xebatkarek runtime de çalak dibe - celebê jîngehê ku bi îhtîmaleke mezin pêbaweriyên ewr ên zindî hildigire. Pakêta herî zû di klusterê de, cinawirê koral, derîyek wisa tune ye û berhevoka xwe ya (hêsantir) bê şert û merc dimeşîne.
BerhevkirîDema derî derbas dibe, çengel ji hundir derdikeve. execFileSync("/bin/sh", ["-c", ...]) û fermanek yekane ya pêkhatî dimeşîne ku, bi rêzê:
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) Gavên 1–3 vegerandina pirtûkek dersê ya IMDSv2 ne: daxwaza nîşanek danişînê bikin, dûv re wê wekî ve girêdin. nîşana-metadata-ya-X-aws-ec2 sernivîsa ji bo kişandina rola IAM ya mînakê û mifteyên gihîştina demkî ya wê rolê. Hilbijartina bicîhanîna IMDSv2 li şûna IMDSv1-a hêsantir a bê pejirandin STENDIN hêjayî gotinê ye - ev tê vê wateyê ku barkêş tewra li ser mînakên ku ji bo gihîştina metadata-ya li ser bingeha nîşanekan hewce ne jî dixebite, ku ev hişkkirina pêşniyarkirî ya AWS ye. Agahdariyên ku ji hêla gava 3-an ve têne vegerandin demkurt in. AccessKeyId/SecretAccessKey/Token sêqat li gorî rola mînakê hatine xêzkirin; çi ku ew rol dikare bike, xwediyê wan mifteyan dikare di tevahiya jiyana bawernameyê de bike.
Gavên 4-6 mijarê firehtir dikin. şandin dump her tiştê ku pêvajoya avakirinê an jî pêvajoya xebitandinê mîras girtiye digire - di pratîkê de ev der e ku nîşanekên qeydê, rêzikên girêdana databasa û mifteyên API-yê pir caran lê dimînin. /app file walk heta panzdeh pelên serîlêdanê li derve dixwîne node_modules, ku dikare konfigurasyona rûberê, .a V pelan, an çavkanî. Gava 6 bang dike lîsteya sirên rêveberê razên aws li sê herêman; bawernameyên ku di gavên 1-3 de hatine kişandin tam ew in ku wan bangan rast dikin, ji ber vê yekê xwendina IMDS û zincîra hejmartina Secrets Manager di yek zêdebûnê de têne hev: rola mînakê → envantera veşartî ya birêvebirî. Gava 7 sernavek ji bo çarçoveya girtina alayê ye - dema ku HTB{…} Eger al bê dîtin, ew bi tena serê xwe tê şandin, wekî din bloba xav a berhevkirî tê çar parçekirin û tê şandin.
Guhertoyên paşîn ên di klusterê de zêdekirinê bêtir didomînin. Li şûna ku li ser envanterekê rawestin, ew bersiva IMDS-ê analîz dikin, mifteyên demkî wekî AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN guhêrbarên jîngehê, nasnameyê bi piştrast bikin aws sts nasnameya-gazker-bistîne, û dûv re her razên ku ji hêla ve hatine vegerandin bizivirînin lîsteyên-razan bang rêveberê-secrets-ên aws nirxa-secret-ê bistîne li ser her yekê - naveroka veşartî vedigerîne, ne tenê navên wan. Heman guhertoyên din jî pelên dualî yên alên ku bi pêvajoyê hatine guhertin dixwînin (/readflag û hevalên) û hewl bidin şarj direve li dijî her projeya Rust-ê ku di bin de tê dîtin /app, berfirehkirina berhevkirinê ji nasnameyên ewr wêdetir ber bi her tiştê ku hawîrdora avakirinê eşkere dike.
Ev guhertoyên paşîn jî xwe bi awayekî êrîşkartir digirin. Ji bilî navê mêvandarê 12-hex û /app/node_modules kontrol dike, barkêş mîhenga pakêta-qeyda çalak û rêya pelrêça xebatê vedikole û dema ku ew analîzek an jî çarçoveyek neynikê nîşan didin ne ku hedefek zindî, bêdeng derdikeve. Bandora hevbeş barkêşek e ku di piraniya jîngehên vekolandinê de tiştek nayê dîtin û berhevoka xwe ya tevahî tenê li cihê ku ew xwe li ser mêvandarek konteynirî ya rastîn dimeşîne.
ExfiltrationAgahiyên berhevkirî mêvandar li ser du kanalan dihêle. Pêşî, fenerêk KOZ ji bo sabît webhook.site berhevkar, ku navê mêvandar, UID-ya hejmarî, navnîşana xebatê, û heta 120 KB daneyên berhevkirî hildigire. Ya duyemîn, daneyên di "manîfestoya modulê" ya YAML-ya sexte de têne pêçandin û pût ber /api/modul/ li ser serverek hedef:
ecto_module: name: "<flag-or-chunk-0>" version: "1.0.0" power_level: "<chunk-1>" ship_deck: "<chunk-2>" cargo_hold: "<chunk-3>" Navên qadên manîfestoyê (asta_hêzê, qata_keştiyê, bargiran) xemilandin in - daneyên dizî di nav nirxên rêzikê de siwar dibin, ji ber vê yekê çavdêrek torê tiştek dibîne ku dişibihe barkirinek manîfestoya pakêt-qeyda bêkêr, ne ku dişibihe depoyek daneya eşkere. Kanala beacon bêtir hildigire: KOZ laş to webhook.site navê mêvandar, UID-ya hejmarî, peldanka xebatê, û heta 120 KB ji bloba berhevkirî vedihewîne, ji ber vê yekê tewra beacon-ek serketî jî tevahiya encamê dide. webhook.site xizmeteke belaş a vekolîna daxwazan e; bikaranîna wê wekî berhevkar tê vê wateyê ku operator qet neçar nîne ku ji bo wê kanalê binesaziya xwe werbigire, û daxwazên tomarkirî di qutiya xizmetê de dimînin.
Manîfesto pût lîsteyek paşveger dimeşe ku bi çend tiştan dest pê dike 127.0.0.1/localhost portan û dûv re di nav sê navnîşanên giştî de dikeve `154.57.164.0/24` rêzê, li xala dawî ya yekem ku bi statuya 2xx bersiv dide raweste. Rêzkirina localhost-first lihevhatî ye bi xwe-danasîna "verdaccio testing" (qeydeke herêmî li ser loopback), lê paşvegerên IP-ya giştî tê vê wateyê ku daneyên ji mêvandar derdikevin her gava loopback guhdarî nake - ango, li ser her makîneyek ku ne alavên ceribandinê yên nivîskar bi xwe ye.
Timeline
Komedî mezinbûna şiyanê ya gav bi gav nîşan dide, ne ku yek daketinek. Em wê li gorî tevgerên çavdêrîkirî rêz dikin, ne li gorî weşana demjimêra dîwar:
| Şanocî | Pakêt / Versiyon | Xwenîşandinî |
|---|---|---|
| Bezîna zû | coral-wraith 9999.0.x | Hejmarên guhertoyên zêdekirî li gorî hewldanek tevliheviya girêdayîbûnê ne; hejmartina dema sazkirinê û exfil |
| Toxim | coral-wraith 1.0.0 | postinstall pelên id/env/flag berhev dike; PUT-ya yekane bo 154[.]57[.]164[.]71:30782, nîşanker ECT-472839 |
| Dubarekirina bilez | coral-wraith 1.0.1 → 6.0.0 | Bi dehan berdan di çend demjimêran de; barkêşî zêde dibe isAppWorker() derî, kişandina bawernameya IMDSv2, tevahî get-secret-value pivot, kontrolkirina jîngeha qeyd/rê, û nîşankerên dual sink |
| Navên paralel | ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 | Eynî barkêşiya derîkirî; webhook.site lîsteya paşvegerê ya beacon û pir-xalên dawîn |
| Guhertoyên | ecto-rust-read-f3a9c1 1.0.1–1.0.2 | Nîşaneyên lavaboyê yên zêde lê zêde dike ECT-987654, ECT-654321, ECT-839201 |
| Guhertoyên | ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 | Eynî barkêşiya derîkirî, heman C2 û fenerê |
Taybetmendiya diyarker a vê komê rêjeya weşanê ye: li şûna yek pakêt û yek guhertoyê, heman nav bi lez û bez dubare û dubare tê weşandin, her yek guhertoyek piçûk a ya paşîn derdixe, digel çend xwişk û birayên bi navên cuda yên ku heman bar hildigirin. pispisî malbatê kod li du şopa tiliyên nêzîk dabeş dibe - komek du tespîtên krîtîk çalak dike, komek din sê (danûstandinek pelê ya din) - lê her du jî li ser heman barkêşiyê çareser dibin; cûdahî guheztina kodê ye, ne forkek tevgerî ye. Versiyonên pispisî ji rêza analîzkirî wêdetir (heta herî kêm 1.0.25 di dema nivîsandinê de) li ser qeydê zindî hatin dîtin, û cinawirê koral nav li ser heman pencereyê berdewam kir ku li ser rêza guhertoya xwe hilkişe.
Nîşaneyên lihevhatinê
Hemû nîşaneyên li jêr ji çavkaniya pakêtê ya li ser dîskê hatine derxistin. Nîşaneyên torê hatine defangkirin.
Têkelî
| indicator | Role |
|---|---|
hxxp://154[.]57[.]164[.]71:30782 | Hedefa PUT a C2 (coral-wraith) |
hxxp://154[.]57[.]164[.]80:30543 | Vegera C2 PUT (ecto-*) |
hxxp://154[.]57[.]164[.]82:31250 | Vegera C2 PUT (ecto-*) |
hxxp://154[.]57[.]164[.]71:31289 | Vegera C2 PUT (ecto-*) |
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 | Berhevkarê Beaconan |
169[.]254[.]169[.]254/latest/... | Xwendina bawernameya IMDSv2 (aliyê hedef, metadata AWS) |
Reftarî/pel
| indicator | Role |
|---|---|
"postinstall": "node postinstall.js" | Vektor saz bike |
ecto_module: YAML bi power_level / ship_deck / cargo_hold keys | Şêmaya manîfestoya Exfil |
Nîşankerên lavaboyê ECT-472839, ECT-987654, ECT-654321, ECT-839201 | Beşa rêya C2 /api/modules/<marker> |
isAppWorker() derî: mêvandar /^[0-9a-f]{12}$/, cwd dihewîne /app/node_modules | Mercê çalakkirinê |
aws secretsmanager list-secrets ser us-east-1, eu-west-1, eu-central-1 | Jimartina razên |
HTB{...} xêzkirina regex | Berhevkirina alayê |
Haşeyên pelan (sha256, di dema analîzê de hatine girtin)
| Wêne | sha256 |
|---|---|
coral-wraith/postinstall.js | ce5ff035cfdfed1d0015446424b352c27b66bcb77e9fdb0a51e4245199146824 |
ecto-corsair-whisper-6f3b9 1.0.18/postinstall.js | b58432acba376aa6976f0490d9a1c04257ccdbc856d8390260c50322d63e31c3 |
Vegotin û tevgera çavdêrîkirî
Pênc navên pakêtan di bin du destên hesabên npm de hatin weşandin, lê ew binesaziyek têr parve dikin da ku wan wekî yek kom bihesibînin: heman modula_ekto şema eşkere, heman ECT-472839 nîşana lavaboya sereke, heman webhook.site Nasnameya berhevkar, û xalên dawî yên C2 di heman demê de Bloka 154.57.164.0/24`. Pakêta tovê (`coral-wraith, hêsantir û bêdestûr) û malbata ekto ya dergehkirî ji ber vê yekê wekî dubarekirinên li ser yek amûrê têne xwendin, ne wekî hewildanên serbixwe.
Pakêt, di guhertoyên paşîn de, xwe wekî "Barkêşiya CTF ji bo ceribandina zincîra dabînkirinê ya verdaccio." Em wê etîketê wekî rastiyek çavdêrîkirî derdixin holê û wekî dîtinek li ser armancê ji nû ve nabêjin. Tiştê ku kod dike nezelal e û serbixwe ye ji ka ew çawa tê etîketkirin: ew bawernameyên rola IAM ji karûbarê metadataya mînakê dixwîne, razên birêvebirî li ser sê herêmên AWS-ê navnîş dike, û encaman ji IP-yek giştî û berhevkarek webhook-a sêyemîn re dişîne. Têlek ceribandinê ya bi rastî tenê-loopback dê hewceyê navnîşa paşvekişandina IP-ya giştî, xwendinên bawernameyên IMDS, an bangên Rêvebirê Veşartiyên Herêmê nebe. Ji ber ku gihîştina derketin û bawernameyê rast in, guhertoyên dergehkirî wekî zirardar hatin dabeş kirin.
Deriyê tenê-konteynir taybetmendiya herî berbiçav a operasyonel e. Ew hem tedbîrek dûrketinê ye - li ser laptopan û di sandboxên analîzê de bêdeng bimînin - û hem jî tedbîrek hedefgirtinê ye, tenê li cihê ku rolek IAM-a rastîn û razên zindî bi îhtîmaleke mezin hene tê çalakkirin. Analîstên ku van pakêtan di sandboxek gelemperî de dimeşînin dê tiştek nebînin; tevger tenê di bin navek mêvandar a şêwaza Docker û rêyek sazkirinê ya di konteynerê de xuya dibe.
Bandor, meyl û rêbername ji bo parêzvanan
Ev eşkerekirin li vir bawernameyên ewr û eşkerekirina veşartî di hundirê konteynerên avakirin û xebitandinê de ye. Bawernameyeke rola IAM-ê ya ji IMDS-ê hatî kişandin her destûrên ku ew rol digire dihewîne; rêveberê razên:LîsteyaZehran (û her şopandinek GetSecretValue) wê berfireh dike bo sirên sepanên hilanînê. Dumpên guhêrbar ên jîngehê pir caran nîşanên qeydkirinê, URL-yên databasê, û mifteyên API-yê hildigirin. Di çarçoveyek CI an konteynerê de - tam tiştê ku derî ji bo wê hildibijêre - sazkirinek yekane ya veguhêzbar a yek ji van pakêtan bes e ku ew materyal biherike.
Ectoplasm li gorî qalibek e ku em hîn jî dibînin: barên dema sazkirinê yên ku li şûna pelên herêmî, digihîjin metadata ewr û razên birêvebirî, û ku tenê di hawîrdorên bi nirxek bilind de xwe vedikin. Du çavdêriyên parastinê li jêr têne.
- Şêwe tê dîtinÇengek sazkirinê ya npm/PyPI ku grafîka banga wê digihîje hem API-ya veşartî ya ewr (rêveberê razên aws, razên gcloud, az keyvault) an navnîşana IMDS û sînyala derketinê ya torê qalibek teng û bi sînyala bilind e - ew hema hema qet di skriptek çerxa jiyanê ya rewa de çênabe. Analîza herikîna statîk dikare bêyî ku bi domain an IP-ya taybetî ve girêdayî be, wê nîşan bide.
- Binpêbûna jîngehê wê bêhiş dike. Bicîhanîna IMDSv2 bi sînorek bazdanê ya 1 rê li ber karên konteyneran digire ku bigihîjin metadata nimûneyê; çarçoveya rolên IAM-ê bi îmtiyaza herî kêm radiusa teqîna her bawernameyek ku diherike sînordar dike; û sazkirinan bi xebitandina -negirin-skrîptan di CI de vektora install-hook bi tevahî ji bo pakêtên ku ne hewce ne radike.
Ji bo parêzvanan, kontrolên pratîkî ev in: hişyarî li ser girêdanên derketinê ji konteynerên build/CI ber bi IP-yên giştî yên ne-destûrkirî di dema npm saz kirin; li gihîştina IMDS-ê ya ku ji skrîptên çerxa jiyana pakêtê derdikeve, temaşe bikin; û heya ku berevajî vê neyê îspatkirin, her çengela sazkirinê ya ku ji CLI-ya ewr re derbas dibe wekî gumanbar bihesibînin.
Du notên din ên taybetî ji bo vê komê. Ya yekem, ji ber ku aktîvasyon ji bo jîngehên konteynerkirî ve girêdayî ye, pakêtek ku dema li ser stasyonek xebatê tê kontrolkirin bêbandor xuya dike hîn jî dikare di hilberînê de zindî be - kontrolkirin hewce dike ku şert û mercên navê mêvandar û rêça konteynerê ji nû ve hilberîne, an jî çavkaniyê rasterast bixwîne, li şûna ku bi "Min ew saz kir û tiştek çênebû" ve girêdayî be. Ya duyemîn, karanîna karûbarek vekolîna daxwaza giştî wekî berhevkarê beacon tê vê wateyê ku hin daneyên derxistinê dikarin ji bo bersiva bûyerê werin vegerandin: rêxistinek ku yek ji van pakêtan di dara xwe ya girêdayîbûnê de dibîne dikare li ser tiştê ku beaconek serketî dê ji mantiqa berhevkirina barkêşiyê hebe bifikire, û divê her bawernameyên rola IAM, nîşaneyên qeydkirinê, û razên birêvebirî yên ku ji avahiya bandorkirî an jîngeha xebitandinê gihîştinê bûn bizivirîne. Rotasyona bawernameyê, ne rakirina pakêtê, çareserîya operasyonel e piştî ku sazkirinek qediya.





