WordPress Plugin WP All Import <= 3.6.7 - Ejecución remota de código (RCE) (Autenticado)
Fecha: 05 de noviembre de 2023
Autor del exploit: Việt HÙng (https://github.com/phanthibichtram12)
Sitio web del proveedor: https://www.wpallimport.com/
Enlace del software: https://wordpress.org/plugins/wp-all-import/advanced/ (desplácese hacia abajo y seleccione la versión)
Versión: <= 3.6.7 (probado: 3.6.7)
Probado en: WordPress 6.1 (no depende del sistema operativo porque este exploit NO proporciona una carga útil)
CVE: CVE-2022-1565
DESCRIPCIÓN DE LA VULNERABILIDAD
El plugin WP All Import es vulnerable a una subida arbitraria de archivos debido a la falta de validación del tipo de archivo a través del archivo wp_all_import_get_gz.php en las versiones hasta la 3.6.7 inclusive.
Esto permite a atacantes autenticados con permisos de nivel administrador o superior subir archivos arbitrarios al servidor del sitio afectado, lo que puede conducir a la ejecución remota de código.
CÓMO FUNCIONA EL EXPLOIT
1. Preparar el archivo zip:
- cree un archivo PHP con su carga útil (por ejemplo, una shell inversa)
- establezca la variable "payload_file_name" con el nombre de este archivo (ejemplo: "shell.php")
- cree un archivo zip con la carga útil
- establezca la variable "zip_file_to_upload" con la RUTA de este archivo (ejemplo: "/root/shell.zip")
2. Iniciar sesión con una cuenta de administrador:
- establezca la variable "target_url" con la URL base del objetivo (NO termine la cadena con una barra /)
- establezca la variable "admin_user" con el nombre de usuario de la cuenta de administrador
- establezca la variable "admin_pass" con la contraseña de la cuenta de administrador
- en realidad hay 2 tipos de wpnonce:
- el primer wpnonce se obtendrá mediante el método get_wpnonce_edit_settings() dentro de la clase PluginSetting.
Este wpnonce nos permite cambiar la configuración del plugin (ver paso 4)
- el segundo wpnonce se obtendrá mediante el método get_wpnonce_upload_file() dentro de la clase PluginSetting.
Este wpnonce nos permite subir archivos
- si el Modo Seguro está activado, el contenido del zip se colocará en un directorio con un nombre aleatorio.
El exploit desactivará el Modo Seguro.
Al desactivar el Modo Seguro, el contenido del zip se colocará en el directorio principal (ver variable payload_url).
El método llamado para activar y desactivar el Modo Seguro es set_plugin_secure_mode(set_to_enabled:bool, wpnonce:str)
- si el Modo Seguro NO está activado, el exploit subirá el archivo pero luego NO lo activará.
- después de la subida, el servidor responderá con HTTP 200 OK, pero eso no significa que la subida se haya completado con éxito.
La respuesta contendrá un JSON como este:
{"jsonrpc":"2.0","error":{"code":102,"message":"Verifique que el archivo que subió sea un archivo ZIP válido."},"is_valid":false,"id":"identificador"}
Como puede ver, indica que hay un error con el código 102, pero según las pruebas que realicé, la subida se completó
- puede definir el método para activar la carga útil.
La razón detrás de esta elección es que este exploit NO proporciona ninguna carga útil.
Dado que puede usar una carga útil personalizada, es posible que desee activarla con una solicitud HTTP POST en lugar de una solicitud HTTP GET, o es posible que desee pasar parámetros
¿POR QUÉ EL EXPLOIT DESACTIVA EL MODO SEGURO?
Según el PoC de esta vulnerabilidad proporcionado por WPSCAN, podemos recuperar los archivos subidos accediendo a la "página de Importaciones gestionadas".
No sé por qué, pero después de subir cualquier archivo, no pude ver el archivo subido en esa página (¿tal vez se necesita la versión Pro?).
Tuve que encontrar una solución alternativa y lo hice explotando esta opción.
Página de WPSCAN: https://wpscan.com/vulnerability/578093db-a025-4148-8c4b-ec2df31743f7
ACTUALIZACIÓN del 06 de noviembre de 2022
Mientras probaba, noté que estaba subiendo un archivo XML no válido y por eso no se mostraba en la "página de Importaciones gestionadas"
De todos modos, esta forma de desactivar el modo seguro es un poco más "sigilosa" porque el contenido subido no se muestra en la página de administración.
Si desea ver la subida en la página de administración, se requieren más pasos.
¿TIENE ALGÚN PROBLEMA CON EL EXPLOIT?
Para que el exploit funcione, considere lo siguiente:
- verifique target_url y las credenciales del administrador
- verifique la ruta del archivo zip y el nombre de la carga útil (pueden ser diferentes)
- si está probando localmente, intente establecer verify_ssl_certificate en False
- puede usar print_response(http_response) para investigar más a fondo