Geolocalizzazione degli indirizzi IP
by admin on Apr.02, 2009, under Hacking, Linux, Networking, Sicurezza
La geo-localizzazione dell’indirizzo IP è una feature molto di moda attualmente, una informazione variamente strutturata che dovrebbe essere in grado di individuare l’origine di qualsiasi connessione TCP, realmente molto utile in determinate circostanze, come ad esempio una analisi statistica sui paesi maggiormente coinvolti nella diffusione di specifiche infezioni informatiche.
Un ottimo strumento, molto pratico in situazioni di questo tipo, dove è sufficiente la sola conoscenza del paese cui un IP appartiene, senza altre informazioni più specifiche, è costituito dal software ip2country, opensource e GPL (http://www.freenet.org.nz/python/ip2country/).
ip2country è un modulo python in grado di restituire come risultato il paese al quale un determinato indirizzo IP appartiene.
Per fare ciò mantiene una cache di allocazioni di indirizzi IP, scaricando la tabella dal database APNIC solamente se la versione nella cache è mancante o o stale, ideale quindi per situazioni dove si debbano effettuare frequenti operazioni di lookup da programma.
Il controllo tramite cache è applicabile solamente nel caso di indirizzi IP di competenza APNIC, ovvero quelli dell’area Pacifico, comprendendo paesi come Cina, Taiwan, Sud-Korea, VietNam, Thailandia e Filippine che sono frequentemente origine di malware.
Per gli altri paesi del mondo, la geolocalizzazione è ancora possibile, ma viene attuata ogni volta tramite una interrogazione whois.
Il modulo è reperibile sottoforma di tarball compresso all’indirizzo http://www.freenet.org.nz/python/ip2country/ip2country.tar.gz.
Dopo averlo scaricato, ad esempio in /opt/, e decompresso:
# cd /opt
# tar xvzf ip2country.tar.gz
ip2country/
ip2country/ip2country.py
ip2country/setup.py
lo si può installare come modulo python
# cd ip2country
# python setup.py install
running install
running build
running build_py
creating build
creating build/lib
copying ip2country.py -> build/lib
running install_lib
copying build/lib/ip2country.py -> /usr/lib/python2.5/site-packages
byte-compiling /usr/lib/python2.5/site-packages/ip2country.py to ip2country.pyc
running install_egg_info
Writing /usr/lib/python2.5/site-packages/ip2country-0.2.0.egg-info
ed eseguire da interprete:
# python
Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49)
[GCC 4.3.2] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import ip2country
>>> ip2c = ip2country.IP2Country(verbose=1)
IP2Country:Cached DB is old or missing, need a new one
IP2Country:Connecting to apnic db server…
IP2Country:Logging in…
IP2Country:Downloading ftp://pub/stats/apnic/delegated-apnic-latest
IP2Country:Download complete!
IP2Country:Closing server connection
IP2Country:Created apnic lookup tables
>>> ip2c.lookup(”202.27.184.3″)
(’NZ’, ‘New Zealand’)
>>> ip2c.lookup(”151.65.184.3″)
IP2Country:Performing whois query for 151.65.184.3
(’IT’, ‘Italy’)
>>>
Il fatto di essere nativamente in Python, offre una comoda possibilità di integrare ip2country con quel fantastico tool che è scapy.
Tornando a considerare l’ipotesi di utilizzo citata all’inizio, può essere piuttosto semplice ottenere una lista di corrispondenze tra tentativi di connessione abusivi e nazioni originanti, registrando preventivamente tramite una regola iptables i tentativi di connessione:
# iptables -A INPUT -p tcp -i eth0 –tcp-flags SYN,ACK,RST SYN -j LOG –log-level alert –log-prefix “IPtables=INTRUDER ”
La registrazione genera un record di ciasun tentativo di connessione, per cui:
# grep “INTRUDER” syslog |grep -v “151.65.”
provoca la visualizzazione di tutte le registrazioni relative ai tentativi di connessione effettuati dall’esterno ad esclusione di quelli originati dagli utenti del mio stesso provider, i quali peraltro costituiscono la maggior parte delle intrusioni tentate.
[...]
Apr 2 12:54:13 silversurfer kernel: [12798.183657] IPtables=INTRUDER IN=eth0 OUT= MAC=00:1a:92:b8:1a:ec:00:15:e9:f9:15:c6:08:00 SRC=59.92.114.35 DST=192.168.1.10 LEN=52 TOS=0×00 PREC=0×00 TTL=54 ID=51348 DF PROTO=TCP SPT=30030 DPT=445 WINDOW=65535 RES=0×00 SYN URGP=0
Apr 2 12:57:29 silversurfer kernel: [12994.491375] IPtables=INTRUDER IN=eth0 OUT= MAC=00:1a:92:b8:1a:ec:00:15:e9:f9:15:c6:08:00 SRC=217.203.196.57 DST=192.168.1.10 LEN=52 TOS=0×00 PREC=0×00 TTL=48 ID=14070 DF PROTO=TCP SPT=43525 DPT=445 WINDOW=60352 RES=0×00 SYN URGP=0
Apr 2 13:15:44 silversurfer kernel: [14089.105504] IPtables=INTRUDER IN=eth0 OUT= MAC=00:1a:92:b8:1a:ec:00:15:e9:f9:15:c6:08:00 SRC=91.139.195.122 DST=192.168.1.10 LEN=48 TOS=0×00 PREC=0×00 TTL=116 ID=56583 DF PROTO=TCP SPT=24659 DPT=445 WINDOW=65535 RES=0×00 SYN URGP=0
[...]
Anziché operare sul file grezzo, è più semplice, lavorando in modalità interattiva, ottenerne solamente la lista degli indirizzi IP, da usare poi come input per la procedura di geolocalizzazione.
Perciò, a tal proposito:
# for addr in $(grep “INTRUDER” /var/log/syslog |grep -v “151.65.” |awk ‘{print $11}’ |cut -d “=” -f 2 |uniq); do echo $addr >>/tmp/workfile; done
A questo punto, passando all’interprete Python:
[...]
>>> import ip2country
>>> ip2c = ip2country.IP2Country(verbose=0)
>>> import fileinput
>>> filein=fileinput.input(”/tmp/workfile”)
>>> for riga in filein:
… b=riga.split()
… a=ip2c.lookup(b[0])
… print b, a
…
['200.146.202.34'] (’BR’, ‘Brazil’)
['113.30.84.21'] (’KR’, ‘Korea, Republic of’)
['59.92.114.35'] (’KR’, ‘Korea, Republic of’)
['217.203.196.57'] (’IT’, ‘Italy’)
['91.139.195.122'] (’BG’, ‘Bulgaria’)
['78.30.193.74'] (’ua’, ‘Ukraine’)
['88.241.101.165'] (’tr’, ‘Turkey’)
['194.102.105.55'] (’ro’, ‘Romania’)
['80.68.245.73'] (’RU’, ‘Russian Federation’)
['117.195.10.63'] (’VN’, ‘Viet Nam’)
['76.77.232.85'] (’US’, ‘United States’)
['96.11.98.4'] (’US’, ‘United States’)
['82.255.233.147'] (’FR’, ‘France’)
['208.78.62.219'] (None, None)
['62.105.148.173'] (’RU’, ‘Russian Federation’)
['212.72.0.225'] (’OM’, ‘Oman’)
['208.78.62.219'] (None, None)
['87.205.231.20'] (’PL’, ‘Poland’)
['115.92.23.47'] (’KR’, ‘Korea, Republic of’)
['58.246.228.178'] (’CN’, ‘China’)
['93.81.25.129'] (’RU’, ‘Russian Federation’)
['94.198.235.77'] (’ru’, ‘Russian Federation’)
['61.67.192.134'] (’IN’, ‘India’)
['88.147.228.40'] (’RU’, ‘Russian Federation’)
['97.81.84.154'] (None, None)
['202.154.225.110'] (’ID’, ‘Indonesia’)
['92.84.205.87'] (’RO’, ‘Romania’)
['89.113.250.139'] (’RU’, ‘Russian Federation’)
['89.39.6.111'] (’ro’, ‘Romania’)
['59.95.201.248'] (’KR’, ‘Korea, Republic of’)
['123.204.121.90'] (’TW’, ‘Taiwan, Province of China’)
['189.121.84.189'] (’BR’, ‘Brazil’)
['118.115.132.46'] (’JP’, ‘Japan’)
['189.117.147.208'] (’BR’, ‘Brazil’)
['190.2.42.137'] (’AR’, ‘Argentina’)
['24.154.3.34'] (’US’, ‘United States’)
['119.125.25.202'] (’CN’, ‘China’)
['92.249.199.28'] (’HU’, ‘Hungary’)
['218.168.48.111'] (’TW’, ‘Taiwan, Province of China’)
['92.83.224.217'] (’RO’, ‘Romania’)
['62.231.177.226'] (’RU’, ‘Russian Federation’)
['61.191.191.190'] (’IN’, ‘India’)
['195.73.24.114'] (’NL’, ‘Netherlands’)
['124.63.176.90'] (’KR’, ‘Korea, Republic of’)
['94.178.87.96'] (’ua’, ‘Ukraine’)
['219.64.150.72'] (’IN’, ‘India’)
['200.210.214.135'] (’BR’, ‘Brazil’)
>>>
ed ecco ottenuta la nostra lista di corrispondenze, che nonostante l’esiguità dei dati esaminati conferma una volta di più che i paesi di origine delle incursioni informatiche sono sempre i soliti noti.

