Jump to content

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


Guest gnoo

Recommended Posts

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 to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...