• 【自制小工具】快速批量查询IP归属地(自动去重、按国内外汇总,并智能识别出错误IP)


    作者:Eason_LYC

    不放弃,不为别的,只想活成自己心中的样子~

    领域:WEB安全、网络攻防

    关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半功倍,少走弯路!

    博客描述:

    一个人的价值,在于他所拥有的,而不是他会的。所以可以不学无数,但不能一无所有!

    个人社区:极乐世界-技术至上

    我们追求技术至上,这是我们理想中的极乐世界~(关注我即可加入社区)

    背景

    如何才能快速提升自己的编写脚本的能力呢,我之前文章中说过“为了学习而学习,永远学不好”。所以本文以我在实际工作中的真实场景为例,讲解自制小工具的思路。

    每个人在生活中都会遇到各种问题,将问题抽象梳理出来,利用已掌握或临时自学拼凑的编程知识,来实现自己的目标,你将事半功倍,能力提升水到渠成。

    在实际安全工作中,经常会从各种渠道获取大量IP,在进行分析前,首先需要对IP进行如下几项处理

    • IP是否有重复
    • IP是否有错误
    • IP归属地是哪里
    • IP有多少国内或者国外的

    上述几件事看上去很简单,网上也有现成的工具或网站可以使用。但是在实际工作中往往IP数量少则上万个,多则十几万,甚至是几十万。而且往往要半小时内出结果。面对这样的实际工作场景,人工或利用半成品工具明显不再合适。

    为了在单位继续干下去,也不想累的的猝死,只能自己动手开发了一个小工具。下面就将这个小工具介绍给大家。

    成果

    是的,没有看错,先看成果,大家才有继续看下去的动力不是?
    请添加图片描述
    一共7万多个原始IP,下面几个数据一加等于去重后的IP数。详细功能数据如下:

    1. 软件自动去重
    2. 查询归属地
    3. 按国内国外分类汇总
    4. 对未查询到和错误IP进行汇总
    5. 结果自动保存为xlsx格式,方便直接汇报
    6. 总耗时20s,这是封装exe可执行文件后的运行时间,脚本直接运行,相同数据10s左右能完成。
      最终excel成果:
      请添加图片描述
      请添加图片描述
      请添加图片描述

    以上就是软件的最终成果,不知各位看官是否满意,至少自制这个小工具后,让我工作轻松不少。

    如何使用

    工具设计之出就明确,一定要非常容易使用,力求0门槛傻瓜式使用。
    打开工具,仅有三个文件,一个程序,一个使用说明,一个文件夹,作用见下图
    请添加图片描述
    使用的要求只有如下两条:

    1. 将你需要处理的大量IP,在txt格式文件中保存为一列即可,名字最好取ip.txt,然后放到db文件夹中就好了。如下图

    请添加图片描述
    2. 双击exe运行程序,结果会自动生成result.xlsx。双击后运行界面如下
    请添加图片描述
    运行过程中的界面
    请添加图片描述
    结果生成界面
    请添加图片描述

    步骤已经设计的很简略了,方便易上手有没有

    使用查询库文件

    本文使用归属地查询的库,是qqwry。这个可以手动从github上下载最新的版本,替换即可。
    其实有更好的库,但是qqwry真的很稳,综合考虑就用这个了。

    其实软件自带的这个,已经满足日常使用了。

    工具代码分析

    本工具使用python编写,后续使用Pyinstaller工具,将脚本生成exe可执行程序。

    • 原始脚本中,引用的库只有3个
    from qqwry import QQwry # 归属地查询库,实现核心功能
    import xlsxwriter # 生成、操作xlsx的库,将结果归类汇总,已特定字段输出到文档中,形成最终成果。
    import time # 用于计时,统计执行一次任务运行的时间
    
    • 1
    • 2
    • 3
    • 根据上文的梳理,我们的需求很明确。所以实现方法和思路如下:
    def input_txt():
    	"""
    	获取输入IP源文件
    	1、文件路径,默认为.\db\ip.txt
    	2、打开文件,以行形式读取内容(单个ip)raw_ip,另外统计原始行数 raw_num
    	3、初步过滤,去掉每行ip首位多余的空格,去重,统计去重后行数 file_num
    	
    	return raw_ip, raw_num, file_num
    	"""
    	pass
    
    
    def check_input(raw_ip):
    	"""
    	对各种异常输入的处理,并将异常IP统计到error_ip列表中。目前能是别的异常情况如下【根据实际,持续更新】
    	1、IP组成不是4个数
    	2、任意一个数字出现4位数
    	3、任意一位数出现异常(非数字,0-255之外,非整数...)
    	过滤后再对所有结果进行去重,无问题IP放到ip列表中
    	
    	return ip, error_ip   
    	"""
    	pass
    
    
    def output_excel(list_home, list_foreign, list_unknown, list_error):
    	"""
    	xlsxwriter这个库使用方式比较固定,根据自己需要设置excel各字段内容和排版 
    	"""
    	pass
    
    
    def ip_search():
    	"""
    	主程序,逻辑是调用上述各方法,获取正常ip后,再调用qqwry库,查询ip归属地查询。
    	另外,cmd中输出内容和格式我也在这里进行的定制。
    	"""
    	pass
    
    
    if __name__ == '__main__':
        start = time.time()
        ip_search()
        end = time.time()
        print('耗时: ', round(end - start, 0))
        input("please input any key to exit!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    整个脚本算上空行,一共才164行,真是短小精悍。但是在工作中真的管用。
    就像我之前文章中说过的那句话“学以致用才是关键,为了学习而学习,永远学不好”。

    不足之处

    自己写的软件,不足之处简直太了解了,那我就自爆家丑了。

    1. 无法识别IPv6
    2. 错误处理中,如原IP文件中出现中文句号则会出现错误不再执行,这个我后续完善下
    3. 归属地查询库只适用单一的qqwry,太low了
    4. 不支持自动更新查询库,这个主要考虑网安工作环境往往不允许连外网,小工具安全起见也不要有连接外网的功能。

    反思下上面的问题,其实都应该早早修正。对异常输入不断优化,增加稳定性;库改为多个常用主流查询库,可根据实际情况选择用哪个;自动更新\手动更新,可人工选择。

    视频演示(各位看官如满意请对视频三连支持,您的三连是我创作下去的动力!)

    【自制小工具】快速批量查询IP归属地(自动去重、按国内外汇总,并智能识别出错误IP)

  • 相关阅读:
    第6 章 多线程程序设计答案
    Node.js中处理特殊字符的文件名,安全稳妥的方案
    EVM networks列表
    驱动开发 day3 9/12
    【python学习】--执行时间计算方法以及优化
    mysql数据库:DCL:管理用户,授权
    Windows系统下安装CouchDB3.3.2教程
    Python Selenium搭建UI自动化测试框架
    应届生写简历不如AI?HR招人到底看什么
    分布式与集群区别
  • 原文地址:https://blog.csdn.net/eason612/article/details/126912595