Você está na página 1de 11

Entendendo o “state machine” TCP de um host

Neste artigo iremos entender os aspectos referentes à conexão e gerenciamento de uma sessão
TCP necessária para que dois hosts quaisquer troquem dados.

Objetivos:
- Entender como os hosts gerenciam as conexões TCP e como utilizar o comando netstat para
compreender a máquina de estado (state machime) TCP.
- Através do estado das conexões TCP verificar as possíveis condições de um host.
- Entender as implicações de determinados estados TCP em relação à segurança de um host.

O TCP é um protocolo totalmente baseado em conexão e o estado de suas sessões de


comunicação podem ser solidamente determinados. Como o início e o fim de uma sessão de
comunicação TCP são muito bem definidos e como existe um acompanhamento destes estados
através dos sues flags, o protocolo é considerado statetfull ou com estado. Toda e qualquer
conexão realizada pelo protocolo TCP é regido por uma máquina de estados que tem a função de
controlar minuciosamente todos os aspectos de uma sessão entre dois hosts quaisquer. Para
entender estes estados faça o seguinte, acesse o ambiente DOS e digite:

A sintaxe completa deste comando para o ambiente windows é a seguinte:


netstat [-a] [-e] [-n] [-s] [-p protocol] [-r] [interval] Se você executá-lo sem nenhuma opção , serão
exibidas todas as conexões de TCP ativas .

a Exibe todas as conexões atuais e ports.


Exibe as estatísticas da rede . Estas estaísticas , o número total de bytes , o
número de unicast e pacotes de non-unicast , o número de pacotes descartados
e
e o número de erros , são cumulativas desde a última vez que o computador foi
reajustado.
n Exibe o hostname IP e nomes de portas (ports).
Exibe as estatísticas para cada um dos protocolos : TCP , IP , ICMP e UDP .
s
Você pode combinar com o -p protocolo.
protocol : Especifica que só devem ser mostradas conexões e estatísticas para
p um protocolo específico . Valores válidos para protocolos são TCP , UDP , IP e
ICMP.
Atualiza as estatísticas continuamente e interrompe a cada segundo de
Interva
intervalo . Se nenhum intervalo é especificado , a informação será exibida uma
l
vez.

O resultado deste comando pode ser visualizado como na figura abaixo:


Este comando pode ser digitado em um desktop, servidores web ou de arquivos ou mesmo em um
firewall, sendo possível entender as estatísticas das conexões TCP.

A resposta típica deste comando pode ser visualizada abaixo e os significados de cada campo são:

Foreign Address (Endereço externo)


Indica o endereço IP e a porta de um host remoto. O asterisco (*) indica uma porta que ainda não
foi estabelecida.

Local Address (endereço Local)


Mostra o endereço IP do computador local e o número da porta que está sendo usada nesta
conexão. È mostrado o nome do host ao invés do endereço IP se no arquivo hosts (..etchosts)
contiver uma entrada com a respectiva referencia. Em casos onde a porta não está ainda
estabelecida o número da porta é referenciado com o asterisco (*).

Proto
O protocolo utilizado para a conexão.

State (estado)
Indica o estado das conexões TCP. Os possíveis estados são:
- Closed
- Listen
- Established
- Close_Wait
- Last_Ack
- SYN_send
- SYN_received
- Time_Wait
- FIN_Wait_1
- Last_Ack.

O significado de cada um deste estados será explicado mais à frente neste artigo.

Portas TCP

Tanto o TCP quanto o UDP possibilitam utilizar 65356 portas que são empregadas pelos
respectivos serviços habilitados nos hosts. Quando um determinado serviço está ativo uma porta
específica é habilitada para que o processo de comunicação entre os hosts ocorra. A comunicação
do TCP é baseada em um componente Cliente que busca dados em um componente Servidor.

As portas TCP são classificadas de acordo com o seguinte esquema:

- Portas no componente Servidor assumem valores entre 1 e 1024 e são sempre fixas. Ex: 21 para
FTP, 23 para Telnet, etc
- Portas para o componente Cliente assumem valores acima de 1023 e são randômicas.

Em sua última atualização de 28 de setembro de 2004 o IANA (entidade que controla a alocação
destas portas) definiu o seguinte esquema:

- Portas bem conhecidas, (Well Known Ports): 0 à 1023


- Portas registradas (Registered Ports): 1024 à 49151
- Portas dinâmicas (Dynamic and/or Private Ports): 49152 à 65535

Verifique em: http://www.iana.org/assignments/port-numbers .

Estados de conexão TCP

Mas o que são estes estados e o que eles significam?


A resposta exata a esta pergunta irá merecer algumas explicações que dividiremos em 03 partes:

- Flags TCP
- State Machime TCP
- Processo de abertura e fechamento de sessão

