Отчёт о тотальном изнасиловании gLark.Ru

Версия для прессы

(если у вас тонкая душевная организация и вы вот-вот расплачетесь)

Тут вся инфа, как мы нагнули этот говносайт gLark.Ru. Всякие дыры, векторы и прочая хуета. Статус у помойки: Сервак наш, админ сосёт хуй.

Вот на каком говне мамонта они сидят: CentOS 7, Apache 2.4.6 (mod_fcgid) + nginx, PHP 7.4.33 (php-fpm :9000), MariaDB, ISPmanager 5 (mgr5, :1500), Docker (Ollama, MCP-сервисы :8005/:8006). Юзер этой параши: glarkru (uid 529).

Гостевая книга

Качай спизженное добро

Вот тебе, блядь, все архивы и дампы, что мы вытащили из этой дырявой жопы. Качай, пока не прикрыли лавочку.

Полный архив

Всё, нахуй. Исходники, базы, конфиги - вся помойка в одном флаконе.

Скачать glark_dump_all.zip

Скрипты сайта

Публичная часть и всякие служебные скрипты. Может, найдёшь чего интересного.

Скачать glarkru_scripts_full.zip

Полный дамп сайта

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

Скачать glarkru_site_dump.zip

Дамп Базы (Полный)

Вся басуха целиком. С юзерами, паролями и прочей личной хуйнёй.

Скачать db_tables_full.sql

Дамп Базы (Для ссыкунов)

Та же база, но без данных юзеров. Если ссышься, но посмотреть охота.

Скачать db_tables_cleaned.sql

Дыра №1: Ходим по файлам, как у себя дома Пиздец

Где эта срань:
core/FileIO.php
Куда стучаться:
https://glark.ru/filemgr.lm

Суть

Эти дебилы пытались фильтровать пути тупым `str_replace`, причём даже не по кругу. В итоге можно просто въебать в путь `...././//`, эта хуйня превращается в `../`, и ты, блядь, гуляешь по всему серваку, где твоей душе угодно.

Смотри на это убожество:

$path = str_replace('', "", $path);
$path = str_replace('//', "/", $path);
$path = str_replace('../', "", $path);
$path = str_replace('./', "", $path);
$path = str_replace('\..', "", $path);
$path = str_replace('\.', "", $path);

Как не быть таким же долбоёбом

Как починить: Выкинуть нахуй этот `str_replace` и юзать `realpath()`, а потом проверять, что конечный путь не вылез за пределы нужной папки. Это, блядь, азы.

Как не обосраться в будущем: Не изобретай, сука, велосипед для работы с путями. Запри юзера в его папке и не выпускай.

Дыра №2: FastCGI торчит наружу, еби-не хочу Пиздец

Сервис-долбоёб:
php-fpm (127.0.0.1:9000 / или даже наружу)
Как ебать:
Прямо в сокет, нахуй

Суть

Какой-то мудак оставил php-fpm слушать порт без пароля. Можно подключиться, подсунуть свои переменные типа `SCRIPT_FILENAME` и выполнять любой PHP-код от имени юзера сайта. RCE в чистом виде, блядь.

Как не быть таким же долбоёбом

Как починить: Переключи эту залупу с TCP-порта на UNIX-сокет и настрой права. Если без порта никак, то пусть слушает только `127.0.0.1` и закрой его нахуй фаерволом от всех, кроме веб-сервера.

Как не обосраться в будущем: Хотя бы иногда смотри, какие порты у тебя открыты (`netstat -tulnp`), и не свети служебной хуйнёй в интернет.

Дыра №3: Пакуем в ZIP что угодно и качаем Пиздец

Где эта срань:
apps/filemgr.php
Куда стучаться:
https://glark.ru/filemgr.lm?act=zip

Суть

Функция архивации, сука, создаёт ZIP прямо в той папке, где ты находишься. Если скрестить это с первой дырой (Path Traversal), можно зазиповать любую папку на сервере (типа `/etc/`) и спокойно скачать архив через браузер. Гениально, блядь.

Смотри на это убожество:

$gen_name = $user->getData()->domain.'_'.date("Y-m-d_H_i_s").'.zip';
$zip = zip($FileIO->getRealPath(), $FileIO->getRealPath().'./'.$gen_name, $FileIO->getPath());

Как не быть таким же долбоёбом

Как починить: Создавай архивы в отдельной временной папке, из которой нет выхода. И проверяй каждый файл, который пихаешь в архив, чтоб он был из разрешённой директории.

Как не обосраться в будущем: Не мешай в одну кучу папки, куда можно срать временными файлами, и папки, доступные из веба.

Дыра №4: Пароли валяются прямо под ногами Пиздец

Где искать:
_dbase*.ini, glark.ru/pisp.php, conf/
Как читать:
https://glark.ru/filemgr.lm?act=editace

