# Drupal RCE
{{#include ../../../banners/hacktricks-training.md}}
## Com o Módulo PHP Filter
> [!WARNING]
> Em versões mais antigas do Drupal **(antes da versão 8)**, era possível fazer login como admin e **ativar o módulo `PHP filter`**, que "Permite que código/snippets PHP incorporados sejam avaliados." Mas a partir da versão 8, este módulo não é instalado por padrão.
1. Vá para **/modules/php** e se um erro 403 for retornado, então o **plugin PHP filter está instalado e você pode continuar**
1. Se não, vá para `Modules` e marque a caixa de `PHP Filter` e depois clique em `Save configuration`
2. Então, para explorá-lo, clique em `Add content`, selecione `Basic Page` ou `Article` e escreva o **backdoor PHP**, depois selecione `PHP` como formato de texto e finalmente selecione `Preview`
3. Para acioná-lo, basta acessar o nó recém-criado:
```bash
curl http://drupal.local/node/3
```
## Instalar o Módulo PHP Filter
> [!WARNING]
> 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](https://www.drupal.org/project/php/releases/8.x-1.1)** **não é instalado por padrão**. Para aproveitar essa funcionalidade, teríamos que **instalar o módulo nós mesmos**.
1. Baixe a versão mais recente do módulo no site do Drupal.
1. `wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz`
2. Após o download, vá para **`Administration`** > **`Reports`** > **`Available updates`**.
3. Clique em **`Browse`**, selecione o arquivo do diretório para o qual o baixamos e clique em **`Install`**.
4. Uma vez que o módulo esteja instalado, podemos clicar em **`Content`** e **criar uma nova página básica**, semelhante ao que fizemos no exemplo do Drupal 7. Novamente, certifique-se de **selecionar `PHP code` no menu suspenso `Text format`**.
## Módulo com Backdoor
> [!WARNING]
> Nas versões atuais, não é mais possível instalar plugins apenas tendo acesso à web após a instalação padrão.
Era possível **baixar** um **módulo**, adicionar um **backdoor** a ele e **instalá-lo**. Por exemplo, baixando o módulo **[Trurnstile](https://www.drupal.org/project/turnstile)** em formato compactado, criando um novo arquivo de backdoor PHP dentro dele, permitindo o acesso ao arquivo PHP com um arquivo `.htaccess`:
```html
RewriteEngine On RewriteBase /
```
E então indo para **`http://drupal.local/admin/modules/install`** para instalar o módulo com backdoor e acessar **`/modules/turnstile/back.php`** para executá-lo.
## Backdooring Drupal com Sincronização de Configuração
**Post compartilhado por** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
### Parte 1 (ativação de _Media_ e _Media Library_)
No menu _Extend_ (/admin/modules), você pode ativar o que parecem ser plugins já instalados. Por padrão, os plugins _Media_ e _Media Library_ não parecem estar ativados, então vamos ativá-los.
Antes da ativação:
Após a ativação:
### Parte 2 (aproveitando o recurso _Sincronização de Configuraçã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
```
...
allow_insecure_uploads: false
...
```
Para:
Arquivo: system.file.yml
```
...
allow_insecure_uploads: true
...
```
**Corrigir field.field.media.document.field_media_document.yml**
Em seguida, corrija a segunda entrada `file_extensions` de:
Arquivo: field.field.media.document.field_media_document.yml
```
...
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'
...
```
Para:
Arquivo: field.field.media.document.field_media_document.yml
```
...
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'
...
```
> 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 é vulnerável a um ataque de traversal de caminho (então podemos voltar dentro da árvore de sistema de arquivos do Drupal).
### Parte 3 (aproveitando o recurso _Adicionar Documento_)
A última etapa é a mais simples e é dividida em duas subetapas. A primeira é 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. A segunda é fazer o upload de um arquivo .txt contendo nosso payload.
Arquivo: .htaccess
```
SetHandler application/x-httpd-php
# Vroum! Vroum!
# We reactivate PHP engines for all versions in order to be targetless.
php_flag engine on
php_flag engine on
php_flag engine on
```
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](https://github.com/drupal/drupal/blob/11.x/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
```txt
...
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
...
```
#### **Parte 3.1 (upload file .htaccess)**
Primeiro, aproveitamos o recurso _Add Document_ (/media/add/document) para fazer o upload do nosso arquivo contendo as diretivas do Apache (.htaccess).
**Parte 3.2 (upload file LICENSE.txt)**
Em seguida, aproveitamos novamente o recurso _Add Document_ (/media/add/document) para fazer o upload de um Webshell oculto dentro de um arquivo de licença.
### Parte 4 (interação com o Webshell)
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.
{{#include ../../../banners/hacktricks-training.md}}