Доступ к полям в scapy DHCP-запросе

Я изучаю разные сетевые протоколы и решил попробовать запросить IP-адрес с помощью scapy. Я могу отправить открытие и получить предложение в переменной ansD. К сожалению, у меня проблемы с доступом к полю, содержащему предложенный IP-адрес, который должен быть ansD[BOOTP].yiaddr . Это говорит мне, что поля не существует. Я осмотрелся и увидел похожие проблемы, но не могу понять, почему я могу получить доступ к обычным полям пакетов, но не могу этого сделать с полями BOOTP.

receivedIP = 0
conf.checkIPaddr = False
fam,hw = get_if_raw_hwaddr(conf.iface)
dhcp_discover = Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=hw)/DHCP(options=[("message-type","discover"),"end"])
ansD,unans = srp(dhcp_discover, multi=True)

if True:
dhcp_request=Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=hw,yiaddr=ansD[BOOTP].yiaddr)/DHCP(options=[("message-type","request"),"end"])
ansR, unans = srp(dhcp_request,multi=True)

Ошибка объекта "список" объект не имеет атрибута "yiaddr"

Извините, если это глупый вопрос, я новичок в сети и новичок в python/scapy

1 ответ

Решение

Я понял это не через две секунды после публикации, но, надеюсь, это поможет другим в будущем.

Я использовал srp() вместо srp1(), первый возвращает несколько пакетов, поэтому мне нужно было проиндексировать конкретный пакет, который я хотел посмотреть на ansD[0][BOOTP].yiaddr . С тех пор я изменил свой код, чтобы вместо этого использовать srp1, поскольку это запрос DHCP, ожидающий только одного конкретного ответа "Предложение" от DHCP-сервера. Исправленный код ниже

import sys
from scapy.all import *


receivedIP = 0
conf.checkIPaddr = False
fam,hw = get_if_raw_hwaddr(conf.iface)
dhcp_discover=Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=hw)/DHCP(options=[("message-type","discover"),"end"])
ansD = srp1(dhcp_discover, multi=True)
if True:
//Request using the IP the server offered us in ansD[BOOTP].yiaddr    

    dhcp_request = Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=hw,yiaddr=ansD[BOOTP].yiaddr)/DHCP(options=[("message-type","request"),"end"])
    ansR, unans = srp(dhcp_request,multi=True)
    ansR.summary()

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