2016-09-10 6 views
2

Я пытаюсь создать инструмент, использующий 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?

ответ

1

Я бы сказал, что scapy является немного изворотливым в этом отношении. Ваш trackeback здесь:

return struct.pack("HH",self.mladdr)+self.payload.hashret() 

должны содержать следующее:

return struct.pack("HH", 0, 0)+"" 

Это struct.pack не имеет шансов работать, то по крайней мере, должно быть:

return struct.pack("HH", *self.mladdr)+self.payload.hashnet() 

Так что struct.pack не имеет шансов получения двух аргументов, необходимых для «HH». Это является ошибкой.

Поскольку вы не заботитесь о полезной нагрузке вы можете изменить код scapy для ICMPv6MLQuery от:

class ICMPv6MLQuery(_ICMPv6ML): # RFC 2710 
    name = "MLD - Multicast Listener Query" 
    type = 130 
    mrd = 10000 
    mladdr = "::" # 10s for mrd 
    overload_fields = {IPv6: { "dst": "ff02::1", "hlim": 1, "nh": 58 }} 
    def hashret(self): 
     if self.mladdr != "::": 
      return struct.pack("HH",self.mladdr)+self.payload.hashret() 
     else: 
      return self.payload.hashret() 

Для

class ICMPv6MLQuery(_ICMPv6ML): # RFC 2710 
    name = "MLD - Multicast Listener Query" 
    type = 130 
    mrd = 10000 
    mladdr = "::" # 10s for mrd 
    overload_fields = {IPv6: { "dst": "ff02::1", "hlim": 1, "nh": 58 }} 
    def hashret(self): 
     return self.payload.hashret() 

т.е. убить struct.pack вообще.


На другой ноте: это:

WARNING: No route found for IPv6 destination :: (no default route?) 

может помешать вам получить ответ (сетевая карта может решить, что ничего не мог прийти и игнорировать его). Целесообразно сконфигурировать, по меньшей мере, некоторый тривиальный маршрут, например.

$ route -6 
Kernel IPv6 routing table 
Destination    Next Hop     Flag Met Ref Use If 
::/0      [::]      U 256 0  0 eth0 
+0

Фантастический. Удаление этих трех строк из '/ usr/lib/python2.7/site-packages/scapy/layers/inet6.py' выполнило трюк, как описано. Хотя у меня нет маршрута IPv6 по умолчанию на этом устройстве, у него есть локальный маршрут link (fe80 ::/64), который, как представляется, достаточно для того, чтобы увидеть ответы. Большое спасибо. – breed808

1

Вы можете попробовать исправить предложенный в Scapy-х pull request #335.

EDIT: фиксированное соединение было объединено, поэтому все, что вам нужно сделать, если у вас есть такая же проблема - это обновление Scapy!