ArpRequest - requisição arp para endereço físico

Publicado por Jeffersson Abreu (última atualização em 09/08/2016)

[ Hits: 3.454 ]

Homepage: https://www.linkedin.com/in/jeffersson-abreu/

Download Arp_Request.py




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...

  



Esconder código-fonte

#!/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]))

Scripts recomendados

Scanner Wifi in Python [very simple and helpful]

Validação de IP

Chatroom Cliente em Python

Pequeno scanner de rede local

Trocar IP em Python3


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts