Mapeia endereços MAC na rede local.
Contexto
O protocolo ARP (Address Resolution Protocol) é o responsável por traduzir endereços IP em endereços físicos (MAC Address) dentro de uma rede local. Quando um dispositivo quer falar com outro na mesma rede, ele grita: "Quem tem o IP X? Diga ao MAC Y".
Um Pentester utiliza o ARP Scanner para:
- Identificar Dispositivos Ocultos: Mesmo que um computador bloqueie o Ping (ICMP), ele precisa responder a requisições ARP para funcionar na rede.
- Mapear Fabricantes: Os primeiros 3 bytes do MAC Address (OUI) revelam o fabricante do hardware (ex: Apple, Cisco, Dell), ajudando a identificar se o alvo é um servidor, um celular ou um roteador.
- Preparar Ataques de Man-in-the-Middle: Ter o mapa de endereços MAC é o primeiro passo para realizar um
Possibilidades de Implementação
- Scapy (Recomendado): Permite criar pacotes ARP do zero e enviá-los via broadcast (para todos na rede). É a forma mais precisa e rápida.
- Manipulação de Cache: Ler a tabela ARP do próprio sistema operacional (comando
arp -a). É passivo, mas limitado ao que o computador já "conheceu". - Broadcasting Personalizado: Enviar um pacote para o endereço MAC especial
ff:ff:ff:ff:ff:ff, forçando todos os dispositivos do segmento a processarem a requisição.
Código
Para este módulo, utilizaremos a biblioteca Scapy. Ela permite realizar o escaneamento de forma extremamente eficiente enviando uma única requisição de broadcast para toda a sub-rede.
Requisito: pip install scapy
from scapy.all import ARP, Ether, srp
import sys
def arp_scan(ip_range):
"""
Envia pacotes ARP Request para um range de IPs e mapeia os endereços MAC.
"""
print(f"[*] Escaneando a rede: {ip_range}")
# 1. Cria o pacote ARP Request (Quem tem o IP X?)
arp_request = ARP(pdst=ip_range)
# 2. Cria o frame Ethernet de Broadcast (Para todos na rede)
broadcast = Ether(dst="ff:ff:ff:ff:ff:ff")
# 3. Combina os pacotes: Ethernet + ARP
packet = broadcast / arp_request
# 4. Envia o pacote e recebe as respostas (srp = Send and Receive Packets na Camada 2)
# timeout: tempo de espera / verbose: oculta detalhes internos
answered_list = srp(packet, timeout=2, verbose=False)[0]
clients = []
for element in answered_list:
client_dict = {"ip": element[1].psrc, "mac": element[1].hwsrc}
clients.append(client_dict)
return clients
def display_results(results):
print("-" * 45)
print(f"{'IP ADDRESS':15} | {'MAC ADDRESS':20}")
print("-" * 45)
for client in results:
print(f"{client['ip']:15} | {client['mac']:20}")
print("-" * 45)
if __name__ == "__main__":
print("=" * 45)
print("Módulo: ARP Scanner | Projeto: 30 Lessons")
print("=" * 45)
# Altere para a sua sub-rede local (ex: 192.168.1.0/24)
target_network = "192.168.1.0/24"
try:
scan_results = arp_scan(target_network)
display_results(scan_results)
except PermissionError:
print("[!] Erro: Você precisa de privilégios de Administrador/Root.")
except Exception as e:
print(f"[!] Erro inesperado: {e}")
Observações
- Velocidade: O ARP scan é muito mais rápido que o Ping Sweep porque não depende de timeouts de Camada 3 (IP).
- Segmentação: Esta ferramenta só funciona dentro da mesma rede local. Pacotes ARP não passam por roteadores (são limitados ao domínio de broadcast).
- Segurança: Devido à natureza do Scapy de enviar pacotes crus (raw packets), o terminal deve ser executado como Sudo (Linux/macOS) ou Administrador (Windows).