Как создать scapy-объект ICMPv6 из необработанной тестовой строки из сокета (AF_INET6, SOCK_RAW, IPPROTO_ICMPv6)? - PullRequest
0 голосов
/ 25 августа 2018

Я хочу проверить / проанализировать рекламные объявления маршрутизатора ICMPv6 (RA) в программе Python, использующей Python, где я получаю (не очень) необработанные данные пакета следующим образом:

import socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_ICMPV6)
p, addr = sock.recvfrom(4096)

Когда пакет ICMPv6 будет получен, пакет p будет содержать только (!) Саму часть ICMPv6, но не любые другие внешние элементы, поэтому нет ни заголовка IPv6, ни заголовка Ethernet, ...

Как мне создать правильный класс пакетов, производный от Scapy ICMPv6, из моих (нет) необработанных пакетных данных? _ICMPv6 кажется просто запасным классом. Есть ли какая-то фабрика для получения правильного подкласса (например, ICMPv6ND_RA)?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

После прочтения исходного кода Scapy inet6.py я заметил, что есть более "прямой" - но не обязательно "более чистый" - способ получить правильный объект сообщения Scapy ICMPv6, чем в Cukic0d. ответ: это в том смысле, что есть альтернативный способ, которому не нужна «поддельная» внешняя оболочка объекта IPv6 (хотя я действительно ценю ответ Cukic0d, так как это было бы хорошим местом, чтобы сбросить адрес отправителя!):

from scapy.layers.inet6 import *

icmpv6_packet = icmp6typescls.get(p[0], ICMPv6Unknown)(p)

При этом используется словарь icmp6typescls, сопоставляющий тип ICMPv6 (сообщения), который находится в первом октете пакета, возвращенного из сокета), с соответствующим классом сообщений Scapy ICMPv6 ... и затем вызывает конструктор, передавая полезная нагрузка к нему.

Класс ICMPv6Unknown является классом по умолчанию, который Scapy использует, когда тип ICMPv6 (сообщения) не может быть сопоставлен с известным классом сообщений. Это гарантирует, что всегда есть разумный конструктор для вызова, даже если мы не понимаем пакет, полученный в его полных деталях.

0 голосов
/ 28 августа 2018

Обычно в scapy проще рассекать пакет из нижнего уровня (второго или третьего) из-за различий в способах рассечения.

Вы можете попробовать взломать

a = IPv6(nh=58)
cls = a.default_payload_class(p)
pkt = cls(p)
...