Gosod Ectoplasm npm Hooks Sy'n Dwyn Cymwysterau AWS

Ectoplasm: gosod npm hooks sy'n casglu manylion mewngofnodi AWS y tu ôl i sbardun cynhwysydd yn unig

TL; DR

Clwstwr o pum pecyn npm, wedi'i gyhoeddi ar draws dau gyfrif, wedi'i anfon a postinstall bachyn sy'n darllen manylion mewngofnodi cwmwl gan y gwesteiwr ac yn eu hanfon oddi ar y blwch. Mae'r pecynnau'n cario enwau ysbrydion a môr-ladron — coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — a chyfresoli beth bynnag maen nhw'n ei gasglu yn ffug ecto_module: Maniffesto YAML cyn ei drosglwyddo. Rydym yn olrhain y clwstwr fel ectoplasm.

Dim ond pan fydd yn canfod amgylchedd penodol y mae'r llwyth tâl yn rhedeg: gwesteiwr y mae ei enw yn Llinyn hecs 12 nod a chyfeiriadur gweithio o dan /app/node_modules — siâp adeilad cynhwysydd neu weithiwr CI. Pan fydd y giât honno'n mynd heibio, mae'r bachyn yn holi'r Gwasanaeth metadata enghreifftiol AWS (IMDSv2) ar gyfer manylion mewngofnodi rôl IAM, yn rhestru Rheolwr Cyfrinachau AWS ar draws tair rhanbarth, yn dympio newidynnau amgylcheddol, yn darllen ffeiliau o dan /app, ac yn crafu am linynnau cipio'r faner. Yna mae'n allyrru'r canlyniad mewn dwy ffordd: goleudy i a webhook.site casglwr a PUT maniffest i bwynt terfyn IP crai, gyda rhestr o ddewisiadau wrth gefn localhost-first.

Mae'r disgrifiadau pecyn diweddarach yn darllen "Llwyth tâl CTF ar gyfer profi cadwyn gyflenwi verdaccio." Rydym yn adrodd yr hunan-ddisgrifiad hwnnw fel ffaith arsylladwy. Yr ymddygiad ei hun - allfa fyw i IP cyhoeddus, darlleniadau credyd IMDS go iawn, galwadau Rheolwr Cyfrinachau go iawn - yw'r hyn ydyw waeth beth fo'r label, a dyma'r rheswm pam y dosbarthwyd y fersiynau hyn yn faleisus.

Un enw yn y clwstwr, coral-wraith, ni stopiodd gydag un rhyddhad. Ailgyhoeddwyd yn gyflym drwy ddwsinau o fersiynau o fewn ychydig oriau — 1.0.0 dringo i 6.0.0 — ac roedd rhediad cynharach o'r un enw wedi defnyddio chwyddedig 9999.0.x rhifau fersiwn, siâp clasurol a ymgais dryswch dibyniaethAr draws y corwynt hwnnw aeddfedodd y llwyth tâl yn amlwg: o oleudy cyfrifo gwesteiwr un ergyd i fod yn golyn credyd AWS llawn wedi'i lapio mewn gwiriadau amgylcheddol sy'n ei gadw'n dawel y tu allan i'w darged bwriadedig.

Pecynnau 5 enw; coral-wraith wedi'i ailgyhoeddi ar ei ben ei hun ar draws dwsinau o fersiynau
ecosystem npm
Gosod fector postinstall sgript cylch bywyd
Prif darged Manylion rôl AWS IAM + gwerthoedd cyfrinachol Rheolwr Cyfrinachau, newidynnau amgylcheddol, /app ffeiliau
Exfil webhook.site beacon + IP-raw C2 PUT
Giât sbarduno Enw gwesteiwr 12-hecs + /app/node_modules cwd, ynghyd â gwiriad amgylchedd sy'n atal y llwyth tâl y tu allan i'r cyd-destun hwnnw
Difrifoldeb uchel — datgeliad manylion mewn cwmwl a chyfrinachau a reolir o amgylcheddau adeiladu ac amser rhedeg cynwysyddion

