Drupal RCE
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Em versões mais antigas do Drupal (antes da versão 8), era possível fazer login como administrador e ativar o módulo PHP filter
, que "Permite que códigos/snippets PHP incorporados sejam avaliados." Mas a partir da versão 8, este módulo não é instalado por padrão.
Você precisa que o plugin php esteja instalado (verifique acessando /modules/php e se retornar um 403, então existe, se não encontrado, então o plugin php não está instalado)
Vá para Módulos -> (Verifique) PHP Filter -> Salvar configuração
Então clique em Adicionar conteúdo -> Selecione Página Básica ou Artigo -> Escreva shellcode php no corpo -> Selecione Código PHP em Formato de texto -> Selecione Visualizar
Finalmente, acesse o nó recém-criado:
Nas versões atuais, não é mais possível instalar plugins apenas tendo acesso à web após a instalação padrão.
A partir da versão 8, o PHP Filter não é instalado por padrão. Para aproveitar essa funcionalidade, teríamos que instalar o módulo nós mesmos.
Baixe a versão mais recente do módulo no site do Drupal.
wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
Uma vez baixado, vá para Administração
> Relatórios
> Atualizações disponíveis
.
Clique em Procurar
, selecione o arquivo do diretório para o qual o baixamos e clique em Instalar
.
Uma vez que o módulo esteja instalado, podemos clicar em Conteúdo
e criar uma nova página básica, semelhante ao que fizemos no exemplo do Drupal 7. Novamente, certifique-se de selecionar Código PHP
no menu suspenso Formato de texto
.
Nas versões atuais, não é mais possível instalar plugins apenas tendo acesso à web após a instalação padrão.
Um módulo com backdoor pode ser criado adicionando um shell a um módulo existente. Módulos podem ser encontrados no site drupal.org. Vamos escolher um módulo como CAPTCHA. Role para baixo e copie o link para o tar.gz arquivo.
Baixe o arquivo e extraia seu conteúdo.
Crie um PHP web shell com o conteúdo:
Em seguida, precisamos criar um .htaccess
arquivo para nos dar acesso à pasta. Isso é necessário, pois o Drupal nega acesso direto à pasta /modules
.
A configuração acima aplicará regras para a pasta / quando solicitarmos um arquivo em /modules. Copie ambos os arquivos para a pasta captcha e crie um arquivo compactado.
Supondo que temos acesso administrativo ao site, clique em Gerenciar
e depois em Estender
na barra lateral. Em seguida, clique no botão + Instalar novo módulo
, e seremos levados à página de instalação, como http://drupal-site.local/admin/modules/install
. Navegue até o arquivo do Captcha com backdoor e clique em Instalar
.
Uma vez que a instalação seja bem-sucedida, navegue até /modules/captcha/shell.php
para executar comandos.
Post compartilhado por Coiffeur0x90
No menu Estender (/admin/modules), você pode ativar o que parecem ser plugins já instalados. Por padrão, os plugins Mídia e Biblioteca de Mídia não parecem estar ativados, então vamos ativá-los.
Antes da ativação:
Após a ativação:
Vamos aproveitar o recurso Sincronização de configuração para despejar (exportar) e fazer upload (importar) entradas de configuração do Drupal:
/admin/config/development/configuration/single/export
/admin/config/development/configuration/single/import
Patch system.file.yml
Vamos começar fazendo patch na primeira entrada allow_insecure_uploads
de:
Arquivo: system.file.yml
Para:
Arquivo: system.file.yml
Patch field.field.media.document.field_media_document.yml
Em seguida, aplique o patch na segunda entrada file_extensions
de:
Arquivo: field.field.media.document.field_media_document.yml
Para:
Arquivo: field.field.media.document.field_media_document.yml
Eu não uso isso neste post do blog, mas é importante notar que é possível definir a entrada
file_directory
de maneira arbitrária e que ela é vulnerável a um ataque de traversal de caminho (então podemos voltar dentro da árvore de sistema de arquivos do Drupal).
A última etapa é a mais simples e é dividida em dois subpassos. O primeiro é fazer o upload de um arquivo no formato .htaccess para aproveitar as diretivas do Apache e permitir que arquivos .txt sejam interpretados pelo motor PHP. O segundo é fazer o upload de um arquivo .txt contendo nosso payload.
Arquivo: .htaccess
Por que esse truque é legal?
Porque uma vez que o Webshell (que chamaremos de LICENSE.txt) é colocado no servidor Web, podemos transmitir nossos comandos via $_COOKIE
e nos logs do servidor Web, isso aparecerá como uma solicitação GET legítima para um arquivo de texto.
Por que nomear nosso Webshell LICENSE.txt?
Simplesmente porque se pegarmos o seguinte arquivo, por exemplo core/LICENSE.txt (que já está presente no núcleo do Drupal), temos um arquivo de 339 linhas e 17,6 KB de tamanho, que é perfeito para adicionar um pequeno trecho de código PHP no meio (já que o arquivo é grande o suficiente).
Arquivo: LICENSE.txt corrigido
Primeiro, aproveitamos o recurso Adicionar Documento (/media/add/document) para fazer o upload do nosso arquivo contendo as diretivas do Apache (.htaccess).
Parte 3.2 (upload arquivo LICENSE.txt)
Em seguida, aproveitamos novamente o recurso Adicionar Documento (/media/add/document) para fazer o upload de um Webshell oculto dentro de um arquivo de licença.
A última parte consiste em interagir com o Webshell.
Como mostrado na captura de tela a seguir, se o cookie esperado pelo nosso Webshell não estiver definido, obtemos o resultado subsequente ao consultar o arquivo via um navegador Web.
Quando o atacante define o cookie, ele pode interagir com o Webshell e executar quaisquer comandos que desejar.
E como você pode ver nos logs, parece que apenas um arquivo txt foi solicitado.
Obrigado por dedicar seu tempo para ler este artigo, espero que ele ajude você a obter algumas shells.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)