Tutorial Scapy Parte 5 Logo

Aprendemos a capturar e visualizar pacotes de rede na parte 4, agora vamos aprender à criar estes pacotes e enviá-los na rede. Bem vindos ao tutorial scapy – parte 5!

Criando Pacotes com Scapy

Como falamos anteriormente, pacotes de rede são construídos em camadas, e cada camada superior é encapsulada pela camada anterior. O jeito mais fácil de entendermos como montar um pacote no Scapy é utilizando o método command() em um pacote que já capturamos.

Método command()

Através deste método, conseguiremos entender melhor como é possível criar um pacote utilizando o Scapy, pois ele irá replicar os comandos necessários para que possamos realizar esta função.

Vamos novamente utilizar a função sniff() e capturar um pacote TCP desta vez, depois vamos descobrir como recriar este pacote no Scapy.

Capturamos um Three Way Handshake do protocolo TCP, vamos agora descobrir como recriar o primeiro pacote deste procedimento, o TCP SYN.

Não se assustem com a quantidade de parâmetros que obtivemos através do método command(), esses parâmetros estão todos preenchidos pois capturamos um pacote da rede, a criação é muito mais simples, pois o Scapy nos ajuda inferindo valores automaticamente, como veremos mais à frente.

Reparem que cada camada é chamada como se fosse uma função e como toda função, ela pode receber parâmetros.

A camada 2 representada pelo protocolo Ethernet, por exemplo, é iniciada com os parâmetros abaixo:

  • dst – MAC Address de destino
  • src – MAC Address de origem
  • type – 2048 (0x0800 em Hexadecimal)

Portanto, um pacote camada 2, cujo protocolo é Ethernet pode ser criado de maneira simples!

Para realizarmos o encapsulamento de camadas no Scapy, utilizamos o carácter “/”, tornando esta tarefa extremamente simples. Portanto, para um pacote IP, teremos o seguinte comando:

Montando o pacote em camadas

O objetivo é montarmos dois pacotes, pois queremos realizar um TCP Handshake com o blog.thepacketwizards.com, portanto vamos montar o pacote TCP SYN e o TCP ACK, uma vez que o pacote TCP SYNACK deverá ser enviado pelo nosso blog.

TCP HANDSHAKE

Camada 2 – Ethernet

Sempre precisamos montar o pacote da camada inferior até a superior, portanto inicializaremos nosso pacote TCP SYN com a camada Ether().

Lembram-se do método show2() que introduzimos na parte 4? Vamos utilizá-lo aqui para aprendermos quais são os valores padrões que o Scapy usa para o protocolo Ethernet.

Temos um warning, pois o Scapy na hora de popular os valores não conseguiu encontrar um MAC Address de destino, porém ele já populou o MAC Address de origem e também o type! Agora que já criamos a camada 2, podemos incluir mais uma camada no nosso pacote, o protocolo de camada 3, IP.

Camada 3 – Internet Protocol

Você deve ter percebido que utilizamos um domínio como parâmetro para a variável “dst” na função IP(), pois é, o Scapy nos da mais essa ferramenta, podemos utilizar um nome como parâmetro uma vez que o Scapy ao montar o pacote irá utilizar o DNS para traduzir este nome à um IP.

Utilizando novamente o método show2() podemos perceber que algumas coisas mudaram, por exemplo, a camada Ethernet foi preenchida com o MAC Address de destino e o parâmetro type também foi modificado de 0x0900 para 0x0800.

Quando o campo type do protocolo Ethernet é 0x0800, isso indica que o protocolo de camada superior será o IP, portanto conseguimos demonstrar que o Scapy consegue inferir as informações de cada camada dada as informações da camada superior. Isto facilita muito nosso trabalho na hora de criar nossos pacotes.

Vamos à nossa última camada para este pacote!

Camada 4 – Transport Control Protocol

Como acontece nas outras camadas, a camada 4 também possui valores padrões. Queremos modificar alguns desses valores, tais como a sequência, porta de origem e porta de destino.

