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

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

[ Hits: 3.455 ]

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

IPs Classfull

Scanner Wifi in Python [very simple and helpful]

Script para Scanner servidor e encontrar portas abertas

Importar múltiplos hosts ZABBIX

Shell reverso completo - servidor


  

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