Tutorial Scapy Parte 4 Logo

Antes de começarmos a explorar pacotes utilizando o Scapy, acho importante que neste tutorial scapy – parte 4, seja introduzido o modelo TCP/IP.

NOTA: Este tutorial não tem nenhuma intenção de ser referência para o estudo do modelo TCP/IP, portanto as informações compartilhadas aqui estarão simplificadas para melhor atender o objetivo final que é utilizar a ferramenta Scapy.

Modelo TCP/IP

O que é o modelo TCP/IP e porquê precisamos dele?

O modelo TCP/IP é uma derivação do modelo OSI, um modelo de rede de computadores definido para garantir a interoperabilidade entre diferentes sistemas.

Tanto o modelo TCP/IP quanto o modelo OSI são divididos em camadas, essa divisão é muito importante, pois facilita o desenvolvimento de novos protocolos independentes, além da identificação e resolução de problemas mais rapidamente e de forma isolada entre as camadas.

 

Modelo TCP/IP

Camadas do Modelo OSI vs TCP/IP

O conjunto de protocolos OSI é dividido em 7 camadas, tendo cada uma sua responsabilidade, como garantir a integridade e entrega dos dados transmitidos entre computadores.

O modelo TCP/IP simplifica o entendimento do modelo OSI e é dividido em quatro camadas – aplicação, transporte, rede e física – na camada física do modelo TCP/IP, agrega-se a tarefa da camada 1 e 2 do modelo OSI, enquanto que na camada de aplicação agregam-se as camadas 5, 6 e 7.

Costumamos nos referir à essas camadas agregadas pelo modelo TCP/IP, utilizando apenas a camada mais superior, portanto a camada de aplicação é geralmente chamada de camada 7, equanto que a camada física é chamada de camada 2.

Camada Física

Esta camada, como observamos antes, é uma junção de duas camadas do modelo OSI, a camada física, que corresponde ao nível de hardware, ou seja, trata dos sinais eletrônicos, conector, pinagem, níveis de tensão e etc, e a camada de enlace, que é responsável pela detecção e também correção de erros da camada física.

É bastante comum que haja um endereço associado à esta camada, conhecido como endereço MAC, um número serial associado e exclusivo do hardware utilizado.

Logo, é normal utilizar a camada de enlace para a entrega de pacotes dentro de um mesmo domínio de colisão.

Comumente, nos referimos à esta camada como camada 2.

Camada de Rede (Internet)

Ela é responsável pelo endereçamento do pacote, fazendo a conexão entre as redes locais. Quando o procolo IP é utilizado, adiciona-se o endereço IP de origem e destino ao cabeçalho deste pacote.

É na camada 3 que os roteadores atuam, ou seja, o roteador lê até a camada 3 do pacote antes de tomar uma decisão de roteamento.

O modelo TCP/IP chama esta camada de camada Internet, porém é muito comum utilizarmos o nome OSI, camada de rede, ou camada 3.

Camada de Transporte

No geral, a camada de transporte tem o papel de fornecer funções que permitam a comunicação fim a fim entre aplicações.

Os protocolos mais usados para a camada de transporte são o TCP, que é um protocolo orientado à conexão e com garantia de entrega, e o UDP que é um protocolo não orientado à conexão e sem garantia de entrega.

Camada de Aplicação

É comum utilizarmos o termo “camada 7” para nos referirmos à camada de aplicação, porém convém lembrar que no modelo TCP/IP a camada de aplicação abriga três camadas do modelo OSI, sessão, apresentação e aplicação.

Os protocolos mais comuns de camada 7 são o protocolo DNS, responsável pela conversão de um nome (domínio) em um endereço IP, o protocolo FTP, responsável pela transferência de arquivos entre dois computadores diferentes e o HTTP, responsável pela transferência de arquivos de uma página Web (servidor) até o navegador (cliente).

Pacotes, Camadas e Campos – A estrutura de dados do Scapy

O Scapy utiliza dicionários Python como estrutura de dados para pacotes. Cada pacote é uma coleção de dicionários aninhados, sendo cada camada um dicionário filho da camada anterior, criado a partir da camada mais baixa. Visualizar as camadas de pacotes aninhadas seria algo como o mostrado pela figura abaixo.

Modelo Scapy

Cada campo (como o valor Ethernet “dst” ou “type”) é um par de {chave: valor} na camada apropriada. Esses campos (e camadas aninhadas) são todos mutáveis ​​para que possamos reatribuí-los usando o operador de atribuição.

