笔记整理6——用python实现IP流量分析
一.主要思路
(1).通过ip获取地理位置
主要是通过ip从我们获取的数据库中查询相应信地理位置信息
程序实现中已经将数据库下载到本地
(2).对经过dpkt解析的对象pcap获取ip及其位置
将经过dpkt.pcap.Reader(g)方法解析的pcap对象进行拆分解析
这个pcap对象中含有一个[timestamp,packet]类数据的数组,我们将每个层
分成以太网层和ip层两部分,通过socket读取ip,读取后利用第一部分的函数进行
地理位置信息的获取。
(3).通过ip获取信息并返回一个kml格式文档
首先是链接数据库获取位置信息,其次建立一个空集合存储相应格式的
地理信息,(格式为kml)主要注意变量和对应输出的关系。
(4).对dpkt打开的pcap包获取ip并获取相应kml文档
获取一个pcap包,遍历所有的缓冲区pcap数据包,提取以太网帧,
从该帧中获取ip信息,得到ip后通过构造的函数获取相应的kml文档
3.总结与思考
(1).主要模块获取
书中很多信息其实过时了,程序中用到模块和数据库获取方法
pygeoip模块:
{
https://github.com/appliedsec/pygeoip
kali下使用git clone
或者通过apt-get install pygeoip下载(蕞方便)
(书中用的数据库后缀为dat,该模块恰好能使用dat类型的该数据库)
dat版本数据库(csdn上有dat版本留存)
https://download.csdn.net/psearch/0/10/0/2/1/geoip.dat
}
替代方法:
{
替代模块
pip install python-geoip-geolite2 -i https://pypi.douban.com/simple
pip install geoip2
(官网数据库geoip为mmdb类型,用新的方法打开,如下)
geoip2(python)使用文档:
https://geoip2.readthedocs.io/en/latest/
GeoliteCity(geoip2)开源数据库位置
https://dev.maxmind.com/zh-hans/geoip/geoip2/geolite2/#IP
}
数据库分享
链接:https://pan.baidu.com/s/1s4FgYu--r6r0IhkGbHoErQ
提取码:0r8c
(2).生成kml文档后,如何使用google地球?(google地球网址:https://earth.google.com/web/)
(3).陌生模块与方法
***socket.inet_ntop(address_family, packed_ip)
Convert a packed IP address (a string of some number of characters) to its standard, family-specific string representation (for example, '7.10.0.5' or '5aef:2b::8') inet_ntop() is useful when a library or network protocol returns an object of type struct in_addr (similar to inet_ntoa()) or struct in6_addr.
***# Unpack the Ethernet frame (mac src/dst, ethertype)
eth = dpkt.ethernet.Ethernet(buf)
print 'Ethernet Frame: ', mac_addr(eth.src), mac_addr(eth.dst), eth.type
***dpkt.pcap.Reader(f)
dpkt.pcap.Reader(f) implements an iterator. Each iteration returns a tuple which is a timestamp and a buffer. The timestamp contains a time as a floating point number. The buffer is a complete packet. For example:
dpkt官方文档介绍
http://www.commercialventvac.com/dpkt.html
4.遭遇问题
(1).其中的pcap包实际用的是书中例子,在网上没有找到pcap流量包,(也可自行构造)数据样本不足
最终得google地球上仅仅有几个点
google语法找到的攻防练习样例
https://www.netresec.com/?page=pcapfiles
二.代码
1.用pygeoip关联ip和物理位置
#!/usr/bin/python
# coding: utf-8
import pygeoip
import dpkt
import socket
f = open('Location.txt','w')
gi = pygeoip.GeoIP('/mnt/hgfs/temp/temp/python/exercise/GeoLiteCity.dat')
#通过ip得到相应地理位置
def retGeoLocation(ip):
try:
rec = gi.record_by_name(ip)
city = rec['city']
country = rec['country_name']
if city:
location = country+"/"+city
else:
location = country
return location
except Exception,e:
print e
return 'No Location'
#对pcap包解析得到ip及其地理位置的来源和去向
def printPcap(pcap):
for (ts,buf) in pcap:
try:
eth = dpkt.ethernet.Ethernet(buf)
ip = eth.data
src = socket.inet_ntoa(ip.src)
dst = socket.inet_ntoa(ip.dst)
print >> f,'[+] Src: '+src+' --> Dst: '+dst
print >> f,'[+] '+retGeoLocation(src)+' --> '+retGeoLocation(src)+'\n'
except Exception,e:
print e
pass
#输出地理ip相关的地理位置(详细)
def printLocation(ip):
rec = gi.record_by_name(ip)
city = rec['city']
region = rec['time_zone']
country = rec['country_name']
long = rec['longitude']
lat = rec['latitude']
print '[*] Target: '+ip
print '[+] '+str(city)+', '+str(region)+', '+str(country)
print '[+] Latitude: '+str(lat)+', Longitude: '+str(long)+'\n'
def main():
g = open('geotest.pcap')
pcap = dpkt.pcap.Reader(g) #dpkt打开pcap包后的对象
print >> f,'---------------------------location-------------------------'
printPcap(pcap)
if __name__ == '__main__':
main()
2.用python由ip画google地球
#!/usr/bin/python
# coding: utf-8
import dpkt
import socket
import pygeoip
gi = pygeoip.GeoIP('/mnt/hgfs/temp/temp/python/exercise/GeoLiteCity.dat')
def retKML(ip):
rec = gi.record_by_name(ip)
try:
longitude = rec['longitude']
latitude = rec['latitude']
kml = (
'<Placemark>\n'
'<name>%s</name>\n'
'<Point>\n'
'<coordinates>%6f,%6f</coordinates>\n'
'</Point>\n'
'</Placemark>\n'
)%(ip,longitude,latitude)
return kml
except Exception,e:
print e
return ''
def plotIP(pcap):
kmlPlot = ''
for (ts,buf) in pcap:
try:
eth = dpkt.ethernet.Ethernet(buf)
ip = eth.data
src = socket.inet_ntoa(ip.src)
srcKML = retKML(src)
dst = socket.inet_ntoa(ip.dst)
dstKML = retKML(dst)
kmlPlot = kmlPlot+srcKML+dstKML
except Exception,e:
print e
pass
return kmlPlot
def main():
f = open('location.kml','w')
g = open('test1.pcap')
pcap = dpkt.pcap.Reader(g)
kmlheader = '<?xml version="1.0" encoding="UTF-8"?>\n'\
+'<kml xmlns="http://www.opengis.net/kml/2.2">\n<Document>\n'
kmlfooter = '</Document>\n</kml>\n'
kmldoc = kmlheader + plotIP(pcap)+ kmlfooter
f.write(kmldoc)
f.close()
if __name__ == '__main__':
main()