Я пытаюсь создать инструмент, использующий Scapy для обнаружения хостов локального IPv6-узла, отправив фальшивую рекламу маршрутизатора на адрес многоадресной рассылки FF02 :: 1.Scapy - отправка маршрутизатора IPv6 Объявление с ошибкой со временем жизни> 0
*SNIP*
router_advertisement = scapy.IPv6(src=ra_src_addr, dst='FF02::1')/scapy.ICMPv6ND_RA(routerlifetime=0, reachabletime=0)/scapy.ICMPv6NDOptSrcLLAddr(lladdr=hw_addr)/scapy.ICMPv6NDOptPrefixInfo(prefixlen=64, validlifetime=0x6, preferredlifetime=0x6, prefix='dead::')
answer, unanswer = scapy.sr(router_advertisement, timeout=10, multi=True)
for reply in answer:
print(reply[1][scapy.Ether].src + ' : ' + reply[1]scapy.IPv6].src)
Все, что выше надреза в основном настройка параметров маршрутизатора рекламы (ra_prefix, hw_addr и т.д.). Я поставил полный скрипт на pastebin, чтобы не загромождать вопрос: http://pastebin.com/4Q3JheXh
Проблема с вышеизложенным заключается в том, что, хотя Scapy успешно отправляет рекламный пакет маршрутизатора, и я вижу ответы со стороны со стороны, Scapy выходит из прежде чем я смогу просмотреть ответы с помощью sr().
Полный выход:
WARNING: No route found for IPv6 destination :: (no default route?)
Begin emission:
Finished to send 1 packets.
...Traceback (most recent call last):
File "find_ipv6_local.py", line 40, in <module>
answer, unanswer = scapy.sr(router_advertisement, timeout=10, multi=True)
File "/usr/lib/python2.7/site-packages/scapy/sendrecv.py", line 317, in sr
a,b=sndrcv(s,x,*args,**kargs)
File "/usr/lib/python2.7/site-packages/scapy/sendrecv.py", line 141, in sndrcv
h = r.hashret()
File "/usr/lib/python2.7/site-packages/scapy/layers/inet6.py", line 423, in hashret
return struct.pack("B", nh)+self.payload.hashret()
File "/usr/lib/python2.7/site-packages/scapy/packet.py", line 711, in hashret
return self.payload.hashret()
File "/usr/lib/python2.7/site-packages/scapy/layers/inet6.py", line 1317, in hashret
return struct.pack("HH",self.mladdr)+self.payload.hashret()
struct.error: pack expected 2 items for packing (got 1)
Интересно, что когда я установил validlifetime и preferredlifetime до 0, Scapy не рухнет и сжечь. Однако это менее полезно, так как продолжительность жизни 0 не дает мне ответов.
Я что-то испортил где-то в сценарии, или это Scapy немного выключен, когда дело доходит до IPv6?
Фантастический. Удаление этих трех строк из '/ usr/lib/python2.7/site-packages/scapy/layers/inet6.py' выполнило трюк, как описано. Хотя у меня нет маршрута IPv6 по умолчанию на этом устройстве, у него есть локальный маршрут link (fe80 ::/64), который, как представляется, достаточно для того, чтобы увидеть ответы. Большое спасибо. – breed808