Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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-0257 — Palo Alto Networks PAN-OS contiene una omisión de autenticación causada por fallos en el portal y la puerta de enlace de GlobalProtect, lo que permite a los atacantes establecer conexiones VPN no autorizadas; la explotación requiere acceso de red al portal o a la puerta de enlace. | Kitploit
Herramientas/GitHubGitHub/tushargurav28/cve-2026-0257
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad de RedesCriptografíaPruebas de PenetraciónAutenticaciónRed Teaming
GitHub
tushargurav28/cve-2026-0257

CVE-2026-0257

Ver Repositorio
311hace 3 mesesAún no revisado

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 →

Acerca de

Palo Alto Networks PAN-OS contiene una omisión de autenticación causada por fallos en el portal y la puerta de enlace de GlobalProtect, lo que permite a los atacantes establecer conexiones VPN no autorizadas; la explotación requiere acceso de red al portal o a la puerta de enlace.

Compartir

CVE-2026-0257: Omisión de Autenticación en GlobalProtect

Resumen

Este exploit consigue acceso VPN sin autenticación a una pasarela/portal GlobalProtect de Palo Alto falsificando una cookie de autenticación usando únicamente el certificado TLS disponible públicamente del servidor.


La Vulnerabilidad Principal (Por Qué Funciona)

GlobalProtect utiliza una cookie pre-autenticación (portal-userauthcookie) para permitir que los clientes se autentiquen. Aquí está el fallo fatal:

Flujo Normal:
  1. El cliente se autentica (usuario + contraseña)
  2. El servidor genera una cookie → la cifra con la clave PÚBLICA RSA del servidor
  3. El cliente guarda la cookie cifrada
  4. En la reconexión, el cliente envía la cookie → el servidor la descifra con la clave PRIVADA → confía en ella

El Bug:
  El servidor SOLO comprueba si la cookie se descifra correctamente con su clave privada.
  NO verifica QUIÉN la cifró ni si el contenido en texto plano es legítimo.

Dado que la clave pública RSA está incrustada en el certificado TLS del servidor (accesible públicamente para cualquiera que se conecte), cualquier atacante puede:

  1. Obtener la clave pública del certificado TLS
  2. Falsificar una cookie con cualquier nombre de usuario
  3. Cifrarla con la clave pública
  4. Enviarla al servidor → el servidor la descifra → la acepta como válida

Esto es un fallo de autenticación rota de manual — usar cifrado donde se necesitaba una firma digital o un HMAC.


La Cadena del Exploit (5 Pasos)

flowchart TD
    A["Paso 1: Conexión TCP Cruda"] --> B["Paso 2: Enviar ClientHello TLS Manipulado"]
    B --> C["Paso 3: Parsear ServerHello → Extraer Certificados DER"]
    C --> D["Paso 4: Recorrer ASN.1 para Extraer la Clave Pública RSA"]
    D --> E["Paso 5: Falsificar Cookie Cifrada PKCS#1 v1.5"]
    E --> F["Paso 6: POST a /ssl-vpn/login.esp"]
    F --> G{"El Servidor Descifra la Cookie"}
    G -->|"Texto plano válido"| H[" Omisión de Autenticación — Acceso VPN Concedido"]
    G -->|"Inválido"| I[" Rechazado"]

Paso 1: Construir un ClientHello TLS Crudo

¿Por qué crudo? Necesitamos el certificado del servidor en formato DER (binario crudo). El módulo ssl de Python completa el handshake TLS internamente y no expone los bytes crudos del certificado de la misma manera. Al hacer una conexión TCP cruda y enviar un ClientHello hecho a mano, podemos interceptar la respuesta del servidor a nivel de bytes.

Formato de Red

Un registro TLS tiene este aspecto:

┌──────────────────────────────────────────────────┐
│ Cabecera de Registro TLS (5 bytes)               │
│ ┌──────┬──────────┬────────────┐                 │
│ │ Tipo │ Versión  │ Longitud   │                 │
│ │ 0x16 │ 0x03 01  │  2 bytes   │                 │
│ │(Hshk)│(TLS 1.0) │            │                 │
│ └──────┴──────────┴────────────┘                 │
│                                                  │
│ Mensaje de Handshake                             │
│ ┌──────┬────────────┬─────────────────────────┐  │
│ │ Tipo │ Longitud   │      Cuerpo             │  │
│ │ 0x01 │  3 bytes   │  (ClientHello)          │  │
│ │(CHlo)│            │                         │  │
│ └──────┴────────────┴─────────────────────────┘  │
└──────────────────────────────────────────────────┘

Código: build_hello()

El cuerpo del ClientHello contiene:

