Réseau : la bibliothèque Scapy
Introduction
D’après la documentation officielle (man Scapy), Scapy est un puissant programme interactif de manipulation de paquets. Il peut forger ou décoder les paquets d’un grand nombre de protocoles, les émettre, les capturer, faire correspondre des requêtes et des réponses et bien plus encore. Il permet la manipulation de la plupart des outils de scan, traceroute, de sonde, de tests unitaires, d’attaques ou de découverte de réseau (il remplace facilement hping, 85 % de nmap, arpspoof, arp-sk, arping, tcpdump, tethereal, p0f, etc.). Il se comporte également très bien sur un grand nombre de tâches qu’un grand nombre de programmes n’est pas en mesure de manipuler, comme envoyer des trames invalides, injecter vos propres trames 802.11, combiner des techniques (VLAN hopping+ARP cache poisoning, VOIP decoding sur canal chiffré en WEP...), etc.
Philippe Biondi est l’auteur de Scapy. Il est l’auteur de nombreux logiciels, la plupart écrits en langage Python. Vous trouverez l’ensemble de ses papiers, conférences et logiciels sur son site.
Scapy est un outil multi-utilisation, c’est un :
-
forgeur de paquets
-
sniffeur
-
scanneur
-
outil de test (machine/service actif)
-
outil de fingerprint
-
outil d’attaque (valeurs non prévues dans les protocoles...)
Il peut remplacer de nombreux outils existants : ethereal/wireshark, tcpdump...
Programmation réseau avec Scapy
1. Liste des protocoles supportés
Scapy va nous permettre de travailler sur de nombreux protocoles. Vous trouverez ci-dessous la liste des protocoles supportés par Scapy.
Si vous souhaitez connaître tous les protocoles utilisés, il suffira, dès que vous aurez lancé Scapy (se mettre en console shell puis taper scapy), d’effectuer la commande ls(IP).
ARP : ARP
ASN1_Packet : None
BOOTP : BOOTP
CookedLinux? : cooked linux
DHCP : DHCP options
DNS : DNS
DNSQR : DNS Question Record
DNSRR : DNS Resource Record
Dot11 : 802.11
Dot11ATIM : 802.11 ATIM
Dot11AssoReq : 802.11 Association Request
Dot11AssoResp : 802.11 Association Response
Dot11Auth : 802.11 Authentication
Dot11Beacon : 802.11 Beacon
Dot11Deauth : 802.11 Deauthentication
Dot11Disas : 802.11 Disassociation
Dot11Elt : 802.11 Information Element
Dot11ProbeReq : 802.11 Probe Request
Dot11ProbeResp : 802.11 Probe Response
Dot11ReassoReq : 802.11 Reassociation Request
Dot11ReassoResp : 802.11 Reassociation Response
Dot11WEP : 802.11 WEP packet
Dot1Q : 802.1Q
Dot3 : 802.3
EAP : EAP
EAPOL : EAPOL
Ether : Ethernet
GPRS : GPRSdummy
GRE : GRE
HCI_ACL_Hdr : HCI ACL header
HCI_Hdr : HCI header
HSRP : HSRP
ICMP : ICMP
ICMPerror : ICMP in ICMP
IP : IP
IPerror : IP in ICMP
IPv6 : IPv6 not implemented here.
ISAKMP : ISAKMP
ISAKMP_class : None
ISAKMP_payload : ISAKMP payload
ISAKMP_payload_Hash : ISAKMP Hash
ISAKMP_payload_ID : ISAKMP Identification
ISAKMP_payload_KE : ISAKMP Key Exchange
ISAKMP_payload_Nonce : ISAKMP Nonce
ISAKMP_payload_Proposal : IKE proposal
ISAKMP_payload_SA : ISAKMP SA
ISAKMP_payload_Transform : IKE Transform
ISAKMP_payload_VendorID : ISAKMP Vendor ID
IrLAPCommand : IrDA Link Access Protocol Command
IrLAPHead : IrDA Link Access Protocol Header
IrLMP : IrDA Link Management Protocol
L2CAP_CmdHdr : L2CAP command header
L2CAP_CmdRej : L2CAP Command Rej
L2CAP_ConfReq : L2CAP Conf Req
L2CAP_ConfResp : L2CAP Conf Resp
L2CAP_ConnReq : L2CAP Conn Req
L2CAP_ConnResp : L2CAP Conn Resp
L2CAP_DisconnReq : L2CAP Disconn Req
L2CAP_DisconnResp : L2CAP Disconn Resp
L2CAP_Hdr : L2CAP header
L2CAP_InfoReq : L2CAP Info Req
L2CAP_InfoResp : L2CAP Info Resp
LLC : LLC
MGCP : MGCP
MobileIP : Mobile IP (RFC 3344)
MobileIPRRP : Mobile IP Registration Reply (RFC 3344)
MobileIPRRQ : Mobile IP Registration Request (RFC 3344)
MobileIPTunnelData : Mobile IP Tunnel Data Message (RFC 3519)
NBNSNodeStatusResponse : NBNS Node Status Response
NBNSNodeStatusResponseEnd...
Scapy et IPv6
1. Notion d’IPv6
a. Généralités
Le nombre d’adresses IPv4 disponibles est limité à 4 294 967 296 soit 232. À l’époque, ce nombre ne semblait jamais pouvoir être atteint.
En 1992, ces adresses IP sont ouvertes au commerce sur l’Internet.
Une année plus tard, nous assistons au déclenchement du plan d’urgence car il n’y a plus aucune classe B disponible :
-
Il y a donc création de la notation CIDR, d’où une diminution du gaspillage de l’espace d’adressage et une diminution de la taille des tables de routage.
-
On procède à la création et la mise en place d’un plan d’adressage privé et du NAT.
Les mesures techniques induisent des contraintes et de nouveaux problèmes, les protocoles dynamiques doivent être traités indépendamment (ex : FTP) et une couche de sécurité est obligatoire pour assurer l’intégrité de la confidentialité.
Une première mouture de l’IPv6 est proposée en 1995 pour une version finale en 1998.
Le RIPE annonce la fin de la distribution de l’IPv4 en février 2011 (pour l’IANA) et la fin de la distribution en novembre pour les représentants régionaux de l’IANA.
L’IPv6 est codé sur 128 bits (32 pour IPv4), ses 64 bits de poids fort représentent le réseau et ses 64 bits de poids faible représentent l’identification des hôtes.
Les adresses sont représentées sous la forme de 8 digits hexadécimaux, chaque digit représentant 16 bits sous forme hexadécimale.
b. IPv6 : RFC 2373
Les adresses IP peuvent s’écrire sous cette forme :
-
2001:470:1f14:10b9:0000:0000:0000:2
-
2001:470:1F14:10b9::2
L’écriture d’un ensemble de zéros contigus peut être simplifiée mais pas plus d’une fois sur une adresse :
-
2:0000:0000:0000:2:0000:0000:2
-
2::2::2 => pas valide
-
2::2:0000:0000:2 => valide
-
2:0000:0000:0000:2::2 => valide
Partie réseau
Les adresses sont structurées selon un modèle dit agrégé.
La notation utilisée pour caractériser les agrégats...
Quelques autres exemples
Nous souhaitons sniffer les paquets TCP sur le port 80 de la machine et afficher le résultat à l’écran.
Nous souhaitons maintenant appliquer une fonction à chaque paquet reçu. Nous pourrons utiliser la variable prn qui va nous servir à appliquer une fonction a sur chaque paquet. Nous pourrons bien sûr utiliser une fonction lambda pour nous aider.
Nous aurons besoin d’effectuer un MITM (Man in the Middle, homme du milieu) pour tester le réseau dans un audit. Il existe bien sûr des logiciels spécialisés, mais nous avons la possibilité de le faire avec Scapy. Cette technique du MITM passe par de l’ARP cache poisoning.
Lors d’une attaque de type ARP poisoning, le pirate va se glisser entre les données envoyées par l’utilisateur et le routeur.
Il nous faut utiliser le protocole ARP, d’où l’utilisation de la fonction ARP() aves les paramètres suivants :
-
requête ARP (1).
-
dst : adresse MAC de destination (si besoin).
-
hwsrc : adresse MAC que vous voulez mettre dans la table ARP distante (attaquant).
-
pdst : adresse IP de la machine distante dont vous voulez infecter la table ARP (victime).
-
psrc : adresse IP de la passerelle.
Il nous faut maintenant mettre notre machine en mode forward IP (/proc/sys/net/ipv4/ip_forward) et lancer le script ci-dessus ainsi qu’un sniffer (en Scapy ou directement...
Conclusion
Nous venons de découvrir les principales fonctionnalités de Scapy. Il en existe bien d’autres et si vous souhaitez approfondir vos connaissances, vous pourrez trouver sur le Net des documentations, des exemples d’utilisation.
Seule votre imagination pourra vous brider dans l’utilisation de Scapy, c’est un outil puissant, plein de ressources, et seule son utilisation fréquente vous permettra d’en maîtriser les méandres.
Mise en pratique
1. Canal caché IP
Énoncé
Prérequis : Python, Scapy, notion de réseau
But : réaliser un script Python qui utilise un canal caché IP.
Énoncé :
Un canal caché IP (covert channel IP) est un canal de communication entre deux ordinateurs qui utilise la bande passante d’un autre canal dans l’objectif de transmettre des informations sans l’autorisation ou la connaissance du propriétaire de l’information ou de l’administrateur du réseau.
Grâce à Scapy, réalisez ce script Python.
Correction
chap3_exo2.py
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
from scapy.all import *
conf.verb=0
def traitePaquet(p):
if p[IP].ttl > 230:
print ""
sys.exit(0)
sys.stdout.write(chr(p[IP].id))
sniff(
filter = "icmp and src //@victim//",
lfilter = lambda p: p.haslayer(ICMP) and p[IP].id < 256,
prn = traitePaquet,
#}Pour le traitement en live
store = 0,
#}
)
2. Détection de Rogue AP
Énoncé
Prérequis : Python, Scapy...