Aparentemente, cada vez son más los usuarios frustrados que se quejan en los foros porque sus dispositivos integrados se sobrecargan con tareas informáticas y de red. Lo que estas quejas en particular tienen en común es el nombre del proceso que causa el problema, uno que se ejecuta desde un directorio temporal y se hace pasar como parte del marco de Java, bajo el nombre ".javaxxx". También usa los nombres adicionales ".swap" o "kworker". Hoy veremos de dónde vienen estos reclamos.

Hace unas semanas, analizamos los incidentes recientes de Mirai y los problemas de seguridad provocados por esta botnet en nuestro artículo "Un ejército de zombis: Cuando los dispositivos IoT están fuera de control". Todo lo que escribimos en ese momento aún sigue vigente.

Vector de ataque

El ataque se realiza a través de intentos de inicio de sesión remoto vía SSH por fuerza bruta, y opera de manera similar a los gusanos para Linux, incluyendo Linux/Moose (que para propagarse atacó los inicios de sesión de Telnet y sigue activo), y al que ESET ha estado investigando desde el año pasado. Entre los objetivos de ataque se encuentran los dispositivos y servidores integrados que tienen un puerto SSH abierto y cuya contraseña es muy débil.

El propósito evidente de este troyano es recopilar una lista de dispositivos desprotegidos y construir una botnet de dispositivos zombis que sea de interés para los atacantes. De esta forma, les suministra una lista selecta y no demasiado extensa de objetivos: únicamente se infectarán las máquinas que representen oportunidades fáciles desde la perspectiva de seguridad.

Cabe notar que las víctimas informaron casos en los que tenían una contraseña segura, pero restauraron la configuración del dispositivo a los valores de fábrica con la contraseña predeterminada, olvidando que su dispositivo estaba online. Un par de horas de exposición online es suficiente para que una máquina restaurada a la configuración de fábrica resulte infectada.

Análisis

El malware está escrito en Go y normalmente aparece comprimido con la herramienta UPX original. Lo extraño es que los desarrolladores quitaron los nombres de las funciones en el archivo binario, pero igualmente siguen estando presentes en una sección especial.

Con la ayuda de un script creado por RedNaga Security, que vuelve a asignar los símbolos correspondientes a sus funciones en el software desensamblador IDA Pro, se simplificó todo el análisis y solo hubo que revisar las funcionalidades que sugerían los nombres de las funciones, tales como main_loadConfig, main_startLocalHttp, main_Skaro_Upgrade, main_IPTarget_checkSSH, etc. El archivo binario incluye cadenas de caracteres como "Skaro" y "dalek". Los autores posiblemente tenían en mente el planeta ficticio de la serie televisiva de ciencia ficción Doctor Who, donde se originaron los Daleks.

Como primer paso, Linux/Rakos carga su configuración a través de una entrada estándar (stdin) en formato YAML. El archivo de configuración contiene información como listas de C&C, todas las credenciales que se prueban contra sus objetivos y los parámetros internos:

---

version: 30
logging: no
generation: 0

skaro:
ips:
- "193.0.178.151"
- "46.8.44.55"
- "5.34.183.231"
- "185.82.216.125"
- "195.123.210.100"
ping: 60

checkers:
- "http://193.0.178.151"
- "http://46.8.44.55"
- "http://5.34.183.231"
- "http://185.82.216.125"
- "http://195.123.210.100"
- "http://httpbin.org/ip"

userpass: [
"root:qwerty",
"user:admin",
"ubnt:ubnt",
"root:12345",

"guest:1234",
"root:1111",
"test:test",
"support:password",
"admin:1",
"test:test123",
"manager:manager",
"fax:fax",
"service:service",
"root:letmein",
"sales:sales",
"guest:guest",
"shell:sh",
"enable:system",
"user:password",
"backup:backup",
"ftpuser:ftpuser",
"admin:password123",
"monitor:monitor",
"bin:bin",
"root:ikwb",
"admin:manager",
"oracle:oracle",
"test:12345",
"bob:bob",
"user1:1234",
"root:1234",
"root:system",
PlcmSpIp:PlcmSpIp",
"user1:123456",
"1:1",
"root:1",
"support:123456",
"nagios:nagios",
"demo:demo",
"admin:1111",
"PlcmSpIp:PlcmSpIp",
"pos:pos",
"support:12345",
"root:baseball",
"guest:12345",
"admin:1234",
"apache:apache",
"root:123456",
"adam:adam",
"root:alpine",
"tester:retset",
"root:raspberry",
"pi:raspberry",
"administrator:1234",
"admin:abc123",
"admin:qwerty",
"root:openelec",
"admin:admin1234",
"shipping:shipping",
"ftpuser:asteriskftp",
"operator:operator",
]

La configuración completa de Linux/Rakos en texto sin formato está disponible en el repositorio de ESET en Github.

