21.4 Python 使用GeoIP2地图定位

GeoIP2是一种IP地址定位库,它允许开发人员根据IP地址查找有关位置和地理位置的信息。它使用MaxMind公司的IP地址数据库,并提供一个方便的Python API。GeoIP2可以用于许多不同的应用程序,例如网站分析、广告定位和身份验证。GeoIP2提供了许多不同的信息,例如国家、城市、邮政编码、经纬度、时区等等。它还可以使用IPv6地址进行查询。

  • 安装第三方库:pip install geoip2

读者可自行执行pip install geoip2命令安装这个第三方库,并自行下载对应免费版本的GeoLite2-City.mmdb主机数据库文件,当一切准备就绪以后我们就可以使用该数据库定位位置了,如下代码是一个演示案例,首先通过GetPcap将数据包解析并存储值ret变量内返回,当返回后通过geoip2.database加载数据库文件,并通过循环的方式以此查询reader.city数据,并将详细地址输出。

import dpkt
import socket
import geoip2.databasedef GetPcap(pcap):ret = []for timestamp,packet in pcap:try:eth = dpkt.ethernet.Ethernet(packet)ip = eth.datasrc = socket.inet_ntoa(ip.src)dst = socket.inet_ntoa(ip.dst)ret.append(dst)except:passreturn set(ret)if __name__ == '__main__':fp = open('d://lyshark.pcap','rb')pcap = dpkt.pcap.Reader(fp)addr = GetPcap(pcap)reader = geoip2.database.Reader("d://GeoLite2-City.mmdb")for item in addr:try:response = reader.city(item)print("IP地址: %-16s --> " %item,end="")print("网段: %-16s --> " %response.traits.network,end="")print("经度: %-10s 纬度: %-10s --> " %(response.location.latitude, response.location.longitude),end="")print("地区: {}".format(response.country.names["zh-CN"]),end="\n")except Exception:pass

当读者运行上述代码后,则可输出当前抓到数据包的详细信息,其中包括了网段,经纬度,地区等敏感数据,如下图所示;

当获取当经纬度详细信息后,则下一步就是要生成一个Google地图模板,一般Google底部模板采用KML文件格式,如下这段代码则是生成一个对应的地图模板,通过传入所需分析的pcap数据包以及数据库信息,则可以输出一个GoogleEarth.kml模板文件。

import dpkt
import socket
import geoip2.database
from optparse import OptionParserdef GetPcap(pcap):ret = []for timestamp,packet in pcap:try:eth = dpkt.ethernet.Ethernet(packet)ip = eth.datasrc = socket.inet_ntoa(ip.src)dst = socket.inet_ntoa(ip.dst)ret.append(dst)except:passreturn set(ret)def retKML(addr,longitude,latitude):kml = ('<Placemark>\n''<name>%s</name>\n''<Point>\n''<coordinates>%6f,%6f</coordinates>\n''</Point>\n''</Placemark>\n') %(addr, longitude, latitude)return kmlif __name__ == '__main__':parser = OptionParser()parser.add_option("-p", "--pcap", dest="pcap_file", help="set -p *.pcap")parser.add_option("-d", "--mmdb", dest="mmdb_file", help="set -d *.mmdb")(options, args) = parser.parse_args()if options.pcap_file and options.mmdb_file:fp = open(options.pcap_file,'rb')pcap = dpkt.pcap.Reader(fp)addr = GetPcap(pcap)reader = geoip2.database.Reader(options.mmdb_file)kmlheader = '<?xml version="1.0" encoding="UTF-8"?>\\n<kml xmlns="http://www.opengis.net/kml/2.2">\n<Document>\n'with open("GoogleEarth.kml", "w") as f:f.write(kmlheader)f.close()for item in addr:try:response = reader.city(item)print("IP地址: %-16s --> " %item,end="")print("网段: %-16s --> " %response.traits.network,end="")print("经度: %-10s 纬度: %-10s --> " %(response.location.latitude, response.location.longitude),end="")print("地区: {}".format(response.country.names["zh-CN"]),end="\n")with open("GoogleEarth.kml","a+") as f:f.write(retKML(item,response.location.latitude, response.location.longitude))f.close()except Exception:passkmlfooter = '</Document>\n</kml>\n'with open("GoogleEarth.kml", "a+") as f:f.write(kmlfooter)f.close()else:parser.print_help()

此时打开谷歌地图,并选择左侧的项目菜单,选择从计算机中导入KML文件,并自行将googleearth.kml文件导入到地图文件内,如下图所示;

当导入成功后,此时在地图左侧将会出现一些坐标信息,此时读者可自行点击这些坐标以确定当前IP地址的详细位置,当然该地址仅供参考,因为某些主机的地址可能会使用隐藏IP的方式并不一定确保一定准确。

当然了上述代码只是一个演示案例,在实际过滤中我们可以会进行多层解析,例如如下这段代码,其中AnalysisIP_To_Address函数就可用于接收一个过滤规则,代码中dport ==80 or dport == 443则用于只过滤出目标端口是80443的主机信息,读者也可自行增加一条符合规则的过滤条件进行自定义捕捉,此处仅仅只是一个演示案例。

