Los expertos de ESET hablaron sobre el nuevo malware dirigido a clústeres de HPC en todo el mundo. Es interesante por varias razones. A pesar del tamaño relativamente pequeño del código base (las muestras analizadas tenían un tamaño de 25 KB), el malware es lo suficientemente complejo como para llevar a cabo ataques en Linux, BSD y Solaris y, potencialmente, puede ser adecuado para ataques en AIX y Microsoft Windows. . Otra característica distintiva es la capacidad de transformar los servidores infectados en nuevos C&C a las órdenes del operador. Debido a los muchos trucos y al pequeño tamaño del código, los investigadores lo llamaron Kobalos, en honor a los traviesos espíritus griegos antiguos que una vez robaron a Hércules y adoraron engañar y asustar a la gente.
El estudio publicado por expertos describe los vectores iniciales estimados de compromiso, mecanismos de autenticación y distribución, funciones integradas y proporciona un análisis técnico del código malicioso. Después de eso, los expertos señalan los signos de compromiso y los métodos aplicados de MITRE ATT & CK.
Teníamos la idea de que las personas que dominan mal el inglés, pero que no son indiferentes a las investigaciones actuales en el campo de la seguridad de la información, en particular, al análisis de malware, serían interesantes y útiles para traducir el análisis de los mismos, en nuestra opinión, malware inusual.
ESET Research analizó Kobalos, un malware multiplataforma complejo, previamente desconocido, diseñado para ejecutarse en Linux, FreeBSD y Solaris. Dado que las víctimas son principalmente organizaciones conocidas, no hay duda de que fueron atacadas por el software. Cuando se implementa, Kobalos da acceso al sistema de archivos del host comprometido y al terminal remoto, lo que permite a los atacantes ejecutar comandos arbitrarios.
Kobalos tiene capacidades de red notables. Puede funcionar en modo pasivo o como un bot, conectándose activamente a sus servidores C&C. Es curioso que estos mismos servidores hayan sido comprometidos por Kobalos: el código para su uso está en todas las muestras de este malware.
A través de una extensa investigación en red, ESET Research pudo identificar y notificar a las víctimas de Kobalos. Se desconoce cuándo se desarrolló este software, pero su primera actividad conocida, confirmada por una víctima, se registró a fines de 2019. El grupo de atacantes que ejecutan Kobalos continuó a lo largo de 2020. Las técnicas de ataque de Linux continúan evolucionando y los autores de malware se esfuerzan mucho en mejorar sus diseños. Kobalos es uno de esos programas.
Principales conclusiones
- Kobalos es una puerta trasera multiplataforma que se ejecuta en Linux, FreeBSD y Solaris. Hay indicios de que este software puede existir en AIX e incluso en Windows.
- Kobalos , , , -. Kobalos , .
- Kobalos , .
- Kobalos C&C- . , .
- OpenSSH. Kobalos.
- Kobalos. , , - . , SSH.
Si ha seguido la investigación de ESET en los últimos años, es posible que haya notado que preferimos buscar y documentar el malware del lado del servidor desarrollado para Linux y otros sistemas operativos menos comunes. Uno de los primeros informes de este tipo está dedicado a la Operación Windigo y describe varias familias de software que trabajan juntas para redirigir el tráfico de Internet, enviar spam y otras actividades maliciosas. Operation Windigo se basa en Ebury, una puerta trasera OpenSSH que roba credenciales. Ebury puede comprometer el servidor y el cliente SSH sin modificar los ejecutables de OpenSSH. En cambio, modifica la biblioteca que están cargando y parchea las funciones para poder iniciar y robar credenciales después de cargar la puerta trasera. La tarea no es fácil, pero los autores de Ebury lograron resolverla.
Después de la Operación Windigo, descubrimos y describimos varios otros programas maliciosos en Linux, como Mumblehard , Moose , Shishiga , y también describimos docenas de puertas traseras para OpenSSH en El lado oscuro del informe ForSSHe .
Hasta ahora, no nos hemos encontrado con malware de Linux que haya sido tan difícil de analizar como Ebury. Pero esta vez la situación es diferente: a diferencia de Ebury, las acciones de Kobalos no parecen tan grandes. La cantidad de autos comprometidos por ellos está en decenas, y en el caso de Ebury, decenas de miles. Este artículo proporciona un análisis técnico completo de Kobalos, los objetivos de los atacantes y los indicadores de compromiso que pueden ayudar a las víctimas potenciales a encontrar malware y deshacerse de él.
Víctimas
Después de analizar el malware, ESET realizó un extenso análisis de Internet en busca de víctimas de Kobalos. Estábamos buscando un comportamiento de puerta trasera específico, que se caracteriza por establecer una conexión TCP con un host comprometido desde un puerto de salida específico.
Dada la complejidad de este software, nos sorprendió el escaso número de víctimas encontradas. Sin embargo, los objetivos en sí mismos claramente no fueron elegidos por casualidad: se trata de computadoras de alto rendimiento (HPC) y servidores que forman parte de redes científicas y de investigación. Una de estas computadoras tenía al menos 512 GB de RAM y casi petabytes de almacenamiento en disco. También encontramos otras organizaciones de víctimas conocidas, como un proveedor de seguridad de terminales (¡no nosotros!).
Figura 1. Industrias y regiones a las que pertenecen las organizaciones comprometidas.
En algunas organizaciones, se infectaron varios servidores a la vez. Notificamos a todas las víctimas que encontramos y trabajamos juntos para eliminar el malware. Gracias a todos los que respondieron y compartieron información que nos ayudó en este estudio.
Vector inicial de compromiso
No sabemos de primera mano cómo se comprometieron los sistemas para que los atacantes pudieran obtener acceso administrativo para instalar Kobalos. Solo podemos especular sobre la base de la evidencia recopilada.
En las máquinas comprometidas cuyos administradores de sistemas participaron en la investigación, descubrimos que el programa de robo de credenciales SSH se presentaba como un cliente OpenSSH troyano. Expediente
/usr/bin/ssh
fue reemplazado por un ejecutable modificado que registró el nombre de usuario, la contraseña, el nombre de host de destino y los guardó en un archivo cifrado. Por lo tanto, creemos que el robo de identidad fue una de las formas en que se distribuyó Kobalos. También podría explicar por qué se vieron comprometidas muchas redes académicas: si los estudiantes o investigadores de varias universidades usaran cualquier cliente SSH, entonces se podrían robar las credenciales de todos estos sistemas de terceros.
Otro posible punto de entrada podría ser la explotación de una vulnerabilidad conocida: algunas máquinas comprometidas estaban ejecutando aplicaciones y sistemas operativos antiguos, sin soporte o sin parches, por lo que la opción de usar un exploit conocido es más probable. Pero tampoco debe excluir la posibilidad de utilizar una vulnerabilidad actualmente desconocida.
Ataque a las redes para la informática de alto rendimiento
ESET ha compartido información con organizaciones que desempeñan un papel importante en la resolución de incidentes en los sistemas académicos y de investigación, como el equipo de seguridad informática del CERN. Confirmaron que desde finales de 2019 hasta mediados de 2020, la comunidad HPC se vio afectada por una ola de tres ataques diferentes, algunos de los cuales se anunciaron públicamente .
Después de muchos meses de investigación, aún no está claro si estas tres ondas estaban relacionadas entre sí o si fue solo una coincidencia inesperada. Los operadores de malware utilizaron diferentes tácticas, técnicas y niveles de dificultad. Por otro lado, resulta extraño que en diferentes ataques coincidieran algunas direcciones IP.
- La primera ola utilizó Kobalos, que se describe en este estudio.
- La segunda ola se centró en la minería de criptomonedas con un conjunto de herramientas muy diferente.
- La tercera ola fue la más grande, pero aún no se ha determinado su carga útil.
El equipo de respuesta a incidentes de seguridad informática de infraestructura de red europea describió signos indirectos de compromiso como resultado de la segunda y tercera oleadas en forma de incidentes # EGI20200421 y # EGI2020512 .
No está claro por qué la comunidad HPC es dominante entre las víctimas de estos ataques. Los HPC son interesantes, por supuesto, pero suelen ser más difíciles de penetrar que otros servidores de I + D. A través de un proceso distribuido de respuesta a incidentes basado en la comunidad, el CERN y otros equipos involucrados han identificado una serie de arquitecturas obsoletas y prácticas de seguridad subóptimas que han jugado un papel clave en la proliferación de ataques. Además, la mayoría de las víctimas de la comunidad HPC estaban mal equipadas para realizar investigaciones, especialmente en términos de la actividad del sistema de monitoreo.
Revisión de Kobalos
Kobalos tiene numerosas capacidades para acceder a sistemas comprometidos y ocultar rastros de su uso.
Acceso a sistemas comprometidos
Primero, Kobalos proporciona comandos generales para leer y escribir en el sistema de archivos, así como para iniciar un terminal y ejecutar comandos arbitrarios. Desafortunadamente, no hay una carga útil específica en el programa que sugiera las intenciones de los autores. Lo más probable es que los operadores ejecuten un shell de comandos a través de la terminal y ejecuten los comandos que necesitan.
Disponibilidad
En segundo lugar, Kobalos tiene una serie de características que le permiten establecer una conexión de red entre los operadores y el malware que se está ejecutando. El software proporciona su accesibilidad externa de varias formas:
- Abre un puerto TCP y espera una conexión entrante (este modo a veces se denomina puerta trasera pasiva).
- Se conecta a otra instancia de Kobalos que está configurada como servidor C&C.
- Esperando conexiones a un servicio legítimo que ya se está ejecutando, saliendo de un puerto TCP específico.
El último método requiere reemplazar el servicio en ejecución por otro que contenga el código Kobalos. En todos los casos en los que notamos el uso de este método, los atacantes tuvieron que modificar el servidor OpenSSH en ejecución. El archivo se
sshd
reemplazó por completo, por lo que el programa continuó funcionando incluso cuando se reinició el servicio o el sistema.
Autenticación y cifrado de red
En tercer lugar, para ejecutar la puerta trasera, debe autenticar a sus clientes, que deben tener una clave y contraseña RSA-512 privadas. Después de verificarlos, Kobalos genera y encripta dos claves de clave pública de 16 bytes utilizando el algoritmo RSA-512 y las envía a los atacantes. Estas dos claves se utilizan para el cifrado RC4 del tráfico entrante y saliente posterior.
Cambio de puerto
En cuarto lugar, durante la autenticación, el operador puede continuar interactuando a través de otra conexión TCP. Si lo solicita, Kobalos puede comenzar a escuchar el puerto deseado y transferirle todas las comunicaciones posteriores. Los datos que pasan a través de este canal se cifran mediante claves RC4 que se crearon durante la autenticación.
Proxying a otras máquinas comprometidas
En quinto lugar, Kobalos se puede utilizar como proxy para conectarse a otros servidores que compromete. Este no es un proxy TCP ordinario: requiere la encapsulación de datos en paquetes especiales y también admite el cambio de puerto anterior: para esto, se envía un comando que "cambia" la conexión.
Los proxies se pueden encadenar, lo que significa que los operadores pueden utilizar varias máquinas comprometidas de Kobalos para conectarse a los servidores de destino.
Un conjunto de posibilidades
Figura 2. Descripción general de las capacidades de Kobalos y posibles escenarios para acceder a servidores comprometidos.
El primer escenario es la conexión directa a servidores comprometidos para acceder a sus recursos. En el diagrama, la puerta trasera se ejecuta dentro del proceso del servidor OpenSSH y espera que la conexión tenga un puerto de origen. El operador debe utilizar el puerto TCP de origen correcto para comunicarse con la puerta trasera.
El segundo escenario es posiblemente el más desafiante, pero viene con las características únicas de los Kobalos. El operador puede ejecutar el servidor C&C desde cualquier servidor que ejecute este software. No se necesita código adicional para esto, todas las funciones ya están integradas. Después de su lanzamiento, el servidor C&C verifica la lista de bots conectados y el operador puede conectarse a cualquiera de ellos. El último nodo requiere autenticación y aplica el cifrado de extremo a extremo mediante el intercambio de claves RC4. Para garantizar tal esquema de trabajo, la instancia de Kobalos en el servidor B debe tener la dirección IP y el puerto del servidor C&C ejecutándose en el servidor A. El servidor B intercambia tráfico solo con el servidor A, ocultando la dirección IP del operador.
En el tercer escenario, el servidor A se utiliza como proxy de la conexión al servidor C. Esto también aplica autenticación y cifrado forzado de extremo a extremo. El operador puede configurar el puerto de origen cuando se conecta del servidor A al C. Esto significa que el servidor A se puede utilizar para conectarse a instancias de Kobalos que están esperando una conexión desde un puerto específico.
Análisis técnico de Kobalos
Por primera vez, analizamos un servidor OpenSSH troyanizado. El tamaño del código malicioso y los datos de Kobalos es bastante pequeño: alrededor de 25 KB para muestras x86-64. Curiosamente, todo el código está empaquetado en una función. Solo hay una llamada a esta función en el código OpenSSH legítimo.
Kobalos es un software complejo. Evidentemente, sus desarrolladores se esforzaron mucho en su creación. Los autores han implementado numerosas funciones y han implementado su propia ofuscación.
Ofuscación
Aplanamiento excepcional del flujo de control
El hecho de que el código encaje en una función no significa que el flujo de control sea lineal. Kobalos llama de forma recursiva a su función para realizar las subtareas necesarias.
Figura 3. Gráfico de flujo de control de Kobalos.
El primer parámetro de la función es la acción a realizar. Kobalos puede realizar 37 acciones. Estos se enumeran en el apéndice de funciones integradas de Kobalos , que le ayuda a analizar las versiones actuales y futuras de este software. La función también sirve como manejador de señales
SIGCHLD
para terminar con gracia el proceso hijo y
SIGALRM
manejar el tiempo de espera de la conexión.
En lo que respecta al código fuente de Kobalos, podría ser como compilar el código C a continuación. Parte de la conversión se puede automatizar mediante la inserción de funciones por parte del compilador, pero asignando identificadores numéricos a todas las funciones y manejando el mismo número de argumentos en las funciones. Requiere trabajo manual o herramientas especiales.
Antes | Después |
---|---|
|
|
Figura 4. Este código C muestra cómo se vería el código fuente de Kobalos después de alinear el flujo de control.
Valores de cadena encriptados
El código y los datos de Kobalos no contienen valores de cadena de texto sin formato. Aquí solo se utilizan algunas cadenas cortas cifradas con RC4. Se descifran inmediatamente después de la interacción inicial con el programa, pero antes de la autenticación. Para todas las muestras que analizamos, se utiliza una llave -
AE 0E 05 09 0F 3A C2 B5 0B 1B C6 E9 1D 2F E3 CE
.
Valores de cadena decodificados:
- % s% s
- / dev / ptmx
- ptem
- ldterm
- ttcompat
- / dev / tty
- % s
- % D
- /
- \
- % d.% d
- win3.11
- win95
- ganar
- ganar ??
- \\. \ pipe \ 2
- % s% s.% s
- / dev / ptc
En las muestras de Kobalos que analizamos, solo se utilizan los valores en negrita (1 y 6-9). Otros no se mencionan, aunque pueden usarse en algunas otras versiones. En particular:
- Las líneas 10 y 12-16 parecen ser específicas de Windows.
- La línea 18 es la ruta al controlador de dispositivo de pseudo-terminal en AIX.
- Las llamadas al sistema de pseudo-terminal de Solaris utilizan las líneas 3-5.
No podemos excluir la opción de intentar desinformar a los investigadores sobre la existencia de versiones para otros sistemas operativos. Dado que hemos confirmado el soporte para tres sistemas operativos, no debería sorprendernos si hay más. Por otro lado, Windows 3.11 y Windows 95 tienen más de 25 años. ¿Existen versiones de Kobalos para estos sistemas heredados?
Oponerse a una investigación
Una vez autenticado, se aplican algunas técnicas al proceso de puerta trasera para dificultar la investigación:
- El valor
RLIMIT_CORE
se borra para evitar que se genere un volcado de kernel en caso de que el proceso se bloquee. - La mayoría de las señales se ignoran para dificultar la interrupción del proceso.
Figura 5. Kobalos evita volcados de kernel en caso de caída e ignora la mayoría de las señales.
Es importante tener en cuenta que la configuración
RLIMIT_CORE
no está de más para volcar el proceso manualmente, por ejemplo, usando
gcore
gdb. El kernel utiliza este límite para determinar el tamaño máximo de un volcado de memoria cuando un proceso falla.
Sellos de tiempo
Un análisis del sistema de archivos de los servidores comprometidos mostró que después de la configuración, las marcas de tiempo de los archivos reemplazados (como
ssh
para agregar un módulo de robo de credenciales o
sshd
para implementar Kobalos) se manipulan para evitar sospechas.
Configuración
Kobalos tiene una configuración estática que habilita o deshabilita funciones de software. La Tabla 1 enumera los campos que consideramos parte de la configuración. La figura 6 muestra un ejemplo del mundo real.
Tabla 1. Estructura de la configuración estática Kobalos:
Tamaño (bytes) | Descripción |
---|---|
2 | Probablemente un número de versión. Transmitido con autenticación exitosa. En todas las muestras encontradas, importa 0xB03
(considerando que se transmite en el formato de mayor a menor, como todos los demás datos de Kobalos). |
320 | Módulo de clave pública RSA. Cifrado en un formato binario especial. |
2 | Puerto TCP para escuchar. Si se establece en cero, Kobalos no escuchará en los puertos, pero usará otros métodos para esperar una conexión a la puerta trasera. |
2 | C&C-, . , — . |
2 | . ( ) ( ). |
4 | IP- C&C- . Kobalos . |
2 x 16 | TCP-, C&C-. |
16 | MD5- , . |
Figura 6. Configuración de muestra de la muestra de Kobalos incrustada en sshd.
Parte de la configuración será diferente si Kobalos se ejecuta internamente
sshd
o como un archivo ejecutable separado. En el último caso, se requiere la dirección del servidor C&C remoto (
remote_c2_addr
) o el puerto de escucha (
listen_port
).
Despliegue y preservación
Si Kobalos se implementa para ejecutarse como parte de un servidor OpenSSH, el archivo
sshd
debe volver a compilarse para agregar código malicioso. Comparamos la versión troyana de OpenSSH y la que debería instalarse en el sistema, por ejemplo, desde el administrador de paquetes. Parece que el operador está compilando Kobalos basándose en el código fuente correcto OpenSSH ya instalado en el servidor. Es probable que el ejecutable infectado se compile en la máquina de la víctima antes de reemplazar el original. Lo más probable es que se haya elegido un esquema de este tipo para garantizar la seguridad del software al evitar que las versiones no coincidan, debido a las cuales puede surgir la incompatibilidad de la biblioteca.
Cabe señalar que para reemplazar
sshd
necesita privilegios de root. Sin embargo, existen versiones de Kobalos como archivos separados que se conectan al servidor C&C o escuchan en el puerto TCP. No necesita privilegios de administrador para ejecutarlos, pero el acceso al sistema de archivos y al conjunto de comandos estará limitado por el nivel de acceso del usuario actual.
Interacción de puerta trasera
Conexión de puerta trasera
Una de las características notables de Kobalos es la flexibilidad para establecer conexiones entre operadores y hosts comprometidos. Esto se puede hacer de tres formas:
- Escuchando el puerto TCP especificado (modo pasivo).
- Conectándose al servidor C&C (modo activo) y esperando que el operador se conecte a través de este servidor.
- Reemplazando el servicio existente que escucha en los puertos TCP y esperando una conexión desde un puerto TCP de origen específico.
Usando la configuración estática de Kobalos, se pueden activar varios métodos a la vez, sin embargo, en cada muestra que analizamos, solo se activó uno.
El último método requiere modificar el demonio ejecutable. La versión troyana llama al código Kobalos cada vez que acepta una nueva conexión TCP, como se muestra en la Figura 7. La puerta trasera puede aceptarla si la conexión proviene de un puerto TCP específico. Si el número de puerto coincide, la función no devuelve nada y el subproceso finaliza cuando se cierra la conexión. Si el puerto no corresponde al prescrito, el programa no hace nada y transfiere el trabajo al código del servicio legítimo, que continúa funcionando correctamente.
Figura 7. Llamar a una función desde una función OpenSSH troyanizada después de aceptar una nueva conexión TCP. Este es el que más hemos visto y solo ha sido abusado por el servidor OpenSSH. Sin embargo, los datos pueden ser erróneos, porque esta es la forma que podríamos detectar al escanear Internet. Como se muestra en la Figura 8, Kobalos está escuchando en el puerto TCP 55201.
kobalos
main
Figura 8. Comparación del puerto de origen con 55201.
Kobalos implementa un método adicional para filtrar las conexiones TCP entrantes, comparando el puerto de origen con una lista de 16 puertos:
Figura 9. Comparación de un puerto de origen con una lista de 16 puertos.
Lista de 16 puertos:
20 | 567 | 2734 | 22392 |
21 | 982 | 5392 | 33921 |
53 | 1821 | 11568 | 44983 |
230 | 1912 | 19678 | 55201 |
Sin embargo, ninguna de las muestras encontradas utilizó este filtro. Es posible que se haya utilizado en una versión anterior de la puerta trasera.
Autenticación
Una vez establecida la conexión, se realiza la autenticación. Para seguir trabajando, necesita una clave RSA privada y una contraseña de 32 bytes. El cliente de Kobalos envía un paquete inicial de 320 bytes al servidor infectado, cuya estructura se describe en la Tabla 2.
Tabla 2. La estructura del paquete de autenticación (encriptado con la clave RSA privada) :
Tamaño (bytes) | Descripción | Valor |
---|---|---|
cuatro | Parámetro misterioso | 0x7FFF000A
|
2 | Puerto de enlace | Si 0x0000
, entonces Kobalos elige un puerto aleatorio. Si 0xFFFF
, entonces usa una conexión TCP existente. |
una | Identificador de canal de comunicación | Parece que siempre se establece como 0xFF
. |
32 | Contraseña | El valor de la contraseña coincide con el hash MD5 en la configuración estática. |
280 | Relleno |
Los primeros 64 bytes del paquete se descifran utilizando el módulo y el exponente de clave pública RSA-512 configurados
0x10001
(consulte la Figura 11). Luego, como se muestra en la Figura 10, el hash MD5 se aplica a la contraseña de 32 bytes y el resultado se compara con la información de la configuración estática.
Figura 10. Después de recibir 320 bytes, se realiza la autenticación.
Figura 11. Carga de una clave pública RSA-512.
Utilizando la clave RSA pública, Kobalos cifra y establece claves RC4 que se utilizan para futuras comunicaciones: una para el tráfico entrante, otra para el tráfico saliente. Kobalos envía claves encriptadas en su respuesta.
Tabla 3. Estructura de la respuesta de Kobalos (cifrada con clave pública RSA) :
Tamaño (bytes) | Descripción | Valor |
---|---|---|
cuatro | Parámetro misterioso | 0x7FFF000A
|
dieciséis | Clave RC4 para tráfico entrante | Clave RC4 utilizada para el tráfico al host comprometido. |
dieciséis | Clave RC4 para tráfico saliente | Clave RC4 utilizada para el tráfico de un host comprometido. |
2 | Puerto obligado | Puerto TCP utilizado como canal activo. El valor 0xFFFF
significa usar la conexión actual. |
282 | Relleno |
Canal activo
Después de pasar la autenticación, el canal activo puede usar un puerto diferente. Es posible que haya notado que con la autenticación de cliente, debe proporcionar un "puerto de enlace" en el mensaje cifrado.
- Si su valor difiere de
0xFFFF
, entonces Kobalos comenzará a escuchar el puerto TCP especificado. - Si el valor es cero, la puerta trasera comenzará a escuchar un puerto aleatorio por encima de 1024.
Como se mencionó anteriormente, en la respuesta de autenticación, junto con el par de claves RC4, se transmite el número del puerto recién abierto. Si lo desea, se puede crear una conexión TCP adicional: si se transmite un valor como puerto de enlace
0xFFFF
, se utiliza la conexión actual.
La comunicación posterior a través de estas conexiones TCP se encapsula en paquetes, cuyo formato se describe en la Tabla 4.
Tabla 4. Estructura de paquetes de Kobalos :
Tamaño (bytes) | Valor |
---|---|
una | Significado misterioso ( 0x7F
) |
2 | Carga útil |
una | Identificador del canal de comunicación. |
una | Identificador del canal de comunicación. |
payload_size | Carga útil (cifrada con RC4). |
Kobalos es el primero en enviar el paquete al operador conectado. El paquete contiene información básica sobre la máquina, como el nombre de host y la versión del kernel. La Figura 12 muestra los niveles de encapsulación en un paquete.
Figura 12. Información enviada al operador desde un host comprometido.
La Figura 13 muestra los procesos de comunicación entre Kobalos y su cliente.
Figura 13. Diagrama de secuencia del protocolo de red de Kobalos.
Gestión de puerta trasera
Después de la autenticación, el operador puede emitir diferentes comandos a la puerta trasera. Los hemos dividido en categorías:
- Conéctese a otros servidores infectados con Kobalos y actúe como proxy.
- Leer y escribir archivos en el sistema de archivos.
- Lanzar y acceder a un pseudo-terminal en un host comprometido.
- Lanzamiento y administración de servidores Kobalos C&C con acceso a bots conectados.
Los comandos están encapsulados en el canal activo. Comienzan con un byte de identificación, seguido de los parámetros analizados por este comando. Los comandos descritos en este trabajo son procesados por Kobalos, es decir, el operador los envía al sistema comprometido mediante un cliente especial. Kobalos responde en el mismo formato, con el primer byte identificador, y las respuestas son procesadas por el mismo cliente. Por ejemplo, después de la autenticación, se puede dar el comando "enviar información de host" (
0x04
).
Usar como proxy
Los operadores pueden usar los Kobalos instalados en la máquina comprometida para conectarse a otras instancias de la puerta trasera en otros sistemas. El modo proxy utiliza el tamaño de paquete especial descrito anteriormente para la autenticación y encapsulación, es decir, no es un proxy TCP normal.
Al conectarse a una máquina de terceros, el operador puede seleccionar el puerto TCP de origen. Esto le permite conectarse a instancias de Kobalos que están esperando una conexión desde un puerto específico. También se admite la reconexión del canal activo a través de un puerto alternativo. Para esto, se da un comando especial.
Una de las tareas en este caso es garantizar un cierto nivel de anonimato del operador. El nodo final solo ve la dirección IP de la otra máquina comprometida, no la dirección IP del operador. Para ocultar aún más la dirección del operador, puede crear cadenas de máquinas proxy comprometidas. La Figura 14 muestra tal escenario.
Figura 14. Kobalos se está utilizando como proxy.
Los comandos de control de proxy se describen en la Tabla 5.
Tabla 5. Comandos para usar Kobalos como proxy :
Mando | Descripción | Opciones |
---|---|---|
0x01 | Establecer una conexión con otro host comprometido por Kobalos. | Dirección remota. Puerto de origen. Puerto final. Mensaje de autenticación (320 bytes). |
0x03 | . , TCP-. | . |
0x05 | . |
Después de la autenticación, el operador puede leer o escribir cualquier archivo en el sistema. En el protocolo de red de Kobalos, la carga útil encapsulada se define mediante un número entero de 16 bits. Esto significa que el operador solo puede enviar paquetes de 64K. Por ejemplo, si quiere escribir 200 KB en un archivo, tendrá que ejecutar cuatro comandos de escritura con éxito. El comando de lectura tiene una limitación aún más estricta: solo se pueden leer y enviar 1000 bytes a la vez.
La Tabla 6 describe los comandos para trabajar con el sistema de archivos.
Tabla 6. Comandos para leer y escribir archivos :
Mando | Descripción | Opciones |
---|---|---|
0x18 | Abrir un archivo para escribir; si no es así, se crea el archivo. | Posición de búsqueda. La ruta al archivo. |
0x1A | Escribiendo en un archivo. | Datos para escribir. Se sobrescribirán desde la posición de búsqueda. |
0x1C | Cerrar el archivo después de la grabación. | |
0x1D | Abrir y leer un archivo. | Posición de búsqueda. La ruta al archivo. |
0x20 | Cerrar el archivo después de leerlo. |
Creando una pseudo-terminal
Esta funcionalidad permite a un operador autenticado crear un shell en un nuevo pseudo-terminal y ejecutar comandos arbitrarios. Para hacer esto, use los comandos de la Tabla 7.
Tabla 7. Comandos para crear y administrar pseudo-terminales :
Mando | Descripción | Opciones |
---|---|---|
0x12 | Lanzamiento de un nuevo pseudo-terminal. | La ruta al caparazón (por ejemplo /bin/sh
). Argumento. |
0x0D | Especifica el tamaño de la ventana de la pseudo-terminal. | Valores de estructura winsize
aceptados por TIOCSWINSZ . |
0x14 | Cerrando una pseudo-terminal. | |
0x16 | Escribiendo a un pseudo-terminal. | Datos para escribir. |
Los datos del terminal se envían a los operadores y, después de los datos, aparece el identificador del comando de cierre
0x17
. Se implementa en el cliente que utilizan los operadores.
Utilizar como servidor C&C
Una de las características más inusuales de Kobalos es que el código del servidor C&C ya está integrado en la propia puerta trasera. Esto permite a los atacantes convertir cualquier máquina infectada en servidores C&C (para otros bots) con un solo comando. Después de iniciar el servidor, el operador puede establecer su dirección IP y puerto en las configuraciones de futuras instancias de Kobalos que se implementarán en otros hosts. Esto permite:
- Utilice los recursos comprometidos como servidores de C&C, en lugar de alquilar servidores de proveedores habituales. Esto reduce la probabilidad de que el servidor no esté disponible.
- Utilice el servidor C&C como nodo intermedio para máquinas detrás de cortafuegos con las que no hay conexión directa desde Internet.
Cuando el operador envía un comando de "transición al modo C&C" (
0x21
) , el número de puerto se pasa como parámetro. Kobalos comienza a escucharlo y los bots usan este puerto para conectarse a la instancia del servidor C&C. Sin embargo, la puerta trasera también escucha en el siguiente número de puerto más alto. Por ejemplo, si los bots usan el puerto TCP 7070, entonces en el modo C&C Kobalos también escucha en 7071. El segundo puerto lo usa el operador para controlar las funciones de C&C, como enumerar bots y establecer túneles para ellos. El diagrama se muestra en la Figura 15.
Figura 15. El operador Kobalos llama a los bots que informaron al servidor de C&C.
La Tabla 8 describe los comandos para controlar las capacidades del servidor C&C.
Tabla 8. Comandos para controlar las funciones del servidor C&C :
Mando | Descripción | Opciones |
---|---|---|
0x21 | Lanzamiento del servidor C&C. | Puerto TCP para servidor C&C. |
0x23 | Obtenga la cantidad de conexiones activas y el total desde que comenzó C&C. | |
0x25 | Lista de todos los bots listos para ejecutar comandos. | |
0x29 | Desconectando el servidor C&C. | |
0x2B | Conéctese al bot. | Índice de bot de la lista de bots listos para conectarse. Mensaje de autenticación (320 bytes). |
0x2D | Conectarse a un bot sin autenticación. | Índice de bot de la lista de bots listos para conectarse. |
Comandos
0x23
:
0x2D
procesados por el subproceso del servidor C&C. Como se muestra en la Figura 16, después de enviarse en un canal activo, los datos se redirigen a través de TCP a la interfaz de bucle invertido del puerto de control (uno más que el número de puerto utilizado por los bots) del servidor C&C.
Figura 16. Los paquetes relacionados con la administración del servidor C&C se reenvían a través de TCP a un subproceso.
Otros comandos
Variables de entorno
Para el proceso de puerta trasera, hay un comando para configurar variables de entorno. Toma una cadena como parámetro y simplemente la pasa a putenv , que espera datos en el formato "VAR = valor".
Tabla 9. Otros comandos que entiende Kobalos :
Mando | Descripción | Opciones |
---|---|---|
0x0E | Establece la variable de entorno para la sesión. | Cadena a la que pasar putenv
. |
Operaciones vacías
Hay dos comandos más implementados, pero no hacen nada. Tenemos dos explicaciones para esto:
- Los autores eliminaron la funcionalidad de los comandos ya que se usaban en versiones anteriores y ya no son necesarios.
- Los comandos son específicos de la plataforma y no se aplican a las versiones de Kobalos para Linux y FreeBSD que analizamos.
Figura 17. Equipos y no hacen nada. La segunda explicación parece más probable porque conocemos los valores de cadena para Solaris, AIX y Windows (consulte el capítulo Valores de cadena encriptados).
0x07
0x09
Programa de robo de credenciales OpenSSH
En la mayoría de los sistemas comprometidos por Kobalos, la puerta trasera también implementó un programa para robar credenciales SSH a través de un cliente SSH troyano. Encontramos diferentes versiones de estos archivos, incluidos Linux y FreeBSD. A diferencia de Kobalos, las capacidades de este programa apenas se han ofuscado. Su función principal es robar el nombre de host, el número de puerto y el nombre de usuario y la contraseña para establecer una conexión SSH desde un host comprometido. Los datos se guardan en un archivo cifrado. Las versiones más recientes del troyano también pueden transmitir información a través de la red a través de UDP, pero esta función no se activó en la configuración de la mayoría de las muestras encontradas.
Pero en el momento de la publicación de nuestro estudio anterior de puertas traseras OpenSSH "El lado oscuro de ForSSHE", no conocíamos este troyano, por lo que no se menciona en ese trabajo. Tampoco podemos vincularlo a ninguno de los programas de robo de credenciales OpenSSH descritos en fuentes abiertas.
La ubicación del archivo de datos robado depende de la versión del programa. Todas las muestras crearon un
/var/run
archivo con la extensión .pid en el directorio . Se utiliza en muchos de los archivos de este directorio. Puede ver ejemplos de nombres de archivos y rutas a ellos de diferentes muestras en el capítulo "Signos de compromiso".
Todas las muestras encontradas cifran el contenido de los archivos utilizando un cifrado simple. Como se muestra en la Figura 18, el troyano simplemente agrega 123 a cada byte de datos que almacena.
Figura 18. Cifrado y escritura de credenciales SSH robadas en el archivo.
La versión de FreeBSD usa el mismo formato y cifrado. Sin embargo, se implementan de manera un poco diferente, por ejemplo, en el programa, la ruta al archivo está encriptada usando un XOR de un solo byte.
Desarrollando una familia de programas
Después de que notificamos a una de las organizaciones víctimas, descubrieron lo que parece ser una versión más reciente de un troyano que roba credenciales. Contiene una configuración encriptada y permite que la información robada se transmita a través de UDP al host remoto especificado en la configuración. Ebury y otros programas de robo de credenciales SSH como Bonadan, Kessel y Chandrila también tienen esta capacidad. Quizás se eligió UDP para evitar los firewalls y no realizar conexiones TCP con hosts potencialmente no confiables. El troyano utiliza solo un método de transmisión, a través de un archivo o una red, porque el nombre del host de destino y la ruta al archivo se almacenan en la misma variable.
La Figura 19 muestra el código descompilado para enviar datos a través de UDP. Y la figura 20 muestra la configuración de la muestra encontrada. Estaba configurado para registrar la información robada
/var/run/sshd/sshd.pid
.
Figura 19. El troyano envía credenciales a través de UDP .
Figura 20. Ejemplo de una configuración que usa un archivo para capturar datos robados.
Curiosamente, la configuración también contiene el nombre del host de la víctima. Es probable que los operadores lo utilicen para indicar una fuente de datos. También significa que cada servidor comprometido recibe una instancia única del troyano.
Conclusión
Numerosas características y técnicas de elusión de red bien implementadas indican que los autores de Kobalos son mucho más hábiles que muchos escritores de malware para Linux y otros sistemas que no son de Windows. La focalización, organizaciones bastante conocidas, también nos dice que los operadores de Kobalos no tienen como objetivo infectar tantos sistemas como sea posible. Los rastros bajos y las técnicas de derivación de la red podrían ser la razón por la que la puerta trasera pasó desapercibida hasta que informamos a las víctimas de los resultados de nuestro análisis de red.
No podemos responder a la pregunta sobre las intenciones de los atacantes. Las capacidades de la puerta trasera le permiten usarla para resolver cualquier problema. No se encontró ningún software adicional en las máquinas comprometidas, excepto un troyano que roba las credenciales SSH. Por lo tanto, consideramos SSH como el punto de entrada y no como la carga útil. Según la información de los administradores de sistemas de los sistemas de información HPC comprometidos de los administradores de sistemas de los sistemas HPC comprometidos, nadie intentó extraer criptomonedas o lanzar otras tareas que requirieran una gran potencia informática.
¿Qué persiguen los atacantes?
Tampoco pudimos averiguar cuánto tiempo ha estado en uso este software. Encontramos líneas relacionadas con Windows 3.11 y Windows 95 que aparecieron hace más de 25 años. ¿Existe una versión de Kobalos para Windows? ¿Este programa fue creado hace tanto tiempo? Sabemos de nuevas infecciones en 2019 y 2020, pero no encontramos evidencia de uso anterior.
Si bien los autores de este software parecen estar bien versados en el funcionamiento de los protocolos de red y los sistemas operativos de sus víctimas, Kobalos tiene varias debilidades. En primer lugar, los problemas con la criptografía probablemente se deban al desarrollo de esta industria, si Kobalos realmente se desarrolló durante mucho tiempo. En segundo lugar, es posible que observe que hay instancias de escucha pasiva, especialmente si requieren un puerto TCP de origen específico. Aprovechamos con éxito esta función y notificamos a las víctimas para reducir la cantidad de hosts infectados y comprender mejor esta amenaza recién descubierta.
También informamos sobre el trabajo de Maciej Kotowicz de MalwareLab pl , quien analizó de forma independiente a Kobalos y con quien intercambiamos los resultados de la encuesta. Le dijo Oh My H@ck 2020.
. Kobalos
1003 | INITIALIZE | socket, filter | Kobalos , ( enum). |
1004 | START_LISTENING | C&C- . | |
1005 | START_C2_SERVER | socket_1, socket_2 | C&C-. |
1006 | SEND_PACKET | socket_fd, &channel_1,
&channel_2, data, data_len |
Kobalos socket_fd. |
1007 | RECV_PACKET | socket_fd, &channel_1,
&channel_2, data, data_len |
Kobalos socket_fd. |
1008 | GET_RANDOM_INT | random_int | 32- . PRNG . |
1009 | GET_HOST_INFO | out_buf, returns buf_len | , IP- . |
1010 | SET_COMMON_SOCKOPT | socket | SO_REUSEADDR SO_KEEPALIVE
true, SO_LINGER — 15 . |
1011 | RC4_DECRYPT_STRING_INPLACE | str, len | str RC4- . |
1012 | CLEANUP_THINGS | what_to_close, send_report | . . . |
1013 | RC4_INIT | context, key_size, key | RC4 . |
1014 | RC4_CRYPT | context, len, data_in, data_out | RC4- . |
1015 | MD5 | input, input_len, output_digest | MD5-. |
1016
to 1037 |
, . | ||
1038 | RSA_PUBLIC_DECRYPT | ||
1039 | LOAD_PUB_KEY | key_bin_data, public_key | Carga un BLOB con una clave RSA pública de key_bin_data a public_key. |
Signos de compromiso
Nombres encontrados por ESET
- Linux / Kobalos
- Linux / Agent.IV
- Linux / SSHDoor.EV
- Linux / SSHDoor.FB
- Linux / SSHDoor.FC
Muestras
Kobalos
SHA-1 | SO de destino | Integrado | Disponibilidad |
---|---|---|---|
FBF0A76CED2939D1F7EC5F9EA58C5A294207F7FE
|
RHEL | sshd | Esperando conexión desde el puerto de origen 55201. |
479F470E83F9A5B66363FBA5547FDFCF727949DA
|
Debian | Ser único | Se conecta a
151.80.57 [.] 191: 7070 |
AFFA12CC94578D63A8B178AE19F6601D5C8BB224
|
FreeBSD | sshd | Esperando conexión desde el puerto de origen 55201. |
325F24E8F5D56DB43D6914D9234C08C888CDAE50
|
Ubuntu | sshd | Esperando conexión desde el puerto de origen 55201. |
A4050A8171B0FA3AE9031E0F8B7272FACF04A3AA
|
Arch Linux | sshd | Esperando conexión desde el puerto de origen 55201. |
Troyano para robar credenciales SSH
SHA-1 | SO de destino | Escribe en |
---|---|---|
6616DE799B5105EE2EB83BBE25C7F4433420DFF7
|
RHEL | /var/run/nscd/ns.pid
|
E094DD02CC954B6104791925E0D1880782B046CF
|
RHEL | /var/run/udev/ud.pid
|
1DD0EDC5744D63A731DB8C3B42EFBD09D91FED78
|
FreeBSD | /var/run/udevd.pid
|
C1F530D3C189B9A74DBE02CFEB29F38BE8CA41BA
|
Arch Linux | /var/run/nscd/ns.pid
|
659CBDF9288137937BB71146B6F722FFCDA1C5FE
|
Ubuntu | /var/run/sshd/sshd.pid
|
Llaves
Clave pública RSA
-----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOUgD8sEF1kZ04QxCd60HrB+TxWnLQED wzb0sZ8vMMD6xnUAJspdYzSVDnRnKYjTOM43qtLNcJOwVj6cuC1uHHMCAwEAAQ== -----END PUBLIC KEY-----
Clave estática RC4 para valores de cadena
AE0E05090F3AC2B50B1BC6E91D2FE3CE
Reglas de YARA
rule kobalos { meta: = “Kobalos malware” author = “Marc-Etienne M.Léveillé” date = “2020-11-02” reference = «http://www.welivesecurity.com» source = «https://github.com/eset/malware-ioc/» license = «BSD 2-Clause» version = “1” strings: $encrypted_strings_sizes = { 05 00 00 00 09 00 00 00 04 00 00 00 06 00 00 00 08 00 00 00 08 00 00 00 02 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 05 00 00 00 07 00 00 00 05 00 00 00 05 00 00 00 05 00 00 00 0A 00 00 00 } $password_md5_digest = { 3ADD48192654BD558A4A4CED9C255C4C } $rsa_512_mod_header = { 10 11 02 00 09 02 00 } $strings_RC4_key = { AE0E05090F3AC2B50B1BC6E91D2FE3CE } condition: any of them } rule kobalos_ssh_credential_stealer { meta: = “Kobalos SSH credential stealer seen in OpenSSH client” author = “Marc-Etienne M.Léveillé” date = “2020-11-02” reference = «http://www.welivesecurity.com» source = «https://github.com/eset/malware-ioc/» license = «BSD 2-Clause» version = “1” strings: $ = “user: %.128s host: %.128s port %05d user: %.128s password: %.128s” condition: any of them }
Técnicas MITRE ATT y CK
La tabla se compiló utilizando la octava versión del marco ATT & CK.
Táctica | Identificador | Nombre | Descripción |
---|---|---|---|
Sustentabilidad | T1554 | Compromiso ClientSoftware Binary | Kobalos OpenSSH- sshd
.Kobalos SSH- . |
T1205 | Traffic Signaling | Kobalos TCP- . | |
Defense Evasion | T1070.003 | Clear Command History | Kobalos , . |
T1070.006 | Timestomp | Kobalos . | |
T1027.002 | Software Packing | Kobalos . | |
Command And Control | T1573.001 | Encrypted Channel: Symmetric Cryptography | RC4. |
T1573.002 | Encrypted Channel: Asymmetric Cryptography | RSA-512. | |
T1090.003 | Proxy: Multi-hop Proxy | Kobalos , Kobalos. |