Scapy: obtiene / establece la frecuencia o el canal de un paquete

8

He estado tratando de capturar paquetes WIFI con Linux y ver la frecuencia / canal en el que se capturó el paquete. Probé Wireshark y no hubo suerte ni ayuda . Aunque utilizo paquetes de muestra de Wireshark, puedo ver la frecuencia / canal.

Así que ahora estoy experimentando con Scapy. Quería averiguar la frecuencia / canal de un paquete inhalado, pero aún así no tuve suerte. ¿Hay alguna manera de hacer esto con Scapy?

PD: si hay una herramienta mejor que Scapy o Python, agradezco los comentarios

Baby desta
fuente
Una respuesta válida sería aquella que proporciona una respuesta detallada sobre cómo enviar un paquete a una determinada frecuencia / canal
Baby desta
2
Dependiendo de lo que quieras hacer al final, recomendaría bettercap.org
Fabian N.
@FabianN., Gracias. investigándolo ahora mismo.
Baby desta

Respuestas:

5

I descubrí que los encabezados RadioTab no son parte de cualquier protocolo Dot11 sino que simplemente se añaden por la interfaz de red. Y la razón por la que obtuve los encabezados RadioTab en paquetes de muestra de Wireshark.org y no de mi captura de cables vivos es porque algunos adaptadores de red no agregan RadioTap mientras que otros lo hacen y el adaptador de red de mi computadora portátil no agrega encabezados RadioTab. Verifiqué esto con un nuevo adaptador WiFi externo y agregó los encabezados RadioTap.

Si el adaptador no inyecta la información adicional mientras captura cuadros, entonces no se agregarán encabezados de radiotap.

Entonces, a mi pregunta principal, cómo obtener / establecer la frecuencia de un paquete. Esperaba que Scapy tuviera esta opción, pero no la tiene, y no debería. La razón es que la frecuencia depende de lo que esté configurado en el adaptador de red. Entonces, lo que hice fue configurar la frecuencia / canal de mi adaptador WiFi a uno diferente. Mi adaptador WiFi externo puede funcionar en varios canales, así que cambié cada uno y lo confirme con el encabezado RadioTap. Hay comandos / herramientas linux simples que me ayudaron a verificar los canales compatibles de mi interfaz WiFi y cambiar a un canal en particular.

Para capturar / enviar paquetes a una determinada frecuencia o canal, debe cambiar el canal de trabajo de su interfaz y configurar la interfaz de sniffer / remitente de manera escasa para esa interfaz.

EDITAR - Otros problemas que enfrenté y soluciones:

Si está en Linux y desea cambiar el canal de trabajo de su interfaz, debe deshabilitar el administrador de red para esa interfaz y para hacer esto Primero agregue el siguiente fragmento a /etc/network/interfaces

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

reemplace $ifacecon el nombre de su interfaz. Esto le permitirá controlar la interfaz usted mismo. Y luego agregue las siguientes líneas 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
}

Tenga en cuenta que 2412 2437 2462son las frecuencias (canal 1, 6, 11 en este caso) para que su interfaz elija. Puede editarlos a la frecuencia deseada. Fuente . Pero primero debe verificar que su interfaz sea compatible con estas frecuencias. Para comprobar eso

iwlist channel

Finalmente después de que todo esté hecho.

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

Esto le enviará paquetes a la frecuencia wlp3s0establecida.

Baby desta
fuente
¿Le importaría agregar algún código a esta respuesta?
Ross Jacobs
@RossJacobs, solo usa el método de envío común en scapy, nada nuevo. excepto que cambias tu interfaz. Un ejemplo sería sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")que puede configurar su interfaz a una determinada frecuencia que desee si es compatible.
Baby desta
1

Esta respuesta se centra en el título y el contenido de la pregunta: proporcionar captadores y establecedores para la frecuencia y el canal de un paquete.

Para esta solución, use el archivo wpa-Induction.pcap en las Capturas de muestra de Wireshark .

Hurgando

Es útil buscar alrededor de un paquete para ver a qué campos tiene acceso Scapy en el intérprete 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> ...

Si bien 2412 es una frecuencia y NO un canal , estos son los datos que queremos. RadioTap es la capa por pkts[0].summary(). Poniendo todo junto,

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

Scapy no proporciona acceso al canal, pero es trivial convertir la frecuencia a canal.

Poniendo todo junto

Obteniendo la frecuencia

Dado un número de archivo y paquete, ahora podemos obtener el canal y la frecuencia de un paquete.

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

Establecer la frecuencia

Digamos que queríamos cambiar la frecuencia a 5300 y guardarla. Esto solo requeriría iterar sobre la lista de paquetes, cambiar la frecuencia de cada paquete y guardar el resultado. En el intérprete aterrador:

>>> 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
fuente
@Babydesta Leí la pregunta y le di alcance a esta respuesta. Es posible que desee pedirle a un colega que obtenga una segunda opinión sobre cómo se lee su pregunta / título. Es posible que desee volver a formular la pregunta siguiendo el formato de cómo preguntar , con énfasis en el segundo encabezado. Si cree que esto responde a la pregunta que hizo , márquelo como tal.
Ross Jacobs