Kobalos apareció en la naturaleza



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.



  1. La primera ola utilizó Kobalos, que se describe en este estudio.
  2. La segunda ola se centró en la minería de criptomonedas con un conjunto de herramientas muy diferente.
  3. 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:



  1. Abre un puerto TCP y espera una conexión entrante (este modo a veces se denomina puerta trasera pasiva).
  2. Se conecta a otra instancia de Kobalos que está configurada como servidor C&C.
  3. 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
int add(int a, int b) {
return a + b;
}

int mul(int a, int b) {
return a * b;
}

int square(int a) {
return mul(a, a);
}

int get_magic(void) {
return add(square(59), 56);
}

int main(void) {
return get_magic();
}

      
      





int f(int action, int a, int b) {
int ret;
switch(action) {
case 1000:
ret = a + b;
break; case 1001:
ret = a * b;
break; case 1002:
ret = f(1001, a, a);
break; case 1003:
ret = f(1002, 59, 0);
ret = f(1000, ret, 56);
break;
}
return ret;
}

int main(void) {
return f(1003, 0, 0);
}

      
      







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:



  1. % s% s
  2. / dev / ptmx
  3. ptem
  4. ldterm
  5. ttcompat
  6. / dev / tty
  7. % s
  8. % D
  9. /
  10. \
  11. % d.% d
  12. win3.11
  13. win95
  14. ganar
  15. ganar ??
  16. \\. \ pipe \ 2
  17. % s% s.% s
  18. / 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:



  1. Escuchando el puerto TCP especificado (modo pasivo).
  2. Conectándose al servidor C&C (modo activo) y esperando que el operador se conecte a través de este servidor.
  3. 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:



  1. Conéctese a otros servidores infectados con Kobalos y actúe como proxy.
  2. Leer y escribir archivos en el sistema de archivos.
  3. Lanzar y acceder a un pseudo-terminal en un host comprometido.
  4. 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.



All Articles