Scapy: obtém / define a frequência ou o canal de um pacote

8

Eu tenho tentado capturar pacotes WIFI com Linux e ver a frequência / canal em que o pacote foi capturado. Eu tentei o Wireshark e não houve sorte nem ajuda . Embora esteja usando pacotes de amostra do Wireshark, posso ver a frequência / canal.

Então agora estou experimentando Scapy. Eu queria descobrir a frequência / canal de um pacote farejado, mas ainda sem sorte. Existe uma maneira de fazer isso com Scapy.

PS Se houver uma ferramenta melhor que Scapy ou Python, agradeço comentários

Baby desta
fonte
Uma resposta válida seria aquela que fornece uma resposta detalhada sobre como enviar um pacote em uma determinada frequência / canal
Baby desta
2
Dependendo do que você quer fazer no final, eu recomendaria bettercap.org
Fabian N.
@FabianN., Obrigado. olhando para isso agora.
Baby desta

Respostas:

5

Eu descobri que os cabeçalhos RadioTab não fazem parte de nenhum protocolo Dot11, mas são apenas adicionados pela interface de rede. E o motivo pelo qual obtive os cabeçalhos do RadioTab em pacotes de amostra do Wireshark.org e não da minha captura ao vivo do wireshark é porque alguns adaptadores de rede não adicionam RadioTap enquanto outros o fazem e o adaptador de rede do meu laptop não adiciona cabeçalhos RadioTab. Eu verifiquei isso com um novo adaptador WiFi externo e ele adicionou os cabeçalhos do RadioTap.

Se o adaptador não injetar informações adicionais à medida que captura quadros, nenhum cabeçalho de radiotap será adicionado.

Então, para a minha pergunta principal, como obter / definir a frequência de um pacote. Eu esperava que o Scapy tivesse essa opção, mas não, e não deveria. O motivo é que a frequência depende do que está definido no adaptador de rede. Então, o que eu fiz foi definir a frequência / canal do meu adaptador WiFi para outro. Meu adaptador WiFi externo pode funcionar em vários canais, então mudei cada um e confirmei com o cabeçalho RadioTap. Existem comandos / ferramentas simples do linux que me ajudaram a verificar os canais suportados da minha interface WiFi e mudar para um canal específico.

Para capturar / enviar pacotes em uma determinada frequência ou canal, você precisa alterar o canal de trabalho da sua interface e definir a interface sniffer / remetente em scapy para essa interface.

EDIT - Outros problemas que enfrentei e soluções:

Se você estiver no linux e quiser alterar o canal de trabalho da sua interface, precisará desativar o gerenciador de rede para essa interface e fazer isso Primeiro Adicione o seguinte trecho a /etc/network/interfaces

auto $iface
iface $iface inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

substitua $ifacepelo seu nome de interface. Isso permitirá que você controle a interface sozinho. E adicione as seguintes linhas a/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant

network={
    ssid="Your_AP_SSID"
    psk="Your_Passphrase"
    freq_list=2412 2437 2462
}

Observe que 2412 2437 2462são as frequências (canal 1, 6, 11 neste caso) para a sua interface escolher. Você pode editá-los na frequência desejada. Fonte . Mas primeiro você precisa verificar se sua interface suporta essas frequências. Para verificar isso

iwlist channel

Finalmente, depois que tudo estiver pronto.

sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="wlp3s0")

Isso enviará pacotes na frequência wlp3s0definida.

Baby desta
fonte
Importa-se de adicionar algum código a esta resposta?
Ross Jacobs
@ RossJacobs, você acabou de usar o método de envio comum no scapy, nada de novo. exceto que você altera sua interface. Um exemplo seria que sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")você pode definir sua interface para uma determinada frequência que desejar, se ela suportar.
Baby desta
1

Esta resposta tem como escopo o título e o conteúdo da pergunta: Fornecendo getters e setters para a frequência e o canal de um pacote.

Para esta solução, use o arquivo wpa-Induction.pcap em Amostras de captura do Wireshark .

Bisbilhotando

É útil vasculhar um pacote para ver a quais campos o Scapy tem acesso no interpretador do Scapy.

>>> pkts = rdpcap('wpa-Induction.pcap')
>>> pkts[0].summary()
"RadioTap / Dot11FCS / Dot11Beacon / Dot11Elt / Dot11EltRates / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11EltRSN / Dot11Elt / Dot11EltVendorSpecific / Dot11EltMicrosoftWPA / SSID=''"
>>> pkts[0].show()
###[ RadioTap dummy ]###
  version= 0
  pad= 0
  len= 24
  present= Flags+Rate+Channel+Lock_Quality+Antenna+dB_AntSignal+RXFlags
  Flags= FCS
  Rate= 2
  Channel= 2412
  ChannelFlags= CCK+2GHz
  Antenna= 84
  notdecoded= '\x00\x00+\x00\x00\x9fa\xc9\\'

... <output truncated> ...

Enquanto 2412 é uma frequência e NÃO um canal , esses são os dados que queremos. RadioTap é a camada por pkts[0].summary(). Juntar as peças,

>>> frequency = pkts[0][RadioTap].Channel
>>> print(frequency)
2412

Scapy não fornece acesso ao canal, mas é trivial converter a frequência em canal.

Juntar as peças

Obtendo a frequência

Dado um número de arquivo e pacote, agora podemos obter o canal e a frequência de um pacote.

from scapy.all import RadioTap, rdpcap

def getChannel(frequency):
    base = 2407              # 2.4Ghz
    if frequency//1000 == 5: 
        base = 5000          # 5Ghz
    # 2.4 and 5Ghz channels increment by 5
    return (frequency-base)//5

def getFrequency(file, packet_number):
  pkts = rdpcap(file)
  # Scapy mixes up Channel/Frequency here
  frequency = pkts[packet_number][RadioTap].Channel
  return frequency

freq = getFrequency('wpa-Induction.pcap', 0)
chan = getChannel(freq)
print("Channel: {0} \nFrequency: {1}".format(freq, chan))

Definir a frequência

Digamos que desejássemos alterar a frequência para 5300 e salvá-la. Isso exigiria apenas iteração na lista de pacotes, alteração da frequência de cada pacote e salvamento do resultado. No intérprete scapy:

>>> for i in range(len(pkts)):
...     pkts[i][RadioTap].Channel = 5300
>>> wrpcap('temp.pcap', pkts)
>>> pkts2 = rdpcap('temp.pcap')
>>> pkts[0].Channel
5300
Ross Jacobs
fonte
@Babydesta Eu li a pergunta e defini o escopo desta resposta. Você pode pedir a um colega para obter uma segunda opinião sobre a leitura da sua pergunta / título. Você pode responder à pergunta seguindo o formato de como fazer a pergunta , com ênfase no segundo cabeçalho. Se você acha que isso responde à pergunta que você fez , marque-o como tal.
Ross Jacobs