Búsqueda de Ciberamenazas

Información sobre la vulnerabilidad CVE-2023-34362 de MOVEit Transfer y MOVEit Cloud

Los usuarios del paquete de transferencia de archivos deben aplicar los parches inmediatamente y comprobar si hay indicios de un posible compromiso

Sophos X-Ops está siguiendo la evolución de una vulnerabilidad de inyección SQL que afecta a MOVEit Transfer y MOVEit Cloud. La vulnerabilidad se ha denominado CVE-2023-34362.

Este post ofrece una visión general de la situación y orientaciones de SophosLabs y Sophos MDR. Actualizaremos esta página a medida que se desarrollen los acontecimientos y la información, incluidas nuestras orientaciones sobre amenazas y detección.

Resumen de la situación

El 31 de mayo de 2023, Progress Software publicó un parche para CVE-2023-34362, una vulnerabilidad de inyección SQL que podría permitir a los atacantes hacerse con el control total de una instalación de MOVEit. (Con este nivel de acceso, los atacantes podrían alterar o robar datos, instalar software malicioso como web shells, y alterar la configuración del servidor (incluyendo la creación de nuevas cuentas o la alteración de las existentes), entre otras acciones.

Como indicael aviso de Progress para clientes locales, todos los clientes locales de MOVEit deben aplicar las medidas de mitigación indicadas en el aviso lo antes posible e implantar el parche tan pronto como sea posible. Los clientes de MOVEit en la nube deben leer y seguir las directrices del aviso de Progress para clientes en la nube.

Los informes públicos indican que los ataques, contra esta vulnerabilidad, fueron verdaderos “ataques de día cero” y pueden haber comenzado ya el 27 de mayo de 2023, antes de que hubiera un parche disponible o de que la vulnerabilidad se divulgara o discutiera públicamente.

Estos informes también indican que los ataques conocidos contra esta vulnerabilidad se han centrado en crear web shells en sistemas vulnerables y utilizar ese acceso para robar datos de los sistemas comprometidos.

El 4 de junio de 2023, Microsoft Threat Intelligence atribuyó estos ataques a “Lace Tempest”, que es “conocido por operaciones de ransomware y por gestionar el sitio de extorsión Cl0p”. Lace Tempest también es rastreado en la industria como FIN11, DEV-0950 y TA505.

Actualmente, SophosLabs y MDR están observando un número muy bajo de ataques, sin embargo, las víctimas son diversas tanto en geografía como en sector. Esto se correlaciona con los hallazgos de otros proveedores de seguridad. Además, la explotación más temprana observada por Sophos se produjo el 27 de mayo de 2023, cuatro días antes de la notificación pública de Progress Software.

Sophos también puede confirmar que un indicador clave del éxito de la post-explotación es la presencia de un web shell: c:\MOVEit Transfer\wwwroot\human2.aspx. A continuación, en la Figura 1, se muestra un ejemplo de ataque y el tráfico de shell web posterior, tal y como se registra en los logs de IIS.

Un registro de IIS que muestra el intento de ataque en curso
Figura 1: Ataque en curso

Actualmente, los productos de Sophos detectan y protegen contra este web shell como Troj/WebShel-GO.

Un indicador adicional de la explotación es “App_Web_<Random8chars>.dll” generado por el compilador csc.exe, que es generado por el proceso padre w3wp.exe. Este archivo dll contiene los comandos de inyección SQL, así como el shell web codificado, y también es detectado por los productos de Sophos como Troj/WebShel-GO. Todos los clientes de MOVEit deben seguir los pasos que se indican en la sección “Orientación” más abajo.

De especial interés: dado que los ataques comenzaron antes de que estuviera disponible un parche, todos los clientes de MOVEit deben comprobar si hay signos de compromiso más allá de los que se han comentado públicamente, ya que los ataques podrían haberse producido antes de la aplicación del parche utilizando métodos que aún no se han identificado públicamente. Además, es importante tener en cuenta que los parches NO eliminarán las web shells ni otros artefactos de compromiso. Esto hace que sea fundamental que los clientes de MOVEit incluyan una comprobación de compromiso después de instalar los parches, ADEMÁS de instalar los parches. Los parches por sí solos, NO son suficientes.

Guía

Determinar el impacto con Sophos XDR

Se puede ejecutar la siguiente consulta de datos para revisar cualquier actividad del compilador csc.exe relacionada con MOVEit, que puede indicar intentos de exploit. Ten en cuenta que también se devolverá actividad benigna con esta consulta, ya que este comportamiento también se produce durante el proceso de actualización del software.

SELECT
  	   customer_id,
   	   meta_hostname, 
           date_format(from_unixtime(time), '%Y-%m-%d %H:%i:%S') as date_time, 
           time, 
           parent_sophos_pid,
           sophos_pid, 
           parent_name, 
           parent_cmdline,
           username, 
           path, 
           name, 
           cmdline, 
           parent_path, 
           sha1, 
           sha256, 
           company_name,
           file_description,
           file_size,
           file_version,
           is_process_file_signed,
           original_filename,
           product_name
FROM
           xdr_data
WHERE
           query_name = 'running_processes_windows_sophos'
  	   AND LOWER(parent_name) = 'w3wp.exe'
  	   AND LOWER(name) = 'csc.exe'
  	   AND LOWER(parent_cmdline) LIKE '%moveitdmz%'

Si la consulta anterior arroja una actividad sospechosa sobre la que te gustaría obtener detalles adicionales, se puede ejecutar la consulta siguiente para obtener una visión más profunda del proceso. Tendrás que generar una variable ‘$$sophos_pid$$’ e introducir el ID del proceso de Sophos de la consulta anterior. Al igual que la primera consulta, esta también puede devolver resultados benignos que requieran un análisis humano.

SELECT
  	   STRFTIME('%Y-%m-%d %H:%M:%S', 
  	   DATETIME(sophos_process_activity.time, 'unixepoch')) 
  	   AS utc_time,
  	   users.username,
  	   process_journal.parent_sophos_pid,
  	   sophos_process_activity.sophos_pid,
  	   process_journal.path,
  	   process_journal.process_name,
  	   process_journal.cmd_line,
  	   sophos_process_activity.subject,
  	   sophos_process_activity.action,
  	   sophos_process_activity.object,
  	   sophos_process_activity.path,
  	   sophos_process_activity.target_path
FROM
  	   sophos_process_activity
  	   LEFT JOIN sophos_process_journal AS process_journal
		ON process_journal.sophos_pid = sophos_process_activity.sophos_pid
  	   LEFT JOIN users
	        ON users.uuid LIKE process_journal.sid
WHERE  
  	   sophos_process_activity.sophos_pid = '$$sophos_pid$$'
  	   AND sophos_process_activity.action = 'Created'
  	   AND sophos_process_activity.object LIKE '%.dll'

Por último, si dispones de archivos de registro de IIS, puedes utilizar la siguiente consulta para buscar la actividad del shell web. Tendrás que generar una variable, ‘$$log_path$$’ e introducir la ruta del archivo del registro de IIS que te gustaría revisar.

WITH sorter AS (
WITH content AS 
            --Split the raw log into sortable columns
            (
SELECT 
            -- Grab data from the IIS logs, removing comment lines and limiting returned line count to ensure functionality
                    grep.line
FROM file
     CROSS JOIN grep ON (grep.path = file.path)
     WHERE
                    file.path LIKE '$$log_path$$'
                AND (
                    grep.pattern = 'POST /api/v1/token'
                    OR grep.pattern = 'POST /guestaccess.aspx'
                    OR grep.pattern = 'GET /human2.aspx'
                    OR grep.pattern = 'GET /api/v1/folders'
                    )
            )
            SELECT 
                CAST(SPLIT(line,' ',0) AS TEXT) AS iis_date, 
                CAST(SPLIT(line,' ',1) AS TEXT) AS iis_time, 
                SPLIT(line,' ',2) AS source_ip, 
                SPLIT(line,' ',3) AS cs_method,
                SPLIT(line,' ',4) AS cs_uri_stem, 
                SPLIT(line,' ',5) AS cs_uri_query, 
                SPLIT(line,' ',6) AS source_port, 
                SPLIT(line,' ',7) AS cs_username, 
                SPLIT(line,' ',8) AS remote_ip, 
                SPLIT(line,' ',9) AS user_agent, 
                SPLIT(line,' ',10) AS referer, 
                SPLIT(line,' ',11) AS status,
                SPLIT(line,' ',12) AS substatus,
                SPLIT(line,' ',13) AS win32status,
                SPLIT(line,' ',14) AS timetaken
            FROM content
            WHERE iis_date NOT LIKE '#%'
 
         )
        SELECT
        --CAST(MIN(datetime(iis_date || ' ' || iis_time)) AS varchar) AS first_seen,
        --CAST(MAX(datetime(iis_date || ' ' || iis_time)) AS varchar) AS last_seen,
        datetime(iis_date || ' ' || iis_time) AS timestamps,
        source_ip,
        cs_method,
        cs_uri_stem, 
        cs_uri_query,
        source_port, 
        cs_username,   
        remote_ip, 
        user_agent,
        referer, 
        status,
        CASE 
            WHEN status LIKE '100' THEN 'Continue'
            WHEN status LIKE '101' THEN 'Switching protocols'
            WHEN status LIKE '200' THEN 'OK. The client request has succeeded'
            WHEN status LIKE '201' THEN 'Created'
            WHEN status LIKE '202' THEN 'Accepted'
            WHEN status LIKE '203' THEN 'Nonauthoritative information'
            WHEN status LIKE '204' THEN 'No content'
            WHEN status LIKE '205' THEN 'Reset content'
            WHEN status LIKE '206' THEN 'Partial content'
            WHEN status LIKE '301' THEN 'Moved permanently'
            WHEN status LIKE '302' THEN 'Object moved'
            WHEN status LIKE '304' THEN 'Not modified'
            WHEN status LIKE '307' THEN 'Temporary redirect'
            WHEN status LIKE '400' THEN 'Bad request'
            WHEN status LIKE '401' THEN 'Access denied'
            WHEN status LIKE '403' THEN 'Forbidden'
            WHEN status LIKE '404' THEN 'Page Not found'
            WHEN status LIKE '405' THEN 'Method Not Allowed'
            WHEN status LIKE '406' THEN 'Client browser does not accept the MIME type of the requested page'
            WHEN status LIKE '408' THEN 'Request timed out'
            WHEN status LIKE '412' THEN 'Precondition faile'
            WHEN status LIKE '500' THEN 'Internal server error'
            WHEN status LIKE '501' THEN 'Header values specify a configuration that is not implemented'
            WHEN status LIKE '502' THEN 'Web server received an invalid response while acting as a gateway or proxy'
            WHEN status LIKE '503' THEN 'Service unavailable'
            ELSE 'unknown'
            END AS 'status_def',
        CASE
            WHEN status LIKE '400' AND substatus LIKE '1' THEN 'Invalid Destination Header'
            WHEN status LIKE '400' AND substatus LIKE '2' THEN 'Invalid Depth Header'
            WHEN status LIKE '400' AND substatus LIKE '3' THEN 'Invalid If Header'
            WHEN status LIKE '400' AND substatus LIKE '4' THEN 'Invalid Overwrite Header'
            WHEN status LIKE '400' AND substatus LIKE '5' THEN 'Invalid Translate Header'
            WHEN status LIKE '400' AND substatus LIKE '6' THEN 'Invalid Request Body'
            WHEN status LIKE '400' AND substatus LIKE '7' THEN 'Invalid Content Length'
            WHEN status LIKE '400' AND substatus LIKE '8' THEN 'Invalid Timeout'
            WHEN status LIKE '400' AND substatus LIKE '9' THEN 'Invalid Lock Token'
            WHEN status LIKE '401' AND substatus LIKE '1' THEN 'Logon failed'
            WHEN status LIKE '401' AND substatus LIKE '2' THEN 'Logon failed due to server configuration'
            WHEN status LIKE '401' AND substatus LIKE '3' THEN 'Unauthorized due to ACL on resource'
            WHEN status LIKE '401' AND substatus LIKE '4' THEN 'Authorization failed by filter'
            WHEN status LIKE '401' AND substatus LIKE '5' THEN 'Authorization failed by ISAPI/CGI application'
            WHEN status LIKE '401' AND substatus LIKE '501' THEN 'Access Denied: Too many requests from the same client IP; Dynamic IP Restriction Concurrent request rate limit reached'
            WHEN status LIKE '401' AND substatus LIKE '502' THEN 'Forbidden: Too many requests from the same client IP; Dynamic IP Restriction Maximum request rate limit reached'
            WHEN status LIKE '401' AND substatus LIKE '503' THEN 'Access Denied: the IP address is included in the Deny list of IP Restriction'
            WHEN status LIKE '401' AND substatus LIKE '504' THEN 'Access Denied: the host name is included in the Deny list of IP Restriction'
            WHEN status LIKE '403' AND substatus LIKE '1 ' THEN 'Execute access forbidden'
            WHEN status LIKE '403' AND substatus LIKE '2 ' THEN 'Read access forbidden'
            WHEN status LIKE '403' AND substatus LIKE '3 ' THEN 'Write access forbidden'
            WHEN status LIKE '403' AND substatus LIKE '4 ' THEN 'SSL required'
            WHEN status LIKE '403' AND substatus LIKE '5 ' THEN 'SSL 128 required'
            WHEN status LIKE '403' AND substatus LIKE '6 ' THEN 'IP address rejected'
            WHEN status LIKE '403' AND substatus LIKE '7 ' THEN 'Client certificate required'
            WHEN status LIKE '403' AND substatus LIKE '8 ' THEN 'Site access denied'
            WHEN status LIKE '403' AND substatus LIKE '9 ' THEN 'Forbidden: Too many clients are trying to connect to the web server'
            WHEN status LIKE '403' AND substatus LIKE '10' THEN 'Forbidden: web server is configured to deny Execute access'
            WHEN status LIKE '403' AND substatus LIKE '11' THEN 'Forbidden: Password has been changed'
            WHEN status LIKE '403' AND substatus LIKE '12' THEN 'Mapper denied access'
            WHEN status LIKE '403' AND substatus LIKE '13' THEN 'Client certificate revoked'
            WHEN status LIKE '403' AND substatus LIKE '14' THEN 'Directory listing denied'
            WHEN status LIKE '403' AND substatus LIKE '15' THEN 'Forbidden: Client access licenses have exceeded limits on the web server'
            WHEN status LIKE '403' AND substatus LIKE '16' THEN 'Client certificate is untrusted or invalid'
            WHEN status LIKE '403' AND substatus LIKE '17' THEN 'Client certificate has expired or is not yet valid'
            WHEN status LIKE '403' AND substatus LIKE '18' THEN 'Cannot execute requested URL in the current application pool'
            WHEN status LIKE '403' AND substatus LIKE '19' THEN 'Cannot execute CGI applications for the client in this application pool'
            WHEN status LIKE '403' AND substatus LIKE '20' THEN 'Forbidden: Passport logon failed'
            WHEN status LIKE '403' AND substatus LIKE '21' THEN 'Forbidden: Source access denied'
            WHEN status LIKE '403' AND substatus LIKE '22' THEN 'Forbidden: Infinite depth is denied'
            WHEN status LIKE '403' AND substatus LIKE '501' THEN 'Forbidden: Too many requests from the same client IP; Dynamic IP Restriction Concurrent request rate limit reached'
            WHEN status LIKE '403' AND substatus LIKE '502' THEN 'Forbidden: Too many requests from the same client IP; Dynamic IP Restriction Maximum request rate limit reached'
            WHEN status LIKE '403' AND substatus LIKE '503' THEN 'Forbidden: the IP address is included in the Deny list of IP Restriction'
            WHEN status LIKE '403' AND substatus LIKE '504' THEN 'Forbidden: the host name is included in the Deny list of IP Restriction'
            WHEN status LIKE '404' AND substatus LIKE '0' THEN 'Page Not found'
            WHEN status LIKE '404' AND substatus LIKE '1' THEN 'Site Not Found'
            WHEN status LIKE '404' AND substatus LIKE '2' THEN 'ISAPI or CGI restriction'
            WHEN status LIKE '404' AND substatus LIKE '3' THEN 'Multipurpose Internet Mail Extensions (MIME) type restriction'
            WHEN status LIKE '404' AND substatus LIKE '4' THEN 'No handler configured'
            WHEN status LIKE '404' AND substatus LIKE '5' THEN 'Denied by request filtering configuration'
            WHEN status LIKE '404' AND substatus LIKE '6' THEN 'Verb denied'
            WHEN status LIKE '404' AND substatus LIKE '7' THEN 'File extension denied'
            WHEN status LIKE '404' AND substatus LIKE '8' THEN 'Hidden namespace'
            WHEN status LIKE '404' AND substatus LIKE '9' THEN 'File attribute hidden'
            WHEN status LIKE '404' AND substatus LIKE '10' THEN 'Request header too long'
            WHEN status LIKE '404' AND substatus LIKE '11' THEN 'Request contains double escape sequence'
            WHEN status LIKE '404' AND substatus LIKE '12' THEN 'Request contains high-bit characters'
            WHEN status LIKE '404' AND substatus LIKE '13' THEN 'Content length too large'
            WHEN status LIKE '404' AND substatus LIKE '14' THEN 'Request URL too long'
            WHEN status LIKE '404' AND substatus LIKE '15' THEN 'Query string too long'
            WHEN status LIKE '404' AND substatus LIKE '16' THEN 'DAV request sent to the static file handler'
            WHEN status LIKE '404' AND substatus LIKE '17' THEN 'Dynamic content mapped to the static file handler via a wildcard MIME mapping'
            WHEN status LIKE '404' AND substatus LIKE '18' THEN 'Querystring sequence denied'
            WHEN status LIKE '404' AND substatus LIKE '19' THEN 'Denied by filtering rule'
            WHEN status LIKE '404' AND substatus LIKE '20' THEN 'Too Many URL Segments'
            WHEN status LIKE '404' AND substatus LIKE '501' THEN 'Not Found: Too many requests from the same client IP; Dynamic IP Restriction Concurrent request rate limit reached'
            WHEN status LIKE '404' AND substatus LIKE '502' THEN 'Not Found: Too many requests from the same client IP; Dynamic IP Restriction Maximum request rate limit reached'
            WHEN status LIKE '404' AND substatus LIKE '503' THEN 'Not Found: the IP address is included in the Deny list of IP Restriction'
            WHEN status LIKE '404' AND substatus LIKE '504' THEN 'Not Found: the host name is included in the Deny list of IP Restriction'
            ELSE substatus || ' - Not Defined'
            END AS substatus,
        win32status,
        timetaken    
        FROM sorter

Detección y protección

SophosLabs ha bloqueado los dominios maliciosos y ha publicado las siguientes detecciones:

Detecciones estáticas:

  • Troj/WebShel-GO

Recursos

Puedes encontrar más información sobre esta situación emergente en Sophos Naked Security.

Agradecimientos

Gracias a Andrew Ludgate y Mark Parsons por sus contribuciones a este artículo.