lunes, 11 de febrero de 2013

Monitorización del tráfico en dispositivos Android (II)

Seguimos con la contribución de Angel Alonso-Parrizas, que ya empezó la semana pasada:

En el primer post dejamos configurado el túnel VPN de tal manera que en el endpoint se podía lanzar tcpdump sobre el interfaz virtual para capturar el tráfico y guardarlo en un fichero.

Lo que vamos a hacer ahora es instalar snort y configurarlo. Por defecto, la versión de Linux usada tiene Snort 2.9.4 en el repositorio así que la podemos instalar de allí sin problemas. Los paquetes a instalar son: snort, snort-common and snort-common-libraries.

Lo siguiente a instalar son las firmas de emergingthreats en las cuales ya se incorpora algunas firmas para Android. En nuestro caso los ficheros de las firmas que vamos a dejar configuradas en el snort.conf son: blacklist.rules, botnet-cnc.rules, community-bot.rules, community-virus.rules, malware-backdoor.rules, malware-cnc.rules , malware-tools.rules, emerging-trojan.rules, emerging-malware.rules, emerging-botcc.rules. Además, en el fichero local.rules crearemos nuestras propias firmas.

Para configurar correctamente snort tenemos que definir cual es la red interna, es decir, que tráfico se considera local y cual externo. Para ello, hay que definir la red asignada al VPN y el interfaz del que queremos analizar el tráfico y esto se hace en el fichero /etc/snort/snort.debian.conf de la siguiente manera:

DEBIAN_SNORT_HOME_NET="172.16.1.1/24"
DEBIAN_SNORT_INTERFACE="tun0"

Lo único que falta es lanzar snort y ver que el proceso esta ejecutándose:

/usr/sbin/snort -m 027 -D -d -l /var/log/snort -u snort -g snort -c /etc/snort/snort.conf -S HOME_NET=[172.16.1.1/24] -i tun0

Lo siguiente es definir que tráfico es considerado normal y cual no. Esto dependerá de cada caso particular, pero para este proyecto se considera que 53/tcp, 53/udp, 80/tcp, 123/udp, 443/tcp y 5228/tcp es tráfico permitido. Cualquier otro tráfico debe levantar una alerta y debe ser investigado ya que puede ser síntoma de que el dispositivo ha sido comprometido.  Las reglas de snort que generarán las alertas son:

alert tcp $HOME_NET any -> $EXTERNAL_NET !$HTTP_PORTS,!5228,!53 (msg:"NOT STANDARD TCP PORTS";sid:9999999; rev:0;)
alert udp $HOME_NET any -> $EXTERNAL_NET !53,!123(msg:"NOT STANDARD UDP PORTS";sid:9999998; rev:0;)

Estas reglas son bastante sencillas si se tiene un conocimiento de snort. La primera regla genera una alerta si se detecta tráfico TCP con puerto destino distinto a los puertos HTTP/s (80 y 443), 5228/tcp o el puerto 53/tcp. La segunda regla es análoga pero para el tráfico UDP a puertos DNS y NTP.

Para probar las reglas y ver que funciona lanzamos un netcat desde la consola del Android a un puerto no estándar (9999/tcp) y podemos ver la alerta en el fichero /var/log/snort/alert:

[**] [1:9999999:0] NOT STANDARD TCP PORTS [**]
[Priority: 0]
11/12-19:29:56.422536 172.16.1.99:37946 -> 147.156.1.1:9999
TCP TTL:64 TOS:0x0 ID:25761 IpLen:20 DgmLen:60 DF
******S* Seq: 0xA82B1A31  Ack: 0x0  Win: 0xFAF0  TcpLen: 40
TCP Options (5) => MSS: 1350 SackOK TS: 492084 0 NOP WS: 1

A su vez, podemos ver que el tráfico se ha almacenado en el fichero capturex.cap sobre el que escribe el tcpdump ejecutado en modo background (post 1):

root@lab1:/var/log/snort# tcpdump -nr /home/angel/capturex.cap host 147.156.1.1
reading from file /home/angel/capturex.cap, link-type RAW (Raw IP)
19:29:47.402027 IP 172.16.1.99.37946 > 147.156.1.1.9999: Flags [S], seq 2821397041, win 64240, options [mss 1350,sackOK,TS val 491182 ecr 0,nop,wscale 1], length 0

Ahora que sabemos que todo funciona bien vamos a probar a hacer lo mismo con malware.

De la página http://contagiominidump.blogspot.com.es/ podemos bajar muestras de malware para Android, subirlas al smartphone y luego ejecutarlo.
En teoría, como ya existen firmas para Android (de emergingthreat) debería haber alertas generadas en algunos de los casos que vamos a analizar, pero esto es sólo la teoría. En la práctica ninguno de los ejemplos de malware que vamos a testear son detectados con las firmas por defecto.

Análisis de ‘Android - Fake Installer /Fake Lookout (TrojanFakeLookout.A.)’
El informe de lo que hace este malware se puede encontrar aquí. Sin entrar al detalle de como funciona este malware lo que hace básicamente es robar información del smartphone y enviarla por HTTP a un servidor. En esta comunicación HTTP el servidor puede enviar comandos al dispositivo también. Como he comentado antes, cuando ejecutamos el malware en el dispostivo y miramos los logs de snort no hay ninguna alerta, por lo que hay que indagar en el fichero con las capturas del tcpdump.
Lo mejor es tirar de Wireshark por la comodidad de lo visual, aunque se podría hacer el mismo análisis con Tshark o alguna otra herramienta.
Lo que vemos es una conexión GET a la IP 68.178.232.10 con el siguiente contenido:

GET /controls.php HTTP/1.1
User-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.7; HTC Vision Build/GRI40)
Host: thelongislandpress.com
Connection: Keep-Alive
Accept-Encoding: gzip

Correlando esta información con la del report, vemos que la URL http://thelongislandpress.com/controls.php es la misma, así que lo más sencillo es crear una regla que haga un match de este host en la cabecerar HTTP además del recurso controls.php.

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"MALWARE Android TrojanFakeLookout.A"; flow:established,to_server; content:"/controls.php";nocase; http_uri; content:"Host: thelongislandpress.com"; http_header; metadata:service http; reference:url,blog.trustgo.com/fakelookout/; sid:88888801; rev:1;)

Sin entrar al detalle del lenguaje usado en Snort, lo que hace la regla es hacer un match de lo anteriormente comentado y alertar cuando hay tráfico TCP desde la red interna a cualquier otro sitio y el puerto es HTTP.

Una vez tenemos las regla creada debemos de probarla con el tráfico capturado y ver si funciona:

/usr/sbin/snort -m 027  -d -l /var/log/snort2 -u snort -g snort -c /etc/snort/snort.conf -S HOME_NET=[172.16.1.1/24] -r /home/angel/capturex.cap

Asi vemos la alerta en el fichero de snort:

 [**] [1:88888801:1] MALWARE Android TrojanFakeLookout.A [**]
[Priority: 0]
11/08-21:00:55.125712 172.16.1.99:59058 -> 68.178.232.100:80
TCP TTL:113 TOS:0x0 ID:24542 IpLen:20 DgmLen:223 DF
***A**** Seq: 0x393EB8F8  Ack: 0x9A02E635  Win: 0xFF48  TcpLen: 20
[Xref => http://blog.trustgo.com/fakelookout/]

(continuará)

No hay comentarios :