Malware personalizado utilizado para comprometer firewalls físicos y virtuales
Sophos y sus clientes fueron víctimas de un ataque coordinado por un adversario desconocido. Este ataque reveló una vulnerabilidad de inyección SQL previamente desconocida que condujo a la ejecución remota de código en algunos de nuestros productos de firewall. Como se describe en el KBA, la vulnerabilidad se ha corregido desde entonces.
Esta publicación es el resultado de muchas horas de investigación e ingeniería inversa por parte de los equipos de seguridad internos de SophosLabs y Sophos, trabajando en conjunto con la gestión de productos para coordinar una revisión y una respuesta global dentro de los dos días posteriores al descubrimiento de este ataque. En aras de la transparencia, queremos describir la naturaleza del ataque y un análisis detallado del malware basado en nuestra investigación y comprensión actual.
Hubo una importante orquestación involucrada en la ejecución del ataque, utilizando una cadena de scripts de shell de Linux que eventualmente descargaron malware ejecutable binario ELF compilado para un sistema operativo de firewall. Este ataque apuntó a los productos de Sophos y aparentemente estaba destinado a robar información confidencial del firewall.
Cómo comenzó el ataque
El proceso de infección comenzó cuando un atacante descubrió y explotó una vulnerabilidad de ejecución remota de código de inyección SQL de día cero. La explotación de esta vulnerabilidad dio como resultado que el atacante pudiera insertar un comando de una línea en una tabla de base de datos.
Este comando inyectado inicial activó un dispositivo afectado para descargar un script de shell de Linux llamado Install.sh desde un servidor remoto en el dominio malicioso sophosfirewallupdate[.]Com . El comando también escribió este script de shell en el directorio/tmp en el dispositivo, usó el programa chmod para designar el archivo como ejecutable y lo ejecutó.
El script (escrito en el dispositivo como x.sh) ejecutó una serie de comandos SQL y soltó archivos adicionales en el sistema de archivos virtual para sentar las bases para el resto del ataque.
El script Install.sh, inicialmente, ejecutó una serie de comandos SQL de Postgres para modificar o poner a cero los valores de ciertas tablas en la base de datos, una de las cuales normalmente muestra la dirección IP administrativa del dispositivo. Parece que este fue un intento de ocultar el ataque, pero fracasó: en algunos dispositivos, la actividad del script de shell dio como resultado que la propia línea de comando SQL inyectada del atacante se mostrara en la interfaz de usuario del panel administrativo del firewall. En lugar de lo que debería haber sido una dirección, mostraba una línea de comandos de shell.
Esta secuencia de comandos también dejó caer al menos otras dos secuencias de comandos de shell en el directorio / tmp, y modificó al menos una secuencia de comandos de shell que forma parte del sistema operativo del firewall para agregar un conjunto de comandos al final de la secuencia de comandos. Este último script, en particular, es relevante porque el malware modificó los servicios para garantizar que se ejecutara cada vez que se iniciaba el firewall; sirvió como un mecanismo indirecto de persistencia para el malware.
El juego de tres conchas ELF
La secuencia de comandos del instalador, x.sh, eliminó dos secuencias de comandos de shell completamente nuevas y modificó una secuencia de comandos existente que forma parte del sistema operativo.
Uno de los scripts de shell eliminados se llamaba .lp.sh y su función principal era conectarse al sitio malicioso sophosfirewallupdate y descargar un archivo ejecutable ELF de Linux compilado para ejecutarse en el sistema operativo de firewall llamado lp . El script escribió ese archivo descargado en / tmp con un nombre de archivo de solo b .
El programa b , cuando se ejecuta, se elimina del sistema de archivos del dispositivo, por lo que solo estaba presente en la memoria. Apareció en la lista de procesos como un programa cuyo nombre, cssconf.bin , está a un carácter de un proceso legítimo que normalmente se ejecuta en un firewall, cscconf.bin . La lista de procesos resaltada a continuación muestra el programa malicioso tal como habría aparecido ejecutándose en un firewall infectado. También es notable que enumeró su ID de proceso principal como 1, lo que el cscconf.bin legítimo nunca hubiera hecho.
Mientras b estaba en la memoria, repitió una serie de tareas cada 3 a 6 horas, un intervalo de retraso elegido al azar la primera vez que se ejecutó, y se reutilizó posteriormente.
Primero, b verificó si podía hacer una conexión a una máquina con la dirección IP de 43.229.55.44 . Si el ELF no pudo establecer una conexión con esa dirección IP, intentó resolver la dirección IP para el dominio malicioso sophosproductupdate [.] Com .
Si resolvió la IP para ese dominio y DNS no devolvió un valor de 127.0.0.1 como resultado, entonces descargó otro ejecutable ELF de Linux llamado Sophos.dat , que discutiremos en la siguiente sección.
El script de shell número dos que dejó caer el script Install.sh/x.sh se escribió en el directorio /tmp con un nombre de archivo de .pg.sh. Su objetivo principal era descargar un segundo ejecutable ELF diferente, que se llamaba bk en el servidor web y se escribía en el sistema de archivos con el nombre .post_MI.
Anteriormente mencionamos que Install.sh, el dropper de la primera etapa, ejecutó varios comandos SQL de Postgres. Uno de estos comandos modificó una entrada de valor de servicio específico para que .post_MI se ejecute siempre que se ejecute ese servicio; Esto proporcionó persistencia al iniciar el malware en cada reinicio.
Este ejecutable tenía una funcionalidad limitada: verificó si un archivo llamado .a.PGSQL (más sobre esto en un minuto) se había escrito en el directorio /tmp, y si no lo encontró, intentó descargar un shell script del servidor web alojado en ragnarokfromasgard.com , llamado patch.sh . En el momento en que realizamos el análisis del ataque, este servidor no respondía.
El tercer script de shell es una modificación de un script de shell que ya forma parte del sistema operativo interno del firewall, denominado generate_curl_ca_bundle.sh . El script Install.sh/x.sh realizó una copia de respaldo del original (anteponiendo un punto al nombre del archivo, .generate_curl_ca_bundle.sh ) antes de modificar el script original para agregar código al archivo. Ese código escribió y dejó caer otro script de shell, /tmp/I (solo una letra mayúscula i ).
El script I tenía dos funciones principales. Primero, realizó un «toque» del archivo /tmp/.a.PGSQL (un acto que, si el archivo no existía, lo creó en el directorio /tmp). Lo mencionado anteriormente . El ejecutable post_MI ELF se verificó para ver si existía .a.PGSQL como parte de su ejecución.
El script I luego recuperó un archivo de script de shell llamado lc del dominio sophosfirewallupdate , y lo escribió en el directorio / tmp como .n.sh y lo ejecutó . Este script replicó el mismo comportamiento que el script .lp.sh (mencionado anteriormente) e intentó descargar y ejecutar el ejecutable b ELF del sitio web malicioso sophosfirewallupdate . Esta descarga de b fue el mecanismo de persistencia, dado que el proceso b se eliminó del disco como una de sus primeras acciones.
Proceso de exfiltración de datos
Nota: Esta sección describe nuestra comprensión de las capacidades de exfiltración de datos del malware al momento de la publicación de este artículo, pero no hemos descubierto ninguna evidencia de que los datos recopilados se hayan extraído con éxito.
Los pasos que involucran los scripts de shell y los ejecutables binarios ELF aparentemente se realizaron para llevar el ataque al punto donde el malware descargó y ejecutó un archivo que había sido llamado Sophos.dat en el servidor remoto, guardado en el sistema de archivos como 2own .
La tarea principal de este malware parecía ser el robo de datos, que podría realizar recuperando el contenido de varias tablas de bases de datos almacenadas en el firewall, así como ejecutando algunos comandos del sistema operativo. En cada paso, el malware recopiló información y luego la concatenó en un archivo que almacenó temporalmente en el firewall con el nombre Info. xg.
Primero, el binario intentó recuperar la dirección IP pública donde se instaló el firewall. Primero hizo esto al consultar el sitio web ifconfig.me , y si ese sitio no fue accesible por alguna razón, trató de hacer lo mismo contactando checkip.dyndns.org .
A continuación, consultó varias áreas de almacenamiento de datos en el firewall para recuperar información sobre el firewall y sus usuarios.
El siguiente diagrama muestra la capacidad del malware para filtrar datos. A la fecha de publicación, no hemos descubierto ninguna evidencia de que los datos recopilados se hayan extraído con éxito.
El malware demostró la capacidad de recuperar solo información residente del firewall, que puede haber incluido:
- La licencia del cortafuegos y el número de serie
- Una lista de las direcciones de correo electrónico de las cuentas de usuario que se almacenaron en el dispositivo, seguida del correo electrónico principal que pertenece a la cuenta de administrador del firewall
- Los nombres de los usuarios del cortafuegos, los nombres de usuario, la forma cifrada de las contraseñas y el hash SHA256 salado de la contraseña de la cuenta del administrador. Las contraseñas no se almacenaron en texto sin formato.
- Una lista de las ID de usuario permitidas para usar el firewall para SSL VPN y las cuentas a las que se les permitió usar una conexión VPN «sin cliente».
El malware luego consultó una base de datos interna del firewall para recuperar una lista de los permisos de asignación de direcciones IP para los usuarios del firewall, así como información sobre el dispositivo en sí: qué versión del sistema operativo se estaba ejecutando, qué tipo de CPU y cantidad de memoria estaba presente en el dispositivo; cuánto tiempo había estado operativo desde el último reinicio (el «tiempo de actividad»); y la salida de las tablas ifconfig y ARP.
Una vez que el malware escribió toda esta información en Info.xg , la comprimió con la herramienta de compresión de alquitrán y luego utilizó OpenSSL para cifrar el archivo comprimido. El atacante usó el algoritmo Triple-DES para cifrar el archivo, y para una frase de paso, la palabra » GUCCI » en mayúsculas. Luego, el malware tenía la intención de cargar el archivo encriptado a una máquina en la dirección IP 38.27.99.69 , y luego limpió sus pistas eliminando los archivos creados temporalmente mientras recopilaba la información.
Remediación y respuesta
Los archivos asociados con este ataque se han agregado a la definición Linux/Agnt-G y los dominios y las direcciones IP se han marcado como maliciosos en el servicio de reputación de dominio de SophosXL.
Ya se ha lanzado una actualización de revisión para los clientes de Sophos para parchear la vulnerabilidad utilizada por los atacantes para acceder a los firewalls. Si no tiene habilitadas las actualizaciones automáticas en el firewall, siga estas instrucciones para habilitarlas.
Desde que se descubrió el ataque, Sophos ha tomado una serie de pasos, que podemos resumir de la siguiente manera: SophosLabs bloqueó dominios encontrados en el análisis forense inicial del ataque, y luego identificó y bloqueó dominios adicionales y direcciones IP asociadas con el ataque. Notificamos a los clientes sobre los pasos de mitigación. Emitimos una actualización de telemetría a los firewalls; y diseñamos, desarrollamos y probamos un hotfix para mitigar la inyección SQL y este ataque, y luego enviamos el hotfix a los dispositivos compatibles. Sophos también ha enviado una solicitud de CVE y agregará el número de CVE al artículo de la base de conocimiento una vez que esté disponible. También hemos tomado medidas adicionales que quedan fuera del alcance de este artículo.
Hay algunos pasos que los clientes de Sophos pueden tomar para fortalecer sus entornos y remediar un dispositivo de firewall afectado. Estos pasos se mantienen actualizados y se describen en la entrada de la base de conocimiento de Sophos sobre este tema.
Indicadores de compromiso (IoC)
Indicadores de archivo
Nombre del archivo | SHA256 | Tipo de archivo | Funcionalidad |
Install.sh [/tmp/x.sh] | 736da16da96222d3dfbb864376cafd58239344b536c75841805c661f220072e5 | Golpetazo | Script de instalación principal. Configuración comprometida del firewall, descartó dos archivos y modificó un tercero. |
Script de Shell | |||
lc [/tmp/.n.sh] | a226c6a641291ef2916118b048d508554afe0966974c5ca241619e8a375b8c6b | Golpetazo | Lp descargado (cuentagotas ELF) |
Script de Shell | |||
bk [/var/newdb/global/.post_MI] | 4de3258ebba1ef3638642a011020a004b4cd4dbe8cd42613e24edf37e6cf9d71 | DUENDE | Patch.sh descargado |
Binario X86 | |||
lp [/ tmp / b] | 9650563aa660ccbfd91c0efc2318cf98bfe9092b4a2abcd98c7fc44aad265fda | DUENDE | Cuentagotas principal. Módulo descargado 2own (exfiltración de datos) |
Binario X86 | |||
in.s_h | 8e9965c2bb0964fde7c1aa0e8b5d74158e37443d857fc227c1883aa74858e985 | Golpetazo | Forma ligeramente modificada de install.sh |
Script de Shell | |||
2own | 31e43ecd203860ba208c668a0e881a260ceb24cb1025262d42e03209aed77fe4 | DUENDE | Módulo de robo de datos. Exfiltra a 38.27.99.69 |
Script X86 |
Indicadores de red
URLS
hxxps: //sophosfirewallupdate.com/sp/Install.sh hxxp: //sophosfirewallupdate.com/sh_guard/lc hxxps: //sophosfirewallupdate.com/bk hxxps: //sophosfirewallupdate.com/sp/lp hxxps: //ragnarokfromasgard.com/sp/patch.sh hxxps: //sophosfirewallupdate.com/sp/sophos.dat hxxps: //sophosfirewallupdate.com/in_exit hxxps: //sophosfirewallupdate.com/sp/lpin hxxp: //sophosfirewallupdate.com/bkin hxxp: //filedownloaderservers.com/bkin hxxps: //sophosfirewallupdate.com/sp/p.sh hxxps: //sophosfirewallupdate.com/sp/ae.sh
DOMINIOS
sophosfirewallupdate.com filedownloaderservers.com ragnarokfromasgard.com sophosenterprisecenter.com sophoswarehouse.com sophosproductupdate.com sophostraining.org
DOMINIOS SOSPECHOSOS ADICIONALES
filedownloaderserverx.com filedownloaderserver.com updatefileservercross.com
IPs
43.229.55.44 38.27.99.69
Rutas del sistema de archivos
/tmp/x.sh /var/newdb/global/.post_MI /scripts/vpn/ipsec/generate_curl_ca_bundle.sh (modificado) /scripts/vpn/ipsec/.generate_curl_ca_bundle.sh (original) / tmp / I /tmp/.a.PGSQL /tmp/.n.sh /tmp/.pg.sh /tmp/.lp.sh / tmp / b / tmp / 2own /tmp/Info.xg /tmp/%s_.xg.rel /tmp/%s_.xg.salt / tmp / ip (resultado de http://checkip.dyndns.org/ip_dyn) / tmp / ip_dyn (resultado de https://ifconfig.me/ip)