Guest gnoo Posted August 8, 2018 at 04:44 PM Share Posted August 8, 2018 at 04:44 PM Saudações, tenho andado aqui a tentar fazer um código que que faz requisições ARP e espera por um reply do host para onde foi enviado o pacote mas, nunca vem esse reply... #!/usr/bin/env python3 import struct import socket raw = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0806)) raw.bind(("wlp3s0", socket.htons(0x0806))) mac_local = "ff:ff:ff:ff:ff:ff" # mac de quem envia request ip_local = "192.168.1.7" # ip de quem envia request mac_dest = "ff:ff:ff:ff:ff:ff" # mac de quem recebe request ip_dest = "192.168.1.6" # ip de quem recebe request # Ethernet Header protocolo = 0x0806 # 0x0806 protocolo para ARP ethernet_header = struct.pack("!6s6sH", mac_dest.encode(), mac_local.encode(), protocolo) # ARP header tipo_hardware = 1 tipo_protocolo = 0x0800 # IPV4 tamanho_endereco_hardware = 6 # Refere ao tamanho do endereço do MAC que é 48 bits == 6 bytes tamanho_endereço_protocolo = 4 # Refere ao tamanho do endereço do ipv4 que é 32 bits == 4 bytes operacao = 1 # 1 = request / 2 = Reply envia_ip = socket.inet_aton(ip_local) destino_ip = socket.inet_aton(ip_dest) arp_addr = struct.pack("!HHBBH6s4s6s4s",tipo_hardware, tipo_protocolo, tamanho_endereco_hardware, tamanho_endereço_protocolo, operacao, mac_local.encode(), envia_ip, mac_dest.encode(), destino_ip) pacote = ethernet_header + arp_addr cont = 0 while cont < 6: raw.send(pacote) cont +=1 Resultado do wireshark Link to comment Share on other sites More sharing options...
Guest gnoo Posted August 10, 2018 at 02:48 PM Share Posted August 10, 2018 at 02:48 PM Qualquer coisa que não está bem com o meu MAC e o MAC do destinatário, provavelmente não está a ser devidamente empacotado e eu não percebo porquê, apesar de eu estar a passar o meu mac correto o wireshark, o MAC do destinatário que vai no pacote deveria ser ff:ff:ff:ff:ff:ff:ff e não 30:30:3a:30:30:3a. Link to comment Share on other sites More sharing options...
Guest gnoo Posted August 11, 2018 at 05:58 PM Share Posted August 11, 2018 at 05:58 PM Saudações, após vários momentos de sangue, suor e lágrimas , e um pouquinho de Stack Overflow finalmente resolvi o meu problema... No código acima o que não estava a funcionar era o formato em que o meu mac_local e o mac_dest não estavam a ser bem empacotados, dai o resultado apresentado pelo pelo wireshark ser completamente diferente do meu MAC real. Isso acontecia porque estava a empacotar um endereço mac com 6 bytes quando na realidade o tamanho da string era 17 bytes (salvo erro), então só apanhava esses 6 bytes logo o mac não era empacotado na totalidade, e como o mac não estava correto ele não fazia o broadcast para a rede, sem broadcast não há resposta. Para resolver isso tive que passar os endereço mac para byte order. Como fazer isso? O código pouco ou até mesmo nada mudou mas deixo o resultado final... Para ver o comportamento dos pacotes enviados deve ser feito através do wireshark ou outra ferramenta que cumpra a mesma função, com filtro "arp". #!/usr/bin/env python3 import struct import socket raw = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0806)) raw.bind(("wlp3s0", socket.htons(0x0806))) mac_local = b'\xff\xff\xff\xff\xff\xff' # mac de quem envia request ip_local = "192.168.1.7" # ip de quem envia request mac_dest = b'\xff\xff\xff\xff\xff\xff' # Endereço broadcast para que seja enviado um reply ip_dest = "192.168.1.2" # ip de quem recebe request # Ethernet Header protocolo = 0x0806 # 0x0806 protocol to ARP ethernet_header = struct.pack("!6s6sH", mac_dest, mac_local, protocolo) # ARP header tipo_hardware = 1 tipo_protocolo = 0x0800 # IPV4 tamanho_endereco_hardware = 6 # Refere ao tamanho do endereço do MAC que é 48 bits == 6 bytes tamanho_endereco_protocolo = 4 # Refere ao tamanho do endereço do ipv4 que é 32 bits == 4 bytes operacao = 1 # 1 = request / 2 = Reply envia_ip = socket.inet_aton(ip_local) destino_ip = socket.inet_aton(ip_dest) arp_addr = struct.pack("!HHBBH6s4s6s4s",tipo_hardware, tipo_protocolo, tamanho_endereco_hardware, tamanho_endereco_protocolo, operacao, mac_local, envia_ip, mac_dest, destino_ip) pacote = ethernet_header + arp_addr # Ciclo de repetição while é opcional cont = 0 while cont < 6: raw.send(pacote) cont +=1 Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.