2012-08-01 22 views
7

Estoy tratando de oler los encabezados http utilizando tcpdump.Comprender el filtro de Tcpdump y el enmascaramiento de bits

Este filtro funciona bien, pero no puedo entenderlo -

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

He buscado en Google, pero no puedo encontrar ninguna información útil

Aquí es todo el comando tcpdump

sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and 
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i eth0 

Respuesta

15

No es el filtro BPF el que obtiene los encabezados http sino el conmutador "-A" en el comando tcpdump.

Su comando tcpdump busca tráfico tcp hacia cierto destino o desde una fuente determinada en eth0 donde el filtro final BPF implica un cálculo que resulta en un total distinto de cero. Con la opción "-A", imprime cada paquete en ASCII menos su encabezado de nivel de enlace.

He explicado el siguiente cálculo, pero creo que hay algunos problemas en el filtro real, posiblemente mediante la copia y el pegado. Al utilizar estos filtros en tcpdump, que está utilizando el bit de máscara-TCP, que se utiliza normalmente cuando se examinan los campos que no están comprendidos en los límites de bytes

  • ip[2:2] se refiere a los dos bytes (es decir, 3ª 4ª & bytes) en el encabezado IP, comenzando en el byte 2 (recuerde que comienza en el desplazamiento 0). Este total representa la longitud total del paquete IP que puede ser un máximo de 65535 bytes.

Para la máscara de bits aquí, para mayor claridad, he agrega como prefijo un '0' por lo que se convierte en máscara 0xf0x0f. El "0" inicial de la máscara se descarta según el comentario de GuyHarris a continuación.

  • ip[0]&0x0f se refiere a la segunda mitad del byte 0 (es decir, el primero byte) en la cabecera IP, que le dará la longitud de la cabecera IP en palabras de 32 bits y, como tal, esto típicamente se multiplica por 4 para tal cálculo.

  • se refiere a la primera mitad del byte 12 (es decir, el undécimo byte), que es el campo de compensación de datos, que especifica el tamaño del encabezado TCP en palabras de 32 bits y como tal, esto se multiplica por 4 para tal cálculo.

es necesario multiplicar los últimos 2 longitudes de 4, ya que son 32 4 palabras de bits/bytes y por lo tanto necesitan ser traducidos a un total en bytes para el cálculo sea correcto

El filtro se debe calcular:

  • La longitud de paquetes IP (en bytes) - La longitud de la cabecera IP - La longitud de cabecera TCP

y en busca de ese valor a ser ze ro, es decir algo como esto

sudo tcpdump -A -nnpi eth0 '(ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

Al realizar la resta, usted está buscando un total distinto de cero.Este total distinto de cero significa que hay datos por encima de la capa 4, es decir, datos en la carga útil de tcp, típicamente tráfico de aplicaciones.

También es posible que desee agregar port 80 asumiendo la mayor parte del tráfico HTTP es a través del puerto 80.

Dicho filtro se utiliza comúnmente por la gente de seguridad para detectar datos sobre un SYN, que no es normal, pero de acuerdo con el RFC, está permitido. por lo que todo el asunto se vería algo como -

'tcp[13]=0x02 and (ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

TCPIPGuide es una guía en línea muy buena, libre en TCP/IP por cierto.

Actualizado: modifique la sección 'cero inicial' en la máscara de bits según la actualización de Guy Harris.

+1

'0x0f' y' 0xf' son la misma cosa; los ceros a la izquierda se pueden omitir en los valores hexadecimales. El código podría leer más * claramente * si los ceros a la izquierda están presentes, sin embargo. El '<< 2' es lo mismo que' * 4'; el '>> 2', sin embargo, es'/2' (dividir por 2), lo que está mal, probablemente sea un error tipográfico. –

+1

¡Muchas gracias respuesta muy completa! – kingasmk

+1

@GuyHarris thx, no estaba seguro de si se eliminó el cero inicial, así que pensé en poner mi comentario para mayor claridad. En cuanto a '>> 2' es lo mismo que' * 4', simplemente lo cambié de '>> 2' por claridad, ya que' * 4' es bastante claro y sentí que era necesario explicar la diferencia de los valores (32 -bit palabras frente a bytes), y para eliminar la duda sobre el error tipográfico << << 2 '. –