Ir para conteúdo

Análise de pacotes na prática [ Parte 6 ] - "ARP- IPv4" - Raw Sockets python


Visitante gnoo

Posts Recomendados

Saudações,

Este conteúdo está sujeito a erros de interpretação por parte da minha pessoa, se vires algum erro ou achas que tens algo a acrescentar deixa nos comentários para ser corrigido/adicionado...

Os conceitos de redes aqui apresentados foram retirados do livro:

 

 

2019-06-09_11-19.thumb.png.f40e1d61df25c19bb23d0915a5034fd3.png2019-06-09_11-21.thumb.png.8c12dadb479716c4d6585715bcdefc08.png

2019-06-09_11-23.thumb.png.4ec5cf720e0f8d24ed8890a63edf25a4.png

 

2019-06-09_11-24.thumb.png.46cff0ee977d7b5d6d4b22abb4800ffa.png

 

SCRIPT EM PYTHON

#!/usr/bin/env python3

from socket import *
import struct
import binascii

# Faz desempacotamento dados do frame ethernet que nos chegam em formato de bytes 
def ethernet_frame(raw_dados):
    mac_destino, mac_fonte, tipo_ethernet = struct.unpack('! 6s 6s H', raw_dados[:14])

    return byte_to_hex_mac(mac_destino), byte_to_hex_mac(mac_fonte), htons(tipo_ethernet), raw_dados[14:]

# Passa o endereço da função MAC na função ethernet_frame para hexadecimal
# Acabando por ser representado numa arquitetura de 6 octetos
def byte_to_hex_mac(mac_em_bytes):
    endereco = binascii.hexlify(mac_em_bytes).decode("ascii")
    return ":".join([endereco[i:i+2] for i in range(0,12,2)])

# Extrai dados do header, pacote ARP (Request/ Reply)
def header_pacote_arp(payload):
    (tipo_hardware, tipo_protocolo, tamanho_endereco_hardware,
     tamanho_endereco_protocolo, operacao, mac_sender, ip_sender,
     mac_dest, ip_dest) = struct.unpack("!HHBBH6s4s6s4s", payload)


    # Dicionário tipo_de_operacao
    """
     Este dicionario indica que tipo de operação é realizada
      é usado no diconaŕio a seguir(dados_header_arp), onde é passado o valor da variável
      operacao que é passado como key
     """

    tipo_de_operacao = {1:"(1) Request", 2:'(2) Reply'}

    dados_header_arp = {'Tipo Hardware':tipo_hardware, 'Tipo Protocolo':htons(tipo_protocolo),
                        'Tamanho Endereço Hardware':tamanho_endereco_hardware,
                        'Tamanho Endereço Protocolo':tamanho_endereco_protocolo,
                        'Operação': tipo_de_operacao[operacao], 'MAC de quem envia': byte_to_hex_mac(mac_sender),
                        'Ip de quem envia':inet_ntoa(ip_sender), 'MAC de quem recebe': byte_to_hex_mac(mac_dest),
                        'IP de quem recebe':inet_ntoa(ip_dest)}


    return dados_header_arp
           

sock = socket(AF_PACKET, SOCK_RAW, ntohs(0x0003))


while True:
    raw_dados, addr = sock.recvfrom(65536)
    mac_destino, mac_fonte, tipo_ethernet, payload  = ethernet_frame(raw_dados)
    
    if tipo_ethernet == 1544:
        print("##### HEADER ARP #####")
        print("\n".join("{}: {}\n".format(key, valor_key) for key, valor_key in header_pacote_arp(payload[:28]).items()))

 

O conteúdo aqui deixado é imprescindível, que seja complementado por informação contida no livro recomendado no início do post.

Abraço.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...