# 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 ()
```