CampoValorPropósito
Versión0x03 0x03 (TLS 1.2)Indicar al servidor que hablamos TLS 1.2
AleatorioMarca de tiempo de 4 bytes + 28 bytes aleatoriosNonce para el handshake
ID de Sesión0x00 (vacío)Sin reanudación de sesión
Suites de Cifrado9 suites incluyendo TLS_RSA_WITH_AES_128_CBC_SHAClave: incluimos cifrados solo-RSA para forzar al servidor a usar su certificado RSA
Compresión0x00 (ninguna)Obligatorio

Extensiones incluidas:

ExtensiónIDPropósito
SNI (Indicación de Nombre de Servidor)0x0000Indicar al servidor a qué hostname nos conectamos
Algoritmos de Firma0x000DAnunciar qué algoritmos de firma soportamos
Grupos Soportados0x000ACurvas EC que soportamos (P-256, P-384, P-521)
Formatos de Punto EC0x000BPuntos EC sin comprimir

[!NOTE] Las suites de cifrado incluyen intencionalmente cifrados de intercambio de claves RSA (0x002F = TLS_RSA_WITH_AES_128_CBC_SHA). Esto empuja al servidor a responder con su certificado RSA en lugar de uno ECDSA — lo cual es crítico porque el exploit solo funciona con RSA.


Paso 2: Recibir y Parsear la Respuesta del Servidor

Después de enviar el ClientHello, el servidor envía de vuelta múltiples registros TLS:

Respuesta del Servidor:
  ┌─────────────────┐
  │ ServerHello      │  (tipo de handshake 2)
  ├─────────────────┤
  │ Certificate      │  (tipo de handshake 11) ← ESTE NOS INTERESA
  ├─────────────────┤
  │ ServerKeyExchange│  (tipo de handshake 12, opcional)
  ├─────────────────┤
  │ ServerHelloDone  │  (tipo de handshake 14) ← SEÑAL DE PARADA
  └─────────────────┘

Código: parse_certs()

Fase 1 — Quitar las cabeceras de registro TLS:

Cada registro TLS tiene una cabecera de 5 bytes: [tipo(1)] [versión(2)] [longitud(2)]. El código escanea todos los registros y, para cualquier registro con type == 22 (Handshake), concatena sus cargas útiles:

while i + 5 <= len(data):
    t = data[i]                              # tipo de contenido
    rl = (data[i + 3] << 8) | data[i + 4]   # longitud del registro
    if t == 22:                              # Handshake
        hs.extend(data[i + 5: i + 5 + rl])  # tomar la carga útil
    i += 5 + rl                              # siguiente registro

Fase 2 — Encontrar el mensaje Certificate (tipo 11):

Dentro del flujo de handshake, cada mensaje tiene una cabecera de 4 bytes: [tipo(1)] [longitud(3)]. Escaneamos buscando type == 11:

while j + 4 <= len(hs):
    ht = hs[j]                                           # tipo de handshake
    hl = (hs[j+1] << 16) | (hs[j+2] << 8) | hs[j+3]    # longitud de 3 bytes
    if ht == 11:  # Certificate!
        # Parsear la lista de certificados dentro

Fase 3 — Extraer los certificados DER individuales:

El mensaje Certificate contiene una lista de certificados, cada uno prefijado por una longitud de 3 bytes:

Cuerpo del Mensaje Certificate:
┌───────────────────────────────────┐
│ Longitud Total de Certificados (3 bytes) │
├───────────────────────────────────┤
│ Longitud del Cert 1 (3 bytes)     │
│ Datos DER del Cert 1 (variable)   │
├───────────────────────────────────┤
│ Longitud del Cert 2 (3 bytes)     │
│ Datos DER del Cert 2 (variable)   │
├───────────────────────────────────┤
│ ...                               │
└───────────────────────────────────┘

En nuestra ejecución de prueba, obtuvimos 3 certificados (certificado hoja, CA intermedia, CA raíz).

Código: has_done()

Esta función escanea buscando ServerHelloDone (tipo de handshake 14), que nos indica que el servidor ha terminado de enviar y podemos dejar de leer.


Paso 3: Parsear el Certificado X.509 (ASN.1/DER)

Los certificados X.509 están codificados en DER (Distinguished Encoding Rules), que es un formato binario basado en ASN.1 (Abstract Syntax Notation One).

Formato ASN.1 TLV (Tag-Longitud-Valor)

Cada elemento en DER es:

┌─────┬────────┬───────────────────┐
│ Tag │ Longitud │ Valor (payload)  │
│ 1B  │ 1-5B   │ variable          │
└─────┴────────┴───────────────────┘
Descargar herramienta