Atacantes aprovechan RCE en MobileIron para ejecutar Kaiten

En septiembre de este año el investigador de seguridad Orange Tsai publicaba diversas vulnerabilidades y P0Cs relacionadas con el MobileIron’s mobile device management (MDM) solution.

Desde el Blue Team de Tarlogic se ha identificado el uso del CVE-2020-15505, por parte de determinado grupo de atacantes, para descargar y ejecutar Kaiten

Kaiten/Tusinami

Por medio del JNDI injection relacionado con dicho CVE, los atacantes están descargando el archiconocido Kaiten, también conocido como Tusnami.  Esta familia de malware ha sido utilizada por múltiples actores desde hace más de 15 años (sus inicios se remontan a 2002) principalmente como herramienta ofensiva para generar ataques DoS y, actualmente, para el minado de criptomonedas.

Existen decenas de variantes asociadas  a este código malicioso; posiblemente a raíz de la publicación de su código fuente. En febrero de 2016, una variante de Kaiten fue distribuida por un grupo de cibercriminales a través de imágenes ISO maliciosas tras comprometer una instancia de WordPress de Linux Mint y modificar sus URL de descarga. Otra variante, apodada como Amnesia en abril de 2017 por parte de PaloAlto, estuvo relacionada con la infección de múltiples sistemas CCTV-DVR en todo el mundo aprovechándose de cierta vulnerabilidad RCE que afectaba a más de 70 vendedores.

En abril de 2018, investigadores de Netlab 360 identificaron una botnet (apodada como Muhstik) vinculada también con este código malicioso que empleaba determinada vulnerabilidad de Drupal como vector de entrada.

Las capacidades de este malware se centran principalmente en ataques de denegación de servicio implementando diversas funciones para hacer TCP/UDP flooding a las víctimas; todo ello instruido por medio del protocolo IRC. Los atacantes también tienen capacidad para ejecutar comandos y descargar nuevos ficheros en las víctimas.

Características del código dañino:

El binario identificado en uno de nuestros clientes se corresponde con 969013b23e440fe31be70daac6d7edb2. Su descarga se ha producido a partir de cierto dropper en bash cuyo objetivo es, en primer lugar, finalizar múltiples procesos relacionados con miners y con servicios que exigen un alto nivel de CPU.

Figura 1. Función bot_kill

Una vez finalizados, el script descargará, vía “curl”, el malware Kaiten desde la URL http://lib.pygensim.com/gensim en el directorio definido por la variable INSTALL (/var/tmp/systemd-private-c15c0d5284bd838c15fd0d6c5c2b50bb-systemd-resolved.service-xCkB12/jf2fa44a/aPs52s/jKal2d), le otorgará permisos de ejecución y finalmente lo ejecutará bajo el nombre de kworker.

Figura 2. Ejecución de Tsunami

La firma del código dañino es la siguiente.

MD5: 969013b23e440fe31be70daac6d7edb2
SHA1: 5369a0122fd3b75ffdd110cc86ccc2d8ae2fa130
SHA256: 0c27c64fc118ef56048b7d994162c4a0d008b4582c5eeb6923949a286f45ec52

El fichero se corresponde con un binario x64 para plataformas Linux compilado con GCC (Alpine 9.3.0). La siguiente imagen muestra las propiedades estáticas del mismo a partir de la información de sus headers.

Figura 3. Información del binario: kworker

Analizando los strings embebidos dentro del binario puede inferirse rápidamente que la muestra se corresponde con Kaiten. En la siguiente imagen pueden verse las cadenas correspondientes al menú de ayuda del malware en donde se muestran algunos de los mensajes IRC NOTICE que se utilizarán para reportar los estados y acciones del bot a los operadores de la botnet.

Figura 4. Strings binario vs código fuente Kaiten

Haciendo ingeniería inversa se puede corroborar que el autor del malware compiló las fuentes públicamente disponibles sin apenas modificar la lógica de sus funciones:

Figura 5. Estructura de funciones

