TCP Flag: O 13º byte

Leandro de Lima Camargo
3 min readJan 14, 2020

--

Cada pacote TCP carrega uma flag. Essa flag pode representar se uma conexão está iniciando, trocando dados, finalizando, resetando, etc. Vamos ver cada uma delas!

Photo by Markus Spiske on Unsplash

Para iniciarmos, vamos entender onde estão as flags no cabeçalho de um pacote TCP. Veja a imagem abaixo:

Perceba os números acima do cabeçalho (0, 1, 2 e 3). Esses números representam cada byte do cabeçalho. Pegue a primeira linha: Source Port e Destination Port.

Perceba que o campo Source Port está contido nos bytes 0 e 1 enquanto o campo Destination Port está contido nos bytes 2 e 3. Enquanto alguns campos precisam de 2 bytes, outros precisam de 1 byte. Alguns até mesmo compartilham 1 byte, como é o caso do campo Offset e Reserved que compartilham o byte 12. O que nos interessa aqui é o byte 13, que contém as flags TCP.

As flags possíveis são:

  • FIN: Finaliza a conexão;
  • SYN: Inicia a conexão;
  • RES: Reseta a conexão;
  • PSH: Envia os dados imediatamente ignorando o buffer;
  • ACK: Confirma que um pacote foi recebido com sucesso;
  • URG: Envia os pacotes com extrema urgência ignorando a sequência dos dados;
  • ECE e CWR: Trabalham em conjunto para identificar congestionamento na rede (RFC 3168);

Perceba que cada flag corresponde a um bit. Como temos 8 flags disponíveis, totalizamos 8 bits (ou 1 byte). Entendeu por que ocupamos o 13 byte completo no cabeçalho?

Vamos ver na prática as flags TCP utilizando o velho e famoso tcpdump.

Instalando o tcpdump:

RedHat/CentOS

yum install tcpdump

Debian/Ubuntu

apt install tcpdump

Micro$oft Window$

format c:/

e

https://www.debian.org/distrib/index.pt.html

Brincadeira, é claro! Mas sinceramente eu não tenho idéia de como instalar no Windows. Em uma googlada rápida, achei esses 2 links:

https://www.microolap.com/products/network/tcpdump/

https://www.techtudo.com.br/tudo-sobre/tcpdump-for-windows.html

Após instalado, podemos capturar o tráfego da sua máquina pelo simples comando:

sudo tcpdump -i any

O comando acima vai capturar qualquer tipo de tráfego. Podemos então filtrar somente a flag TCP que queremos. Lembra que cada flag é representada por cada bit?

128 — — 64 —- 32 —- 16 — — 8 —- -4 — — 2 — — 1

CWR — ECE — URG — ACK — PSH — RST — SYN — FIN

O TCPDUMP nos dá a possibilidade de filtrarmos os bytes do cabeçalho TCP de forma simples. Veremos na prática:

Veja o comando: sudo tcpdump -i any tcp[13] == 2 and host 186.192.90.5.

O IP 186.192.90.5 é do site globo.com. Fiz um filtro pra ele para evitar poluição na tela.

Eu estou apenas coletando quando o bit 7 do byte 13 estiver ativo. O bit 7 corresponde à flag SYN, conforme mencionado acima. Caso eu queria coletar pacotes que contenham apenas a flag ACK, filtro pelo bit 3.

Aí que está a pegadinha. Você filtra o bit 3 porém você não usa tcp[13] == 3e sim tcp[13] == 16, que é o valor correspondente ao bit 3. Bateu a dúvida? Veja o byte 13 novamente e os valores para cada bit:

Assim, de forma básica, conseguimos analisar as flags TCP em cada pacote que passa na sua máquina.

Até a próxima! ;)

--

--