ArpRequest - requisição arp para endereço físico
Publicado por Jeffersson Abreu (última atualização em 09/08/2016)
[ Hits: 3.746 ]
Homepage: https://somewhere.com
Este script faz uma simples requisição arp, e recebe uma resposta do endereço físico (mac address) da máquina em um range de rede.
Ainda está em melhorias mas já está funcional. O ponto forte é que não é necessário instalar nada
! Espero que vocês possam melhorá-lo ou adaptá-lo para o próprio propósito.
output:
192.168.0.1 is at 3c:1e:06:78:5f:d8
192.168.0.4 is at a7:9f:ba:14:54:0c
192.168.0.7 is at c8:3a:45:26:7e:6b
Exiting...
#!/usr/bin/env python3
########################
# #
# Escrito por: ctw6av #
# Versão 0.2 #
# #
########################
from binascii import hexlify, unhexlify
from netaddr import IPNetwork
from codecs import decode
from uuid import getnode
from ctypes import *
from struct import *
import socket
import sys
class ArpReplay(Structure):
_fields_ = [('eth_dst', c_char * 6),
('eth_src', c_char * 6),
('eth_pro', c_ushort),
('arp_hrd', c_ushort),
('arp_pro', c_ushort),
('arp_hln', c_byte),
('arp_pln', c_byte),
('arp_opr', c_ushort),
('arp_sha', c_char * 6),
('arp_sip', c_char * 4),
('arp_dha', c_char * 6),
('arp_dip', c_char * 4)]
def __new__(cls, socket_buffer):
return cls.from_buffer_copy(socket_buffer)
def __init__(self, socket_buffer=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.addr = decode(hexlify(self.arp_sha))
self.mac = ":".join([self.addr[i:i+2] for i in range(0, 12, 2)])
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 0))
return s.getsockname()[0]
def request(target):
eth_dst = unhexlify('ff' * 6)
eth_src = unhexlify(hex(getnode()).strip('0x'))
eth_pro = 0x0806
ether_frame = pack('!6s6sH', eth_dst, eth_src, eth_pro)
arp_hrd = 0x01
arp_pro = 0x0800
arp_hln = 0x06
arp_pln = 0x04
arp_opr = 0x01
arp_sha = unhexlify(hex(getnode()).strip('0x'))
arp_sip = socket.inet_aton(get_ip())
arp_dha = unhexlify('00' * 6)
arp_dip = socket.inet_aton(target)
arp_frame = pack('!HHBBH6s4s6s4s', arp_hrd, arp_pro, arp_hln, arp_pln, arp_opr,
arp_sha, arp_sip, arp_dha, arp_dip)
# Pacote arp com 42 bytes
packet = ether_frame + arp_frame
sock = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0806))
sock.bind((iface, 0))
sock.settimeout(0.5)
for x in range(2):
try:
try:
sock.send(packet)
buffer = sock.recvfrom(42)[0]
if socket.inet_ntoa(buffer[28:32]) == target:
arp_replay = ArpReplay(buffer)
print('{} is at {}'.format(target, arp_replay.mac))
break
except socket.timeout:
continue
except KeyboardInterrupt:
print('\rExiting...')
exit()
if __name__ == '__main__':
if len(sys.argv[:]) == 3:
iface = sys.argv[1]
subnet = sys.argv[2]
for ip in IPNetwork(str(subnet)).iter_hosts():
request(str(ip))
else:
print('usage: {} [interface] [subnet]'.format(sys.argv[0]))
Aplicação gráfica para Wake-on-LAN com Python 3 + GUI Tk/Tcl
Ligando máquina pela rede usando Python
Nenhum comentário foi encontrado.
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Instalando partes faltantes do Plasma 6
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Estou tentando ser legalista, mas tá complicado! (9)
espelhar monitores nao funciona (2)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (1)









