Как создать новый слой или новый протокол со Scapy?

Я хочу создать новый слой, используя scapy, я создал новый слой, но когда я отправил его на другой компьютер, он потерян, wireshark также не может его распознать. как я могу решить эту проблему?

class OMER(Packet):
    name = "OMER"
    fields_desc = [StrLenField("Omer", "", None)]

2 ответа

Когда вы создаете новый протокол или новый слой с scapy другие сетевые инструменты, такие как wireshark (и другие), поскольку они не осведомлены о специфике вашего протокола, не смогут автоматически его правильно проанализировать.

Если вы хотите поэкспериментировать с новым протоколом, вам придется создать свой собственный локальный декодер. Следующий пример, даже минимальный, демонстрирует все вышеперечисленное:


#!/usr/bin/env python 

from scapy.all import *

# create a simple protocol 
# (example similar with the one in the scapy docs...)
class Exmpl(Packet):
    name = "myprotocol"
    fields_desc=[ ShortField("fld1",5),
                  XByteField("fld2",3) ]

from scapy.utils import PcapWriter

# write data in a pcap file to examine later with
# 1 -> scapy
# 2 -> wireshark
print '\n[+] Writing net.pcap file...'
cap = PcapWriter("net.pcap", append=True, sync=True)
for i in range(10):
    packet = Exmpl(fld1=i)
    cap.write(packet)

# read the data and examine them with scapy
# scapy is aware of the "Exmpl" protocol (e.g. its fields etc...) 
# and how to decode it, while wireshark is not
print '[+] Examining net.pcap file...\n'
packets = rdpcap('net.pcap')
for p in packets: 
    Exmpl(str(p)).show()

Вывод вышеприведенного скрипта будет таким:

[+] Writing net.pcap file...
[+] Examining net.pcap file...

###[ myprotocol ]###
  fld1      = 0
  fld2      = 0x3
###[ myprotocol ]###
  fld1      = 1
  fld2      = 0x3
###[ myprotocol ]###
  fld1      = 2
  fld2      = 0x3
...skip...

Как видите, scapy знает о протоколе и, следовательно, может правильно анализировать данные. Теперь, если вы попытаетесь проверить файл "net.pcap" с wireshark вы увидите следующее:

wireshark не знает о вашем протоколе и, как следствие, не может его правильно проанализировать.

Обратите внимание: как вы понимаете, даже если вы отправляете эти пакеты на другое устройство (для того, чтобы на самом деле это сделать, вам придется реализовать и другие вещи), тогда это устройство также должно знать о вашем протоколе, иначе оно не сможет разобрать это правильно. Вот почему, когда вы пытались отправить пакеты с одного компьютера на другой, получатель не смог успешно их декодировать.

Вы сделали свой пользовательский слой. Однако вы должны помнить, что этот пользовательский уровень не будет распознаваться операционной системой до тех пор, пока вы не начнете создавать сети на уровне ядра, и это должно присутствовать в каждой операционной системе. Итак, на другом хосте вы пишете другой скрипт на python, который сообщает операционной системе, что нужно соответствующим образом удалить пакет, содержащий ваш пользовательский уровень. Напишите свой собственный пакет сниффера, а затем инициализируйте свой пользовательский класс слоя, чтобы во время сниффинга вы фактически использовали этот класс при удалении пакета, а затем могли просматривать пакет с вашим пользовательским слоем. Обратите внимание, что вам нужно связать слой, ваш новый слой со слоем в его пене. Кажется, что вы создали правильный пакет, однако, когда он достигает другого хоста, он просто не может декодировать, пока вы не свяжете слой. Только когда вы связываете его, ваша операционная система знает, как удалить пакет сразу после того, как ваш ip-уровень или udp-слой и т. Д. Были проанализированы.

Также для того, чтобы сжать ваш пользовательский уровень между двумя хорошо известными протоколами, скажем, например, udp с портом 53, работа по умолчанию привязывает dns к порту udp 53. Если вы когда-нибудь хотели внедрить свой новый уровень между udp и dns, скажем, вам нужно сначала отсоедините udp и dns, а затем скажите udp, что я хочу, чтобы вместо слоя dns следовал мой пользовательский слой. Просто используйте split_layers, чтобы отсоединить udp и dns, а затем связать свой пользовательский слой с udp, а также привязать dns к новому пользовательскому слою.

Думает об этом как об изучении иностранного языка. Допустим, ваша семья говорит только по-английски.

  • Вы изучаете китайский язык и теперь можете произносить предложения на китайском языке (это то, что вы сделали, создав слой в scapy и создав пакеты)
  • Ваша семья может слышать китайские предложения (wireshark может получать пакеты)
  • Но ваша семья не может понять предложения, так как они все еще будут говорить только по-английски (wireshark не может анализировать пакеты, так как не знает ваш протокол)
  • Если вы абсолютно хотите, чтобы ваша семья понимала вас, когда вы говорите по-китайски, вы должны научить их (внедрить диссектор в wireshark)

Надеюсь, это понятно:-)

Вы связали новый уровень / протокол с предыдущим уровнем / протоколом? Например, bind_layers(Ether, OMER), если уровень OMER идет сразу после уровня Ether.

Другие вопросы по тегам