moveit
Recherche sur les menaces

Informations sur les vulnérabilités MOVEit CVE-2023-34362, CVE-2023-35036 et CVE-2023-35708

Les utilisateurs du pack de transfert de fichiers doivent installer les correctifs immédiatement et observer les signes annonciateurs d'une éventuelle compromission.

Sophos X-Ops suit l’évolution de la situation concernant une vulnérabilité d’injection SQL affectant MOVEit Transfer et MOVEit Cloud. La vulnérabilité concernée porte le nom CVE-2023-34362.

Cet article va vous donner une vue d’ensemble de la situation et des conseils provenant des SophosLabs et Sophos MDR. Nous mettrons à jour cet article au fur et à mesure de l’évolution des événements et de notre compréhension globale de la situation, notamment en vous donnant des conseils sur les menaces et la détection.

[Version 5 [Mise à jour 4] publiée à 20h25 UTC, le 16 juin 2023 pour ajouter un numéro CVE (CVE-2023-35708) concernant la troisième vulnérabilité et pour indiquer qu’un correctif MOVEit est disponible.  

Version 4 [Mise à jour 3] publiée à 8h00 UTC, le 16 juin 2023 pour inclure des informations de MOVEit sur une troisième vulnérabilité, récemment révélée.

Version 3 [Mise à jour 2] publiée à 20h30 UTC, le 9 juin 2023 pour inclure des informations de MOVEit sur le dernier correctif et donner de nouveaux conseils, notamment l’avis concernant une deuxième vulnérabilité (CVE-2023-35036).

Version 2 publiée à 23h30 UTC, le 6 juin 2023, ajoutant la section “Déterminer l’impact avec Sophos XDR” fournissant une requête datalake et mettant à jour les informations sur le nombre et la diversité des attaques ainsi que sur les traces de logs IIS.

Article publié initialement à 22h43 UTC le 5 juin 2023].

Vue d’ensemble de la situation

MISE À JOUR DES CONSEILS : Depuis le 15 juin 2023, Progress a publié un troisième correctif et de nouveaux conseils après la divulgation d’une nouvelle vulnérabilité. Plus d’informations sur CVE-2023-35708 sont disponibles en cliquant sur le lien ci-dessus.

moveitDepuis le 9 juin 2023, Progress a publié un NOUVEAU correctif et tous les clients MOVEit doivent l’installer comme indiqué dans leur dernier avis.

Le 31 mai 2023, Progress Software a publié un correctif pour CVE-2023-34362, une vulnérabilité d’injection SQL qui pourrait permettre aux attaquants de prendre le contrôle complet d’une installation MOVEit (MOVEit est un logiciel de transfert de fichiers sécurisé et d’automatisation orienté conformité). Avec un tel niveau d’accès, les attaquants pourraient modifier ou voler des données, installer des logiciels malveillants tels que des Web shells et/ou modifier la configuration du serveur (notamment en créant de nouveaux comptes ou en modifiant des comptes existants), entre autres actions.

Comme indiqué dans l’avis émis par Progress pour les clients sur-site (on-premises), tous les clients MOVEit sur-site doivent appliquer les mesures de mitigation décrites dans l’avis dès que possible et installer ensuite le correctif dans la foulée. Les clients de MOVEit Cloud doivent lire et suivre les conseils de l’avis émis par Progress pour les clients Cloud.

Des rapports publics indiquent que les attaques contre cette vulnérabilité étaient de véritables “attaques zero-day” et ont à priori débuté dès le 27 mai 2023, avant donc qu’un correctif ne soit disponible ou que la vulnérabilité n’ait été divulguée ou discutée publiquement.

Ces rapports indiquent également que les attaques connues ayant exploité cette vulnérabilité se sont concentrées sur la création de Web shells sur des systèmes vulnérables et sur l’utilisation de cet accès pour voler des données à partir de systèmes compromis.