Anatomeg ymosod

Mae pob pecyn yn y clwstwr wedi'i adeiladu yn yr un ffordd: pecyn bron yn wag mynegai.js (modiwl.allforion = {}), un llinell pecyn.json sgript — “ôl-osod”: “nod ôl-osod.js” — a'r llwyth tâl yn postinstall.jsMae gosod y pecyn yn ddigon i redeg y bachyn; nid oes angen mewnforio na galw.

Y giât dargedu. Cyn gwneud unrhyw beth, mae llwyth y teulu ecto yn gwirio ei amgylchoedd:

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

Enw gwesteiwr 12-hecsagon yw'r siâp diofyn y mae Docker yn ei aseinio i gynhwysydd, a /ap/node_modules yn llwybr gosod confensiynol mewn cynhwysydd. Mae'r trydydd cymal yn cael ei ddileu os yw'r llwybr yn edrych fel cyfeiriadur echdynnu mewn blwch tywod. Yr effaith net yw bod y llwyth tâl yn aros yn segur ar liniadur datblygwr neu flwch tywod dadansoddi ac yn actifadu dim ond y tu mewn i adeilad cynhwysydd neu weithiwr amser rhedeg - y math o amgylchedd sydd fwyaf tebygol o gario manylion mewn cymwysterau cwmwl byw. Y pecyn cynharaf yn y clwstwr, coral-wraith, nid oes ganddo giât o'r fath ac mae'n rhedeg ei gasgliad (symlach) yn ddiamod.

Dull CasgluPan fydd y giât yn mynd heibio, mae'r bachyn yn cregyn allan drwyddo execFileSync(“/ bin/sh”, [“-c”, …]) ac yn rhedeg un gorchymyn cyfansawdd sydd, yn y drefn ganlynol:

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)

Mae camau 1–3 yn adferiad gwerslyfr IMDSv2: gofynnwch am docyn sesiwn, yna atodwch ef fel y Tocyn metadata-X-aws-ec2 pennawd i dynnu rôl IAM yr achos ac allweddi mynediad dros dro'r rôl honno. Y dewis i weithredu IMDSv2 yn hytrach na'r IMDSv1 symlach heb ei ddilysu GET yn werth nodi — mae'n golygu bod y llwyth tâl yn gweithio hyd yn oed ar achosion sydd wedi'u ffurfweddu i ofyn am fynediad metadata sy'n seiliedig ar docynnau, sef y caledu a argymhellir gan AWS. Mae'r manylion mewngofnodi a ddychwelir gan gam 3 yn fyrhoedlog. AllweddMynediadID/Allwedd Mynediad Gyfrinachol/tocyn triphlyg wedi'u cwmpasu i rôl yr achos; beth bynnag y gall y rôl honno ei wneud, gall deiliad yr allweddi hynny ei wneud am oes y dystysgrif.

Mae camau 4–6 yn ehangu’r broses. env Mae dump yn cipio unrhyw beth a etifeddwyd gan y broses adeiladu neu amser rhedeg — yn ymarferol dyma lle mae tocynnau cofrestrfa, llinynnau cysylltiad cronfa ddata, ac allweddi API yn byw amlaf. / ap mae taith ffeiliau yn darllen hyd at bymtheg o ffeiliau cymhwysiad y tu allan nod_modiwlau, a all ffurfweddu arwyneb, .env ffeiliau, neu ffynhonnell. Mae cam 6 yn galw rhestr gyfrinachau rheolwr cyfrinachau aws mewn tair rhanbarth; y manylion mewngofnodi a dynnwyd yng nghamau 1–3 yw'r union beth sy'n dilysu'r galwadau hynny, felly mae'r darlleniad IMDS a'r rhestru Rheolwr Cyfrinachau yn cysylltu i mewn i un uwchgyfeirio: rôl achos → rhestr eiddo cyfrinachau a reolir. Mae Cam 7 yn gyfeiriad at y fframio cipio'r faner — pan fydd HTB{…} os canfyddir baner caiff ei hanfon ar ei phen ei hun, fel arall caiff y blob crai a gasglwyd ei rannu'n bedwar darn a'i anfon.