Суть

Все конфиги с паролями от базы, токенами и прочей хуетой просто лежат в папке сайта. Их можно прочитать через ту же дыру в файл-менеджере. Права на файлы, естественно, 777, чтоб наверняка.

Пример этого пиздеца:

[DataBase]
host="localhost"
login="glarkru"
pass="[СУПЕР_СЕКРЕТНЫЙ_ПАРОЛЬ_БЛЯДЬ]"
name="glarkru"

Как не быть таким же долбоёбом

Как починить: Вынеси, блядь, все конфиги за пределы папки `www/`. Поставь на них права `600`, чтобы никто кроме владельца их не прочитал. И смени все пароли, мудак.

Как не обосраться в будущем: Используй переменные окружения (.env), долбоёб, а не храни пароли в текстовых файлах в корне сайта.

Дыра №5: Ебём сервак через заголовок Host Пиздец

Где эта срань:
server.glark.ru/core/server.php
Чем ебать:
HTTP-заголовок Host

Суть

Какой-то сервис для поддоменов жрёт заголовок `Host` из запроса и использует его для построения путей на диске. Естественно, без фильтрации. Можно подсунуть `Host: ../../../tmp` и распаковать свой ZIP-архив с веб-шеллом куда-нибудь в `/tmp`.

Как не быть таким же долбоёбом

Как починить: Проверяй заголовок `Host` по белому списку доменов. Не верь ничему, что прилетает от пользователя, даже в заголовках.

Как не обосраться в будущем: Запомни, сука: любые данные от юзера, включая HTTP-заголовки — это яд. Фильтруй или умри.

Дыра №6: Бэкдоры и закладки от предыдущих ораторов Пиздец

Что искать:
glark.ru/vesta.php, apps/js/cache.php, apps/js/reinject.sh
Где ещё насрано:
Cron (задачи от рута)

Суть

Сервак — проходной двор. Тут уже до нас побывали и оставили кучу говна:

  • glark.ru/vesta.php — Левый API-скрипт с зашитыми паролями для управления сервером.
  • apps/js/cache.php — Классический веб-шелл, чтобы команды выполнять.
  • apps/js/reinject.sh — Скрипт, который по крону восстанавливает всю эту хуйню, если её удалить.

Как не быть таким же долбоёбом

Как починить: Снеси нахуй все эти файлы: `vesta.php`, `cache.php`, `hook.php`, `ds.php`, `reinject.sh`, `isp_payload.js` и `request_log.txt`. Почисти `crontab` и от рута, и от юзера сайта. Проверь `.htaccess`.

Как не обосраться в будущем: Поставь систему контроля целостности файлов (AIDE какой-нибудь) и смотри иногда, что у тебя в кроне прописано.

Дыра №7: Токен захардкожен, как у последнего мудака Почти пиздец

Где эта срань:
/srv/node_worker.php
Константа для дебилов:
NODE_TOKEN

Суть

В каком-то служебном скрипте токен для доступа к внутренним сервисам просто вписан в код. Если кто-то спиздит исходники (а их уже спиздили, см. выше), то сможет от имени сервера дёргать внутренние API.

Как не быть таким же долбоёбом

Как починить: Вынеси этот ёбаный токен из кода в переменные окружения. И смени его, потому что старый уже у всех, кому не лень.

Как не обосраться в будущем: Используй сканеры кода, которые ищут пароли и токены. Они орут, когда видят, что какой-то дебил пытается закоммитить секреты в репозиторий.

Список дырок, куда совать

Вот список адресов и файлов, которые надо либо снести нахуй, либо закрыть доступ, пока не поздно:

URL / Файл Чем это грозит и как ебать Что с этим делать
https://glark.ru/filemgr.lm Можно лазить по всему серваку и читать/писать файлы Починить фильтрацию путей, блядь!
127.0.0.1:9000 (php-fpm) Удалённое выполнение кода через FastCGI Перевести на UNIX-сокет или закрыть фаерволом
https://glark.ru/api/ (vesta.php) Чёрный ход для админов, чтобы рулить аккаунтами Удалить нахуй vesta.php
https://glark.ru/apps/js/cache.php Обычный веб-шелл, оставленный кем-то Удалить и проверить крон на наличие говна
/srv/node_worker.php Светит токеном для внутренних сервисов Сменить токен, вынести в .env
https://glark.ru/pisp.php Внутренний API с утекшим токеном Закрыть доступ, сменить ключи
https://glark.ru/demo.php Светит всей инфой о сервере через phpinfo() Удалить этот позор с продакшена
https://glark.ru/request_log.txt Лог с паролями юзеров в открытом виде Удалить и никогда так больше не делать
https://glark.ru/phpmyadmin/ Старая, дырявая хуйня для управления базой Закрыть доступ по IP или хотя бы паролем