En segundo lugar, el malware inicia un servicio HTTP local disponible en http://127.0.0.1:61314. Hay dos razones por las que se instala: la primera es como un método ingenioso para que las versiones futuras del bot cierren las instancias en ejecución (independientemente del nombre que estas tengan) mediante una solicitud http://127.0.0.1:61314/et; la segunda es porque intenta analizar los parámetros "ip", "u" y "p" en una consulta URL mediante una solicitud http://127.0.0.1:61314/ex. El propósito del recurso /ex de HTTP aún no está claro en el momento en que se escribe este informe, y no parece que haya referencias a él en ninguna otra parte del código.

El bot también crea un servidor web que escucha en todas las interfaces. En las primeras versiones, escuchaba en el puerto TCP 13666, pero ahora el puerto se selecciona aleatoriamente dentro del rango 20000 a 60000. Al enviar una solicitud remota al dispositivo a través de este puerto, se muestra un mensaje como este en el navegador:

{"origin":"192.168.18.1"}

Allí, la dirección IP corresponde al lado del cliente. La salida está en el mismo formato que el servidor de prueba público http://httpbin.org con la solicitud /ip. En el lado que ejecuta Linux/Rakos, se puede llegar a ver la siguiente línea de registro en stdout:

“{2016/11/21 09:02:03 INFO StartChecker.func1 ▶ 001 check: 192.168.18.1}”

A continuación, envía una solicitud HTTP inicial que contiene información importante de la víctima a https://{cnc_server}/ping. Los datos enviados pueden ser los siguientes (algunos campos han sido alterados artificialmente):

{
"arch": "amd64",
"config": 30,
"fork": 0,
"generation": 0,
"ip": "192.168.18.1",
"origin": "unknown",
"password": "shipping",
"services:": {"http":{"addr":"192.168.18.1:80","available":false,"running":false},
"dns":{"addr":"","available":false,"running":false},
"checker":{"addr":"192.168.18.1:22418","available":false,"running":true}},
"stats": {
"cnt": "load: 0 scan: 0 bless: 0 sm:0 ins: 0 mem: 2692k",
"cpu": "1 x Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz 3591Mhz",
"facts": "host: ubuntu pid: 10219 uid: 0 args: [/tmp/.javaxxx]",
"load": "1.14 0.45 0.17",
"mem": "592MB / 1983MB free (35.21% used)"},"uptime": 514,
"username": "shipping",
"uuid": "ab-97-b1-d5-2d-8f",
"version": 706
}

La funcionalidad principal de este bot es explorar el servicio SSH en diversas direcciones IP, que se obtienen del servidor de C&C al solicitar la lista ubicada en https://{cnc_server}/scan. Al parecer, esta lista se modifica con frecuencia. Las versiones anteriores del troyano también analizaban el servicio SMTP, pero los atacantes han silenciado esta funcionalidad (posiblemente la estén desarrollando para mejorarla).

El ataque principal se lleva a cabo de la siguiente manera: si la conexión con el objetivo se logra correctamente, se ejecutan dos comandos de manera remota (id, uname -m). Se hacen otras comprobaciones y se informan sus resultados. Finalmente, el binario verifica si puede cargarse al dispositivo de la nueva víctima y lo hace si la respuesta es afirmativa.

Para nuestro análisis, seleccionamos dos objetivos (127.0.0.1 y 127.0.0.100) y simulamos un ataque (originalmente, los atacantes lo intentan con 200 objetivos simultáneos cada 10 segundos). En caso de que el bot no logre conectarse al primer objetivo, lo etiquetará con la palabra "FORGET" (olvidar). Si a continuación se conecta correctamente al segundo objetivo, lo marcará con la palabra "INSTALL" (instalar) y se establece una conexión SSH con los datos de inicio de sesión correctos shipping:shipping; también es importante notar que el archivo ejecutable cargado se elimina de inmediato tras su ejecución.

1_skaro_logs

