Scapy è un tool scritto in Python per la manipolazione dei pacchetti di rete. Con Scapy potremo assemblare o decodificare i pacchetti di un ampio numero di protocolli, inviarli, catturarli, filtrare richieste e risposte, e molto altro ancora.
Per l'utilizzo di Scapy sono richieste delle competenze nei seguenti ambiti:
- conoscenza base dei protocolli di rete;
- conoscenza base di Python;
- conoscenza base di Unix;
Scapy non ha uno scopo principale, serve per diversi motivi dal testare la sicurezza della propria rete all'analisi di rete, tracerouting, probing, network discovery. Scapy supporta l'invio di invalid frames, l'iniezione di propri frames 802.11, l'ARP cache poisoning, la decodifica di un canale WEP crittato, etc. Per installare Scapy da source su una distro Debian like bastano pochi comandi:
sudo apt-get install -y tcpdump graphviz imagemagick python-gnuplot python-crypto python-pyx
cd
mkdir scapy-src
cd scapy-src
wget http://www.secdev.org/projects/scapy/files/scapy-latest.zip
unzip scapy-latest.zip
cd scapy-2.*
sudo python setup.py install
Se siete su Archlinux, potete installare scapy con i seguenti comandi:
su -
pacman -Syu python-scapy
Sempre una distro Debian like, esiste anche il pacchetto già pre-compilato, installabile con il seguente comando:
sudo apt-get install python-scapy
Questo tool di sicurezza è presente anche nelle principali distribuzioni di sicurezza, come BackBox.
Scapy può essere utilizzato da shell interattiva oppure come modulo python. Per utilizzare Scapy nei nostri script in python basterà importarlo con il seguente comando:
from scapy.all import *
Per utilizzare scapy da shell basta digitare il seguente comando:
sudo scapy
Una volta lanciato il comando, avremo a disposizione una shell interattiva. Per visualizzare un elenco di comandi scapy, è possibile lanciare il comando:
lsc()
Per avere ulteriori informazioni sul comando basta utilizzare la funzione help, con in argomento il comando di cui vogliomo avere altre info. Un esempio:
help(arping)
Per visualizzare tutti i protocolli supportati da Scapy, digitiamo:
ls()
Passando alla stessa funzione come argomento il nome di un layer, si ottiene invece la lista dei suoi specifici campi:
ls(ARP)
Ad ogni istanza di Scapy vengono settate delle impostazioni di default. Per vedere le impostazioni di default basta digitare:
conf
Per modificare una di questi settaggi basta digitare conf.NOME_SETTAGGIO = NUOVO VALORE esempio:
conf.iface='wlan0'
Un pacchetto di rete è suddivisibile in layers separati, e ciascuno di essi viene rappresentato da una istanza Python, perci? la manipolazione avviene tramite gli attributi ed i metodi di tale istanza. La creazione di un pacchetto avviene attraverso la creazione di una pila di tante istanze quanti sono i layers coinvolti.
Ogni layer viene separato dal carattere "/". Per capire se è attivo uPNP su un certo dispositivo basta creare un nuovo pacchetto UDP.
ipInput = "192.168.0.1"
ip = IP();
ip.dst="%s" % ipInput
udp = UDP();
udp.dport= 1900
udp.sport= RandShort();
data="M-SEARCH * HTTP/1.1rnHost:%s:1900rnST: upnp:rootdevicernMan:"ssdp:discover"rn" % ipInput
risp=sr1(ip/udp/data,verbose=0);
risp.display();
Come si può vedere, viene creato il pacchetto IP() a cui viene definita la destinazione. Dopo viene creato il pacchetto UDP, con porta di destinazione 1900 e la porta sorgente random. Come dati mandiamo:
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: ssdp:discover
MX: 10
ST: ssdp:all
Per maggiori informazioni vi mando alla pagina di Wikipedia. Una volta eseguito lo script, se il dispositivo supporta uPNP avremo un output simile a questo:
###[ IP ]###
version = 4L
ihl = 5L
tos = 0x0
len = 290
id = 2382
flags =
frag = 0L
ttl = 255
proto = udp
chksum = 0x2d93
src = 192.168.1.1
dst = 192.168.1.152
options
###[ UDP ]###
sport = 1900
dport = 44812
len = 270
chksum = 0x850d
###[ Raw ]###
load = 'HTTP/1.1 200 OKrnST:upnp:rootdevicernUSN:uuid:11111111-0000-c0a8-0101-000cf6312ddf::upnp:rootdevicernLocation:http://192.168.1.1:80/DeviceDescription.xmlrnCache-Control:max-age=480, no-cache="Ext"rnServer:Allegro-Software-RomUpnp/4.07 UPnP/1.0 IGD/1.00rnExt:rnrn'
Per visualizzare un pacchetto, basta digitare il suo nome seguito dalla funzione display().
Ad esempio:
- La funzione sr() si occupa proprio di inviare pacchetti e ricevere pacchetti in risposta.
- La funzione sr1() ne costituisce una variante che ritorna solamente il primo pacchetto di risposta.
- Le funzioni srp() e srp1() operano allo stesso modo per i pacchetti layer 2 (Ethernet, 802.3, etc.).
- La funzione sendp() invia un pacchetto di layer 2.
- La funzione send() un pacchetto di layer 3.
- Le funzione send() e sendp() non ricevono pacchetti.
Scapy è un tool molto potente e utilizzato spesso, sul Web sono presenti diversi tutorial, utili a capire come funziona la rete. Ecco alcuni video sull'utilizzo di Scapy in BackBox: