Scapy a été architecturé pour fonctionner dans un mode stimulus-réponse. C'est tout ce qui est nécessaire pour accomplir scan de ports, traceroutes, collectes d'IP ID, etc. Mais lorsqu'il s'agit de transfert de fichier TFTP ou de connexion TCP, où l'échange de paquets n'est plus une suite stimulus-réponse-stimulus-réponse-..., c'est insuffisant. Nous allons donc voir deux façons de parler d’un protocole qui échangerait des messages dans une connexion TCP, en s'attardant sur les facilités offertes par Scapy pour créer des automates réseau. D'autres méthodes existent et sont détaillées dans [5,6,7,8].
1. Les messages
Nous supposons que nous devons nous interfacer avec un protocole constitué d'un échange de messages triviaux, mais sur TCP. Voici l'implémentation Scapy décrivant ces messages :
class Message(Packet):
fields_desc = [ FieldLenField("len",None, fmt="H", length_of="msg"),
StrLenField("msg", "", length_from=lambda pkt:pkt.len) ]
def extract_padding(self, pay):
return "",pay
Ces messages sont donc constitués d'un champ de longueur sur 2 octets, en big endian, suivi d'un message dont la taille est indiquée par le champ précédent. Notons la présence de la méthode extract_padding(). Son rôle est de séparer le payload du protocole et son padding. En effet, par défaut, Scapy considère que tous les octets d'un paquet suivant une couche protocolaire qui vient d'être décodée font partie du payload de cette couche. Lorsqu'une couche protocolaire contient un champ contenant la longueur de ce...
- Accédez à tous les contenus de Connect en illimité
- Découvrez des listes de lecture et des contenus Premium
- Consultez les nouveaux articles en avant-première