import argparse
import socket,dpkt
import geoip2.databasedef AnalysisPace(DpktPack,Filter):respon = []with open(DpktPack,"rb") as fp:pcap = dpkt.pcap.Reader(fp)for timestamp, packet in pcap:try:eth = dpkt.ethernet.Ethernet(packet)# 解析过滤出网络层(三层)中的IP数据包if eth.data.__class__.__name__ == "IP":ip = eth.datasrc = socket.inet_ntoa(ip.src)dst = socket.inet_ntoa(ip.dst)# 解析过滤出传输层(四层)中的TCP数据包if eth.data.data.__class__.__name__ == "TCP":sport = eth.data.data.sportdport = eth.data.data.dport# 过滤出源地址是192.168.1.2且目的端口是80或者443的流量# if src == "192.168.1.2" and dport == 80 or dport == 443:if eval(Filter):dic = { "src":"None","sport":0 , "dst":"None","dport":0 }#print("[+] 时间戳: %-17s 源地址: %-14s:%-2s ---> 目标地址: %-16s:%-2s" %(timestamp,src, sport, dst, dport))RecvData = eth.data.data.dataif len(RecvData) and b"GET" in RecvData:#print("[*] 时间戳: {} 源地址: {} <--- 访问网页: {}".format(timestamp,src,bytes.decode(RecvData).split("\n")[1]))passdic['src'] = srcdic['dst'] = dstdic['sport'] = sportdic['dport'] = dportrespon.append(dic)except Exception:passreturn respondef AnalysisIP_To_Address(PcapFile,MmdbFile):IPDict = AnalysisPace(PcapFile,"dport ==80 or dport == 443")NoRepeat = []for item in range(len(IPDict)):NoRepeat.append(IPDict[item].get("dst"))NoRepeat = set(NoRepeat)reader = geoip2.database.Reader(MmdbFile)for item in NoRepeat:try:response = reader.city(item)print("[+] IP地址: %-16s --> " %item,end="")print("网段: %-16s --> " %response.traits.network,end="")print("经度: %-10s 纬度: %-10s --> " %(response.location.latitude, response.location.longitude),end="")print("定位: {} {} {}".format(response.country.names["zh-CN"],response.subdivisions.most_specific.name,response.city.name),end="\n")except Exception:print("定位: None None None")passif __name__ == '__main__':Banner()parser = argparse.ArgumentParser()parser.add_argument("-p", "--pcap", dest="pcap", help="设置抓到的数据包 *.pcap")parser.add_argument("-d", "--mmdb", dest="mmdb", help="设置城市数据库 GeoLite2-City.mmdb")args = parser.parse_args()# 使用方式: main.py -p data.pcap -d GeoLite2-City.mmdb (分析数据包中IP)if args.pcap and args.mmdb:AnalysisIP_To_Address(args.pcap,args.mmdb)else:parser.print_help()

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/647f46e.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下安装 Chrome 和 chromedriver 以及 selenium webdriver 使用

1 安装 Chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm2 下载 chromedriver # 进入下载目录 cd soft/crawler_tools# 查看chrome 版本号 google-chrome --version# 在chromedriver下载地址中找到对应版本&#xff0c;下载对…

在项目管理中,项目经理要控制这三个重要因素:进度、成本、质量

项目管理贯穿项目的整个生命周期&#xff0c;对项目的整个过程进行管理&#xff0c;对项目进行计划、组织、指导和控制的手段。 在项目的生命周期内&#xff0c;进行资源的配置和协调&#xff0c;做出科学决策&#xff0c;从而使项目执行的全过程处于最佳的运行状态&#xff…

22 行为型模式-状态模式

1 状态模式介绍 2 状态模式结构 3 状态模式实现 代码示例 //抽象状态接口 public interface State {//声明抽象方法,不同具体状态类可以有不同实现void handle(Context context); }

python+requests接口自动化测试框架

1、首先&#xff0c;我们先来理一下思路。 正常的接口测试流程是什么&#xff1f; 脑海里的反应是不是这样的&#xff1a; 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果&#xff08;有的需要数据库辅助&#xff09; —> 生成测试报…

实现寄生组合继承

寄生组合继承是一种继承方式&#xff0c;它通过组合使用构造函数继承和原型继承的方式&#xff0c;实现了高效而且正确的继承方式。 具体实现步骤如下&#xff1a; ① 定义一个父类&#xff0c;实现其属性和方法&#xff1a; function Person(name) {this.name namethis.age…

浙大陈越何钦铭数据结构06-图1 列出连通集

题目 给定一个有N个顶点和E条边的无向图&#xff0c;请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时&#xff0c;假设我们总是从编号最小的顶点出发&#xff0c;按编号递增的顺序访问邻接点。 输入格式: 输入第1行给出2个整数N(0<N≤10)和E&…

python操作MySQL、SQL注入问题、视图、触发器、事务、存储过程、函数、流程控制、索引(重点)

