¿Cómo capturar paquetes ack o syn por Tcpdump?

48

Quiero usar una regla de filtro para capturar solo paquetes de reconocimiento o sincronización. ¿Cómo hago esto?

larry
fuente
Personalmente no haría esto. Capturaría todos los paquetes, luego filtraría los indicadores SYN y ACK más tarde. Si está solucionando problemas de TCP, casi siempre desea ver una conversación completa, no solo un apretón de manos o un ACK. Si no está interesado en la carga útil de datos real, puede limitar el tamaño del paquete con tcpdump -s SIZE. El encabezado TCP puede tener una longitud variable, por lo que la captura -s 128probablemente obtendrá todos los encabezados posibles y tal vez un poco de datos.
suprjami
44
Tal vez no estás solucionando problemas de TCP. Tal vez desee ver cuán hablador es un programa y contar sus conexiones salientes. Como yo ahora.
Dan Pritts

Respuestas:

81

La sintaxis del filtro pcap utilizada para tcpdump debería funcionar exactamente de la misma manera en el filtro de captura Winshark.

Con tcpdump usaría un filtro como este.

tcpdump "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"

Consulte la página de manual de tcpdump y preste mucha atención a los tcpflags.

Asegúrese de revisar también las secciones en Wireshark Wiki sobre captura y visualización de filtros. Desafortunadamente, los dos tipos de filtros usan una sintaxis completamente diferente y nombres diferentes para la misma cosa.

Si desea un filtro de visualización en lugar de un filtro de captura, probablemente necesite construir una expresión que combine tcp.flags.ack y tcp.flags.syn. Sin embargo, estoy mucho más familiarizado con los filtros de captura, por lo que tendrá que resolverlo por su cuenta.

Zoredache
fuente
1
Me gusta más tu respuesta. Parece que hiciste un esfuerzo. Vota por ti.
Ablue
44
Esta es una gran respuesta con buenas referencias, pero tenga en cuenta que esta sintaxis capturará cualquier paquete que tenga establecidos los indicadores SYN o ACK, incluso si también se establecen otros indicadores. Esto puede o no ser lo que pretendía el OP. Consulte mi respuesta a continuación para obtener un filtro más estricto si solo se desean paquetes TCP SYN o ACK. Salud.
JJC
14

Si bien la respuesta de @ Zoredache es agradable y completa, tenga en cuenta que la sintaxis generará todos los paquetes que tengan configurado el indicador TCP SYN o TCP ACK, incluidos los paquetes que no son estrictamente simples "TCP SYN" o "TCP ACK", porque También tienen otras banderas establecidas. Esto puede o no ser lo que usted (o futuros lectores) pretendía. Por ejemplo, esa sintaxis también capturará paquetes TCP SYN-ACK, TCP FIN-ACK, etc. Si solo desea paquetes TCP SYN o TCP ACK (es decir, SOLO uno de esos indicadores establecidos), la sintaxis adecuada del filtro de captura es:

'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'

Equivalentemente:

'tcp[13] == 2 or tcp[13] == 16'

¡Salud!

JJC
fuente
9

Hice un script para ver los principales "sincronizadores". Para eso, considero solo el paquete de sincronización inicial (el primer paquete del apretón de manos de tres paquetes). Es decir, syn = 1, ack = 0

while :; do
  date; 
  tcpdump -i eth1 -n -c 100 \
  'tcp[tcpflags] & (tcp-syn) != 0' and 
  'tcp[tcpflags] & (tcp-ack) == 0' 2> /dev/null \
  | awk '{ print $3}' \
  | sort | uniq -c | sort | tail -5;
  echo;
  sleep 1
done
Eduardo
fuente
55
Ese es un buen ejemplo. Puede simplificar aún más su filtro de captura tcpdump reemplazando "'tcp [tcpflags] & (tcp-syn)! = 0' y 'tcp [tcpflags] & (tcp-ack) == 0'" con solo 'tcp [tcpflags ] == tcp-syn '. Eso excluirá automáticamente los paquetes con ACK configurado. ¡Salud!
JJC
9
tcpdump 'tcp[13] = 3'

http://danielmiessler.com/study/tcpdump/

Avanzado

También puede filtrar según porciones específicas de un paquete, así como combinar múltiples condiciones en grupos. El primero es útil cuando se busca solo SYNs o RSTs, por ejemplo, y el segundo para un aislamiento de tráfico aún más avanzado.

UAP RSF

[Sugerencia: un anagrama para las banderas TCP: los atacantes no calificados molestan a la gente de seguridad real]

tu nota: ...

Muéstrame todos los URGpaquetes URGENTES ( ) ...

tcpdump 'tcp[13] & 32 != 0'

Muéstrame todos los ACKpaquetes de RECONOCIMIENTO ( ) ...

tcpdump 'tcp[13] & 16 != 0'

Muéstrame todos los PSHpaquetes PUSH ( ) ...

tcpdump 'tcp[13] & 8 != 0'

Muéstrame todos los RSTpaquetes RESET ( ) ...

tcpdump 'tcp[13] & 4 != 0'

Muéstrame todos los SYNpaquetes SYNCHRONIZE ( ) ...

tcpdump 'tcp[13] & 2 != 0'

Muéstrame todos los FINpaquetes FINISH ( ) ...

tcpdump 'tcp[13] & 1 != 0'

Muéstrame todos los SYNACKpaquetes SINCRONIZAR / RECONOCER ( ) ...

tcpdump 'tcp[13] = 18'

[ Nota: Sólo el PSH, RST, SYN, y FINbanderas se muestran en la producción del campo de la bandera de tcpdump. URGsys ACKse muestran, pero se muestran en otra parte de la salida en lugar de en el campo de banderas]

castet
fuente
2
El plagarismo no está permitido en Stack Exchange . Edite esta publicación para dejar en claro que ha copiado el contenido del sitio vinculado. Gracias.
Chris S
4

Quería obtener solo paquetes SYN, utilicé el siguiente comando:

tcpdump -i eth7 'tcp[13] & 2 != 0'

Esto debería funcionar para usted de inmediato.

Sidharth
fuente
3
Esto capturará cualquier paquete con el conjunto de indicadores SYN, incluidos SYN, SYN-ACK, etc. Si solo desea paquetes SYN, use 'tcp [13] == 2' en su lugar. ¡Salud!
JJC
1

debería mostrarlos sin ningún filtro o argumento.

Un azul
fuente
Su respuesta es técnicamente correcta, pero el OP probablemente pretendía incluir la palabra "solo" en su pregunta. ;-) ¡Salud!
JJC