A escolha de dicionários aninhados é muito interessante, pois representa exatamente como um pacote é encapsulado. Toda camada é encapsulada pela sua camada anterior, portanto a camada de aplicação está encapsulada na camada de transporte, que por sua vez está encapsulada na camada de rede e seguimos assim até chegarmos à camada física.

Chega de teoria e vamos à aplicação!

Funções e Métodos para visualização de pacotes do Scapy

O Scapy possui três funções principais para examinarmos um pacote. Cada uma com sua própria característica.

Nesta seção, tentaremos aconselhar os melhores usos de cada método para visualização de pacotes.

Uma função em Python, pode também ser chamada de método quando a mesma esta associada à um objeto, portanto não estranhe se chamarmos uma função de método daqui para frente.

Método summary()

O método summary() nos da uma visão resumida de um pacote, ele é ótimo para ser utilizado quando queremos apenas garantir que nosso pacote tem certas camadas.

Vamos utilizar a função sniff() que aprendemos na parte 3 deste tutorial para coletarmos 8 pacotes ICMP. É Importante lembrar que o Scapy precisa ser rodado com o comando sudo.

Temos um objeto pkts que é uma lista contendo 8 pacotes do tipo ICMP. Se utilizarmos o método summary() nesta lista de pacotes, conseguiremos ter uma visão geral.

Vejam que o método summary() nos apresenta as camadas Ether, IP, ICMP, além de nos dizer qual é o IP de origem e destino de cada mensagem.

Podemos otimizar nossa tarefa ainda mais, utilizando o parâmetro prn da função sniff().

Olha que interessante! Podemos coletar pacotes e apresentar seus resumos em tempo real! Isto pode nos ser muito útil quando estivermos realizando uma análise de rede.

Método show()

Suponhamos agora, que precisamos analisar alguns campos específicos do protocolo ICMP. Para isso, precisaremos utilizar o método show(), que irá nos apresentar o pacote com suas camadas expandidas, nos dando todas as informações daquele pacote no mínimo detalhe.

Vamos utilizar o método show() no primeiro pacote da nossa lista.

O método show() nos traz muito mais detalhes do pacote capturado. Conseguimos ver não só as camadas, como também cada campo das respectivas camadas.

Na camada ICMP, por exemplo, vemos os campos type, code, chksum, id e seq. Assim, para realizar um troubleshooting mais detalhado, precisamos utilizar o método show().

Método show2()

Suponhamos que em vez de capturar um pacote na rede, queremos construir um pacote. Quando construímos um pacote no Scapy, existem alguns campos que são calculados apenas quando o pacote é enviado pela rede, portanto os métodos summary() e show() não irão apresentar esses campos para nós.

Vamos à um exemplo, suponhamos que queremos enviar um pacote ICMP com destino ao endereço IP 192.168.163.1, mas queremos garantir que os valores de checksum estarão corretos antes de enviar o mesmo.

Podemos fazer isso utilizando o método show2().

Notem a diferença do método show() e show2() observando as linhas 16 e 23. Quando utilizamos o método show() as linhas 16 e 23, que correspondem ao campo checksum não possuem qualquer valor, porém quando utilizamos o método show2() podemos notar que o Scapy já calculou os valores e os apresentou para nós.

Bom, vocês podem estar se perguntando, por que eu, que já utilizo o Wireshark para análise de pacotes, preciso me dar ao trabalho de aprender o Scapy?

O Wireshark é sim a principal ferramenta de análise de pacotes opensource, e eu também a utilizo e muito, porém o Scapy, sendo uma ferramenta escrita em Python me dá muita liberdade de gerar análises específicas numa linguagem simples e direta.

Mas não se preocupe, ainda temos um método bônus de visualização de pacotes com o Scapy!

Método Bônus – WRPCAP/RDPCAP

Tudo bem, já aprendemos os métodos para análise de pacotes com Scapy, mas ainda gostaríamos de salvar esses pacotes para análisar mais tarde, como faço isso?

O Scapy é realmente uma ferramenta incrível! Logo, conseguimos utilizá-la para salvar os pacotes em formato pcap e usar o Wireshark para análisar esses pacotes à qualquer momento!

Incrível, não é mesmo? Mas, e se já tivermos capturado pacotes com o Wireshark e quiser analisá-los no Scapy?

Você também não estará na mão, pois o método rdpcap() é utilizado exatamente para lermos um arquivo pcap e importamos ele para o Scapy.

Agora que já aprendemos quatro métodos de visualização de pacotes com o Scapy, está na hora de criar um pacote e enviá-lo via rede! Vamos fazer isso na Parte 5!

<< Tutorial Scapy – Parte 3Tutorial Scapy – Parte 5 >>