python操作MySQL(重要) SQL的由来&#xff1a; MySQL本身就是一款C/S架构&#xff0c;有服务端、有客户端&#xff0c;自身带了有客户端&#xff1a;mysql.exe python这门语言成为了MySQL的客户端(对于一个服务端来说&#xff0c;客户端可以有很多) 操作步骤&#xff1a; …

Kafka - 深入了解Kafka基础架构:Kafka的基本概念

文章目录 Kafka的基本概念 Kafka的基本概念 我们首先了解一些Kafka的基本概念。 1&#xff09;Producer &#xff1a;消息生产者&#xff0c;就是向kafka broker发消息的客户端2&#xff09;Consumer &#xff1a;消息消费者&#xff0c;向kafka broker获取消息的客户端3&…

二、【常用的几种抠图方式一】

文章目录 选框抠图快速选择工具抠图魔棒工具抠图对象选择工具抠图套索工具抠图多边形套索工具抠图磁性套索工具抠图 选框抠图 选框工具抠图适合规则的图形&#xff0c;如下图先使用选框工具框出对象的图轮廓&#xff0c;然后再选择并遮住在里边擦出图形的边缘&#xff0c;根据…

Spring MVC 执行流程

前言 Spring MVC 是一个非常强大的框架&#xff0c;它能够帮助开发人员快速构建高效的 Web 应用程序。然而&#xff0c;要理解 Spring MVC 的执行流程并不容易&#xff0c;因为它涉及到多个组件和模块。在本文中&#xff0c;我们将介绍 Spring MVC 的执行流程&#xff0c;帮助…

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters2. 解决参考 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters …

uniapp vue国际化 i18n

一、安装 vue-i18n npm i vue-i18n 二、新建i18n目录 1、en.json 内容 {"loginPage":{"namePh":"Please enter your login account","passwordPh":"Please enter password"} } 2、zh-CN.json 内容 {"loginPage&qu…

MacOS Mojave(苹果14系统) v10.14.6中文离线安装包

MacOS Mojave是一款先进的操作系统&#xff0c;它拥有诸多出色的特性。其中&#xff0c;夜间模式可以根据时间或用户设置自动切换&#xff0c;改变了UI、壁纸和窗口的样式&#xff0c;使界面在夜晚使用时更为舒适。另外&#xff0c;新的堆栈和群组功能让用户能更方便地分类和整…

软考系统架构师知识点集锦四:信息安全技术基础知识

一、考情分析 二、考点精讲 2.1信息加解密技术 2.1.1对称加密 概念:对称加密(又称为私人密钥加密/共享密钥加密) : 加密与解密使用同一密钥。特点:加密强度不高&#xff0c;但效率高;密钥分发困难。 (大量明文为了保证加密效率一般使用对称加密) 常见对称密钥加密算法:DES:…

PaddleX场景实战:PP-TS在电压预测场景上的应用

时间序列是按照时间发生的先后顺序进行排列的数据点序列&#xff0c;简称时序。时间序列预测即运用历史的多维数据进行统计分析&#xff0c;推测出事物未来的发展趋势。时间序列预测是最常见的时序问题之一&#xff0c;在很多行业都有其应用&#xff0c;且通常时序预测效果对业…

高防回源ip被源站拦截怎么办

​  在进行网站运营过程中&#xff0c;我们经常会遇到DDoS攻击等网络安全威胁。为了保护网站的正常运行&#xff0c;很多企业选择使用高防服务来应对这些攻击。有时候我们可能会遇到一个问题&#xff0c;就是高防回源IP被源站拦截的情况。 那么&#xff0c;当我们发现高防回源…

Vue(uniapp)父组件方法和子组件方法执行优先顺序

涉及到的知识点&#xff1a;watch监控&#xff1a;先看问题&#xff0c;父组件从后端通过$ajax获取数据&#xff0c;在将父组件将值传输给子组件&#xff0c;使用子组件使用created钩子函数获取数据&#xff0c;按自己的想法应该是父组件先获取后端数据&#xff0c;在传入给子组…

【机器学习合集】标准化与池化合集 ->(个人学习记录笔记)

文章目录 标准化与池化1. 标准化/归一化1.1 归一化归一化的作用 1.2 标准化批标准化方法 Batch Normailzation标准化方法的对比自动学习标准化方法 2. 池化2.1 池化的作用2.2 常见的池化方法2.3 池化方法的差异2.4 池化的必要性 标准化与池化 1. 标准化/归一化 1.1 归一化 归…

使用pycharm远程调试

使用pycharm 专业版&#xff0c; 在设置解释器中&#xff0c;具备ssh 解释器功能&#xff1b; 一般在本地无法调试远程端代码&#xff0c;机械性的scp传输文件十分影响工作效率&#xff0c;PyCharm的Pro支持远程Run&#xff0c;Debug&#xff0c;等可视化的功能。 操作系统&…

Git总结

Git介绍 一、Git常用命令 添加、提交 git add 将文件从工作区添加到暂存区&#xff0c;表示git开始追踪文件&#xff0c;如果不想让git追踪了&#xff0c;可以使用 git rm --cached <file> 取消文件追踪&#xff0c;仅仅只代表追踪取消&#xff0c;工作区文件还是照…