Una nueva campaña de ataque tiene como objetivo implementaciones de Docker, Hadoop, Confluence y Redis de acceso público mediante la explotación de configuraciones erróneas comunes y vulnerabilidades conocidas. Los atacantes despliegan cargas útiles nunca antes vistas, incluidos cuatro archivos binarios escritos en Golang.
«Una vez que se logra el acceso inicial, se utilizan una serie de scripts de shell y técnicas generales de ataque de Linux para entregar un minero de criptomonedas, generar un shell inverso y permitir el acceso persistente a los hosts comprometidos», dijeron investigadores de Cado Security en un nuevo informe. Si bien la atribución no se puede hacer con certeza, los scripts observados en la campaña tienen algunas similitudes con los utilizados en el pasado por los actores de amenazas conocidos TeamTNT y WatchDog.
Cadena de infección compleja de varias etapas a través de scripts de shell
La cadena de infección de esta campaña es bastante compleja y cuenta con más de 10 scripts de shell y varios archivos binarios, múltiples mecanismos de persistencia, métodos de entrega de carga útil de respaldo, técnicas antiforenses, rootkits en modo de usuario, herramientas de escaneo de red y exploits. Cado observó por primera vez el ataque a uno de sus honeypots Docker, que estaba configurado intencionalmente de forma insegura. Los atacantes se conectaron a la API de Docker Engine, generaron un nuevo contenedor basado en Alpine Linux y montaron el sistema de archivos raíz del host en un directorio temporal dentro del contenedor.
Esta técnica no es nueva y se usa comúnmente en ataques Docker para escribir un trabajo cron malicioso en el sistema host que luego ejecutaría el código de los atacantes. En esta nueva campaña, los atacantes escribieron un archivo en la ruta /usr/bin/vurl y crearon un trabajo cron para ejecutar algunos comandos de shell codificados en base64.
El código de shell ejecutado por cron utiliza el script vurl para recuperar una carga útil de primera etapa de un servidor de comando y control codificado a través de una conexión TCP. Si este método falla, se crea un segundo trabajo cron que utiliza Python y la biblioteca urllib2 para recuperar una carga útil alternativa. La carga útil de vurl es un script de shell llamado cronb.sh cuyo objetivo es asegurarse de que la utilidad chattr (cambiar atributos de archivo) esté instalada y verificar si la cuenta actual es root. Esto determinará la siguiente carga útil, otro script de shell llamado ar.sh cuyo propósito es preparar el sistema para las siguientes etapas de infección.
Primero, utiliza el comando netstat para verificar si las conexiones en el puerto 80 están permitidas a Internet. Luego deshabilita los firewalls de Linux firewalld e iptables, elimina el historial del shell para ocultar sus pistas, deshabilita la protección SELinux y agrega servidores DNS públicos /etc/resolv.conf para garantizar que los futuros dominios C2 se resuelvan correctamente.