6 votos

¿Cómo ver el tráfico de red solicitado por una aplicación específica?

Hay muchas discusiones sobre cómo ver qué aplicación está solicitando la conexión de red. He probado las siguientes aplicaciones:

tcapturepacket
wifi monitor
connection tracker

Sin embargo, ninguno de ellos fue útil. Por ejemplo, durante un corto periodo de tiempo, subí un archivo pcap de 30KB que se puede ver aquí . Todavía no he descubierto qué aplicación está solicitando la conexión y a dónde está tratando de conectarse.

También traté de ver adb logcat pero no encontré información útil. Tal vez algo se ha perdido aquí. ¿Alguna idea?

11voto

Jack Wade Puntos 231

Si tienes un teléfono rooteado, ve por nethogs (para la supervisión en directo) o iptables (para obtener estadísticas) herramientas de línea de comandos. El uso de VPN o de aplicaciones basadas en estadísticas de Android es la única solución posible que no sea Root. O consulte esta respuesta para un logcat / dumpsys solución basada en la tecnología.


En primer lugar, el seguimiento de un UID o PID de un flujo de red no es sencillo porque no son parámetros relacionados con la red sino con el sistema operativo. Propuestas y proyectos abandonados existen.

Android asigna un UID único a cada aplicación instalada, al igual que cada usuario humano en Linux tiene un UID. Así que podemos capturar los paquetes enviados por un UID específico a través de las interfaces de red para rastrear el uso.

TCPDUMP:

Ahora, ¿cómo podemos capturar el tráfico de la red? La mayoría de los sniffers de red utilizan libpcap familia de bibliotecas independientes del sistema para este fin. Soporta Filtro de paquetes BSD (BPF) para el filtrado de paquetes en el núcleo. Algunas utilidades populares que utilizan libpcap incluye tcpdump , nmap , tshark/wireshark , dumpcap , nethogs etc. Aplicación Android Utilidades de red y otros también hacen uso de tcpdump .

Sin embargo, la información del UID no se propaga a través del AF_PACKET / PF_PACKET canal que pcap utiliza en Capa 2 de OSI . Así que lo que podemos hacer aquí es hacer uso de los sockets de red (combinación de IP y puerto) que son creados y utilizados por una aplicación. netstat -tup o ss -tup mostrará todos los sockets de red con conexiones activas/establecidas. Ambas herramientas están disponibles en Android (o puedes conseguir un binario estático), ss es el más nuevo. Socket vs. UID la información también puede leerse directamente desde /proc/net/{tcp,udp} . Aplicación Android Netstat Plus funciona según el mismo principio. Esto proporcionará la dirección local (socket) utilizada por un proceso.

Una vez que sabemos qué sockets están siendo utilizados por una aplicación (UID), tcpdump -i wlan0 src <IP> and port <PORT> volcará todo el tráfico originado en ese proceso.
Del mismo modo, una toma de corriente remota (si no está conectada a varias aplicaciones) también puede utilizarse para filtrar los resultados.

LIMITACIONES:

Sin embargo, hay algunos problemas con este enfoque:

  • Las aplicaciones de Android suelen lanzar más de un proceso a la vez en paralelo, es decir múltiples PIDs trabajando bajo el mismo UID . Así que tenemos que capturar el tráfico de todos los procesos.
  • Las aplicaciones siguen creando y borrando sockets. Manteniendo un registro de cambio continuo de tomas de corriente es casi imposible, especialmente cuando hay un gran número de aplicaciones que acceden a la red simultáneamente.
  • Existe -aunque rara- la posibilidad de que los locales los enchufes están siendo compartidos por múltiples procesos en sistemas operativos tipo UNIX. Los sockets remotos compartidos, como UDP/53, que se utiliza para la resolución de DNS, no pueden ser rastreados por un solo proceso. Esto debilita aún más el enfoque.

NetHogs atraviesa procfs y hace frente a las limitaciones mencionadas (aunque no siempre con mucho éxito):

IPTABLES:

Las deficiencias descritas anteriormente de una herramienta de capa 2 pueden mitigarse utilizando iptables LOG o NFLOG . Capa 2 está justo por encima de la Capa Física, es decir, es lo último que encuentran los paquetes antes de salir del dispositivo. Por eso, al estar en la capa de enlace de datos y trabajar en un nivel inferior de la pila de red, el BPF es una especie de mecanismo de filtrado de paquetes sin estado en comparación con netfilter / iptables que trabaja en el OSI Capa 3 (más cerca de los programas del espacio del usuario). Así que iptables también puede obtener información de la pila TCP/IP ( Capa 4 ). Filtra los paquetes en función de los UIDs de sus creadores utilizando el módulo owner que interactúa con las tomas de corriente para encontrar la propiedad del paquete.

iptables escribe en el registro del kernel que se puede leer con dmesg o logcat . El UID de una aplicación puede obtenerse mediante alguna aplicación o leerse desde /data/system/packages.list o pm list packages -U .

# iptables -I OUTPUT -m owner --uid-owner <UID> -j LOG --log-level 7 --log-prefix 'SNIFFER: ' --log-uid
# dmesg -w | grep SNIFFER

