笔记整理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()


posted @ 2019-08-23 21:06  qianxinggz  阅读(3018)  评论(0编辑  收藏  举报