ArpRequest - requisição arp para endereço físico
Publicado por Jeffersson Abreu (última atualização em 09/08/2016)
[ Hits: 3.799 ]
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]))
Script para Scanner servidor e encontrar portas abertas
Importar múltiplos hosts ZABBIX
Ligando máquina pela rede usando Python
Nenhum comentário foi encontrado.
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
LazyDocker – Interface de Usuário em Tempo Real para o Docker
Apagar Todo o Histórico do Terminal
Linux Mint: Zram + Swapfile em Btrfs
Após todos esses anos... youtube! (5)
Internet não funciona corretamente no Linux (3)
Pendrive do Ubuntu 24.04 travando ao tentar fazer a instalação dual bo... (4)









