Usando Python e Scapy para farejar o ARP no Pi

11

Estou tentando usar um Raspberry Pi para encontrar solicitações ARP de um dispositivo sem fio específico na minha rede. É um daqueles botões de traço da Amazon. Alguém usou esse código para ouvir quando o painel se conecta ao Wi-Fi.

from scapy.all import *
def arp_display(pkt):
  if pkt[ARP].op == 1: #who-has (request)
    if pkt[ARP].psrc == '0.0.0.0': # ARP Probe
      if pkt[ARP].hwsrc == '74:75:48:5f:99:30': # button 1
        print "Pushed Huggies"
      elif pkt[ARP].hwsrc == '10:ae:60:00:4d:f3': # button 2
        print "Pushed Elements"
      else:
        print "ARP Probe from unknown device: " + pkt[ARP].hwsrc

print sniff(prn=arp_display, filter="arp", store=0, count=10)

Quando executo isso no Raspbian (com o python e o scapy instalados), recebo um erro

"IndexError: Layer [ARP] not found"

Eu não estou familiarizado com o scapy e estou mergulhando pela primeira vez. Obrigado por qualquer ideia.

    
por user851 14.08.2015 / 17:28

4 respostas

6

Eu também estou fazendo a mesma coisa. O que eu encontrei foi que tcpdump não foi instalado.

Um simples sudo apt-get install tcpdump corrigiu esse erro para mim.

    
por 16.08.2015 / 17:37
5

Eu tive o mesmo erro, mas descobri que isso não acontece de forma confiável, às vezes falha imediatamente com:

IndexError: Layer [ARP] not found

e às vezes corre para sempre.

Dica: defina count=0 na linha sniff de impressão para que ela seja executada para sempre. A contagem parece ser de tempo limite.

Eu inicialmente instalei o scapy no site, mas acabei fazendo:

apt-get update
apt-get upgrade
apt-get install tcpdump tcpreplay wireshark python-scapy

e parece correr bem quando é executado. Não tenho certeza se eu precisava de todos os itens acima, mas o python-scapy recomendou-os (e um monte de rotinas de gráficos) quando o instalei.

Addenda: Cada vez que eu mexer com o código, a probabilidade de que ele seja executado sem alterar as batidas, então há algo realmente estranho acontecendo.

    
por 18.08.2015 / 19:16
1

Tivemos o mesmo problema aqui, e nos esquecemos de verificar uma condição.

Basta adicionar esta linha antes de todos os blocos if:

if pkt.haslayer(ARP):
    
por 14.04.2017 / 16:27
0

no meu Raspy B 2012, ele consome > 50% do CPU.

O que eu tentei foi

sniff (filter="tcp e porta 123", prn = print_summary, store = 0)

Eu redirecionei as solicitações do botão do Dash para o IP da máquina onde o Scapy é executado através do meu Firewall. A ideia era salvar recursos e não monitorar todo o tráfego para endereços MAC, mas apenas para assistir solicitações de conexão na porta.

Isso consome ~ 30% da CPU. Ele funciona em uma máquina Ubuntu, mas em um Raspi B leva cerca de 5 minutos para começar a funcionar e depois mostra conexões de toda a minha rede - o que não funciona na máquina Ubuntu. Eu suponho que ele está quebrado na imagem do Raspy Musicbox.

    
por 25.06.2017 / 10:56