El binario, tras ejecutarse, hace un fork y posteriormente trata de establecer comunicación con el servidor de control haciendo uso del protocolo IRC. Para ello genera un nick y usuario aleatorio y conecta con el canal correspondiente (#internet) a la espera de recibir las instrucciones del C2.

Figura 6. Fork y conexión con el C2

El código implementa diversas funciones para llevar a cabo varios tipos de ataques de denegación de servicio (SYN/UDP flooding, etc.). La siguiente imagen se corresponde con la lógica para ejecutar uno de ellos, en concreto, el denominado ataque Tsunami. Los atacantes instruirán a los bots a ejecutar, durante un determinado tiempo (establecido en segundos), un ataque DOS TCP jugando con diversos flag de dicho protocolo.

Figura 7. Ataque Tsunami (DOS)

El código malicioso también tiene capacidad para ejecutar comandos en la víctima por medio de la orden “SH”. Para ello, en primer lugar, añade en la variable de entorno $PATH el comando a ejecutar y luego hace uso de popen() para la ejecución del mismo.

Figura 8. Ejecución de comandos

Otra de las funcionalidades de Kaiten es la descarga de ficheros vía HTTP. En la siguiente imagen se muestra la función responsable de dicha lógica. Obsérvense los strings correspondientes a la petición GET (con los headershardcodeados”) con los que el bot establecerá la conexión HTTP para descargar ficheros en el sistema.

Figura 9. Descarga de ficheros vía HTTP

Communications

La descarga de Kaiten (por parte del dropper previamente descrito) así como el servidor de control IRC comparten el mismo dominio malicioso: lib.pygensim.com

Éste ha sido creado el 2 de octubre de 2020 (unos días antes del incidente) y actualmente resuelve a la dirección 198.98.56.111 (perteneciente al“bulletproof hostFranTech solutions). La información de Whois asociada al dominio se muestra a continuación.

Figura 10. Whois dominio pygensim.com

Según la información indexada por Shodan  el servidor se corresponde con un Debian 10 con los puertos 22 (SSH) y 443 expuestos a Internet. Fíjese que Shodan identifica correctamente el servidor IRC corriendo en el socket 443.

Figura 11. Información Shodan

La siguiente imagen muestra la conexión del bot con el servidor IRC (UnrealIRCd 5.0.6) y la entrada al canal #internet (con la contraseña “:key_of_channel”). La fecha de creación se corresponde con el 4 de octubre a las 18:12 PDT.

Figura 12. Comunicaciones IRC

Cabe destacar que el servidor IRC se encontraba activo durante el análisis de la muestra y contaba con unos 300 bots.

Figura 13. Bots activos

En la salida anterior puede observarse el “Network Administrator” de la red bajo el nick “magician”.

Figura 14. Network Administrator (Magician)

El número de bots por país se lista a continuación:

  • 70 US, United States
  • 30 DE, Germany
  • 22 GB, United Kingdom
  • 19 HK, Hong Kong
  • 12 NL, Netherlands
  • 12 IT, Italy
  • 11 RU, Russian Federation
  • 10 SK, Slovakia
  • 10 FR, France
  • 10 CN, China
  • 10 AU, Australia
  • 9 TR, Turkey
  • 9 IE, Ireland
  • 8 AT, Austria
  • 7 MY, Malaysia
  • 6 SG, Singapore
  • 6 GL, Greenland
  • 5 TW, Taiwan
  • 5 CH, Switzerland
  • 4 MX, Mexico
  • 4 KR, Korea, Republic of
  • 4 JP, Japan
  • 4 CZ, Czech Republic
  • 4 CA, Canada
  • 4 AR, Argentina
  • 3 BE, Belgium
  • 2 SE, Sweden
  • 2 RS, Serbia
  • 2 RO, Romania
  • 2 PR, Puerto Rico
  • 2 LU, Luxembourg
  • 2 ID, Indonesia
  • 2 HU, Hungary
  • 2 DO, Dominican Republic
  • 1 ES, Spain
  • 1 BR, Brazil

Indicadores de compromiso

Reglas de yara:

rule Tsunami {
    meta:
        author = "BlackArrow Unit (Tarlogic)"
        description = "Detection of Tsunami/Kaiten sample based on embeded strings"
        md5 = "969013b23e440fe31be70daac6d7edb2"
        sha1 = "5369a0122fd3b75ffdd110cc86ccc2d8ae2fa130"
    strings:
        $elf = { 7f 45 4c 46 }

        $x1 = "= Kills the client"
        $x2 = "Kaiten wa goraku"
        $x3 = "syn flooder that will kill most"
        $x4 = "NOTICE %s :Killing pid"       
        $x5 = ":Removed all spoofs"
        $x6 = "TSUNAMI <target>"
        $x7 = "Do something like: 169.40"
        $x8 = ":Spoofs: %d.%d.%d.%d"
        $x9 = "NOTICE %s :UDP <target>"           
        $x10 = "NOTICE %s :GET <http address> "           
        $x11 = "NOTICE %s :NICK <nick>"  
        $x12 = "NOTICE %s :UNKNOWN <target>"
        $x13 = "NOTICE %s :KILLALL"  
        $x14 = "GETSPOOFS"  

    condition:
        $elf in (0..4) and 6 of ($x*) and filesize < 120KB
}

Se recomienda, además, filtrar el dominio vinculado con el C2 (lib.pygensim.com) y establecer reglas en los dispositivos de networking correspondientes (firewalls, IDS/IPS) para identificar tráfico saliente IRC al ser éste un protocolo raramente utilizado en entornos empresariales. En el caso de utilizar SNORT valórense las reglas de detección listadas en: https://www.snort.org/search?query=irc&submit_search=