python绝技中对wireshark数据包分析dpkt、scapy以及geoip2的使用方法。案例获取wireshark数据包中的ip地址,并查询ip地址归属城市。

一 dpkt 

#!C:\Python37
# -*- coding:utf-8 -*-

import dpkt
import socket
from scapy.all import *
import geoip2.database
import optparse


def PrintPcap_dpkt(filename):
    iplist = []
    try:
        filepcap = open(filename,'rb')
        pcap = dpkt.pcap.Reader(filepcap)
        for (ts,buf) in pcap:
            eth = dpkt.ethernet.Ethernet(buf)

            ip = eth.data
            src = socket.inet_ntoa(ip.src)
            dst = socket.inet_ntoa(ip.dst)
            if not str(src) in iplist:
                iplist.append(str(src))
            if not str(dst) in iplist:
                iplist.append(str(dst))

            print(f'[+]Src:{src}--->Dst:{dst}')

        filepcap.close()
        print(iplist)
        return iplist
    except Exception as e:
        print(e)
        pass
    return

def PrintPcap_scapy(filename):
    iplist = []
    try:
        pcap = rdpcap(filename)
        for rd in pcap:
            #print(rd.show())
            if rd['IP'].payload:
                src = rd['IP'].src
                dst = rd['IP'].dst
                print(f'[+]Src:{src}--->Dst:{dst}')
                if not str(src) in iplist:
                    iplist.append(str(src))
                if not str(dst) in iplist:
                    iplist.append(str(dst))
        return iplist

    except Exception as e:
        print(e)
        pass

    return

def retGeoStr(iplist,geoLiteCity='./GeoLiteCity/GeoLiteCity.mmdb'):
    #iplist =['10.0.0.101', '10.0.0.201']
    if  len(iplist) < 1:
        print("[*] no IP")
        return
    try:
        reader = geoip2.database.Reader(geoLiteCity,['zh-CN'])
    except Exception as e:
        print(e)
        return
    for ip in iplist:
        print(ip)
        try:
            resp = reader.city(ip)  # type:geoip2.models.City
            # print(resp)
            country = str(resp.country.name)
            city = str(resp.city.name)
            print('[+]IP:{},is {} {}'.format(ip, country, city))
        except Exception as e:
            print(e)
            pass

    return



def main():
    #filename = './file/sqli.pcap'
    geoLiteCity ='./GeoLiteCity/GeoLIteCity.mmdb'
    parser = optparse.OptionParser('usage -p <pcap file>')
    parser.add_option('-p', dest = 'filename', type = 'string', help = 'specify a pcap file')
    (options,args) = parser.parse_args()
    filename = options.filename
    if (filename == None):
        print(parser.usage)
        exit(0)

    iplist =PrintPcap_dpkt(filename)
    #PrintPcap_scapy(filename)

    retGeoStr(iplist)
    return


if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值