Le 4 juin 2023, Microsoft Threat Intelligence a attribué ces attaques à “Lace Tempest”, qui est “connu pour ses opérations de ransomware et l’exploitation du site d’extorsion Cl0p”. Lace Tempest est également connu dans le secteur sous les noms FIN11, DEV-0950 et TA505.

Actuellement, les SophosLabs et l’équipe MDR constatent un très faible nombre d’attaques. Notons que les victimes sont très variées en termes de présence géographique et de secteur d’activité. Ce constat confirme bien les conclusions d’autres éditeurs de sécurité. De plus, la première exploitation observée par Sophos s’est produite le 27 mai 2023, quatre jours avant la notification publique émise par Progress Software.

Sophos peut également confirmer qu’un indicateur clé prouvant qu’une post-exploitation a réussi est la présence d’un Web shell : c:\MOVEit Transfer\wwwroot\human2.aspx. Ci-dessous, dans la figure 1, se trouve un exemple d’attaque et le trafic Web Shell de suivi tel qu’enregistré dans les logs IIS.

moveit

Figure 1 : Attaque en cours

Les produits Sophos détectent et protègent actuellement contre ce Web shell sous le nom Troj/WebShel-GO.

Un indicateur supplémentaire d’exploitation est “App_Web_<Random8chars>.dll” généré par le compilateur csc.exe, lui même généré par le processus parent w3wp.exe. Ce fichier dll contient les commandes d’injection SQL, ainsi que le Web shell hardcodé, et est également détecté par les produits Sophos sous le nom Troj/WebShel-GO. Tous les clients MOVEit doivent suivre les étapes décrites dans la section “Conseils” ci-dessous.

À noter en particulier : étant donné que les attaques ont commencé avant qu’un correctif ne soit disponible, tous les clients MOVEit doivent vérifier les signes de compromission au-delà de ceux discutés publiquement, car des attaques auraient pu se produire avant la disponibilité du correctif en utilisant des méthodes non encore identifiées publiquement. De plus, il est important de noter que les correctifs ne supprimeront PAS les Web shells ou autres artefacts de compromission. Il est donc essentiel que les clients MOVEit incluent une vérification de la compromission après le déploiement des correctifs EN PLUS de l’installation des correctifs à proprement parler. L’installation des correctifs seule n’est PAS suffisante.

Conseils

Déterminer l’impact avec Sophos XDR

La requête Datalake ci-dessous peut être exécutée pour examiner toute activité du compilateur csc.exe liée à MOVEit, pouvant ainsi indiquer des tentatives d’exploitation. Veuillez noter que les activités bénignes seront également renvoyées avec cette requête, car ce comportement se produit également pendant le processus de mise à jour du logiciel.

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 requête ci-dessus génère une activité suspecte sur laquelle vous souhaitez obtenir des détails supplémentaires, la requête ci-dessous peut être exécutée pour vous donner un aperçu plus détaillé du processus. Vous devrez générer une variable “$$sophos_pid$$” et saisir le Sophos Process ID de la requête précédente. Semblable à la première requête, cette dernière peut également renvoyer des résultats bénins qui nécessiteront une analyse humaine.

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'

Enfin, si vous disposez des fichiers de logs IIS, la requête suivante peut être utilisée pour rechercher l’activité du Web shell . Vous devrez générer une variable, ‘$$log_path$$‘ et saisir le chemin du fichier vers les logs IIS que vous souhaitez consulter.

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

Protections en matière de détection

Les SophosLabs ont bloqué les domaines malveillants et publié les détections suivantes :

Détections statiques :

  • Troj/WebShel-GO

Ressources

De plus amples informations sur cette situation en constante évolution sont disponibles sur Sophos Naked Security.

Remerciements

Merci à Andrew Ludgate et Mark Parsons pour avoir contribué à cet article.

Billet inspiré de Update 1: Information on MOVEit Transfer and MOVEit Cloud Vulnerability CVE-2023-34362, sur le Blog Sophos.