• 笔记整理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)+'
    '
            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)+'
    '
     
    
    
    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>
    '
                '<name>%s</name>
    '
                '<Point>
    '
                '<coordinates>%6f,%6f</coordinates>
    '
                '</Point>
    '
                '</Placemark>
    '
            )%(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"?>
    '
                +'<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
    '
        kmlfooter = '</Document>
    </kml>
    '
        kmldoc = kmlheader + plotIP(pcap)+ kmlfooter
        f.write(kmldoc)
        f.close()
    
    
    if __name__ == '__main__':
        main()
    
    
    
  • 相关阅读:
    引擎设计跟踪(九.10) Max插件更新,地形问题备忘
    引擎设计跟踪(九.9) 文件包系统(Game Package System)
    [原] Android上使用native IO
    [原] GLES在iOS和Android上的不同
    [原] perforce 获取本地最近更新的Changelist
    [转]GLES 3.0 新特性
    [原]android不支持命名的semaphore
    [原]android 链接错误
    引擎设计跟踪(九.8) Gizmo helper实现与多国语言
    [原]游戏引擎与游戏逻辑
  • 原文地址:https://www.cnblogs.com/qianxinggz/p/11402647.html
Copyright © 2020-2023  润新知