TL; កុង
ចង្កោមមួយនៃ កញ្ចប់ npm ប្រាំបានបោះពុម្ពផ្សាយនៅទូទាំងចំណុចទាញគណនីពីរ បានដឹកជញ្ជូន postinstall hook ដែលអានព័ត៌មានសម្ងាត់លើ cloud ពីម៉ាស៊ីន ហើយបញ្ជូនវាចេញពីប្រអប់។ កញ្ចប់ទាំងនេះមានឈ្មោះ ghost-and-pirate — coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — ហើយធ្វើស៊េរីអ្វីដែលពួកគេប្រមូលបានទៅជារបស់ក្លែងក្លាយ ecto_module: YAML បង្ហាញមុនពេលបញ្ជូនវា។ យើងតាមដានចង្កោមជា អេកូផ្លាស្មា.
payload ដំណើរការតែនៅពេលដែលវារកឃើញបរិស្ថានជាក់លាក់មួយ៖ ម៉ាស៊ីនដែលឈ្មោះរបស់វាជា ខ្សែអក្សរគោលដប់ប្រាំមួយចំនួន ១២ តួអក្សរ និងថតឯកសារការងារនៅក្រោម /app/node_modules — រូបរាងរបស់កម្មករសំណង់កុងតឺន័រ ឬកម្មករ CI។ នៅពេលដែលច្រកទ្វារនោះឆ្លងកាត់ ទំពក់នឹងសួរ សេវាកម្មទិន្នន័យមេតាឧទាហរណ៍ AWS (IMDSv2) សម្រាប់លិខិតសម្គាល់តួនាទី IAM សូមរាប់បញ្ចូល អ្នកគ្រប់គ្រងអាថ៌កំបាំងអេ។ អេស។ អេ ឆ្លងកាត់តំបន់ទាំងបី បោះចោលអថេរបរិស្ថាន អានឯកសារនៅក្រោម /appនិងការកោសសម្រាប់ខ្សែអក្សរចាប់យកទង់ជាតិ។ បន្ទាប់មកវាច្រោះលទ្ធផលតាមវិធីពីរយ៉ាង៖ ពីសញ្ញាទៅកាន់ webhook.site collector និង manifest PUT ទៅកាន់ចំណុចបញ្ចប់ raw-IP ជាមួយនឹងបញ្ជីនៃ fallbacks localhost-first។
ការពិពណ៌នាអំពីកញ្ចប់នៅពេលក្រោយអានថា "CTF payload សម្រាប់ការធ្វើតេស្តខ្សែសង្វាក់ផ្គត់ផ្គង់ verdaccio"។ យើងរាយការណ៍ពីការពិពណ៌នាខ្លួនឯងថាជាការពិតដែលអាចសង្កេតឃើញ។ ឥរិយាបថខ្លួនវាផ្ទាល់ — ការចេញទៅក្រៅផ្ទាល់ទៅកាន់ IP សាធារណៈ ការអានព័ត៌មានសម្គាល់ IMDS ពិតប្រាកដ ការហៅ Secrets Manager ពិតប្រាកដ — គឺជាអ្វីដែលវាមានដោយមិនគិតពីស្លាកនោះទេ ហើយវាជាហេតុផលដែលកំណែទាំងនេះត្រូវបានចាត់ថ្នាក់ថាជាមេរោគព្យាបាទ។
ឈ្មោះមួយនៅក្នុងចង្កោម, coral-wraithមិនបានឈប់ត្រឹមការចេញផ្សាយតែមួយទេ។ វាត្រូវបានបោះពុម្ពផ្សាយឡើងវិញជាបន្តបន្ទាប់តាមរយៈកំណែរាប់សិបក្នុងរយៈពេលតែប៉ុន្មានម៉ោងប៉ុណ្ណោះ — 1.0.0 ឡើងដល់ 6.0.0 — ហើយការរត់មុនដែលមានឈ្មោះដូចគ្នាបានប្រើ inflated 9999.0.x លេខកំណែ រូបរាងបុរាណរបស់ ការប៉ុនប៉ងច្រឡំភាពអាស្រ័យឆ្លងកាត់ការផ្លាស់ប្ដូរនោះ បន្ទុកទិន្នន័យបានចាស់ទុំយ៉ាងច្បាស់៖ ពីឧបករណ៍បញ្ជូនទិន្នន័យដែលមានតែមួយដងប៉ុណ្ណោះទៅជាចំណុចប្រសព្វពេញលេញនៃវិញ្ញាបនបត្រ AWS ដែលរុំដោយការត្រួតពិនិត្យបរិស្ថានដែលរក្សាវាឲ្យនៅស្ងៀមនៅក្រៅគោលដៅដែលវាបានគ្រោងទុក។
| កញ្ចប់ | ៥ ឈ្មោះ; coral-wraith បានបោះពុម្ពឡើងវិញតែម្នាក់ឯងនៅទូទាំងកំណែរាប់សិប |
| ប្រព័ន្ធអេកូ | ម៉ោងងង |
| ដំឡើងវ៉ិចទ័រ | postinstall ស្គ្រីបវដ្តជីវិត |
| គោលដៅចម្បង | លិខិតសម្គាល់តួនាទី AWS IAM + តម្លៃសម្ងាត់របស់ Secrets Manager, អថេរបរិស្ថាន, /app ឯកសារ |
| អ៊ិចហ្វីល | webhook.site beacon + raw-IP C2 PUT |
| ច្រកទ្វារបង្ក | ឈ្មោះម៉ាស៊ីន 12-hex + /app/node_modules cwd បូករួមទាំងការត្រួតពិនិត្យបរិស្ថានដែលទប់ស្កាត់ payload នៅខាងក្រៅបរិបទនោះ |
| ភាពធ្ងន់ធ្ងរ | ខ្ពស់ — អត្តសញ្ញាណប័ណ្ណលើពពក និងការបង្ហាញព័ត៌មានសម្ងាត់ដែលបានគ្រប់គ្រងពី បរិស្ថានសាងសង់ និងពេលដំណើរការដែលមានកុងតឺន័រ |
កាយវិភាគសាស្ត្រវាយប្រហារ
កញ្ចប់នីមួយៗនៅក្នុងចង្កោមត្រូវបានបង្កើតឡើងតាមរបៀបដូចគ្នា៖ ស្ទើរតែទទេ index.js ។ (ម៉ូឌុល.នាំចេញ = {}), មួយជួរ កញ្ចប់ ស្គ្រីប — “postinstall”: “ណូត postinstall.js” - និងបន្ទុកនៅក្នុង ក្រោយការដំឡើង.jsការដំឡើងកញ្ចប់គឺគ្រប់គ្រាន់ដើម្បីដំណើរការ hook; មិនចាំបាច់នាំចូល ឬហៅទេ។
ច្រកទ្វារគោលដៅ។ មុនពេលធ្វើអ្វីមួយ ecto-family payload ពិនិត្យមើលបរិស្ថានជុំវិញរបស់វា៖
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-hex គឺជារូបរាងលំនាំដើមដែល Docker កំណត់ទៅកុងតឺន័រ ហើយ /app/node_modules គឺជាផ្លូវដំឡើងក្នុងកុងតឺន័រធម្មតា។ ឃ្លាទីបីនឹងការពារប្រសិនបើផ្លូវមើលទៅដូចជាថតស្រង់ចេញដែលដាក់ក្នុងប្រអប់ខ្សាច់។ ផលប៉ះពាល់សុទ្ធគឺថា payload នៅតែអសកម្មនៅលើកុំព្យូទ័រយួរដៃអ្នកអភិវឌ្ឍន៍ ឬប្រអប់ខ្សាច់វិភាគ ហើយធ្វើឱ្យសកម្មតែនៅក្នុង build ឬ runtime worker ដែលដាក់ក្នុងកុងតឺន័រប៉ុណ្ណោះ — ប្រភេទបរិស្ថានដែលទំនងជាផ្ទុកព័ត៌មានសម្ងាត់ cloud ផ្ទាល់។ កញ្ចប់ដំបូងបំផុតនៅក្នុងចង្កោម ខ្មោចផ្កាថ្ម, មិនមានច្រកទ្វារបែបនេះទេ ហើយដំណើរការការប្រមូល (សាមញ្ញជាង) របស់វាដោយគ្មានលក្ខខណ្ឌ។
ការប្រមូលនៅពេលដែលច្រកទ្វារឆ្លងកាត់ ទំពក់នឹងលបចេញតាម execFileSync(“/bin/sh”, [“-c”, …]) ហើយដំណើរការពាក្យបញ្ជាផ្សំតែមួយដែលតាមលំដាប់លំដោយ៖
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)ជំហានទី 1–3 គឺជាការទាញយកសៀវភៅសិក្សា IMDSv2៖ ស្នើសុំថូខឹនវគ្គ បន្ទាប់មកភ្ជាប់វាជា ថូខឹនទិន្នន័យមេតា X-aws-ec2 បឋមកថា ដើម្បីទាញយកតួនាទី IAM របស់ instance និងកូនសោចូលប្រើបណ្ដោះអាសន្នរបស់តួនាទីនោះ។ ជម្រើសក្នុងការអនុវត្ត IMDSv2 ជាជាង IMDSv1 ដែលមិនបានផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវសាមញ្ញជាង។ ទទួលបាន គួរកត់សម្គាល់ — វាមានន័យថា payload ដំណើរការសូម្បីតែលើ instances ដែលត្រូវបានកំណត់រចនាសម្ព័ន្ធដើម្បីទាមទារការចូលប្រើ metadata ដែលមានមូលដ្ឋានលើ token ដែលជាការពង្រឹងដែល AWS បានណែនាំ។ លិខិតសម្គាល់ដែលបានប្រគល់មកវិញដោយជំហានទី 3 គឺមានអាយុកាលខ្លី។ AccessKeyId/សោសម្ងាត់/ថូខឹន ដែនកំណត់បីដងត្រូវបានកំណត់ទៅតាមតួនាទីរបស់ instance; អ្វីក៏ដោយដែលតួនាទីនោះអាចធ្វើបាន អ្នកកាន់សោទាំងនោះអាចធ្វើបានសម្រាប់អាយុកាលរបស់លិខិតសម្គាល់។
ជំហានទី ៤-៦ ពង្រីកវិសាលភាពនៃការយល់ដឹង។ env dump ចាប់យកអ្វីៗគ្រប់យ៉ាងដែលដំណើរការ build ឬ runtime បានទទួលមរតក — នៅក្នុងការអនុវត្ត នេះគឺជាកន្លែងដែលថូខឹនចុះបញ្ជី ខ្សែអក្សរតភ្ជាប់មូលដ្ឋានទិន្នន័យ និងកូនសោ API ភាគច្រើនរស់នៅ។ / កម្មវិធី ការដើរឯកសារអានឯកសារកម្មវិធីរហូតដល់ដប់ប្រាំនៅខាងក្រៅ ម៉ូឌុលថ្នាំងដែលអាចកំណត់រចនាសម្ព័ន្ធលើផ្ទៃ .NS ឯកសារ ឬប្រភព។ ជំហានទី 6 ការហៅ បញ្ជីអាថ៌កំបាំងរបស់ aws secretsmanager នៅក្នុងតំបន់បី; ព័ត៌មានបញ្ជាក់អត្តសញ្ញាណដែលទាញចេញពីជំហានទី 1–3 គឺជាអ្វីដែលផ្ទៀងផ្ទាត់ការហៅទូរស័ព្ទទាំងនោះ ដូច្នេះ IMDS អាន និងខ្សែសង្វាក់រាប់បញ្ចូល Secrets Manager រួមគ្នាទៅជាការកើនឡើងតែមួយ៖ តួនាទីឧទាហរណ៍ → សារពើភ័ណ្ឌសម្ងាត់ដែលគ្រប់គ្រង។ ជំហានទី 7 គឺជាការងក់ក្បាលទៅនឹងការកំណត់រចនាសម្ព័ន្ធ capture-the-flag — នៅពេលដែល ហតប៊ី{…} ទង់ជាតិត្រូវបានរកឃើញថាវាត្រូវបានផ្ញើដោយខ្លួនឯង បើមិនដូច្នោះទេ ដុំដែលប្រមូលបានឆៅត្រូវបានបែងចែកជាបួនបំណែក ហើយផ្ញើ។
កំណែក្រោយៗទៀតនៅក្នុងចង្កោមអនុវត្តការកើនឡើងបន្ថែមទៀត។ ជំនួសឱ្យការឈប់នៅសារពើភ័ណ្ឌ ពួកគេវិភាគការឆ្លើយតប IMDS នាំចេញសោបណ្ដោះអាសន្នជា AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN អថេរបរិស្ថាន បញ្ជាក់អត្តសញ្ញាណជាមួយ aws sts get-caller-identityហើយបន្ទាប់មក ធ្វើការត្រួតពិនិត្យរាល់អាថ៌កំបាំងដែលបានប្រគល់មកវិញដោយ បញ្ជីអាថ៌កំបាំង ការហៅទូរស័ព្ទ aws secretsmanager ទទួលបានតម្លៃសម្ងាត់ នៅលើឯកសារនីមួយៗ — កំពុងទាញយកខ្លឹមសារសម្ងាត់ មិនមែនគ្រាន់តែឈ្មោះរបស់វានោះទេ។ កំណែដូចគ្នានេះក៏អានឯកសារគោលពីរដែលជំនួសដោយដំណើរការផងដែរ (/សញ្ញាសម្គាល់អាន និងមិត្តភក្តិ) ហើយព្យាយាម ដំណើរការគិតថ្លៃ ប្រឆាំងនឹងគម្រោង Rust ណាមួយដែលត្រូវបានរកឃើញនៅក្រោម / កម្មវិធីដោយពង្រីកការប្រមូលផលលើសពីលក្ខណៈសម្បត្តិពពកទៅជាអ្វីដែលបរិស្ថានសាងសង់បង្ហាញ។
កំណែក្រោយៗទៀតទាំងនេះក៏បិទទ្វារខ្លួនឯងយ៉ាងសកម្មជាងមុនផងដែរ។ បន្ថែមពីលើឈ្មោះម៉ាស៊ីន 12-hex និង /app/node_modules នៅពេលត្រួតពិនិត្យ payload ត្រួតពិនិត្យការកំណត់រចនាសម្ព័ន្ធ package-registry សកម្ម និងផ្លូវថតឯកសារការងារ ហើយចេញដោយស្ងៀមស្ងាត់នៅពេលដែលពួកវាបង្ហាញពីការវិភាគ ឬបរិបទឆ្លុះបញ្ចាំងជាជាងគោលដៅផ្ទាល់។ ឥទ្ធិពលរួមបញ្ចូលគ្នាគឺជា payload ដែលមិនធ្វើអ្វីដែលអាចសង្កេតឃើញនៅក្នុងបរិស្ថានត្រួតពិនិត្យភាគច្រើន ហើយដំណើរការការប្រមូលពេញលេញរបស់វាតែកន្លែងដែលវាវិនិច្ឆ័យខ្លួនឯងថានៅលើម៉ាស៊ីនកុងតឺន័រពិតប្រាកដ។
ការបណ្តេញចេញទិន្នន័យដែលប្រមូលបានទុកម៉ាស៊ីននៅលើឆានែលពីរ។ ទីមួយ ប៊ីខុន POST ទៅថេរមួយ។ គេហទំព័រ webhook អ្នកប្រមូល ដែលមានផ្ទុកឈ្មោះម៉ាស៊ីន លេខ UID ថតឯកសារការងារ និងទិន្នន័យដែលប្រមូលបានរហូតដល់ 120 KB។ ទីពីរ ទិន្នន័យត្រូវបានបញ្ចូលទៅក្នុង "បញ្ជីម៉ូឌុល" YAML ក្លែងក្លាយ ហើយ PUT ទៅ /api/ម៉ូឌុល/ នៅលើម៉ាស៊ីនបម្រើគោលដៅ៖
ecto_module:
name: "<flag-or-chunk-0>"
version: "1.0.0"
power_level: "<chunk-1>"
ship_deck: "<chunk-2>"
cargo_hold: "<chunk-3>"ឈ្មោះវាល manifest (កម្រិតថាមពល, នាវា, ទំនិញ) គឺជាការតុបតែង — ទិន្នន័យដែលត្រូវបានគេលួចជិះនៅខាងក្នុងតម្លៃខ្សែអក្សរ ដែលជាមូលហេតុដែលម៉ូនីទ័របណ្តាញមើលឃើញអ្វីដែលមើលទៅដូចជាការផ្ទុកឡើងនូវបញ្ជីឈ្មោះកញ្ចប់ដែលមិនបង្កគ្រោះថ្នាក់ ជាជាងការចាក់ទិន្នន័យជាក់ស្តែង។ ឆានែល beacon ផ្ទុកច្រើនជាង៖ POST រាងកាយទៅ គេហទំព័រ webhook រួមបញ្ចូលឈ្មោះម៉ាស៊ីន លេខ UID ថតឯកសារការងារ និងរហូតដល់ 120 KB នៃ blob ដែលប្រមូលបាន ដូច្នេះសូម្បីតែ beacon ជោគជ័យតែមួយក៏ផ្តល់នូវការទទួលយកពេញលេញដែរ។ គេហទំព័រ webhook គឺជាសេវាកម្មត្រួតពិនិត្យសំណើដោយឥតគិតថ្លៃ។ ការប្រើប្រាស់វាជាឧបករណ៍ប្រមូលមានន័យថា ប្រតិបត្តិករមិនចាំបាច់ក្រោកឈរទទួលហេដ្ឋារចនាសម្ព័ន្ធផ្ទាល់ខ្លួនសម្រាប់ឆានែលនោះទេ ហើយសំណើដែលបានកត់ត្រាទុកនៅតែមាននៅក្នុងធុងសំរាមរបស់សេវាកម្ម។
ការបង្ហាញ PUT ដើរបញ្ជីបម្រុងដែលចាប់ផ្តើមដោយបញ្ជីជាច្រើន 127.0.0.1/localhost ច្រក ហើយបន្ទាប់មកធ្លាក់ចូលទៅក្នុងអាសយដ្ឋានសាធារណៈចំនួនបីនៅក្នុង `១៥៤.៥៧.១៦៤.០/២៤` ជួរ ដោយឈប់នៅចំណុចបញ្ចប់ដំបូងដែលឆ្លើយតបជាមួយស្ថានភាព 2xx។ ការរៀបចំ localhost-first គឺស្របនឹងការពិពណ៌នាដោយខ្លួនឯង "verdaccio testing" (បញ្ជីឈ្មោះក្នុងស្រុកនៅលើ loopback) ប៉ុន្តែ public-IP fallbacks មានន័យថាទិន្នន័យចាកចេញពី host នៅពេលណាដែល loopback មិនស្តាប់ — ដែលមានន័យថា នៅលើម៉ាស៊ីនណាមួយដែលមិនមែនជាឧបករណ៍សាកល្បងផ្ទាល់ខ្លួនរបស់អ្នកនិពន្ធ។
ការកំណត់ពេលវេលា
ចង្កោមបង្ហាញពីកំណើនសមត្ថភាពបន្តិចម្តងៗ ជាជាងការធ្លាក់ចុះតែមួយ។ យើងរៀបចំវាតាមឥរិយាបថដែលសង្កេតឃើញ មិនមែនតាមនាឡិកាជញ្ជាំងដែលបោះពុម្ពផ្សាយទេ៖
| ដំណាក់កាល | កញ្ចប់ / កំណែ | ឥរិយាបថ |
|---|---|---|
| ការរត់ដំបូង | coral-wraith 9999.0.x | លេខកំណែដែលបានបំប៉ោងស្របនឹងការប៉ុនប៉ងច្រឡំភាពអាស្រ័យ; ការរាប់ពេលវេលាដំឡើង និង exfil |
| ពូជ | coral-wraith 1.0.0 | ក្រោយការដំឡើងប្រមូលឯកសារ id/env/flag; ដាក់តែមួយទៅ 154[.]57[.]164[.]71:30782, សញ្ញាសម្គាល់ ECT-472839 |
| ការធ្វើម្តងទៀតយ៉ាងឆាប់រហ័ស | coral-wraith 1.0.1 → 6.0.0 | ការចេញផ្សាយរាប់សិបក្នុងរយៈពេលប៉ុន្មានម៉ោង; បន្ទុកទទួលបាន isAppWorker() ច្រកទ្វារ, ការទាញយកព័ត៌មានបញ្ជាក់អត្តសញ្ញាណ IMDSv2, ពេញលេញ get-secret-value pivot, ការត្រួតពិនិត្យបរិស្ថាន registry/path និងសញ្ញាសម្គាល់ dual sink |
| ឈ្មោះស្របគ្នា | ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 | បន្ទុកដែលបានកំណត់ដូចគ្នា; webhook.site បញ្ជីបម្រុង beacon និង multiendpoint |
| វ៉ារ្យ៉ង់ | ecto-rust-read-f3a9c1 1.0.1–1.0.2 | បន្ថែមសញ្ញាសម្គាល់អាងលិចបន្ថែម ECT-987654, ECT-654321, ECT-839201 |
| វ៉ារ្យ៉ង់ | ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 | បន្ទុកដែលបានកំណត់ដូចគ្នា C2 និង beacon ដូចគ្នា |
លក្ខណៈពិសេសនៃចង្កោមគឺចង្វាក់នៃការបោះពុម្ពផ្សាយរបស់វា៖ ជំនួសឲ្យកញ្ចប់មួយ និងកំណែមួយ ឈ្មោះដូចគ្នាត្រូវបានបោះពុម្ពផ្សាយឡើងវិញម្តងហើយម្តងទៀតយ៉ាងឆាប់រហ័ស ដោយកញ្ចប់នីមួយៗចេញផ្សាយបំរែបំរួលតិចតួចលើកញ្ចប់ចុងក្រោយ រួមជាមួយបងប្អូនមួយក្តាប់តូចដែលផ្ទុកបន្ទុកដូចគ្នា។ នៅក្នុង ខ្សឹប កូដបានបំបែកជាស្នាមម្រាមដៃជិតគ្នាពីរ — មួយសំណុំធ្វើឲ្យការរកឃើញសំខាន់ពីរ និងបីទៀត (អាងអានឯកសារបន្ថែម) — ប៉ុន្តែទាំងពីរដោះស្រាយទៅនឹងបន្ទុកផ្ទុកដូចគ្នា។ ភាពខុសគ្នាគឺការរសាត់កូដ មិនមែនជាសមគំនិតអាកប្បកិរិយាទេ។ កំណែនៃ ខ្សឹប លើសពីជួរដែលបានវិភាគ (រហូតដល់យ៉ាងហោចណាស់ 1.0.25 នៅពេលសរសេរ) ត្រូវបានគេសង្កេតឃើញផ្ទាល់នៅលើបញ្ជីឈ្មោះ ហើយ ខ្មោចផ្កាថ្ម ឈ្មោះបានបន្តឡើងជណ្ដើរកំណែផ្ទាល់ខ្លួនរបស់វាលើបង្អួចដដែល។
សូចនាករនៃការសម្របសម្រួល
សូចនាករទាំងអស់ខាងក្រោមត្រូវបានស្រង់ចេញពីប្រភពកញ្ចប់នៅលើថាស។ សូចនាករបណ្តាញត្រូវបានបិទ។
Network
| ទ្រនិចបង្ហាញ | តួនាទី |
|---|---|
hxxp://154[.]57[.]164[.]71:30782 | គោលដៅ C2 PUT (coral-wraith) |
hxxp://154[.]57[.]164[.]80:30543 | C2 PUT ជំនួស (ecto-*) |
hxxp://154[.]57[.]164[.]82:31250 | C2 PUT ជំនួស (ecto-*) |
hxxp://154[.]57[.]164[.]71:31289 | C2 PUT ជំនួស (ecto-*) |
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 | ឧបករណ៍ប្រមូលសញ្ញា |
169[.]254[.]169[.]254/latest/... | ការអានព័ត៌មានសម្គាល់ IMDSv2 (ផ្នែកគោលដៅ ទិន្នន័យមេតា AWS) |
អាកប្បកិរិយា/ឯកសារ
| ទ្រនិចបង្ហាញ | តួនាទី |
|---|---|
"postinstall": "node postinstall.js" | ដំឡើងវ៉ិចទ័រ |
ecto_module: YAML ជាមួយ power_level / ship_deck / cargo_hold គ្រាប់ចុច | គ្រោងការណ៍បង្ហាញឯកសារ Exfil |
សញ្ញាសម្គាល់លិច ECT-472839, ECT-987654, ECT-654321, ECT-839201 | ផ្នែកផ្លូវ C2 /api/modules/<marker> |
isAppWorker() ច្រកទ្វារ៖ ម្ចាស់ផ្ទះ /^[0-9a-f]{12}$/, cwd មាន /app/node_modules | លក្ខខណ្ឌធ្វើឱ្យសកម្ម |
aws secretsmanager list-secrets ជាង us-east-1, eu-west-1, eu-central-1 | ការរាប់បញ្ចូលអាថ៌កំបាំង |
HTB{...} ការកោស regex | ការប្រមូលផលដោយចាប់យកទង់ជាតិ |
ហាសឯកសារ (sha256 ចាប់យកនៅពេលវិភាគ)
| ឯកសារ | sha256 |
|---|---|
coral-wraith/postinstall.js | ce5ff035cfdfed1d0015446424b352c27b66bcb77e9fdb0a51e4245199146824 |
ecto-corsair-whisper-6f3b9 1.0.18/postinstall.js | b58432acba376aa6976f0490d9a1c04257ccdbc856d8390260c50322d63e31c3 |
ការសន្មត់ និងឥរិយាបថដែលសង្កេតឃើញ
ឈ្មោះកញ្ចប់ទាំងប្រាំត្រូវបានបោះពុម្ពផ្សាយក្រោមចំណុចទាញគណនី npm ពីរ ប៉ុន្តែពួកវាចែករំលែកហេដ្ឋារចនាសម្ព័ន្ធគ្រប់គ្រាន់ដើម្បីចាត់ទុកពួកវាជាចង្កោមតែមួយ៖ ដូចគ្នា ម៉ូឌុល_អេកតូ គ្រោងការណ៍បង្ហាញឱ្យឃើញ, ដូចគ្នា ECT-472839 សញ្ញាសម្គាល់លិចបឋម, ដូចគ្នា គេហទំព័រ webhook លេខសម្គាល់អ្នកប្រមូល និងចំណុចបញ្ចប់ C2 នៅក្នុងតែមួយ ប្លុក 154.57.164.0/24`។ កញ្ចប់គ្រាប់ពូជ (`coral-wraithសាមញ្ញជាង និងគ្មានព្រំដែន) ហើយក្រុមគ្រួសារ ecto ដែលមានព្រំដែនត្រូវបានអានថាជាការធ្វើម្តងទៀតនៅលើឧបករណ៍មួយជាជាងកិច្ចខិតខំប្រឹងប្រែងឯករាជ្យ។
កញ្ចប់ទាំងនេះពិពណ៌នាខ្លួនឯង នៅក្នុងកំណែក្រោយៗទៀតថា “បន្ទុក CTF សម្រាប់ការធ្វើតេស្តខ្សែសង្វាក់ផ្គត់ផ្គង់ verdaccio”។ យើងបង្ហាញស្លាកនោះថាជាការពិតដែលអាចសង្កេតឃើញ ហើយមិនបញ្ជាក់វាឡើងវិញជាការរកឃើញអំពីគោលបំណងនោះទេ។ អ្វីដែលកូដធ្វើគឺមិនមានភាពមិនច្បាស់លាស់ និងមិនអាស្រ័យលើរបៀបដែលវាត្រូវបានដាក់ស្លាក៖ វាអានព័ត៌មានបញ្ជាក់តួនាទី IAM ពីសេវាកម្មទិន្នន័យមេតាឧទាហរណ៍ រាប់បញ្ចូលអាថ៌កំបាំងដែលបានគ្រប់គ្រងនៅទូទាំងតំបន់ AWS ចំនួនបី និងបញ្ជូនលទ្ធផលទៅ IP សាធារណៈ និងអ្នកប្រមូល webhook ភាគីទីបី។ បណ្តាញសាកល្បង loopback តែប៉ុណ្ណោះពិតប្រាកដនឹងមិនត្រូវការបញ្ជីបម្រុង IP សាធារណៈ ការអានព័ត៌មានបញ្ជាក់ IMDS ឬការហៅ Secrets Manager ឆ្លងតំបន់នោះទេ។ ដោយសារតែការចាកចេញ និងការទៅដល់ព័ត៌មានបញ្ជាក់គឺពិតប្រាកដ កំណែដែលមាន gated ត្រូវបានចាត់ថ្នាក់ថាមានគ្រោះថ្នាក់។
ច្រកទ្វារកុងតឺន័រតែប៉ុណ្ណោះ គឺជាលក្ខណៈពិសេសគួរឱ្យកត់សម្គាល់បំផុតនៅក្នុងប្រតិបត្តិការ។ វាគឺជាទាំងវិធានការគេចវេស — ការនៅស្ងៀមនៅលើកុំព្យូទ័រយួរដៃ និងនៅក្នុងប្រអប់ខ្សាច់វិភាគ — និងជាវិធានការកំណត់គោលដៅ ដោយបាញ់តែកន្លែងដែលតួនាទី IAM ពិតប្រាកដ និងអាថ៌កំបាំងផ្ទាល់ទំនងជាមានវត្តមាន។ អ្នកវិភាគដែលកំពុងដំណើរការកញ្ចប់ទាំងនេះនៅក្នុងប្រអប់ខ្សាច់ទូទៅនឹងមិនឃើញអ្វីទាំងអស់។ ឥរិយាបថនេះបង្ហាញឱ្យឃើញតែនៅក្រោមឈ្មោះម៉ាស៊ីនបែប Docker និងផ្លូវដំឡើងនៅក្នុងកុងតឺន័រប៉ុណ្ណោះ។
ផលប៉ះពាល់ និន្នាការ និងការណែនាំសម្រាប់អ្នកការពារ
ការលាតត្រដាងនៅទីនេះគឺជាព័ត៌មានបញ្ជាក់អត្តសញ្ញាណលើពពក និងការបង្ហាញព័ត៌មានសម្ងាត់នៅខាងក្នុងកុងតឺន័រសាងសង់ និងកុងតឺន័រពេលដំណើរការ។ ព័ត៌មានបញ្ជាក់អត្តសញ្ញាណតួនាទី IAM ដែលទាញចេញពី IMDS មានការអនុញ្ញាតណាមួយដែលតួនាទីនោះមាន។ អ្នកគ្រប់គ្រងសម្ងាត់៖ បញ្ជីសម្ងាត់ (និងការតាមដានណាមួយ GetSecretValue) ពង្រីកវាទៅជាអាថ៌កំបាំងកម្មវិធីដែលបានរក្សាទុក។ គំនរអថេរបរិស្ថានច្រើនតែផ្ទុកថូខឹនចុះបញ្ជី URL មូលដ្ឋានទិន្នន័យ និងកូនសោ API។ នៅក្នុងបរិបទ CI ឬកុងតឺន័រ — គឺជាអ្វីដែលច្រកទ្វារជ្រើសរើស — ការដំឡើងអន្តរកាលតែមួយនៃកញ្ចប់មួយក្នុងចំណោមកញ្ចប់ទាំងនេះគឺគ្រប់គ្រាន់ដើម្បីលេចធ្លាយសម្ភារៈនោះ។
Ectoplasm សមនឹងគំរូដែលយើងបន្តឃើញ៖ បន្ទុកទិន្នន័យពេលដំឡើង ដែលទៅដល់ទិន្នន័យមេតាលើពពក និងអាថ៌កំបាំងដែលបានគ្រប់គ្រងជាជាងឯកសារក្នុងស្រុក ហើយវាបើកឱ្យដំណើរការតែនៅក្នុងបរិស្ថានដែលមានតម្លៃខ្ពស់ប៉ុណ្ណោះ។ ការសង្កេតការពារពីរត្រូវបានអនុវត្តតាម។
- រូបរាងអាចសម្គាល់បានទំពក់ដំឡើង npm/PyPI ដែលក្រាហ្វការហៅរបស់វាទៅដល់ទាំង cloud secrets API (អ្នកគ្រប់គ្រងសម្ងាត់ aws, អាថ៌កំបាំង gcloud, សោរសោរ az) ឬអាសយដ្ឋាន IMDS និងកន្លែងលិចចេញបណ្តាញគឺជាគំរូសញ្ញាខ្ពស់តូចចង្អៀត - វាស្ទើរតែមិនដែលកើតឡើងនៅក្នុងស្គ្រីបវដ្តជីវិតស្របច្បាប់នោះទេ។ ការវិភាគលំហូរឋិតិវន្ត អាចដាក់ទង់ជាតិវាដោយមិនអាស្រ័យលើដែន ឬ IP ជាក់លាក់ណាមួយឡើយ។
- ការរឹងប៉ឹងនៃបរិស្ថានធ្វើឱ្យវាទន់ខ្សោយ។ ការអនុវត្ត IMDSv2 ជាមួយនឹងដែនកំណត់ hop ចំនួន 1 ការពារបន្ទុកការងារកុងតឺន័រពីការទៅដល់ទិន្នន័យមេតាឧទាហរណ៍; ការកំណត់វិសាលភាពតួនាទី IAM ទៅសិទ្ធិតិចបំផុតកំណត់កាំផ្ទុះនៃព័ត៌មានសម្គាល់ណាមួយដែលលេចធ្លាយ; និងដំណើរការការដំឡើងជាមួយ – មិនអើពើស្គ្រីប នៅក្នុង CI លុបវ៉ិចទ័រ install-hook ចេញទាំងស្រុងសម្រាប់កញ្ចប់ដែលមិនត្រូវការវា។
សម្រាប់អ្នកការពារ ការត្រួតពិនិត្យជាក់ស្តែងគឺ៖ ការជូនដំណឹងអំពីការតភ្ជាប់ចេញពីកុងតឺន័រ build/CI ទៅកាន់ IP សាធារណៈដែលមិនត្រូវបានអនុញ្ញាតក្នុងអំឡុងពេល ល្ងាចដំឡើង; តាមដានការចូលប្រើ IMDS ដែលមានប្រភពមកពីស្គ្រីបវដ្តជីវិតកញ្ចប់; ហើយចាត់ទុកទំពក់ដំឡើងណាមួយដែលផ្ញើទៅ CLI លើពពកថាជាការសង្ស័យរហូតដល់មានការបញ្ជាក់ផ្សេងពីនេះ។
កំណត់ចំណាំពីរបន្ថែមទៀតជាក់លាក់ចំពោះចង្កោមនេះ។ ទីមួយ ដោយសារតែការធ្វើឱ្យសកម្មត្រូវបានកំណត់ចំពោះបរិស្ថានដែលមានកុងតឺន័រ កញ្ចប់ដែលលេចឡើងអសកម្មនៅពេលដែលត្រូវបានត្រួតពិនិត្យនៅលើស្ថានីយការងារអាចនៅតែអាចផ្សាយផ្ទាល់នៅក្នុងផលិតកម្មបាន — ការត្រួតពិនិត្យត្រូវការបង្កើតឡើងវិញនូវឈ្មោះម៉ាស៊ីនកុងតឺន័រ និងលក្ខខណ្ឌផ្លូវ ឬអានប្រភពដោយផ្ទាល់ ជាជាងពឹងផ្អែកលើ "ខ្ញុំបានដំឡើងវាហើយគ្មានអ្វីកើតឡើង"។ ទីពីរ ការប្រើប្រាស់សេវាកម្មត្រួតពិនិត្យសំណើសាធារណៈជាអ្នកប្រមូល beacon មានន័យថាទិន្នន័យមួយចំនួនដែលត្រូវបានច្រោះអាចសង្គ្រោះបានសម្រាប់ការឆ្លើយតបឧប្បត្តិហេតុ៖ អង្គការដែលរកឃើញកញ្ចប់មួយក្នុងចំណោមកញ្ចប់ទាំងនេះនៅក្នុងដើមឈើអាស្រ័យរបស់វាអាចវែកញែកអំពីអ្វីដែល beacon ដែលទទួលបានជោគជ័យនឹងមានពីតក្កវិជ្ជាប្រមូលរបស់ payload ហើយគួរតែបង្វិលលិខិតសម្គាល់តួនាទី IAM ណាមួយ ថូខឹនចុះបញ្ជី និងអាថ៌កំបាំងដែលបានគ្រប់គ្រងដែលអាចទៅដល់បានពីបរិស្ថានសាងសង់ ឬពេលដំណើរការដែលរងផលប៉ះពាល់។ ការបង្វិលលិខិតសម្គាល់មិនមែនជាការដកកញ្ចប់ចេញទេ គឺជាការកែតម្រូវប្រតិបត្តិការ នៅពេលដែលការដំឡើងបានដំណើរការ។