Mae fersiynau diweddarach yn y clwstwr yn mynd â'r broses uwchgyfeirio ymhellach. Yn hytrach na stopio wrth restr eiddo, maent yn dadansoddi'r ymateb IMDS, yn allforio'r allweddi dros dro fel AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / TOCYN_SES_AWS newidynnau amgylcheddol, cadarnhau'r hunaniaeth gyda aws sts cael-hunaniaeth-galwr, ac yna dolennu dros bob cyfrinach a ddychwelir gan rhestr-gyfrinachau galw rheolwr-gyfrinachau aws cael-gwerth-cyfrinachol ar bob un — gan adfer y cynnwys cyfrinachol, nid dim ond eu henwau. Mae'r un fersiynau hefyd yn darllen ffeiliau deuaidd baner wedi'u hamnewid gan brosesau (/darllen baner a ffrindiau) a cheisio rhediad cargo yn erbyn unrhyw brosiect Rust a geir o dan / ap, gan ehangu'r cynhaeaf y tu hwnt i gymwysterau cwmwl i beth bynnag y mae'r amgylchedd adeiladu yn ei ddatgelu.

Mae'r fersiynau diweddarach hyn hefyd yn defnyddio giatiau mwy ymosodol. Yn ogystal â'r enw gwesteiwr 12-hecsagon a /ap/node_modules gwiriadau, mae'r llwyth tâl yn archwilio'r cyfluniad cofrestrfa pecyn gweithredol a'r llwybr cyfeiriadur gwaith ac yn ymadael yn dawel pan fyddant yn nodi cyd-destun dadansoddi neu ddrych yn hytrach na tharged byw. Yr effaith gyfunol yw llwyth tâl nad yw'n gwneud dim y gellir ei arsylwi yn y rhan fwyaf o amgylcheddau arolygu ac yn rhedeg ei gasgliad llawn dim ond lle mae'n barnu ei fod ar westeiwr cynhwysydd dilys.

AllfudoMae'r data a gasglwyd yn gadael y gwesteiwr ar ddwy sianel. Yn gyntaf, mae goleudy SWYDD i sefydlog gwefan.bwc casglwr, yn cario'r enw gwesteiwr, UID rhifol, cyfeiriadur gweithio, a hyd at 120 KB o ddata a gasglwyd. Yn ail, mae'r data'n cael ei blygu i mewn i "maniffest modiwl" YAML ffug a RHOI i /api/modiwlau/ ar weinydd targed:

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

Enwau'r meysydd maniffest (lefel_pŵer, dec_llong, dalfa cargo) yn addurn — mae'r data wedi'i ddwyn yn mynd o fewn y gwerthoedd llinynnol, a dyna pam mae monitor rhwydwaith yn gweld rhywbeth sy'n edrych fel uwchlwythiad maniffesto cofrestrfa pecyn diniwed yn hytrach na dymp data amlwg. Mae sianel y beacon yn cario mwy: y SWYDD corff i gwefan.bwc yn cynnwys yr enw gwesteiwr, yr UID rhifol, y cyfeiriadur gweithio, a hyd at 120 KB o'r blob a gasglwyd, felly mae hyd yn oed un beacon llwyddiannus yn cyflawni'r cymeriant llawn. gwefan.bwc yn wasanaeth archwilio ceisiadau am ddim; mae ei ddefnyddio fel casglwr yn golygu nad oes rhaid i'r gweithredwr byth sefydlu seilwaith derbyn ei hun ar gyfer y sianel honno, ac mae'r ceisiadau a gofnodwyd yn parhau ym min y gwasanaeth.