Flags TCP

Como colocado no início do artigo, todo o processo de controle de uma sessão TCP é controlada
pelos seus flags. O protocolo TCP possui 6 flags que controlam completamente todo o processo
de comunicação entre os hosts, os seis flags, são:
SYN ACK FIN PSH URG RST

Os significados destes flags são:

SYN
Quando setado em 1 indica o pedido de abertura de sessão TCP.

ACK
Quando "setado" em 1, sinaliza que este segmento contém o próximo octeto que o host origem
espera receber. O flag ACK está sempre presente nos segmentos TCP, exceto na abertura de
sessão.

FIN
Quando "setado" em 1, sinaliza um pedido de desconexão. Como o TCP é full duplex a
desconexão pode se dar em um único sentido ou em ambos. Se um host enviar uma solicitação
FIN, este pedido terá que ser confirmado, mas dados podem ainda ser transmitidos até que
finalize suas atividade, onde outro segmento com o flag SYN deve ser enviado devendo também
se confirmado pelo outro host.

PUSH
Quando "setado" em 1, avisa ao receptor que os dados podem ser entregues diretamente à
aplicação. Uma resposta afirmativa a este comando significa que o receptor enviou todos os
dados à aplicação correspondente.

URG
Quando "setado" em 1, sinaliza que o campo Urgent Pointer deve ser lido, pois contém dados
válidos. È um flag muito pouco utilizado hoje em dia. Este flag é também conhecido como OOB
(Out Off Band) já que ele especifica uma condição na qual os dados devem ser retirados não do
fluxo de dados normal, mas do campo URGENT POINT.

RST
Indica que a conexão está sendo abortada. Para uma conexão ativa, se um segmento com o flag
RST é enviado a conexão é fechada de forma abrupta de maneira que os dados armazenados nos
buffers ou em transito sejam descartados.

State Machine TCP

O protocolo TCP possui 11 estados de conexão que são definidos como abertura e fechamento de
sessão, os mais simples de entender e os estados intermediários, mais complexos, que podem
determinar uma série de situações importantíssimas nas quais um host pode passar. No diagrama
de blocos abaixo é possível verificar estes estados.
O processo de conexão de um host se inicia quando um serviço qualquer habilita uma
determinada porta que passa do estado Closed para o estado Listen. Quando um host recebe um
segmento com o flag SYN habilitado (SYN=1) formalmente é iniciada uma sessão TCP e no host
destino é reservado uma estrutura de dados especial para controle de todas as conexões TCP
iniciadas. Esta estrutura de dados é chamada de TCB (Transmission Control Block) ou Bloco de
Controle da transmissão. O TCB contem todas as informações importantes sobre uma conexão,
tais como os dois números do soquete que identificam a conexão e os ponteiros para os buffers
onde os dados que entram e saem da conexão são mantidos. O TCB é usado também executar o
mecanismo de Slide Window ou janela deslizante.

Abertura de sessão TCP


O processo de conexão se inicia quando o host de origem envia para o host destino um segmento
TCP contendo a porta de origem e destino, endereço IP de origem e destino e o flag SYN ativado.
O diagrama abaixo explica o processo de abertura de sessão. Nenhum dado é trocado se este
processo não for realizado.

1 - O primeiro segmento indica que o host A com endereço IP 192.168.1.1 deseja realizar uma
abertura de sessão TCP na porta 80 do host B com endereço IP 192.168.1.2. O segmento possui a
porta de origem xxxx e o flag SYN habilitado (SYN=1).

Toda vez que o flag SYN está ativado (SYN=1)


indica abertura de sessão.

C:/> netstat – na

2 - O segundo segmento contém dois flags ativos (SYN e ACK) e demonstra duas situações:
- O host B aceitou o pedido de abertura de sessão na porta 80 enviando um segmento de resposta
com o flag ACK habilitado (ACK=1). Isto significa que o pedido de abertura de sessão foi aceito já
que o serviço existente neste host utiliza a porta 80 e está ativo.
- No mesmo segmento é enviado o flag SYN=1 demonstrando que este host deseja abrir uma
sessão na porta xxx do host A. O TCP é full-duplex, ou seja, o host A abre sessão no host B e vice
versa. O procedimento de enviar dois flags habilitados em um mesmo segmento é conhecido como
pigg-backing.

3 - O terceiro e último segmento é o host A confirmando para o host B a abertura de sessão na


porta xxx, através do envio de um segmento com o flag ACK habilitado (ACK=1).

O tráfego deste processo no padrão Ethereal pode ser baixado aqui.

Quando o processo de abertura de sessão se estabelece totalmente através do tráfego dos 3


