python流量实时分析无虚假诚招代理_笔记整理6——用python实现IP流量分析

一.主要思路 (1).通过ip获取地理位置 主要是通过ip从我们获取的数据库中查询相应信地理位置信息 程序实现中已经将数据库下载到本地

ce8eb54f488c6b5b943a503ebc0297ec.png

(2).对经过dpkt解析的对象pcap获取ip及其位置 将经过dpkt.pcap.Reader(g)方法解析的pcap对象进行拆分解析 这个pcap对象中含有一个[timestamp,packet]类数据的数组,我们将每个层 分成以太网层和ip层两部分,通过socket读取ip,读取后利用第一部分的函数进行 地理位置信息的获取。

8911d48746f781010af47f501009cb72.png

(3).通过ip获取信息并返回一个kml格式文档 首先是链接数据库获取位置信息,其次建立一个空集合存储相应格式的 地理信息,(格式为kml)主要注意变量和对应输出的关系。

72d7c0010000e2821a60ad4ceba6c509.png

(4).对dpkt打开的pcap包获取ip并获取相应kml文档 获取一个pcap包,遍历所有的缓冲区pcap数据包,提取以太网帧, 从该帧中获取ip信息,得到ip后通过构造的函数获取相应的kml文档

921527daf693f894f2745aad858655c4.png

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 = (

'\n'

'%s\n'

'\n'

'%6f,%6f\n'

'\n'

'\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'\

+'\n\n'

kmlfooter = '\n\n'

kmldoc = kmlheader + plotIP(pcap)+ kmlfooter

f.write(kmldoc)

f.close()

if __name__ == '__main__':

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值