Y maniffest RHOI yn cerdded rhestr wrth gefn sy'n dechrau gyda sawl 127.0.0.1/localhost porthladdoedd ac yna'n disgyn drwodd i dri chyfeiriad cyhoeddus yn y `154.57.164.0/24` ystod, gan stopio wrth y pwynt terfynol cyntaf sy'n ateb gyda statws 2xx. Mae'r drefn localhost-first yn gyson â'r hunan-ddisgrifiad "profi verdaccio" (cofrestrfa leol ar ddolennôl), ond mae'r dewisiadau wrth gefn IP cyhoeddus yn golygu bod y data'n gadael y gwesteiwr pryd bynnag nad yw'r ddolennôl yn gwrando - hynny yw, ar unrhyw beiriant nad yw'n rig prawf yr awdur ei hun.

Llinell Amser

Mae'r clwstwr yn dangos twf gallu cynyddrannol yn hytrach nag un gostyngiad. Rydym yn ei drefnu yn ôl ymddygiad a welwyd, nid yn ôl cloc wal cyhoeddi:

Cam Pecynnau / Fersiynau Ymddygiad
Rhediad cynnar coral-wraith 9999.0.x Rhifau fersiwn chwyddedig sy'n gyson ag ymgais dryswch dibyniaeth; rhestru amser gosod ac exfil
Hadau coral-wraith 1.0.0 mae postinstall yn casglu ffeiliau id/amgylchedd/baner; PUT sengl i 154[.]57[.]164[.]71:30782, marciwr ECT-472839
Iteriad cyflym coral-wraith 1.0.1 → 6.0.0 Dwsinau o ryddhadau mewn oriau; mae'r llwyth tâl yn ennill y isAppWorker() giât, tynnu tystlythyr IMDSv2, y llawn get-secret-value colyn, y gwiriad amgylchedd cofrestrfa/llwybr, a marcwyr sinc deuol
Enwau cyfochrog ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Yr un llwyth tâl â giât; webhook.site rhestr wrth gefn beacon a phwynt terfyn aml
amrywiadau ecto-rust-read-f3a9c1 1.0.1–1.0.2 Yn ychwanegu marcwyr sinc ychwanegol ECT-987654, ECT-654321, ECT-839201
amrywiadau ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Yr un llwyth tâl â giât, yr un C2 a goleudy

Nodwedd ddiffiniol y clwstwr yw ei gyflymder cyhoeddi: yn hytrach nag un pecyn ac un fersiwn, mae'r un enw yn cael ei ailgyhoeddi dro ar ôl tro yn gyflym olynol, pob rhyddhad yn amrywiad bach ar yr olaf, ochr yn ochr â llond llaw o frodyr a chwiorydd ag enwau gwahanol sy'n cario'r un llwyth tâl. O fewn y sibrwd teulu rhannodd y cod yn ddau olion bysedd agos — un set yn baglu dau ganfyddiad critigol, un arall dri (sinc darllen ffeiliau ychwanegol) — ond mae'r ddau yn datrys yr un llwyth tâl; y gwahaniaeth yw drifft cod, nid fforch ymddygiadol. Fersiynau o sibrwd y tu hwnt i'r ystod a ddadansoddwyd (hyd at o leiaf 1.0.25 ar adeg ysgrifennu) wedi'u gweld yn fyw ar y gofrestrfa, a'r coral-wraith parhaodd yr enw i ddringo ei ysgol fersiwn ei hun dros yr un ffenestr.

Dangosyddion cyfaddawd

Cafodd yr holl ddangosyddion isod eu tynnu o ffynhonnell y pecyn ar y ddisg. Mae dangosyddion rhwydwaith wedi'u dad-ffagio.

Rhwydwaith

Dangosydd Swydd
hxxp://154[.]57[.]164[.]71:30782 Targed PUT C2 (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 C2 PUT wrth gefn (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 C2 PUT wrth gefn (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 C2 PUT wrth gefn (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Casglwr goleuadau
169[.]254[.]169[.]254/latest/... Darlleniad tystlythyr IMDSv2 (ochr y targed, metadata AWS)

Ymddygiad/ffeil

