Si necesitamos analizar el tráfico de red de nuestro Android, ya sea para depurar una aplicación o para ver qué uso de la red hacen las aplicaciones instaladas en el terminal, podemos recurrir a herramientas bien conocidas como tcpdump, netcat y Wireshark.

Antes de empezar

Antes de continuar, deberemos tener instaladas las herramientas de desarrollo para Android. Descargamos el paquete y lo descomprimimos:

bash $ wget http://dl.google.com/android/android-sdk_r20.0.3-linux.tgz $ tar xvzf android-sdk_r20.0.3-linux.tgz

Añadimos los directorios tools y platform-tools al PATH. Ejecutamos las siguientes líneas, y las añadimos también en el fichero ~/.bashrc, para incluirlas en el PATH del sistema:

bash export ANDROID_HOME=$HOME/android-sdk-linux export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

Abrimos el gestor de paquetes ejecutando:

bash $ android sdk

Instalaremos las SDK Tools y las SDK Platform-tools.

Instalando tcpdump en Android

Utilizaremos una versión de tcpdump que ha sido compilada para ARM. La podemos descargar de aquí tcpdump-arm:

bash $ wget http://www.eecs.umich.edu/~timuralp/tcpdump-arm

Ahora activaremos el modo depuración. En Android 4.0.3 se encuentra en el menú Ajustes > Opciones del desarrollador > Depuración de USB. En otras versiones puede variar ligeramente. Si no nos aparece esta opción, podemos probar pulsando 7 veces en el campo Build del menú Ajustes > Información. Acto seguido, conectamos el móvil a nuestro equipo mediante el cable USB.

Si todo ha ido bien, podremos listar los dispositivos conectados ejecutando:

bash $ adb devices List of devices attached 192B32A8955D29F device

Enviamos la versión de tcpdump que hemos descargado al móvil y le cambiamos los permisos:

bash $ adb push tcpdump-arm /data/local $ adb shell shell@android:/ $ cd /data/local shell@android:/data/local $ chmod 777 tcpdump-arm shell@android:/data/local $ su 1|shell@android:/data/local # ./tcpdump-arm -h tcpdump-arm version 4.0.0 libpcap version 1.0.0 Usage: tcpdump-arm [-aAdDefIKlLnNOpqRStuUvxX] [ -B size ] [ -c count ] [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ] [ -i interface ] [ -M secret ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z command ] [ -Z user ] [ expression ]

Un ejemplo de captura de tráfico:

bash shell@android:/data/local # ./tcpdump-arm -n -i wlan0 -p -s 0 -w out.pcap

El argumento -n es para evitar traducir IPs a nombres, -i especifica la interfaz de red, -p indica que no sea en modo promiscuo, dado que de todas formas no iba a funcionar, -s 0 es para que capture todo el paquete desde el primer byte y -w envía la salida a un fichero.

Cuando queramos parar, matamos el proceso con ^C y nos traemos el fichero de la captura, que podremos abrir con Wireshark:

bash $ adb pull /data/local/out.pcap


Actualizado el 20 de enero de 2014

Me he encontrado algún caso en el que al intentar ejecutar netcat, nos devuelve el siguiente error:

bash $ adb shell ~ # nc /sbin/sh: nc: not found

En este caso, podemos utilizar la versión que trae alguna aplicación, como por ejemplo SSH Droid:

bash ~ # alias nc="/data/data/berserker.android.apps.sshdroid/home/bin/nc"

Otra opción podría ser utilizar BusyBox:

bash ~ # find . -name busybox ./system/xbin/busybox ~ # alias nc="/system/xbin/busybox nc" # debemos pasar el nombre del comando


Analizar el tráfico en tiempo real

Guardar el tráfico en un fichero para luego examinarlo puede estar bien en algunos casos, pero poder analizar en tiempo real también suena interesante. Lo que haremos será abrir una conexión entre el móvil y nuestro equipo mediante netcat, y pasar la salida de tcpdump a través de ella directamente hacia Wireshark.

bash $ adb shell shell@android:/ $ su shell@android:/ # /data/local/tcpdump-arm -n -s 0 -i wlan0 -w - | nc -l -p 12345

O en un solo comando:

bash $ adb shell "su -c '/data/local/tcpdump-arm -n -s 0 -i wlan0 -w - | nc -l -p 12345'"

En nuestro equipo, creamos una redirección de un puerto en el móvil, el puerto en el que hemos lanzado netcat como servidor, a un puerto de nuestro equipo:

bash $ adb forward tcp:12345 tcp:12345

Y utilizando netcat como cliente, pasamos su salida a Wireshark:

bash $ nc 127.0.0.1 12345 | wireshark -k -S -i -


Actualizado el 22 de julio de 2014

Si usamos ADB sobre red no es necesario que conectemos el móvil al ordenar por USB. Basta activar el modo de depuración y ejecutar:

bash $ adb connect 192.168.1.51:5555


Referencias

» Analyzing Android Network Traffic » Android: Binary solo » Android Developer Tools » Cross Compiling on Linux


Entradas relacionadas