La expresión del filtro tcpdump se rompe a través de adb

La expresión del filtro tcpdump se rompe a través de adb

Instalé tcpdump en mi tableta Android y estoy ejecutando comandos desde un shell adb raíz. estoy trabajando desdelos ejemplos de la página de manual de tcpdump, específicamente este:

Para imprimir todos los paquetes HTTP IPv4 hacia y desde el puerto 80, es decir, imprimir solo paquetes que contengan datos, no, por ejemplo, paquetes SYN y FIN ni paquetes de solo ACK.

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Si ejecuto el comando anterior en mi escritorio (Ubuntu), funciona bien. Si intento ejecutarlo en mi dispositivo Android, así:

adb shell tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Recibo este error:

/system/bin/sh: can't create 2)) != 0): Read-only file system
/system/bin/sh: here document missing
tcpdump: syntax error

Y el siguiente comando funciona bien en el dispositivo Android:

tcpdump 'tcp port 80'

Parece que la expresión del filtro no se está analizando correctamente o algo así, pero seré honesto, no estoy seguro de cómo funciona exactamente, así que no estoy seguro de por dónde empezar con la solución de problemas. ¿Alguna idea sobre qué está pasando o cómo solucionarlo?

Respuesta1

Las comillas hacen que al comando adbse le pasen tres argumentos:

  1. shell
  2. tcpdump
  3. tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)

Presumiblemente luego intenta ejecutar el comando.

tcpdump tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)

sinlas comillas (ya que el shell de la máquina en la que escribió el comando eliminó las comillas) en la máquina Android.

Probablemente puedas hacer

adb shell tcpdump "'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'"

lo que significa que el adbcomando será pasado

  1. shell
  2. tcpdump
  3. 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

para que intente ejecutar el comando

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

en la máquina Android.

El mismo problema existiría con, por ejemplo, ssh; El comando

ssh localhost tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

obtiene los errores

bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `tcpdump tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Respuesta2

Todavía no estoy seguro de dónde exactamente no se estaba interpretando correctamente el comando, pero ya no hay problema si en lugar de esto:

adb shell tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Primero abro el shell y luego ejecuto tcpdump:

adb shell
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

información relacionada