
Reescrita em CLI do PoC do Drupalgeddon2 (CVE-2018-7600) — para testes/educação autorizados
Uma reescrita de linha de comandos da prova de conceito do Drupalgeddon2 (CVE-2018-7600), criada como exercício de estudo durante o módulo Attacking Common Applications da Hack The Box Academy.
[!WARNING] Apenas para testes de segurança autorizados e fins educativos. Executar isto contra sistemas que não possui ou para os quais não tem permissão escrita explícita para testar é ilegal na maioria das jurisdições. Consulte Uso legal e responsável.
[!NOTE] Implementação escrita com assistência de IA. Consulte Nota sobre a autoria.
O Drupal é uma das "aplicações comuns" abordadas no módulo Attacking Common Applications da HTB Academy, e o CVE-2018-7600 ("Drupalgeddon2") é o exemplo canónico de RCE não autenticada para esse contexto. Em vez de copiar e colar um script descartável e seguir em frente, quis perceber de facto a injeção na Form API que torna a falha possível — por isso reconstruí o PoC público do zero como exercício de aprendizagem.
O original amplamente referenciado, a2u/CVE-2018-7600 de Vitalii Rudnykh, é ótimo para demonstrar a falha, mas pressupõe que edite o payload no próprio código em cada execução. Num fluxo de trabalho de laboratório/CTF — reexecutando contra alvos diferentes, querendo um ponto de apoio repetível — isso torna-se tedioso. Esta versão transforma-o numa verdadeira ferramenta CLI:
cmd= previsível aberta atrás de siEstá deliberadamente limitada a uma vulnerabilidade conhecida e corrigida há muito tempo (divulgada em 2018). O objetivo era compreender a técnica e produzir uma implementação de referência limpa e documentada — não uma capacidade ofensiva nova.
O código neste repositório foi escrito com assistência de IA (Claude da Anthropic) enquanto percorria o módulo da HTB. Defini os objetivos e requisitos de design — ergonomia da CLI, auto-implantação da web shell, modo interativo, nome da shell e parâmetro aleatorizados — e revi e testei o resultado. Divulgo isto porque é o que é honesto fazer, e porque o valor aqui está na compreensão e nas decisões de engenharia, e não na autoria de cada linha.
--cmd, ou entrar numa pseudo-shell interativa com --shell.O CVE-2018-7600 afeta:
Esta implementação tem como alvo o vetor da Form API do Drupal 8 (o endpoint AJAX user/register). O Drupal 7 é explorável através de um endpoint/payload diferente e não é tratado aqui.
As versões corrigidas (7.58 / 8.5.1 e posteriores) não são afetadas.
requestspip install requests
# comando único
python3 drupalgeddon2.py -u http://target/ -c id
# pseudo-shell interativa
python3 drupalgeddon2.py -u http://target/ --shell
# apenas implantar a shell, não executar nada
python3 drupalgeddon2.py -u http://target/ --deploy-only
# encaminhar pelo Burp, ignorar o certificado autoassinado do proxy
python3 drupalgeddon2.py -u http://target/ -c id --proxy http://127.0.0.1:8080 -k
O CVE-2018-7600 é uma falha de sanitização de entrada na Form API do Drupal. O Drupal representa formulários como arrays renderizáveis aninhados, e as chaves de array que começam com # são tratadas como propriedades de renderização especiais, e não como dados de utilizador. O patch (SA-CORE-2018-002) adicionou sanitização para remover estas chaves prefixadas com # da entrada fornecida pelo utilizador.
Antes do patch, um atacante não autenticado podia injetar propriedades de renderização num elemento de formulário processado pelo handler AJAX do Drupal. Submeter propriedades como:
#post_render — uma lista de callables que o Drupal invoca após a renderização, e#markup — o argumento passado a essas callablescontra o elemento mail do formulário de registo de utilizador faz com que o Drupal chame uma função PHP arbitrária (aqui, exec) com entrada controlada pelo atacante durante o passo de renderização — ou seja, execução remota de código, sem autenticação necessária.
Este PoC usa essa primitiva para codificar em base64 uma shell PHP de uma linha localmente, fazer com que o servidor a descodifique para um ficheiro na raiz web e depois interagir com esse ficheiro através de pedidos GET normais.
Se está do lado da defesa:
Remediação
Ideias de deteção
#post_render, #markup, #type, #lazy_builder, etc. Submissões legítimas de formulários não contêm estas chaves.…/user/register?element_parents=…&_wrapper_format=drupal_ajax que contenham parâmetros suspeitos..php recém-criado na raiz web.system($_GET[...]) shells).Esta ferramenta é publicada para educação e para testes de segurança autorizados — os seus próprios ambientes de laboratório, alvos de HTB/CTF, ou sistemas para os quais tem permissão escrita explícita para avaliar. O acesso não autorizado a sistemas informáticos é crime ao abrigo de leis como o Computer Misuse Act 1990 do Reino Unido, o Computer Fraud and Abuse Act dos EUA e equivalentes noutros países. É o único responsável pela forma como a utiliza. O autor não aceita qualquer responsabilidade por uso indevido ou por danos causados.
MIT
| Flag | Descrição |
|---|
-u, --url | (obrigatório) URL base do alvo, ex.: http://target/ |
-c, --cmd | Comando único a executar no alvo |
--shell | Entrar numa pseudo-shell interativa |
--deploy-only | Apenas implantar a web shell, não executar nada |
--shell-name | Nome do ficheiro da shell implantada (padrão: .php aleatório) |
--param | Nome do parâmetro GET para a shell (padrão: md5 aleatório) |
--proxy | URL do proxy, ex.: http://127.0.0.1:8080 |
-k, --insecure | Desativar a verificação TLS (para certificados de proxy autoassinados) |
--timeout | Tempo limite por pedido em segundos (padrão: 15) |