Uma vez que o pacote já foi criado, podemos acessar as camadas tratando o objeto do pacote como um dicionário python. Vamos modificar a porta de origem para o valor 30001.

Sabemos que o nosso Blog possui serviço HTTPS, portanto vamos modificar também a porta de destino para 443, já aproveitando essa modificação, vamos colocar um valor aleatório para a sequência.

Vamos olhar como ficou nosso pacote agora.

Enfim, temos um pacote TCP SYN criado e já podemos iniciar nosso envio deste pacote para que possamos fazer o TCP Handshake com o servidor do blog.

Enviando e Recebendo Pacotes de rede com o Scapy

O Scapy possui algumas funções para enviarmos pacotes na rede.

Podemos não só enviar, como também receber pacotes, e com o Scapy esta tarefa se torna simples.

Enviando Pacotes

É possível enviarmos pacotes tal como um Switch , utilizando apenas a camada 2 (Endereço MAC), ou tal como um Roteador, utilizando a camada 3 (Endereço IP).

Como criamos o pacote TCP SYN cuja camada inferior é a camada 2, iremos utilizar a função sendp() para enviá-lo. Esta função realiza o envio do pacote via camada 2.

Simples assim! Porém, para fazermos um TCP Handshake, que afinal é o objetivo deste tutorial, precisamos também receber um pacote de resposta.

Recebendo Pacotes

Apenas enviar o pacote já é por si só, muito interessante, pois como vimos, com o Scapy esta tarefa é muito fácil de ser executada.

Para receber o pacote, não é diferente. Basta utilizarmos a função srp(), esta função irá enviar e receber via camada 2.

Uma vez que estamos enviando um pacote TCP SYN, esperamos receber um pacote TCP ACK. O Scapy já sabe isso, portanto não precisamos fazer nada além de enviar nosso pacote com a função especificada.

Passamos duas variáveis para desempacotar a saída da função srp(), isso se deve ao fato desta função nos retornar duas listas, uma lista de pacote que correspondem à resposta ao nosso envio e uma lista de pacotes capturados enquanto o Scapy esperava esta resposta.

Vamos olhar o pacote que enviamos e o pacote que recebemos como resposta.

Funcionou! Enviamos um pacote TCP SYN, ou seja, um pacote cuja camada superior é a camada TCP e cuja FLAG TCP é igual à S (SYN). Em retorno à este estimulo, recebemos um pacote TCP SYNACK, cujas FLAGs são S e A (SYN e ACK).

É importante repararmos nos valores de SEQ e ACK dos pacotes. O pacote TCP SYNACK possui o parâmetro ack igual ao parâmetro seq do TCP SYN com a adição de 1.

Para finalizarmos o TCP Handshake, ainda falta um passo. Precisamos enviar um pacote ACK em respota ao pacote SYNACK.

O pacote ACK possui três características, o parâmetro flags, precisa ser igual à ‘A’ (ACK), o parâmetro seq precisa ser igual ao parâmetro ack recebido no pacote TCP SYNACK e o parâmetro ack precisa ser igual ao parâmetro seq do pacote TCP SYNACK adicionado de 1.

Não podemos esquecer de alterar a porta de origem e destino! Pois elas precisam ser as mesmas que utilizamos no pacote TCP SYN.

Agora que já aprendemos como montar cada pacote do TCP Handshake, que tal utilizarmos uma função que será mais adequada ao nosso objetivo para enviar e receber este pacote?

Função srp1()

A função srp1() envia um pacote e retorna apenas a resposta como saída, portanto ficará mais fácil montar o TCP Handshake desta maneira.

Pronto! Conseguimos realizar nosso TCP Handshake!

Bônus

Como bônus, irei deixar aqui um código utilizando o Scapy como uma biblioteca python, além de enviar o pacote utilizando apenas a camada IP.

Fiquem à vontade para se divertirem com o código abaixo, apenas lembrem-se de executá-lo como root.

Vejamos este script executado:

 

<< Tutorial Scapy – Parte 4