Dangosydd Swydd
"postinstall": "node postinstall.js" Gosod fector
ecto_module: YAML gyda power_level / ship_deck / cargo_hold allweddi Cynllun maniffest Exfil
Marcwyr sinc ECT-472839, ECT-987654, ECT-654321, ECT-839201 Segment llwybr C2 /api/modules/<marker>
isAppWorker() giât: gwesteiwr /^[0-9a-f]{12}$/, mae cwd yn cynnwys /app/node_modules Amod actifadu
aws secretsmanager list-secrets dros us-east-1, eu-west-1, eu-central-1 rhestru cyfrinachau
HTB{...} crafu regex Cynhaeaf Cipio'r Faner

Hashiau ffeil (sha256, wedi'u cipio adeg dadansoddi)

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

Priodoliad ac ymddygiad a welwyd

Cyhoeddwyd y pum enw pecyn o dan ddau ddolen cyfrif npm, ond maent yn rhannu digon o seilwaith i'w trin fel un clwstwr: yr un peth modiwl_ecto cynllun amlwg, yr un peth ECT-472839 marcwr sinc cynradd, yr un peth gwefan.bwc ID casglwr, a phwyntiau terfyn C2 yn yr un peth bloc 154.57.164.0/24`. Y pecyn hadau (`coral-wraith, yn symlach a heb gatiau) ac felly mae'r teulu ecto-gatiog yn darllen fel iteriadau ar un pecyn cymorth yn hytrach nag ymdrechion annibynnol.

Mae'r pecynnau'n disgrifio eu hunain, mewn fersiynau diweddarach, fel “Llwyth tâl CTF ar gyfer profi cadwyn gyflenwi verdaccio.” Rydym yn amlygu'r label hwnnw fel ffaith arsylladwy ac nid ydym yn ei ailddatgan fel canfyddiad am bwrpas. Mae'r hyn y mae'r cod yn ei wneud yn ddiamwys ac yn annibynnol ar sut mae wedi'i labelu: mae'n darllen manylion mewngofnodi rôl IAM o'r gwasanaeth metadata achos, yn rhestru cyfrinachau a reolir ar draws tair rhanbarth AWS, ac yn trosglwyddo'r canlyniadau i IP cyhoeddus a chasglwr gwe-fachau trydydd parti. Ni fyddai angen y rhestr wrth gefn IP cyhoeddus, y darlleniadau manylion mewngofnodi IMDS, na'r galwadau Rheolwr Cyfrinachau traws-ranbarthol ar harnais prawf dolennog yn unig. Gan fod yr allfa a'r cyrhaeddiad manylion mewngofnodi yn real, dosbarthwyd y fersiynau wedi'u giatio yn faleisus.

Y giât cynhwysydd-yn-unig yw'r nodwedd fwyaf nodedig yn weithredol. Mae'n fesur osgoi - aros yn dawel ar liniaduron ac mewn blychau tywod dadansoddi - ac yn fesur targedu, gan danio dim ond lle mae rôl IAM go iawn a chyfrinachau byw yn fwyaf tebygol o fod yn bresennol. Ni fyddai dadansoddwyr sy'n rhedeg y pecynnau hyn mewn blwch tywod generig yn sylwi ar ddim; dim ond o dan enw gwesteiwr arddull Docker a llwybr gosod yn y cynhwysydd y mae'r ymddygiad yn amlygu.

Effaith, tueddiadau a chanllawiau i amddiffynwyr

Yr amlygiad yma yw datgeliad manylion mewn cwmwl a chyfrinachau y tu mewn i gynwysyddion adeiladu ac amser rhedeg. Mae manylion mewn rôl IAM a dynnir o IMDS yn cario pa bynnag ganiatâd sydd gan y rôl honno; rheolwrcyfrinachau:RhestrCyfrinachau (ac unrhyw ddilyniant CaelGwerthCyfrinachol) yn ehangu hynny i gyfrinachau cymwysiadau sydd wedi'u storio. Mae dympiau newidynnau amgylcheddol yn aml yn cario tocynnau cofrestrfa, URLau cronfa ddata, ac allweddi API. Mewn cyd-destun CI neu gynhwysydd - yn union yr hyn y mae'r giât yn ei ddewis - mae un gosodiad trawsdoriadol o un o'r pecynnau hyn yn ddigon i ollwng y deunydd hwnnw.

Mae ectoplasm yn cyd-fynd â phatrwm rydyn ni'n parhau i'w weld: llwythi tâl amser gosod sy'n estyn am fetadata cwmwl a chyfrinachau rheoledig yn hytrach na ffeiliau lleol, ac sy'n eu galluogi i danio mewn amgylcheddau gwerth uchel yn unig. Mae dau arsylwad amddiffynnol yn dilyn.

  • Mae'r siâp yn ganfyddadwyBachyn gosod npm/PyPI y mae ei graff galwad yn cyrraedd API cyfrinachau cwmwl (rheolwr cyfrinachau aws, cyfrinachau gcloud, az keyvault) neu'r cyfeiriad IMDS a sinc allfa rhwydwaith yn batrwm cul, signal uchel — bron byth y mae'n digwydd mewn sgript cylch bywyd cyfreithlon. Dadansoddiad llif statig gall ei nodi heb ddibynnu ar unrhyw barth neu IP penodol.
  • Mae caledu amgylcheddol yn ei ddiflasu. Mae gorfodi IMDSv2 gyda therfyn hop o 1 yn atal llwythi gwaith cynwysyddion rhag cyrraedd metadata achosion; mae cwmpasu rolau IAM i'r breintiau lleiaf yn cyfyngu radiws ffrwydrad unrhyw gymhwyster sy'n gollwng; a rhedeg gosodiadau gyda –anwybyddu-sgriptiau yn CI mae'n tynnu'r fector install-hook yn gyfan gwbl ar gyfer pecynnau nad oes eu hangen arnynt.

I amddiffynwyr, y gwiriadau ymarferol yw: rhybudd am gysylltiadau allanol o gynwysyddion adeiladu/CI i IPs cyhoeddus nad ydynt ar y rhestr ganiatâd yn ystod npm gosod; cadwch lygad am fynediad IMDS sy'n tarddu o sgriptiau cylch bywyd pecynnau; a thrin unrhyw fachyn gosod sy'n mynd allan i CLI cwmwl fel un amheus nes profir fel arall.

Dau nodyn pellach sy'n benodol i'r clwstwr hwn. Yn gyntaf, oherwydd bod actifadu wedi'i giatio i amgylcheddau cynwysyddion, gall pecyn sy'n ymddangos yn anadweithiol pan gaiff ei wirio ar orsaf waith fod yn fyw mewn cynhyrchiad o hyd - mae angen i wirio atgynhyrchu enw gwesteiwr a llwybr y cynhwysydd, neu ddarllen y ffynhonnell yn uniongyrchol, yn hytrach na dibynnu ar "Fe'i gosodais i ac ni ddigwyddodd dim." Yn ail, mae defnyddio gwasanaeth archwilio ceisiadau cyhoeddus fel casglwr goleudy yn golygu y gellir adfer rhywfaint o'r data a all-hidlwyd ar gyfer ymateb i ddigwyddiadau: gall sefydliad sy'n dod o hyd i un o'r pecynnau hyn yn ei goeden ddibyniaeth resymu ynghylch yr hyn y byddai goleudy llwyddiannus wedi'i gynnwys o resymeg casglu'r llwyth tâl, a dylai gylchdroi unrhyw gymwysterau rôl IAM, tocynnau cofrestrfa, a chyfrinachau a reolir a oedd yn gyraeddadwy o'r amgylchedd adeiladu neu amser rhedeg yr effeithiwyd arno. Cylchdroi tystlythyrau, nid tynnu pecyn, yw'r adferiad gweithredol ar ôl i osodiad redeg.

offer-sca-meddalwedd-offer-dadansoddi-cyfansoddiad
Blaenoriaethu, cywiro a diogelu eich risgiau meddalwedd
Cael eich Cyfrif Am Ddim.
Nid oes angen cerdyn credyd.

Sicrhau eich Datblygiad a Chyflwyniad Meddalwedd

gyda Phecyn Cynnyrch Xygeni