La salida puede guardarse en un archivo y formatearse con herramientas como grep , awk , printf etc. Registro de la red - aunque muy anticuado- funciona de forma similar. AFWall+ es un cortafuegos basado en iptables que puede registrar/notificar la actividad de red de una aplicación cuando ésta se bloquea.

El único inconveniente de este enfoque es que no se puede utilizar para olfatear el tráfico de un proceso cuando hay varios procesos que se ejecutan con el mismo UID . iptables no puede capturar paquetes basados en PIDs. Decidieron no usar iptables con procesos porque el proceso se inicia antes de ser bloqueado / olfateado, y el programa podría fácilmente generar un proceso hijo con un nuevo PID que no sería bloqueado / olfateado. Además, los PIDs se crean y destruyen tan rápido como los sockets. Así que siempre hay espacio para que el tráfico se filtre.

QTAGUID:

owner no funcionará para tráfico entrante o reenviado porque los paquetes IP no llevan información de propiedad. Para medir el uso de la red entrante/saliente por aplicación, Android parcheó el kernel para incluir qtaguid módulo. Podemos leer las estadísticas de /proc/net/xt_qtaguid/stats . Con algunas secuencias de comandos de shell obtener el uso de datos en vivo desde el reinicio:

Sin embargo, en Android 9+, qtaguid está siendo sustituido con ampliado BPF (que también está previsto sustituir netfilter en el núcleo de Linux). Relacionado: ¿Qué proceso es responsable de capturar la utilización de los datos?

IPTABLES + TCPDUMP:

Una alternativa es poner el tráfico saliente de una aplicación en un NFLOG grupo y posteriormente capturas tcpdump paquetes de ese grupo:

# iptables -I OUTPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30
# tcpdump -i nflog:30

Esto es para asegurar que nos acercamos a la capa física al olfatear el tráfico saliente. Pero todavía puede dar falsos positivos Por ejemplo, si los paquetes se caen / se pierden en las tablas de enrutamiento. Por eso olfateadores trabajan en la capa 2 de OSI. O incluso mejor es ver desde el exterior, por ejemplo, utilizando un servidor proxy / VPN o en un PC atado o en el router. Pero esto no capturará el tráfico por UID/PID.

OTRAS OPCIONES:

  • Utilice herramientas de diagnóstico como strace para rastrear syscalls relacionados con la actividad de red de un proceso. force_bind y tracedump también funcionan con el mismo principio. El núcleo de Linux subsistema de auditoría puede utilizarse para lo mismo.
  • Utilice Clasificador de red cgroup con iptables NETFILTER_XT_MATCH_CGROUP para olfatear el tráfico de ciertos procesos.
  • Utilice Network Namespaces para aislar los procesos y leer el uso de datos por interfaz. nstrace funciona según el mismo principio.
  • Si la intención es bloquear por completo el tráfico procedente de determinados procesos, SELinux y seccomp se puede utilizar para restringir la capacidad de los procesos de crear sockets definiendo restricciones policies y la supresión de syscalls respectivamente.

La mayoría de ellas no son opciones directamente viables para Android y requieren configuraciones avanzadas.


APIs de Android (OPCIONES NO ROTAS):

Algunas aplicaciones como NetGuard utilice VpnService API de Android para bloquear el tráfico en la capa 3 (interfaz TUN). La aplicación puede "notificar cuando una aplicación accede a internet" . Captura y seguimiento por aplicación ( 1 , 2 ) es posible utilizando la API de VPN ya que Android hace uso de UIDs y SOcket_MARKs ( 1 , 2 ) para controlar el tráfico en la red Política de enrutamiento ( RPDB ), justo antes de dejar el dispositivo.

Algunas aplicaciones como NetLive utilizar NetworkStatsManager pero va a la zaga del uso en tiempo real y "no se actualiza con la suficiente rapidez" Es "destinado a proporcionar datos históricos" .

NOTA: No estoy afiliado a ninguna de las aplicaciones mencionadas.


RELACIONADO:

4voto

Kathy Puntos 1

Con PCAPdroid puedes ver las conexiones individuales realizadas por las aplicaciones. Es una herramienta de código abierto desarrollada por mí que funciona sin Root (el Root es opcional). Tiene muchas características interesantes para la seguridad y privacidad de los usuarios, compruébalo

0 votos

Esto es exactamente lo que necesitaba, y conseguí que funcionara en 5 minutos. Gracias.

1voto

pr0nin Puntos 353

Si sólo quieres hacer un seguimiento de qué aplicación realiza conexiones a qué servidor te recomiendo la aplicaciónMonitor de red a ti. Actúa como una VPN local y, por tanto, es capaz de detectar todo el tráfico de la red. Además, muestra qué aplicación ha realizado la petición de red (incluyendo el host remoto, los puertos, e incluso si la conexión es simple o SSL/TLS).

Por lo tanto, si utiliza esta aplicación en combinación con las herramientas de captura que ya mencionó en su pregunta, debería poder rastrear todas y cada una de las conexiones de red.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X