Geotracerouting con Scapy
by admin on Apr.05, 2009, under Hacking, Networking
Può essere interessante, per chi è attratto dall’argomento internetworking, esaminare il tragitto che i pacchetti percorrono per giungere a destinazione, verificando come tali tragitti possano differire, in relazione al protocollo utilizzato, ed anche ad altri fattori, come indirizzo IP di origine, indirizzo IP di destinazione, porta di origine, porta di destinazione, Type of Service (o TOS), calcolati nel load-balancing dei routers intermedi.
Questo comportamento è facilmente riproducibile facendo ricorso a poche rige di Python, ed ai moduli scapy e ip2country (per la geo-localizzazione dei nodi intermedi), per realizzare un personale traceroute che utilizza il protocollo TCP.
geotrac.py:
#! /usr/bin/env python
import sys
import ip2country
from scapy.all import *
ip2c = ip2country.IP2Country(verbose=0)
ans,unans=sr(IP(dst=sys.argv[1], ttl=(1,25),id=RandShort())/TCP(flags=0×2,dport=80))
for snd,rcv in ans:
a=ip2c.lookup(rcv.src)
print snd.ttl, rcv.src, “t”, a
if isinstance(rcv.payload, TCP):
break
# python geotrac.py 61.67.192.134 2>/dev/null |tail -n +3 |column -t
1 192.168.1.1 (None, None)
2 151.23.227.33 (’IT’, ‘Italy’)
3 10.0.31.1 (None, None)
4 151.6.225.65 (’IT’, ‘Italy’)
5 151.6.204.41 (’IT’, ‘Italy’)
6 151.6.2.78 (’IT’, ‘Italy’)
7 151.6.6.106 (’IT’, ‘Italy’)
8 80.81.192.64 (’DE’, ‘Germany’)
9 62.216.128.241 (’GB’, ‘United-Kingdom’)
10 62.216.128.45 (’GB’, ‘United-Kingdom’)
11 85.95.25.173 (’GB’, ‘United-Kingdom’)
12 85.95.25.6 (’GB’, ‘United-Kingdom’)
13 85.95.25.201 (’GB’, ‘United-Kingdom’)
14 85.95.25.206 (’GB’, ‘United-Kingdom’)
15 80.77.1.150 (’HK’, ‘Hong-Kong’)
16 203.187.6.37 (’TW’, ‘Taiwan’)
17 203.187.9.204 (’TW’, ‘Taiwan’)
18 58.86.0.189 (’TW’, ‘Taiwan’)
19 58.86.0.22 (’TW’, ‘Taiwan’)
20 58.86.5.98 (’TW’, ‘Taiwan’)
21 61.67.192.134 (’IN’, ‘India’)
Se, per fare un confronto, tracciamo la rotta verso la stessa destinazione utilizzando il normale comando traceroute di Linux, che utilizza invece il protocollo UDP, scopriremo una notevole diversità.
# traceroute -n 61.67.192.134
[...]
1 192.168.1.1
2 151.23.227.33
3 10.0.31.1
4 151.6.225.65
5 151.6.204.41
6 151.6.6.106
7 151.6.2.82
8 80.81.192.64
9 85.95.25.173
10 85.95.25.6
11 62.216.128.210
12 62.216.128.33
13 85.95.25.201
14 85.95.25.206
15 62.216.145.54
16 203.187.6.37
17 203.187.9.204
18 58.86.0.189
19 58.86.0.22
20 58.86.5.98
21 61.67.192.134
Ripetendo più volte le stesse prove, i risultati non cambiano, inducendo a concludere che la variabilità dei percorsi non può dipendere in questo caso, da una scelta temporale.
Per verificare che la differenza sia piuttosto attribuibile al protocollo, ho provato a modificare il programma in Python per utilizzare stavolta UDP, e la porta di destinazione 53.
La rotta evidenziata converge maggiormente co quella del normale traceroute, ma restano significative differenze.
Per fare una ulteriore verifica ho implementino un meccanismo più simile al traceroute standard, cioè utilizzando UDP, la stessa porta sorgente (42833) ed una porta di destinazione casuale:
geotrac2.py:
#! /usr/bin/env python
import sys
import ip2country
from scapy.all import *
ip2c = ip2country.IP2Country(verbose=0)
ans,unans=sr(IP(dst=sys.argv[1], ttl=(1,25),id=RandShort())/UDP(sport=42833,dport=RandShort()),timeout=4)
for snd,rcv in ans:
a=ip2c.lookup(rcv.src)
print snd.ttl, rcv.src, “t”, a
if rcv.src == sys.argv[1]:
break
# python geotrac2.py 61.67.192.134 2>/dev/null |tail -n +3 |column -t
1 192.168.1.1 (None, None)
2 151.23.227.33 (’IT’, ‘Italy’)
4 151.6.225.65 (’IT’, ‘Italy’)
5 151.6.204.41 (’IT’, ‘Italy’)
6 151.6.6.106 (’IT’, ‘Italy’)
7 151.6.2.82 (’IT’, ‘Italy’)
8 80.81.192.64 (’DE’, ‘Germany’)
11 62.216.128.241 (’GB’, ‘United Kingdom’)
12 62.216.128.33 (’GB’, ‘United Kingdom’)
10 85.95.25.6 (’GB’, ‘United Kingdom’)
9 85.95.25.173 (’GB’, ‘United Kingdom’)
13 85.95.25.201 (’GB’, ‘United Kingdom’)
15 62.216.145.54 (’GB’, ‘United Kingdom’)
16 203.187.6.37 (’TW’, ‘Taiwan’)
17 203.187.9.204 (’TW’, ‘Taiwan’)
18 58.86.0.189 (’TW’, ‘Taiwan’)
14 85.95.25.206 (’GB’, ‘United Kingdom’)
19 58.86.0.22 (’TW’, ‘Taiwan’)
21 61.67.192.134 (’IN’, ‘India’)
Come supposto, la rotta ottenuta stavolta quasi coincide con quella ottenuta dal comando.
L’output evidenzia pure il fenomeno (piuttosto probabile nell’ UDP) dei pacchetti che arrivano fuori ordine.