segmentos acima descritos ou 3 way handshaking, os dois hosts se encontram no estado de
conexão estabelecida ou “Established State” significando que uma sessão TCP foi formalmente
estabelecida e os dois hosts podem trocar dados. O processo de abertura de sessão altera
também uma série de parâmetros do protocolo TCP como números de seqüência, números de
ACK e outros que explicaremos em um futuro artigo.

O que é um segmento?
Segmento é a representação dos dados na camada
de transporte e significa um pacote que contém as
portas de serviço de destino e origem.

Fechamento de sessão TCP

Da mesma forma que a abertura de sessão, o protocolo TCP também realiza um fechamento
formal de uma sessão exigindo uma troca de flags entre os hosts, de maneira a confirmar,
explicitamente, que a sessão TCP será fechada. O esquema abaixo facilita a visualização de como
este processo é realizado.

O fechamento de uma sessão TCP usa um processo diferenciado do 3 way handshaking da


abertura de sessão acima descrito. Só para relembrar, as conexões TCP são full-duplex e fluem
cada uma em direções opostas (cliente-server-client). O processo detalhado pode ser resumido
abaixo.

1 - O primeiro segmento é enviado pelo host A quando uma aplicação como o FTP, por exemplo,
não tiver mais dados para enviar e requisita da pilha TCP o encerramento da sessão que será
realizada através do envio de um segmento com o flag FIN habilitado (FIN =1).

2- O segundo segmento é enviado pela aplicação que está sendo executada no host B aceitando o
pedido de finalização enviando um segmento com o flag ACK habilitado (ACK=1). A conexão está
agora fechada em uma direção (A->B) e serão necessários mais segmentos para fechar a conexão
no sentido inverso (B->A).

3 - Este segmento é o pedido de fechamento de sessão no sentido inverso (B->A) que é realizado
pelo host B enviando um segmento com o flag FIN habilitado (FIN=1).
4 – Este é o último segmento confirmando pelo host A o pedido de fechamento de sessão feito
pelo host B. O segmento com o flag ACK habilitado (ACK=1) é enviado pelo host A .

O tráfego deste processo no padrão Ethereal pode ser baixado aqui.

A conexão TCP pode ser encerrada de maneira


totalmente informal e abrupta, bastando que um
host envie um segmento com o flag habilitado
(RST =1).

Descrição do State Machine TCP

Um "sem estado", que existe antes que uma conexão seja realmente
CLOSED iniciada. Na verdade um host sempre está em closed se nenhuma
aplicação ou serviço requisitar uma porta.
Estado em que um host se encontra quando um determinado serviço ou
LISTEN aplicação se posiciona para esperar um pedido para iniciar uma
conexão. Esse é o verdadeiro estado inicial de uma conexão TCP.
Tempo depois que um host tiver enviado um pacote SYN e estiver
SYN-SENT
aguardando a resposta SYN-ACK apropriada.
Estado em que um host se encontra depois de receber um segmento
SYN-RCVD com o flag SYN e responder que aceita este pedido enviando um
segmento com os flags SYN-ACK ativados.
Estado em que uma conexão realizou todos os procedimentos
ESTABLISHE intermediários para o estabelecimento de sessão. È o ápice do processo
D de abertura de sessão e a partir daí os dados podem ser trocados entre
os hosts.
O processo de estabelecimento de uma conexão TCP normalmente passa por estados
acima descritos como parte do three-way handshaking.
Os seis estados restantes descrevem o desmembramento de uma conexão TCP onde os
estados descritos demonstram como uma conexão é fechada e como os dados param de
fluir entre os dois hosts. Os estados abaixo descritos demonstram como esse processo é
realizado.
Estado em que uma conexão se encontra depois de ter enviado um
FIN-WAIT-1
pacote FIN inicial pedindo um fechamento correto da conexão TCP.
Estado de uma conexão receber um segmento com o flag FIN inicial e
CLOSE-WAIT
enviado de volta um ACK para confirmar que o FIN foi aceito.
Estado da conexão de um host que recebeu um segmento com o flag
FIN-WAIT-2 FIN habilitado, enquanto espera por um FIN final do seu parceiro de
conexão.
Estado da conexão de um host que acabou de enviar o segmento FIN,
LAST-ACK necessário para o fechamento correto de uma conexão TCP, de volta ao
host iniciador, enquanto espera uma confirmação deste.
Estado do host que recebeu um FIN tendo que esperar um determinado
período de tempo antes de enviar um ACK. O host deve esperar por um
TIME-WAIT
determinado tempo (em torno de 240 segundos) antes da porta ser outra
vez utilizada.
Estado que é empregago quando uma conexão usa o fechamento
simultâneo fora do padrão. A conexão está neste estado depois de
CLOSING receber um FIN inicial e enviar um ACK. Depois de receber um ACK a
conexão entrará no estado TIME-WAIT. A figura abaixo exemplifica esta
situação.
Cada um dos estados de uma conexão TCP é minuciosamente descrito na RFC 793. Para
entender verdadeiramente estes estados de uma conexão TCP é importante observar os muitos
estágios pelos quais uma conexão TCP passa. Além dos estados “Stablished” e “Closed”
demonstrados acima, existem uma série de outros estados que devem ser entendidos por
qualquer profissional de segurança, suporte e desenvolvimento. As descrições destes estados
são:

Em que estas informações podem me ajudar?

A compreensão destes estados poderá ajuda-lo a entender uma série de situações que um host
pode passar. As mais importantes e comuns, são:

- Entender como as conexões de um determinado host estão.


- Descobrir quais os serviços sua máquina está executando e em quais portas;
- Entender quando um ataque Syn-Flooding está sendo realizado;
- Entender um ataque de DDOS;

Serviços executados

Um simples netstat –na ou mesmo a execução TCPview (download) ou o fport (download) poderão
lhe dizer quem são os serviços que estão sendo executados em seu computador e quais as portas
empregadas, de maneira que, se um ataque estiver sendo recebido ou mesmo se um trojam tiver
sido instalado em sua máquina sem que você perceba, será possível nitidamente encontra-lo, pois
o comando netstat –an ou TCPview ou o fport relacionarão os serviços ativos habilitados com as
respectivas portas e os arquivos que estão sendo executados. Observe a listagem abaixo.
Ataque SYN-FLOODING

O SYN-FLOODING é um ataque de negação de serviço ou DOS (Denial-of-service) que é


caracterizado em explorar o state-machime TCP. O atacante injeta uma enorme quantidade de
tráfego visando criar, exclusivamente, conexões do tipo half-open (SYN - SYN+ACK) sem
preocupação com a resposta pois o endereço IP de origem é falsificado (spoofing). Desta maneira,
existem várias sessões TCP abertas no host destino que, se não tratado pelo sistema operacional,
levará a uma exaustão da tabela TCB e de recursos como CPU e memória, fazendo o host atacado
travar, resetar ou mesmo inicializar. O comando nestat poderá lhe indicações se sua máquina
está mesmo sofrendo este ataque.

C:>nestat –n – p TCP

Active Connections

TCP 192.168.2.80:1161 64.233.171.104:80 ESTABLISHED


TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
TCP 192.168.1.1:1025 192.168.1.1:1025 SYN_RECIVED
*As conexões marcadas de vermelho são ataques SYN FLOOD

Ataques DDOS

Os ataques de DDOS são semelhantes aos ataques SYN Flooding no que se refere ao
procedimento das conexões TCP, pois o resultado prático é o mesmo, ou seja, exaurir os recursos
computacionais da máquina vítima (TCB). Mas este ataque é muito mais sofisticado e devastador,
pois é necessária a estruturação de uma rede bem orquestrada de computadores clientes que
podem ser preparados horas, dias ou mesmo meses antes que o ataque seja proferido. De um
modo geral, os procedimentos empregados para o SYN-Flooding podem ser utilizados, o problema
é que na máquina vítima deste ataque,como normalmente acontece nem mesmo é possível
executar qualquer aplicação, pois a mesma trava em poucos segundos após o início do ataque,
ficando assim, praticamente impossível, a utilização de utilitários como o netstat. O mais
recomendado então é verificar os seguintes itens:
- Excesso de tráfego: Verifque com o MRTG ou PRTG (download) se existe tráfego que esteja
ultrapassando o número de acesso médio ou esperado.

- Pacotes UDP e ICMP: Verifique a existência de pacotes UDP e ICMP de tamanho acima do
normal ou em excesso. Geralmente as sessões UDP empregam pacotes pequenos em torno de 10
bytes. As mensagens ICMP não excedem a faixa de 64 e 128 bytres. Pacotes com tamanhos
superiores a esses números são considerados suspeitos de conter mensagens de controle
destinadas a cada um dos agentes instalados nas máquinas vítimas. Normalmente o conteúdo
destes pacotes está criptografado, mas o endereço de destino é verdadeiro, o que poderá ser um
item interessante para se localizar os agentes que estão realizando os ataques.

- Pacotes TCP e UDP: Alguns ataques de DDOS utilizam aleatoriamente protocolos orientados a conexão para
enviar dados em canais que não são orientados a conexão e normalmente utilizam portas acima de 1024.

Como foi demonstrado, o conhecimento do protocolo TCP se torna uma importante ferramenta na
ajuda do entendimento de um ambiente de rede. No próximo artigo exploraremos como são
realizados os Port Scanners e como cada método funciona. Até breve.

Paulo Eustáquio Coelho


Fonte: INSTITUTO ONLINE
www.instonline.com.br