Además, el backdoor es capaz de:

  • actualizar el archivo de configuración (desde https://{cnc_server}/upgrade/vars.yaml)
  • mejorarse a sí mismo.

No se implementa ninguna actividad maliciosa evidente de las que podríamos esperar, como ataques de DDoS o propagación de spam (al menos hasta este momento). No obstante, el hecho de que se envíen la dirección IP, el nombre de usuario y la contraseña significa que los atacantes podrán hacer lo que quieran con la máquina más tarde. Creemos que es poco probable que solo se trate de un experimento invasivo pero inocente, o de un ejercicio o una investigación académica que salió mal.

Hay varios informes online sobre las infecciones. Por ejemplo, se puede encontrar uno del 23 de agosto de 2016 en Pastebin. La siguiente tabla contiene el resultado al ejecutar "lsof –n" en el proceso culpable. Hay que recordar que los rangos de direcciones IP probados por SSH parecen aleatorios:

CMD PID USER FD TYPE SIZE/OFF NODE NAME
.javaxxx 2773 root txt REG 5822568 /tmp/.javaxxx (deleted)
.javaxxx 2773 root 5u IPv6 0t0 TCP *:13666 (LISTEN)
.javaxxx 2773 root 6u IPv4 0t0 TCP 127.0.0.1:61314 (LISTEN)
.javaxxx 2773 root 7u IPv4 0t0 TCP 192.168.88.210:59958->66.209.103.211:ssh (ESTABLISHED)
.javaxxx 2773 root 10u IPv4 0t0 TCP 192.168.88.210:57370->139.196.21.134:ssh (ESTABLISHED)
.javaxxx 2773 root 13u IPv4 0t0 TCP 192.168.88.210:52507->148.75.167.198:ssh (SYN_SENT)
.javaxxx 2773 root 16u IPv4 0t0 TCP 192.168.88.210:54746->208.9.162.70:ssh (SYN_SENT)
.javaxxx 2773 root 17u IPv4 0t0 TCP 192.168.88.210:54533->148.75.167.191:ssh (SYN_SENT)
.javaxxx 2773 root 18u IPv4 0t0 TCP 192.168.88.210:51856->139.196.20.79:ssh (ESTABLISHED)
.javaxxx 2773 root 19u IPv4 0t0 TCP 192.168.88.210:57210->208.9.162.95:ssh (SYN_SENT)
.javaxxx 2773 root 24u IPv4 0t0 TCP 192.168.88.210:45946->148.75.167.99:ssh (SYN_SENT)
.javaxxx 2773 root 25u IPv4 0t0 TCP 192.168.88.210:55928->208.9.162.25:ssh (SYN_SENT)
.javaxxx 2773 root 27u IPv4 0t0 TCP 192.168.88.210:50041->139.196.21.177:ssh (ESTABLISHED)

Mitigación y desinfección

El troyano no es capaz de mantener su persistencia tras reiniciar el sistema. Por lo tanto, los dispositivos disponibles se pueden infectar reiteradamente.

Los pasos necesarios para desinfectar son los siguientes:

  • Conéctate a tu dispositivo mediante SSH/Telnet,
  • Busca un proceso llamado .javaxxx,
  • Ejecuta comandos como netstat o lsof con el conmutador -n para confirmar que es el responsable de establecer las conexiones no deseadas,
  • (Acción voluntaria) recopila evidencia forense volcando el espacio de memoria del proceso correspondiente (por ejemplo, con gcore). También es posible recuperar la muestra borrada desde /proc con cp /proc/{pid}/exe {output_file}
  • Finaliza el proceso con el parámetro -KILL.

Naturalmente, es imprescindible que las víctimas protejan sus credenciales SSH y deben recordar volver a hacerlo después de cada restablecimiento a los valores de fábrica.

También preparamos un complemento para Volatility Framework llamado vf_ioc_linux_rakos_a.py que detecta los indicadores de sistemas comprometidos si se cuenta con un volcado de memoria completo que admita este marco. Además, este complemento extrae datos del proceso malicioso como la configuración o la información enviada al servidor de C&C. Está disponible también en GitHub.

Conclusión

En esta ocasión presentamos otro ejemplo de un backdoor para Linux que se propaga a través de un canal bastante conocido. Parece que a los atacantes les conviene escribir nuevas muestras de software malicioso para aprovechar las vulnerabilidades actuales de la seguridad de la red.

Nuestro consejo es el siguiente: no construyas muros de paja o ramas para resguardar tus dispositivos; mejor usa ladrillos y piedras. Internet es un lugar bastante ventoso...

Un agradecimiento especial a Marc-Étienne Léveillé.

Indicadores de sistemas comprometidos

Muestras

Como el malware se elimina tras haberse ejecutado con éxito, no disponemos de muchas muestras recopiladas.

SHA1 Visto por primera vez Arquitectura Tamaño Versión
f80836349d6e97251030190ecd30dda0047f1ee6 17/08/2016 EM_X86_64 7 360 928 B 688
def04ec688ac6b41580dd3a6e78445b56536ba34 27/09/2016 EM_X86_64 1 606 936 B 694
3435ca5505ce8dfe8e1b22e0ebd4f41c60050cc0 27/09/2016 EM_X86_64 1 613 292 B 695
e53c73fe6a552eab720e7ee685ea4e159ebd4fdd 27/09/2016 EM_X86_64 1 613 292 B 697
c93bddd9cdb4f2e185b54a4931257954e25e7c37 28/09/2016 EM_X86_64 1 614 436 B 698
14af6254d9ca310b4d52778d050cb8dd7a5de1d8 21/10/2016 EM_MIPS 4 095 740 B ???
c54d50025d9f66ce2ace3361a8626aee468d94ba 09/11/2016 EM_386 1 697 592 B 700
36b2fffe98f517355425797fc242f2cb82271c0c 21/11/2016 EM_386 1 875 844B 706
E46E8E5E823EB0466981AFB7683FD918D6FE78A9 16/12/2016 EM_386 1 876 888 B 708
0492E5C07C1426AF9CE73AD33E00A3FD8477C6C2 16/12/2016 EM_386 5 688 388 B 711

Servidores de C&C

217.12.208.28
217.12.203.31
193.169.245.68
46.8.44.55
195.123.210.100
5.34.183.231
5.34.180.64
185.82.216.125
185.14.30.78
185.14.29.65
185.20.184.117