{"id":20485,"date":"2026-06-15T13:15:03","date_gmt":"2026-06-15T10:15:03","guid":{"rendered":"https:\/\/sysadmin.courses\/%d0%b4%d0%b5%d1%81%d1%8f%d1%82%d1%8c-%d0%bb%d0%b5%d1%82-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b8-%d0%ba%d0%b0%d0%ba-%d0%ba%d0%b8%d1%82%d0%b0%d0%b9%d1%81%d0%ba%d0%b0%d1%8f-apt-%d0%b3%d1%80%d1%83%d0%bf\/"},"modified":"2026-06-15T13:18:08","modified_gmt":"2026-06-15T10:18:08","slug":"desimt-metu-viduje-kaip-kinijos-apt-grupe-gyveno-linux-sistemoje-per-pam-ir-openssh-uzpakalines-dureles","status":"publish","type":"post","link":"https:\/\/sysadmin.courses\/lt\/desimt-metu-viduje-kaip-kinijos-apt-grupe-gyveno-linux-sistemoje-per-pam-ir-openssh-uzpakalines-dureles\/","title":{"rendered":"De\u0161imt met\u0173 viduje: kaip Kinijos APT grup\u0117 gyveno Linux sistemoje per PAM ir OpenSSH u\u017epakalines dureles"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Kai Sygnia komanda prad\u0117jo analizuoti pa\u017eeidim\u0105, kur\u012f v\u0117liau pavadins Operation Highland, ankstyviausi artefaktai buvo datuoti 2016 metais. Tai buvo ne naujas \u012fsilau\u017eimas \u2014 beveik de\u0161imt met\u0173 nepasteb\u0117to buvimo izoliuotame kritin\u0117s infrastrukt\u016bros tinkle. Velvet Ant \u2014 Kinijos APT grup\u0117, kuri\u0105 Sygnia seka per kelis incidentus \u2014 nei\u0161naudojo jokios pa\u017eeid\u017eiamyb\u0117s ir nepaliko akivaizd\u017ei\u0173 p\u0117dsak\u0173. Ji pakeit\u0117 pa\u010dias programas, kurios nusprend\u017eia, kas gali prisijungti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Velvet Ant pakeit\u0117 teis\u0117tus PAM modulius ir OpenSSH dvejetainius failus u\u017epakalini\u0173 dur\u0173 kopijomis. Ne nauja kenk\u0117ji\u0161ka programa, kuri\u0105 gali aptikti skeneriai, \u2014 o patikim\u0173 sistemini\u0173 komponent\u0173 modifikacija, kuriais operacin\u0117 sistema pasitiki pagal nutyl\u0117jim\u0105. Slapta\u017eod\u017eiai buvo kei\u010diami \u2014 u\u017epakalin\u0117s durys liko. Sesijos buvo nutraukiamos \u2014 grup\u0117 gr\u012f\u017edavo. \u012eprastos reagavimo \u012f incidentus priemon\u0117s neveik\u0117, nes pats autentifikacijos mechanizmas dirbo u\u017epuolik\u0173 naudai.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tai ne pirmas kartas, kai Velvet Ant taiko \u0161i\u0105 taktik\u0105. 2024 metais Sygnia u\u017efiksavo t\u0105 pa\u010di\u0105 grup\u0119, piktnaud\u017eiaujan\u010di\u0105 F5 BIG-IP \u012frenginiais nuolatiniam prieigos palaikymui. Tada \u2014 CVE-2024-20399 i\u0161naudojim\u0105 Cisco NX-OS sistemoje, siekiant \u012fdiegti u\u017epakalines duris tiesiai \u012f Nexus komutatorius. Kaskart aptikus vien\u0105 placdarmij\u0105, grup\u0117 traukdavosi giliau \u2014 \u012f ma\u017eiau kontroliuojam\u0105 infrastrukt\u016br\u0105. Operation Highland \u2014 kitas \u017eingsnis: giliau jau neb\u0117ra kur. Tai pats autentifikacijos sluoksnis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>KAS YRA PAM IR KOD\u0116L TAI SVARBU<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PAM (Pluggable Authentication Modules) \u2014 tai Linux posistem\u0117, per kuri\u0105 vyksta beveik kiekvienos paslaugos autentifikacija: SSH prisijungimas, sudo, su, vietin\u0117 konsol\u0117. Kai serverio komandin\u0117je eilut\u0117je \u012fvedate slapta\u017eod\u012f, j\u012f tikrina b\u016btent PAM. Esminis modulis \u2014 <code>pam_unix.so<\/code> \u2014 atsakingas u\u017e standartin\u012f slapta\u017eod\u017eio tikrinim\u0105 pagal <code>\/etc\/shadow<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSH \u2014 standartinis SSH paketas kiekviename Linux serveryje: <code>sshd<\/code> kaip serverio demonas, <code>ssh<\/code> kaip klientas, <code>scp<\/code> fail\u0173 perk\u0117limui. Abu komponentai \u2014 PAM ir OpenSSH \u2014 yra nuotolinio administravimo pagrindas. Jei u\u017epuolikas juos valdo, jis valdo visk\u0105: kas gali prisijungti, k\u0105 mato prisijung\u0119s, kokie veiksmai \u012fra\u0161omi. Ir visa tai nepalieka n\u0117 eilut\u0117s \u012fprastuose \u017eurnaluose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Svarbus kontekstas: <code>pam_unix.so<\/code> ir OpenSSH dvejetaini\u0173 fail\u0173 pakeitimas reikalauja root teisi\u0173 tiksliniame serveryje. Tai ne pradinio \u012fsiskverbimo technika \u2014 tai \u012fsitvirtinimo technika, taikoma jau gavus root prieig\u0105. Tod\u0117l Velvet Ant tiek daug j\u0117g\u0173 skyr\u0117 pirmiems dviem etapams: gauti pradin\u0119 prieig\u0105, pasiekti izoliuot\u0105 segment\u0105, gauti root \u2014 ir tik tada keisti autentifikacijos failus. Gynybos po\u017ei\u016briu tai rei\u0161kia: kontroliuoti, kas ir kada gauna root, ne ma\u017eiau svarbu nei steb\u0117jimas po fakto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TIKROJI ATAKOS GRANDIN\u0116<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tikslinis tinklas netur\u0117jo tiesiogin\u0117s interneto prieigos \u2014 u\u017epuolikai tur\u0117jo tiesti keli\u0105 etapais. Pirmajame etape Velvet Ant \u012fsitvirtino interneto pus\u0117je esan\u010diuose serveriuose. Ten buvo \u012fdiegta modifikuota GS-Netcat versija \u2014 \u012frankis i\u0161 vie\u0161o Global Socket Toolkit rinkinio. Dvejetainis failas buvo pavadintas <code>auditdb<\/code> ir pad\u0117tas \u012f <code>\/usr\/sbin\/<\/code> \u2014 tarp teis\u0117t\u0173 sistemini\u0173 \u012franki\u0173. Kad slapt\u0173 nuo proces\u0173 s\u0105ra\u0161\u0173, \u012frankis perra\u0161ydavo savo <code>argv[0]<\/code> reik\u0161m\u0119 \u012f <code>[khubd]<\/code>, imituodamas teis\u0117t\u0105 branduolio proces\u0105. Nuolatinis veikimas buvo u\u017etikrintas per systemd vieneto fail\u0105 naujesn\u0117se sistemose arba \u012fterpt\u0105 eilut\u0119 \u012f <code>\/etc\/init.d\/<\/code> scenarijus senesn\u0117se \u2014 abiem atvejais maskuojantis kaip Chrome paslauga.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lygiagre\u010diai buvo \u012fdiegtas SOCKS5 tarpinis serveris Perl kalba \u2014 vie\u0161o ssspl projekto adaptuota realizacija \u2014 srautui tunelinti ir \u0161oniniam jud\u0117jimui. Procesas maskavosi kaip <code>smbd -D<\/code>. Kiekvienas pavyzdys naudojo unikal\u0173 failo pavadinim\u0105, proceso pavadinim\u0105 ir klausymosi prievad\u0105 \u2014 kad b\u016bt\u0173 sunkiau koreliuoti duomenis tarp pa\u017eeist\u0173 serveri\u0173.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antrajame etape grup\u0117 per\u0117jo per IT tinkl\u0105 \u012f izoliuot\u0105 kritin\u0117s infrastrukt\u016bros segment\u0105. Tam panaudojo pa\u017eeist\u0105 nginx server\u012f: jo konfig\u016bracija buvo pakeista taip, kad \u012feinan\u010dios u\u017eklausos tam tikru URL b\u016bt\u0173 perduodamos \u012f backend server\u012f, kur FastCGI apvalkalas (<code>fcgiwrap<\/code>) vykd\u0117 specialiai sukurt\u0105 dvejetain\u012f fail\u0105 <code>uptime<\/code>. Tas failas u\u017emegzdavo SSH ry\u0161\u012f su serveriu izoliuotame segmente ir ten vykdydavo scenarijus \u2014 pagal HTTP POST u\u017eklausoje perduotus parametrus. Tiesiogin\u0117s prieigos prie izoliuoto tinklo nereik\u0117jo: komandos keliaudavo per paprastas HTTP u\u017eklausas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tre\u010diajame \u2014 ir pagrindiniame \u2014 etape u\u017epuolikai per\u0117m\u0117 autentifikacijos paket\u0105. Pa\u017eeistuose serveriuose <code>pam_unix.so<\/code> buvo pakeistas u\u017epakalini\u0173 dur\u0173 kopija. Sygnia aptiko devynis skirtingus variantus \u2014 kiekvienas sukompiliuotas atskiroje aplinkoje, kas rodo gerai organizuot\u0105 gamybos konvejer\u012f. Du pagrindiniai tipai: pirmasis pri\u0117m\u0117 u\u017ekoduot\u0105 slapta\u017eod\u012f ir visi\u0161kai aplenkdavo standartin\u012f tikrinim\u0105 (slapta\u017eodis po naudojimo b\u016bdavo nedelsiant anuliuojamas atmintyje, kad nesimatyt\u0173 atminties i\u0161krovoje); antrasis papildomai \u012fra\u0161ydavo tikruosius vartotoj\u0173 vardus ir slapta\u017eod\u017eius \u012f pasl\u0117pt\u0105 fail\u0105 <code>\/usr\/sbin\/.ssh.log<\/code>. \u0160iame variante u\u017epakalini\u0173 dur\u0173 slapta\u017eodis buvo saugomas dvejetainiame faile u\u017e\u0161ifruotu pavidalu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenSSH dvejetainiai failai \u2014 <code>ssh<\/code>, <code>sshd<\/code>, <code>scp<\/code>, kai kuriais atvejais ir <code>ssh-keygen<\/code> \u2014 taip pat buvo pakeisti. Modifikuotas <code>sshd<\/code> per\u0117m\u0117 ir saugojo vis\u0173 \u012feinan\u010di\u0173 ry\u0161i\u0173 kredencialus u\u017e\u0161ifruotame faile <code>\/usr\/share\/man9\/ph\/.ph.man<\/code>. Kiekvienas \u012fra\u0161as fiksavo ry\u0161io krypt\u012f, autentifikacijos tip\u0105 ir s\u0117kmingum\u0105. Tiek <code>ssh<\/code>, tiek <code>sshd<\/code> taip pat registravo kiekvien\u0105 sesijoje \u012fvest\u0105 komand\u0105: <code>sshd<\/code> ra\u0161\u0117 failus \u012f <code>\/usr\/share\/man9\/ph\/<\/code> vardais <code>s{MD5(username+TTY)}<\/code>, o <code>ssh<\/code> \u2014 vardais <code>c{MD5(UID+SSH_TTY)}<\/code>. Visi sukurti failai ir katalogai buvo timestompinami \u2014 j\u0173 laiko \u017eymos pakei\u010diamos \u012f <code>\/etc\/shells<\/code> suk\u016brimo laik\u0105. Modifikuotas <code>scp<\/code>, paleidus su root teis\u0117mis, gal\u0117jo i\u0161jungti SELinux. Jo <code>!<\/code> v\u0117liava maskavo proces\u0105 kaip <code>[kauditd] -sh<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Viena detal\u0117 atskleid\u017eia \u0161ios kampanijos operacin\u0119 drausm\u0119: modifikuotas <code>ssh<\/code> tur\u0117jo papildom\u0105 <code>-d<\/code> v\u0117liav\u0105, i\u0161jungian\u010di\u0105 pa\u010dios grup\u0117s kredencial\u0173 ir klavi\u0161\u0173 paspaudim\u0173 registravim\u0105. Kai Velvet Ant operatoriai dirbo per u\u017epakalini\u0173 dur\u0173 dvejetain\u012f fail\u0105 \u2014 jie aktyvuodavo \u0161i\u0105 v\u0117liav\u0105, kad nepalikt\u0173 p\u0117dsak\u0173. Tre\u010diasis nuolatin\u0117s prieigos sluoksnis buvo paprastesnis, bet ne ma\u017eiau patikimas: grup\u0117 prid\u0117davo savo vie\u0161uosius raktus prie <code>authorized_keys<\/code> pa\u017eeistuose serveriuose \u2014 nepriklausoma prieiga be slapta\u017eod\u017ei\u0173.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>LAIKO JUOSTA<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ankstyviausi klavi\u0161\u0173 registravimo artefaktai \u0161ioje aplinkoje datuoti 2016 metais. Jie rasti senajame modifikuoto OpenSSH variante, kuris sesij\u0173 \u017eurnalus ra\u0161\u0117 \u012f <code>\/var\/lib\/sam\/<\/code> failais pavadintais <code>sam_{timestamp}<\/code> \u2014 ma\u017eiau rafinuotai nei v\u0117lesni variantai, ir b\u016btent tai leido Sygnia nustatyti, kada grup\u0117 pirm\u0105 kart\u0105 pasirod\u0117 aplinkoje. Buvimas t\u0119s\u0117si beveik de\u0161imtmet\u012f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sygnia seka Velvet Ant per kelis nepriklausomus tyrimus su skirtingomis aukomis. 2024 metais grup\u0117 buvo sugauta piktnaud\u017eiaujant F5 BIG-IP \u012frenginiais kitoje organizacijoje. T\u0173 pa\u010di\u0173 met\u0173 pabaigoje \u2014 i\u0161naudojant CVE-2024-20399, Cisco NX-OS nulin\u0117s dienos pa\u017eeid\u017eiamyb\u0119, siekiant \u012fdiegti VELVETSHELL u\u017epakalines duris tiesiai \u012f Nexus komutatorius. Abiem atvejais Sygnia paskelb\u0117 i\u0161samius techninius apra\u0161ymus su IOC s\u0105ra\u0161ais.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schema pastovi: aptikta Velvet Ant nepasitraukia \u2014 ji pereina \u012f infrastrukt\u016br\u0105, kuri\u0105 gyn\u0117jai stebi ma\u017eiau. Tinkl\u0173 \u012frenginiai su patentuota OS stebimi pras\u010diau nei Windows serveriai. Linux komutatoriai \u2014 pras\u010diau nei \u012frenginiai. Pa\u010di\u0173 Linux serveri\u0173 autentifikacijos paketas \u2014 pras\u010diausiai i\u0161 visko. Operation Highland paskelbta Sygnia 2026 m. bir\u017eelio 11 d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>KOD\u0116L TAI SVARBU<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Standartinis reagavimo \u012f incidentus scenarijus numato: pakeisti slapta\u017eod\u017eius, nutraukti sesijas, izoliuoti server\u012f. N\u0117 viena i\u0161 \u0161i\u0173 priemoni\u0173 neveikia, kai pa\u017eeistas pats autentifikacijos mechanizmas. Slapta\u017eod\u017eio keitimas beprasmis, jei <code>pam_unix.so<\/code> priima u\u017epakalini\u0173 dur\u0173 slapta\u017eod\u012f nepriklausomai nuo <code>\/etc\/shadow<\/code> turinio. Sesij\u0173 nutraukimas beprasmis, jei modifikuotas modulis perims naujus kredencialus kito teis\u0117to administratoriaus prisijungimo metu. EDR, IDS ir SIEM nemato nieko nenormalaus \u2014 prisijungimai atrodo kaip \u012fprasta administracin\u0117 veikla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kiekvienam sistemos administratoriui, valdan\u010diam produkcin\u012f server\u012f su SSH prieiga, tai tiesiogiai nurodo akl\u0105j\u0105 zon\u0105: jei u\u017epuolikas tur\u0117jo prieig\u0105 prie <code>\/lib\/security\/pam_unix.so<\/code> ar OpenSSH dvejetaini\u0173 fail\u0173 \u2014 \u017eurnal\u0173 patikrinimas nieko neparodys. \u0160ios klas\u0117s atakoms, kurias Sygnia vadina \u201eauthentication-layer persistence&#8221;, reikia atskiros aptikimo strategijos: ne \u017eurnal\u0173 analiz\u0117, o pa\u010di\u0173 vykdom\u0173j\u0173 fail\u0173 vientisumo kontrol\u0117.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Velvet Ant schema nuosekli: kaskart aptikus vien\u0105 placdarmij\u0105, grup\u0117 jau tur\u0117jo kit\u0105, gilesn\u0119. Operation Highland \u2014 tai ta\u0161kas, po kurio u\u017epuolikai kontroliavo ne konkreti\u0105 paslaug\u0105, o geb\u0117jim\u0105 autentifikuotis visuose aplinkos serveriuose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>KAIP APSISAUGOTI SAVO SERVERIUOSE<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pagrindinis apsaugos nuo \u0161ios klas\u0117s atak\u0173 \u012frankis \u2014 autentifikacijos dvejetaini\u0173 fail\u0173 vientisumo steb\u0117jimas. Ne konfig\u016bracijos failai, ne \u017eurnalai \u2014 b\u016btent vykdomieji failai. AIDE, auditd su ra\u0161ymo steb\u0117jimu arba bet kuris FIM sprendimas turi apimti: <code>pam_unix.so<\/code> ir kitus modulius <code>\/lib\/security\/<\/code> bei <code>\/lib\/x86_64-linux-gnu\/security\/<\/code> kataloguose, PAM konfig\u016bracijas <code>\/etc\/pam.d\/<\/code>, OpenSSH dvejetainius failus \u2014 <code>ssh<\/code>, <code>sshd<\/code>, <code>scp<\/code>, <code>sftp<\/code>, <code>ssh-keygen<\/code>, fail\u0105 <code>sshd_config<\/code>, privilegijuot\u0173 vartotoj\u0173 <code>authorized_keys<\/code>, systemd vieneto failus ir paleidimo scenarijus. Bet koks \u0161i\u0173 fail\u0173 pakeitimas turi suaktyvinti \u012fsp\u0117jim\u0105, reikalaujant\u012f tyrimo, o ne tik \u012fra\u0161o \u017eurnale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Greit\u0105 \u012fdiegt\u0173 paket\u0173 vientisumo patikrinim\u0105 suteikia <code>dpkg --verify<\/code>. Debian ir Ubuntu sistemose \u0161i komanda lygina fail\u0173 kontrolines sumas su paketo metaduomenimis \u2014 tu\u0161\u010dia i\u0161vestis rei\u0161kia, kad failai nepakeisti, eilut\u0117 su prefiksu <code>??5??????<\/code> nurodo nesutampan\u010di\u0105 sum\u0105:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dpkg --verify openssh-server openssh-client libpam-modules<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0160is testas greitas, bet ne visi\u0161kai patikimas: u\u017epuolikas su root prieiga gali pataisyti ir dpkg duomen\u0173 baz\u0119. Patikimesnis b\u016bdas \u2014 palyginti SHA256 kontrolines sumas tiesiogiai su etaloniniu tos pa\u010dios distribucijos versijos vaizdu. Nor\u0117dami patikrinti <code>sshd<\/code> dvejetain\u012f fail\u0105: atsisi\u0173skite paket\u0105 i\u0161 oficialaus veidrod\u017eio atskirame \u0161variai sukonfig\u016bruotame kompiuteryje, i\u0161pakuokite ir palyginkite kontrolines sumas su tikrinamo serverio failais. Sutapimas \u2014 gerai; nesutapimas esant identi\u0161kai paketo versijai \u2014 rimtas persp\u0117jimo signalas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suma\u017einti rizik\u0105, kad root prieiga bus gauta i\u0161 anksto, padeda standartiniai kietinimo veiksmai: i\u0161junkite tiesiogin\u012f root prisijungim\u0105 per SSH (<code>PermitRootLogin no<\/code> faile <code>sshd_config<\/code>), nukreipkite vis\u0105 administracin\u0119 prieig\u0105 per vardines paskyras su tiksliai apibr\u0117\u017etomis <code>sudo<\/code> teis\u0117mis. MFA turi veikti prie\u0161 u\u017eklausai pasiekiant server\u012f, o ne jo viduje \u2014 pa\u017eeistas PAM papras\u010diausiai ignoruos vidin\u0119 MFA apsaug\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jei pa\u017eeidimas jau \u012fvyko \u2014 atk\u016brimo seka yra esminis dalykas. Slapta\u017eod\u017ei\u0173 keitimas prie\u0161 pakei\u010diant <code>pam_unix.so<\/code> nieko neduos: modifikuotas modulis perims naujus slapta\u017eod\u017eius kito prisijungimo metu. Seka: pirmiausia patikrinti ir pakeisti autentifikacijos dvejetainius failus, tada i\u0161valyti <code>authorized_keys<\/code>, ir tik tada keisti kredencialus. Sygnia ypa\u010d pabr\u0117\u017eia: PAM moduli\u0173 ir OpenSSH dvejetaini\u0173 fail\u0173 pakeitim\u0105 b\u016btina i\u0161 anksto i\u0161bandyti izoliuotoje laboratorijoje su identi\u0161ka konfig\u016bracija \u2014 nesuderinama versija ar tr\u016bkstama priklausomyb\u0117 gali visi\u0161kai u\u017eblokuoti SSH prieig\u0105 prie veikian\u010dio produktyvaus serverio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>K\u0104 DARYTI DABAR<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nepriklausomai nuo to, ar turite pagrindo \u012ftarti pa\u017eeidim\u0105, ar tiesiog norite \u012fsitikinti, kad sistema \u0161vari \u2014 patikrinkite Velvet Ant naudotus failus \u0161ioje kampanijoje. \u0160ios komandos ie\u0161ko Operation Highland b\u016bding\u0173 katalog\u0173 ir fail\u0173:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls -la \/usr\/sbin\/.ssh.log 2&gt;\/dev\/null\nls -la \/usr\/share\/man9\/ph\/ 2&gt;\/dev\/null\nls -la \/usr\/lib\/eth-scsi\/ 2&gt;\/dev\/null\nls -la \/var\/lib\/sam\/ 2&gt;\/dev\/null<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jei bet kuris i\u0161 \u0161i\u0173 katalog\u0173 ar fail\u0173 egzistuoja \u2014 tai tiesioginis \u0161ios kampanijos IOC. Atskirai patikrinkite <code>authorized_keys<\/code> root ir kit\u0173 privilegijuot\u0173 paskyr\u0173: Velvet Ant prid\u0117davo savo vie\u0161uosius raktus kaip tre\u010di\u0105 nuolatin\u0117s prieigos sluoksn\u012f. Root paskyroje:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/root\/.ssh\/authorized_keys<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kitiems vartotojams su prisijungimo apvalkalu \u2014 patikrinkite <code>~\/.ssh\/authorized_keys<\/code> j\u0173 nam\u0173 kataloguose. Bet koks raktas, kurio n\u0117ra j\u016bs\u0173 patikim\u0173 rakt\u0173 s\u0105ra\u0161e, yra potencialus IOC.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Visas Operation Highland kompromitacijos indikatori\u0173 (IOC) s\u0105ra\u0161as paskelbtas Sygnia ataskaitos priede. Jei j\u016bs\u0173 aplinka atitinka apra\u0161yt\u0105 profil\u012f \u2014 kritin\u0117 infrastrukt\u016bra, izoliuotas tinklas, Linux serveriai su ilgu veikimo laiku be reguliaraus dvejetaini\u0173 fail\u0173 audito \u2014 PAM ir OpenSSH vientisumo patikrinimas tur\u0117t\u0173 b\u016bti prioritetas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>I\u0160VADOS<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Operation Highland parodo, kur atkeliauja pa\u017eangi ilgalaik\u0117 ataka, kai gyn\u0117jai tinkamai dirba: kaskart aptikus placdarmij\u0105, Velvet Ant \u0117jo giliau, kol pasiek\u0117 sluoksn\u012f, kurio dauguma Blue Team komand\u0173 niekada netikrina. PAM ir OpenSSH \u2014 ne \u201etiesiog paketai&#8221;. Tai mechanizmas, nusprend\u017eiantis, kas yra tas, kuo prisistato. Jo pa\u017eeidimas vienu metu panaikina MFA, stipri\u0173 slapta\u017eod\u017ei\u0173 ir \u017eurnal\u0173 audito veiksmingum\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Praktin\u0117 i\u0161vada sistemos administratoriui: FIM autentifikacijos dvejetainiams failams \u2014 ne paranoja, o minimalus higienos reikalavimas kiekvienam serveriui, kuriame vyksta ilgalaikiai administraciniai procesai. Organizacijoms su kritine infrastrukt\u016bra ar izoliuotais tinklais: pasitik\u0117jimas komponentu vien tod\u0117l, kad jis sisteminis \u2014 tai b\u016btent ta gr\u0117sm\u0117s modelio spraga, kuri\u0105 Velvet Ant i\u0161naudoja jau beveik de\u0161imtmet\u012f.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kai Sygnia komanda prad\u0117jo analizuoti pa\u017eeidim\u0105, kur\u012f v\u0117liau pavadins Operation Highland, ankstyviausi artefaktai buvo datuoti 2016 metais. Tai buvo ne naujas \u012fsilau\u017eimas \u2014 beveik de\u0161imt met\u0173 nepasteb\u0117to buvimo izoliuotame kritin\u0117s infrastrukt\u016bros tinkle. Velvet Ant \u2014 Kinijos APT grup\u0117, kuri\u0105 Sygnia seka per kelis incidentus \u2014 nei\u0161naudojo jokios pa\u017eeid\u017eiamyb\u0117s ir nepaliko akivaizd\u017ei\u0173 p\u0117dsak\u0173. Ji pakeit\u0117 pa\u010dias programas, kurios nusprend\u017eia, kas gali prisijungti. Velvet Ant pakeit\u0117 teis\u0117tus PAM modulius ir OpenSSH dvejetainius failus u\u017epakalini\u0173 dur\u0173 kopijomis. Ne nauja kenk\u0117ji\u0161ka programa, kuri\u0105 gali aptikti skeneriai, \u2014 o patikim\u0173 sistemini\u0173 komponent\u0173 modifikacija, kuriais operacin\u0117 sistema pasitiki pagal nutyl\u0117jim\u0105. Slapta\u017eod\u017eiai buvo kei\u010diami \u2014 u\u017epakalin\u0117s durys liko. Sesijos buvo nutraukiamos \u2014 grup\u0117 gr\u012f\u017edavo. \u012eprastos reagavimo \u012f incidentus priemon\u0117s neveik\u0117, nes pats autentifikacijos mechanizmas dirbo u\u017epuolik\u0173 naudai. Tai ne pirmas kartas, kai Velvet Ant taiko \u0161i\u0105 taktik\u0105. 2024 metais Sygnia u\u017efiksavo t\u0105 pa\u010di\u0105 grup\u0119, piktnaud\u017eiaujan\u010di\u0105 F5 BIG-IP \u012frenginiais nuolatiniam prieigos palaikymui. Tada \u2014 CVE-2024-20399 i\u0161naudojim\u0105 Cisco NX-OS sistemoje, siekiant \u012fdiegti u\u017epakalines duris tiesiai \u012f Nexus komutatorius. Kaskart aptikus vien\u0105 placdarmij\u0105, grup\u0117 traukdavosi giliau \u2014 \u012f ma\u017eiau kontroliuojam\u0105 infrastrukt\u016br\u0105. Operation Highland \u2014 kitas \u017eingsnis: giliau jau neb\u0117ra kur. Tai pats autentifikacijos sluoksnis. KAS YRA PAM IR KOD\u0116L TAI SVARBU PAM (Pluggable Authentication Modules) \u2014 tai Linux posistem\u0117, per kuri\u0105 vyksta beveik kiekvienos paslaugos autentifikacija: SSH prisijungimas, sudo, su, vietin\u0117 konsol\u0117. Kai serverio komandin\u0117je eilut\u0117je \u012fvedate slapta\u017eod\u012f, j\u012f tikrina b\u016btent PAM. Esminis modulis \u2014 pam_unix.so \u2014 atsakingas u\u017e standartin\u012f slapta\u017eod\u017eio tikrinim\u0105 pagal \/etc\/shadow. OpenSSH \u2014 standartinis SSH paketas kiekviename Linux serveryje: sshd kaip serverio demonas, ssh kaip klientas, scp fail\u0173 perk\u0117limui. Abu komponentai \u2014 PAM ir OpenSSH \u2014 yra nuotolinio administravimo pagrindas. Jei u\u017epuolikas juos valdo, jis valdo visk\u0105: kas gali prisijungti, k\u0105 mato prisijung\u0119s, kokie veiksmai \u012fra\u0161omi. Ir visa tai nepalieka n\u0117 eilut\u0117s \u012fprastuose \u017eurnaluose. Svarbus kontekstas: pam_unix.so ir OpenSSH dvejetaini\u0173 fail\u0173 pakeitimas reikalauja root teisi\u0173 tiksliniame serveryje. Tai ne pradinio \u012fsiskverbimo technika \u2014 tai \u012fsitvirtinimo technika, taikoma jau gavus root prieig\u0105. Tod\u0117l Velvet Ant tiek daug j\u0117g\u0173 skyr\u0117 pirmiems dviem etapams: gauti pradin\u0119 prieig\u0105, pasiekti izoliuot\u0105 segment\u0105, gauti root \u2014 ir tik tada keisti autentifikacijos failus. Gynybos po\u017ei\u016briu tai rei\u0161kia: kontroliuoti, kas ir kada gauna root, ne ma\u017eiau svarbu nei steb\u0117jimas po fakto. TIKROJI ATAKOS GRANDIN\u0116 Tikslinis tinklas netur\u0117jo tiesiogin\u0117s interneto prieigos \u2014 u\u017epuolikai tur\u0117jo tiesti keli\u0105 etapais. Pirmajame etape Velvet Ant \u012fsitvirtino interneto pus\u0117je esan\u010diuose serveriuose. Ten buvo \u012fdiegta modifikuota GS-Netcat versija \u2014 \u012frankis i\u0161 vie\u0161o Global Socket Toolkit rinkinio. Dvejetainis failas buvo pavadintas auditdb ir pad\u0117tas \u012f \/usr\/sbin\/ \u2014 tarp teis\u0117t\u0173 sistemini\u0173 \u012franki\u0173. Kad slapt\u0173 nuo proces\u0173 s\u0105ra\u0161\u0173, \u012frankis perra\u0161ydavo savo argv[0] reik\u0161m\u0119 \u012f [khubd], imituodamas teis\u0117t\u0105 branduolio proces\u0105. Nuolatinis veikimas buvo u\u017etikrintas per systemd vieneto fail\u0105 naujesn\u0117se sistemose arba \u012fterpt\u0105 eilut\u0119 \u012f \/etc\/init.d\/ scenarijus senesn\u0117se \u2014 abiem atvejais maskuojantis kaip Chrome paslauga. Lygiagre\u010diai buvo \u012fdiegtas SOCKS5 tarpinis serveris Perl kalba \u2014 vie\u0161o ssspl projekto adaptuota realizacija \u2014 srautui tunelinti ir \u0161oniniam jud\u0117jimui. Procesas maskavosi kaip smbd -D. Kiekvienas pavyzdys naudojo unikal\u0173 failo pavadinim\u0105, proceso pavadinim\u0105 ir klausymosi prievad\u0105 \u2014 kad b\u016bt\u0173 sunkiau koreliuoti duomenis tarp pa\u017eeist\u0173 serveri\u0173. Antrajame etape grup\u0117 per\u0117jo per IT tinkl\u0105 \u012f izoliuot\u0105 kritin\u0117s infrastrukt\u016bros segment\u0105. Tam panaudojo pa\u017eeist\u0105 nginx server\u012f: jo konfig\u016bracija buvo pakeista taip, kad \u012feinan\u010dios u\u017eklausos tam tikru URL b\u016bt\u0173 perduodamos \u012f backend server\u012f, kur FastCGI apvalkalas (fcgiwrap) vykd\u0117 specialiai sukurt\u0105 dvejetain\u012f fail\u0105 uptime. Tas failas u\u017emegzdavo SSH ry\u0161\u012f su serveriu izoliuotame segmente ir ten vykdydavo scenarijus \u2014 pagal HTTP POST u\u017eklausoje perduotus parametrus. Tiesiogin\u0117s prieigos prie izoliuoto tinklo nereik\u0117jo: komandos keliaudavo per paprastas HTTP u\u017eklausas. Tre\u010diajame \u2014 ir pagrindiniame \u2014 etape u\u017epuolikai per\u0117m\u0117 autentifikacijos paket\u0105. Pa\u017eeistuose serveriuose pam_unix.so buvo pakeistas u\u017epakalini\u0173 dur\u0173 kopija. Sygnia aptiko devynis skirtingus variantus \u2014 kiekvienas sukompiliuotas atskiroje aplinkoje, kas rodo gerai organizuot\u0105 gamybos konvejer\u012f. Du pagrindiniai tipai: pirmasis pri\u0117m\u0117 u\u017ekoduot\u0105 slapta\u017eod\u012f ir visi\u0161kai aplenkdavo standartin\u012f tikrinim\u0105 (slapta\u017eodis po naudojimo b\u016bdavo nedelsiant anuliuojamas atmintyje, kad nesimatyt\u0173 atminties i\u0161krovoje); antrasis papildomai \u012fra\u0161ydavo tikruosius vartotoj\u0173 vardus ir slapta\u017eod\u017eius \u012f pasl\u0117pt\u0105 fail\u0105 \/usr\/sbin\/.ssh.log. \u0160iame variante u\u017epakalini\u0173 dur\u0173 slapta\u017eodis buvo saugomas dvejetainiame faile u\u017e\u0161ifruotu pavidalu. OpenSSH dvejetainiai failai \u2014 ssh, sshd, scp, kai kuriais atvejais ir ssh-keygen \u2014 taip pat buvo pakeisti. Modifikuotas sshd per\u0117m\u0117 ir saugojo vis\u0173 \u012feinan\u010di\u0173 ry\u0161i\u0173 kredencialus u\u017e\u0161ifruotame faile \/usr\/share\/man9\/ph\/.ph.man. Kiekvienas \u012fra\u0161as fiksavo ry\u0161io krypt\u012f, autentifikacijos tip\u0105 ir s\u0117kmingum\u0105. Tiek ssh, tiek sshd taip pat registravo kiekvien\u0105 sesijoje \u012fvest\u0105 komand\u0105: sshd ra\u0161\u0117 failus \u012f \/usr\/share\/man9\/ph\/ vardais s{MD5(username+TTY)}, o ssh \u2014 vardais c{MD5(UID+SSH_TTY)}. Visi sukurti failai ir katalogai buvo timestompinami \u2014 j\u0173 laiko \u017eymos pakei\u010diamos \u012f \/etc\/shells suk\u016brimo laik\u0105. Modifikuotas scp, paleidus su root teis\u0117mis, gal\u0117jo i\u0161jungti SELinux. Jo ! v\u0117liava maskavo proces\u0105 kaip [kauditd] -sh. Viena detal\u0117 atskleid\u017eia \u0161ios kampanijos operacin\u0119 drausm\u0119: modifikuotas ssh tur\u0117jo papildom\u0105 -d v\u0117liav\u0105, i\u0161jungian\u010di\u0105 pa\u010dios grup\u0117s kredencial\u0173 ir klavi\u0161\u0173 paspaudim\u0173 registravim\u0105. Kai Velvet Ant operatoriai dirbo per u\u017epakalini\u0173 dur\u0173 dvejetain\u012f fail\u0105 \u2014 jie aktyvuodavo \u0161i\u0105 v\u0117liav\u0105, kad nepalikt\u0173 p\u0117dsak\u0173. Tre\u010diasis nuolatin\u0117s prieigos sluoksnis buvo paprastesnis, bet ne ma\u017eiau patikimas: grup\u0117 prid\u0117davo savo vie\u0161uosius raktus prie authorized_keys pa\u017eeistuose serveriuose \u2014 nepriklausoma prieiga be slapta\u017eod\u017ei\u0173. LAIKO JUOSTA Ankstyviausi klavi\u0161\u0173 registravimo artefaktai \u0161ioje aplinkoje datuoti 2016 metais. Jie rasti senajame modifikuoto OpenSSH variante, kuris sesij\u0173 \u017eurnalus ra\u0161\u0117 \u012f \/var\/lib\/sam\/ failais pavadintais sam_{timestamp} \u2014 ma\u017eiau rafinuotai nei v\u0117lesni variantai, ir b\u016btent tai leido Sygnia nustatyti, kada grup\u0117 pirm\u0105 kart\u0105 pasirod\u0117 aplinkoje. Buvimas t\u0119s\u0117si beveik de\u0161imtmet\u012f. Sygnia seka Velvet Ant per kelis nepriklausomus tyrimus su skirtingomis aukomis. 2024 metais grup\u0117 buvo sugauta piktnaud\u017eiaujant F5 BIG-IP \u012frenginiais kitoje organizacijoje. T\u0173 pa\u010di\u0173 met\u0173 pabaigoje \u2014 i\u0161naudojant CVE-2024-20399, Cisco NX-OS nulin\u0117s dienos pa\u017eeid\u017eiamyb\u0119, siekiant \u012fdiegti VELVETSHELL u\u017epakalines duris tiesiai \u012f Nexus komutatorius. Abiem atvejais Sygnia paskelb\u0117 i\u0161samius techninius apra\u0161ymus su IOC s\u0105ra\u0161ais. Schema pastovi: aptikta Velvet Ant nepasitraukia \u2014 ji pereina \u012f infrastrukt\u016br\u0105, kuri\u0105 gyn\u0117jai stebi ma\u017eiau. Tinkl\u0173 \u012frenginiai su patentuota OS stebimi pras\u010diau nei Windows serveriai. Linux komutatoriai \u2014 pras\u010diau nei \u012frenginiai. Pa\u010di\u0173 Linux serveri\u0173 autentifikacijos paketas \u2014 pras\u010diausiai i\u0161 visko. Operation Highland paskelbta Sygnia 2026 m. bir\u017eelio 11 d. KOD\u0116L TAI SVARBU Standartinis reagavimo \u012f incidentus scenarijus numato: pakeisti slapta\u017eod\u017eius, nutraukti sesijas, izoliuoti server\u012f. N\u0117 viena i\u0161 \u0161i\u0173 priemoni\u0173 neveikia, kai pa\u017eeistas pats autentifikacijos mechanizmas. Slapta\u017eod\u017eio keitimas beprasmis, jei pam_unix.so priima u\u017epakalini\u0173 dur\u0173 slapta\u017eod\u012f nepriklausomai nuo \/etc\/shadow turinio. Sesij\u0173 nutraukimas beprasmis, jei modifikuotas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":20481,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[199,155,190],"tags":[424,425,426,427,428,429,430,431,288,432,433,434,435,436,437],"class_list":["post-20485","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-lt","category-saugumas","category-monitoring-lt","tag-aide","tag-apt","tag-authentication","tag-backdoor","tag-china-nexus","tag-critical-infrastructure","tag-file-integrity-monitoring","tag-incident-analysis","tag-linux","tag-openssh","tag-operation-highland","tag-pam","tag-pam_unix-so","tag-persistence","tag-velvet-ant"],"_links":{"self":[{"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/posts\/20485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/comments?post=20485"}],"version-history":[{"count":2,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/posts\/20485\/revisions"}],"predecessor-version":[{"id":20489,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/posts\/20485\/revisions\/20489"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/media\/20481"}],"wp:attachment":[{"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/media?parent=20485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/categories?post=20485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/tags?post=20485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}