Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

implémenter une nouvelle option DHCP dans scapy

+1 vote

Je voudrais utiliser l'option 252 du DHCP (private/proxy autoconfiguration) avec scapy. Dans la classe BOOTP dont les paquets encapsulent le DHCP (fichier scapy/layers/dhcp.py), les options standards sont renseignées dans le dictionnaire DHCPOptions (option 3: router, option 6: nameserver, ...).

L'option que je souhaite implémentée n'est pas standard (pas de RFC mais juste un draft).

Ce que j'ai fait mais que je ne trouve pas maintenable, c'est de rajouter mon option dans ce dictionnaire directement dans la librairie scapy:

53: ByteEnumField("message-type", 1, DHCPTypes),
#             55: DHCPRequestListField("request-list"),
252: StrField('proxy_autodiscovery', 'http://0.0.0.0/wpad.pac'),
255: "end"

Je voudrais plutôt surcharger dans mon script la définition de ce dictionnaire. Pour cela, j'ai essayé:

from scapy.layers import dhcp
dhcp.DHCPOptions[252] = StrField(
    'proxy_autodiscovery', 'http://0.0.0.0/wpad.pac'
)

Ensuite je créé mon paquet pour renseigner cette option:

    response = Ether(dst=ether_src)/ \
    IP(dst=ip_src)/ \
    UDP(sport=67,dport=68)/ \
    BOOTP(chaddr=unhexlify(ether_src.replace(':','')), xid=transaction_id)/ \
    DHCP(options=
        [
            ('message-type','ack'),
            ('server_id', server_ip),
            ('subnet_mask', mask),
            ('domain', domain),
            ('router', gateway),
            ('name_server', domain_ip),
            ('proxy_autodiscovery', wpad_url),
            'end'
        ]
    )

Lors de l'envoi du paquet, l'ai le warning suivant:

WARNING: Unknown field option proxy_autodiscovery

et le paquet envoyé ne comporte pas l'information du proxy!
Je suis certain qu'il y a une façon de faire sans toucher aux librairies et en se contentant de les surcharger, mais je ne vois pas comment!

demandé 11-Fev-2015 par chibollo (170 points)

1 Réponse

+4 votes
 
Meilleure réponse

un peu plus loin dans dhcp.py, il y a le test

if DHCPRevOptions.has_key(name):
    [...]
else:
    warning("Unknown field option %s" % name)
    continue

donc il faut que tu peuples aussi DHCPRevOptions. Ce dictionnaire est défini juste après DHCPOptions, et peuplé en fonction de ses clé/valeur .
Dans ton cas, il te faut probablement avoir :

from scapy.layers import dhcp
from scapy import StrField

opt252_name = 'proxy_autodiscovery'
opt252_port = 252
opt252_option = StrField(opt252_name, 'http://0.0.0.0/wpad.pac')

dhcp.DHCPOptions[opt252_port] = opt252_option
dhcp.DHCPRevOptions[opt252_name] = (opt252_port, opt252_option)

ensuite, bon courage pour la suite... :)

répondu 11-Fev-2015 par Lhassa (798 points)
edité 11-Fev-2015 par Lhassa

Ta réponse résout complètement mon problème! Effectivement, il faut également importer StrField.

code édité pour rajouter l'import...

...