最新要闻
- Redmi 12C支持内存扩展:4GB内存手机瞬间变6GB 699元性价比更高了
- 全球消息!RTX 4050加持!联想发布Yoga AIO 9i一体机:设计惊艳
- 国产车型大降价 新款特斯拉Model X/S售价公布:超100万
- 【焦点热闻】小米13被低估了!网友没想到小米13相机能有这么大惊喜
- 天天日报丨三件套抄底:李锦记锦珍大桶生抽+金蚝油+黄豆酱 19.6元
- 世界观速讯丨《人民日报》炮轰手机预装应用不能删:占内存、鸡肋、广告满天飞
- 【当前热闻】240W闪充卷王!真我GT Neo5即将登场:有两种版本
- 全球动态:TCL华星宣布品牌形象升级:全新Logo正式上线
- 12月汽车投诉榜:丰田包揽前三甲 踩的同一个“坑”
- 世界快资讯:PS5主机千万别再长期竖向放置了!维修人士:会导致APU液金泄露 造成永久损坏
- 当前关注:阿汤哥驾F14爽片《壮志凌云2》惜败!《阿凡达2》成2022年票房冠军 赢麻
- 全球简讯:春节放假7天要调休!除夕火车票明日开抢
- 骁龙8 Gen2首发!高通正式推出卫星通信:3秒发出信息、可实现双向收发
- 每日视讯:Intel怕吗!AMD锐龙7000史上最强核显 这性能不得了
- 世界视讯!被骗好久!宰相刘罗锅真的是一个罗锅吗?1.9米帅男一枚
- 环球视讯!5位退役也未曾飞天的航天员首次公开!他们也是英雄
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球热文:使用python编写端口扫描工具
端口扫描工具编写
目录- 端口扫描工具编写
- 0x01:实现端口扫描的方式
- 一、TCP扫描:
- 二、SYN扫描:
- 三、UDP扫描:
- 0x02:使用python实现端口扫描
- 一、使用socket库的connect()方法扫描
- 1、核心代码
- 2、批量端口扫描
- 3、使用协程提高效率
- 一、使用socket库的connect()方法扫描
- 0x03:总结
- 0x01:实现端口扫描的方式
0x01:实现端口扫描的方式
一、TCP扫描:
TCP connect扫描,也称为全连接扫描,这种方式直接连接到目标端口,完成了TCP三次握手的过程,这种方式扫描结果比较准确,但速度比较慢而且可轻易被目标系统检测到。
二、SYN扫描:
TCP SYN扫描是另一种TCP扫描。端口扫描工具不使用操作系统原生网络功能,而是自行生成、发送IP数据包,并监控其回应。这种扫描模式被称为“半开放扫描”,因为它从不建立完整的TCP连接。端口扫描工具生成一个SYN包,如果目标端口开放,则会返回SYN-ACK包。扫描端回应一个RST包,然后在握手完成前关闭连接。如果端口关闭了但未使用过滤,目标端口应该会持续返回RST包。
三、UDP扫描:
UDP扫描发送空的(没有数据)UDP报头到每个目标端口。 如果返回ICMP端口不可到达错误(类型3,代码3), 该端口是closed(关闭的)。 其它ICMP不可到达错误(类型3, 代码1,2,9,10,或者13)表明该端口是filtered(被过滤的)。 偶尔地,某服务会响应一个UDP报文,证明该端口是open(开放的)。
(资料图片仅供参考)
0x02:使用python实现端口扫描
一、使用socket库的connect()方法扫描
原理:指定IP和端口号,连接到特定主机对应的远程socket,连接失败会抛出timeout错误,通过判断是否连接成功来判断端口是否开放。
1、核心代码
首先使用socket.socket(socket.AF_INET, socket.SOCK_STREAM)
建立一个基于网络并且使用TCP协议的套接字;
之后使用connect()尝试建立连接,需要的参数为IP和端口号;
最后根据判断返回的结果是成功还是超时,来判断端口是否开放。
就这三步,转化成实际的代码就是下面这样:
import socketdef star_scan(ip, port): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建一个基于网络并且使用tcp协议的套接字,用于通信。 s.settimeout(0.02)# 设置超时时间 s.connect((ip, port)) except Exception as e: print(e) else: res = s.recv(3096).decode("utf-8").encode() print(res) print("[+]{}:{} \topen".format(ip, port)) finally: s.close() ip = "192.168.247.135"port = 22star_scan(ip, port)
主要代码都在star_scan()函数里,往里面传入指定的IP和端口,就可以看到该端口是否开放。
上图是程序运行的结果。
只做成这样肯定是不够的,下一步是实现批量端口的扫描,但是探测的原理还是这个。
2、批量端口扫描
要实现批量端口的扫描,主要的问题就是如何让计算机知道你想要扫的端口有哪些。
最简单的方法是一个一个指定,把要扫的端口全输入进去或者放到文件里让程序去读。一般情况下这都是一种很笨的方法,假如我们要指定1000个端口去扫描,那要输1000个端口,要是扫描全端口就更加麻烦。但是有的时候也是会使用这种方法的,有些端口就是比其他端口更常使用,这些算是常用端口;有些端口打开后假如被恶意利用,会造成非常严重的后果(比如3389端口),这些算是高危端口。
在知道这些端口的存在后,我们可以把它们存到列表里,每次扫描时都默认扫描这些端口,因为它们的利用价值更大,这样扫效率也更高。
把哪些端口定义为默认扫描端口也是门学问,太多太少都不太好,可以去GitHub上找一下大佬写的端口扫描工具或者综合扫描工具,看看他们默认都扫描哪些端口,或者看看nmap等工具是怎么定义的,这里就不列出来了。
还有一种常用的方式是指定端口范围,一般使用-
指定,比如1-100
这样。
通过设定默认扫描端口和输入端口范围,可以满足大部分使用需求了。由于设定默认端口在代码的实现上比较简单,所以这里主要实现指定端口范围,也就是让程序能够解析1-100
。具体实现代码如下:
import socketdef make_port_list(ports): new_port_list = [] if "," in ports: temp_list = ports.split(",") for port in temp_list: if "-" in port: for p in range(int(port.split("-")[0]), int(port.split("-")[1]) + 1): new_port_list.append(p) else: new_port_list.append(port) elif "-" in ports: for p in range(int(ports.split("-")[0]), int(ports.split("-")[1]) + 1): new_port_list.append(p) else: new_port_list.append(ports) return new_port_listdef star_scan(ip, port): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建一个基于网络并且使用tcp协议的套接字,用于通信。 s.settimeout(0.02)# 设置超时时间 s.connect((ip, port)) except Exception as e: pass #print(e) #print("[+]{}:{} \tclosed".format(ip, port)) else: res = s.recv(3096).decode("utf-8").encode() print(res) print("[+]{}:{} \topen".format(ip, port)) finally: s.close() ip = "192.168.247.135"port = "21,22-24"port_list = make_port_list(port)print("total port num:{}".format(len(port_list)))for port in port_list: star_scan(ip, int(port))
正常情况下,要扫描的端口应以命令参数的形式输入进去,这里为了方便直接以变量形式写进了代码。
这里扫描了指定端口21和端口范围22-24,以,
为分隔符区分,通过make_port_list()函数解析,返回一个端口列表,之后循环调用star_scan函数来实现批量扫描,运行结果如下:
这里把扫描失败时的输出提示给注释掉了,因为要是扫描的端口过多这里会看着非常乱。
程序到这里还没有完成,可以看到这里在扫描4个端口的情况下用了快1秒的时间,实际扫描的时候肯定不会只扫几个端口,那时候会扫描成千上万个端口,这时的耗时会非常大:
这是由于网络I/O操作非常的耗时,程序大部分时间都耗在了等待上面,下面就要解决这个问题。
3、使用协程提高效率
关于协程,这里也不会做太多描述(我也不太懂)。大概就是在一个协程进入IO等待时,会自动切换到其他协程继续执行,也就是最大化的利用了IO等待时间,这个过程一直都是单线程,只是程序在一个协程进入等待后切换到另一个协程给CPU处理,而对于CPU来说则一直是同一个程序在给它发任务,CPU是感受不到区别的。
套用到这个程序里,可以理解为:我们每扫一个端口都要建立一次连接,而每次建立连接都会有一次等待,那我们就把每一个要建立的连接都放到一个协程里,在一个连接也就是协程进入IO等待后,系统会自动切换去建立下一个连接,这样效率就会大大提升,这个切换时自动的,完全不需要我们去做什么。
python中可以使用gevent库来实现协程,操作也非常简单。
1、使用gevent.spawn(函数名)
创建协程
2、使用gevent.join()
或者gevent.joinall()
执行协程
于是这里就用我们程序里的star_scan()
函数创建协程,协程的数量等于我们要扫描的次数,最后一起执行就可以了。
还有一个问题就是每一个star_scan()
函数从哪里获取我们要扫描的IP和端口号信息,这里我们使用queue(队列)来解决这个问题。先把所有的IP和端口号放入队列,根据队列长度创建协程,之后每个协程在执行任务的时候就把队列里的信息提取出来一个,当把队列空了的时候,任务也就处理完了。
下面是完整代码:
import socketimport sysfrom queue import Queuefrom gevent import monkey; monkey.patch_socket()import geventdef make_port_list(ports): new_port_list = [] if "," in ports: temp_list = ports.split(",") for port in temp_list: if "-" in port: for p in range(int(port.split("-")[0]), int(port.split("-")[1]) + 1): new_port_list.append(p) else: new_port_list.append(port) elif "-" in ports: for p in range(int(ports.split("-")[0]), int(ports.split("-")[1]) + 1): new_port_list.append(p) else: new_port_list.append(ports) return new_port_listdef coroutines(): # 开启多协程 cos = [] num = ip_port.qsize() print(num) for i in range(num): # 调用工作函数 cor = gevent.spawn(star_scan) cos.append(cor) gevent.joinall(cos)def star_scan(): sockets = ip_port.get() ip = sockets[0] port = int(sockets[1]) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建一个基于网络并且使用tcp协议的套接字,用于通信。 s.settimeout(0.02)# 设置超时时间 s.connect((ip, port)) except Exception as e: pass #print("[+]{}:{} \tclosed".format(ip, port)) else: res = s.recv(3096).decode("utf-8").encode() print(res) print("[+]{}:{} \topen".format(ip, port)) finally: s.close()ip_port = Queue()ip = "192.168.247.135"port = "21,22-2400"port_list = make_port_list(port)print("total port num:{}".format(len(port_list)))for port in port_list: ip_port.put([ip, port])coroutines()
主要是加了使用ip_port = Queue()
创建队列,再用put()
函数将参数放入队列。最后调用coroutines()
函数开启协程,star_scan()
里获取参数的方式也变成了用get()
获取队列中的数据。
可以看到速度确实是快了,但是准确性降低了,22端口明明是开着的这里却没有扫到......
这里不太清楚具体原因,但是也是可以解决的,把超时时间设置的长一点就好了,也就是修改star_scan()
里的settimeout()
里面的值。还有一种解决方案是修改每次创建协程的最大值,超时时间少点也能扫到。
我稍微改了下代码,把直接创建所有协程改成50个50个创建,最后代码如下:
import socketimport sysfrom queue import Queuefrom gevent import monkey; monkey.patch_socket()import geventdef make_port_list(ports): new_port_list = [] if "," in ports: temp_list = ports.split(",") for port in temp_list: if "-" in port: for p in range(int(port.split("-")[0]), int(port.split("-")[1]) + 1): new_port_list.append(p) else: new_port_list.append(port) elif "-" in ports: for p in range(int(ports.split("-")[0]), int(ports.split("-")[1]) + 1): new_port_list.append(p) else: new_port_list.append(ports) return new_port_listdef coroutines(num): # 开启多协程 # print("开启协程{}个".format(num)) cos = [] for i in range(num): # 调用工作函数 cor = gevent.spawn(star_scan) cos.append(cor) gevent.joinall(cos)def star_scan(): sockets = ip_port.get() ip = sockets[0] port = int(sockets[1]) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建一个基于网络并且使用tcp协议的套接字,用于通信。 s.settimeout(0.02)# 设置超时时间 s.connect((ip, port)) except Exception as e: pass #print("[+]{}:{} \tclosed".format(ip, port)) else: res = s.recv(3096).decode("utf-8").encode() print(res) print("[+]{}:{} \topen".format(ip, port)) finally: s.close()ip = "192.168.247.135"port = "21,22-2400"port_list = make_port_list(port)print("total port num:{}".format(len(port_list)))ip_port = Queue() # 创建队列for port in port_list: ip_port.put([ip, port])num = 50if len(port_list)%num == 0: turn = int(len(port_list)/num) for i in range(turn): coroutines(num)else: turn = int(len(port_list)/num)+1 for i in range(turn): if i == turn-1: coroutines(len(port_list)%num) else: coroutines(num)
最后结果就可以扫出来了,后续可以把每次创建协程数当作参数输入进去,这样方便调整。
0x03:总结
到目前为止程序就写的差不多了,只能说基本能用了。接下来就该是实现命令行参数的解析,不能每次换目标都要改代码,这里可以使用argparse模块来解析命令行参数,也可以使用gooey弄个简单的图形化界面,因为懒我就没接着往下写了。
这次是使用的socket库来实现的TCP扫描,其实方法不是唯一的,用scapy发包来扫描也是可以的,甚至直接用nmap模块调nmap来扫描也行。
-
QFramework v1.0 使用指南 工具篇:15. 补充内容:GridKit 二维格子数据结构
在做游戏的过程中,我们经常需要处理二维格子类的数据,比如消除类游戏、俄罗斯方块、各种棋类游戏,还...
来源: 环球热文:使用python编写端口扫描工具
QFramework v1.0 使用指南 工具篇:15. 补充内容:GridKit 二维格子数据结构
速读:【从零开始学爬虫】采集食品行业最新报价数据
Redmi 12C支持内存扩展:4GB内存手机瞬间变6GB 699元性价比更高了
全球消息!RTX 4050加持!联想发布Yoga AIO 9i一体机:设计惊艳
国产车型大降价 新款特斯拉Model X/S售价公布:超100万
【焦点热闻】小米13被低估了!网友没想到小米13相机能有这么大惊喜
天天日报丨三件套抄底:李锦记锦珍大桶生抽+金蚝油+黄豆酱 19.6元
每日热闻!数据结构:ST表 学习笔记
快资讯:ESP32 I2C 总线主模式通信程序
天天观点:创新的概念、设计和生产鞋类和鞋类软件丨Jevero及Botcha 3D功能简介
学习笔记——书城项目第五阶段之购物车数量的修改、精度问题的处理
世界观速讯丨《人民日报》炮轰手机预装应用不能删:占内存、鸡肋、广告满天飞
【当前热闻】240W闪充卷王!真我GT Neo5即将登场:有两种版本
全球动态:TCL华星宣布品牌形象升级:全新Logo正式上线
12月汽车投诉榜:丰田包揽前三甲 踩的同一个“坑”
世界快资讯:PS5主机千万别再长期竖向放置了!维修人士:会导致APU液金泄露 造成永久损坏
当前关注:阿汤哥驾F14爽片《壮志凌云2》惜败!《阿凡达2》成2022年票房冠军 赢麻
快资讯丨回顾2022
全球简讯:春节放假7天要调休!除夕火车票明日开抢
骁龙8 Gen2首发!高通正式推出卫星通信:3秒发出信息、可实现双向收发
每日视讯:Intel怕吗!AMD锐龙7000史上最强核显 这性能不得了
好用的工具
世界最资讯丨Python中的注释和input函数的使用
世界视讯!被骗好久!宰相刘罗锅真的是一个罗锅吗?1.9米帅男一枚
环球视讯!5位退役也未曾飞天的航天员首次公开!他们也是英雄
天天精选!在我电脑里 这是唯一的一个360产品
存款贬值快一半!土耳其人把游戏当成了救命稻草
顺序结构及if选择结构
环球今亮点!左偏树 学习笔记
亲测有效! Scrutiny 网站SEO检测及优化工具 V12.6.1 for mac
全球聚焦:创建型模式——前言
continue跳過循環(skippaart程序),接受設定的合法分數來進行平均分求值,并展現最高分,最低分
AMD锐龙7000 3D版暴力堆料144MB缓存 微软神助攻:Win11专属优化
【环球新视野】大疆2022年之最:有人每天飞5小时 有人一年飞了3万公里
正点原子FSMC控制TFT-LCD的地址偏移解读
【全球新视野】linux 下 mongodb 安装
PG中级证书到手,PostgreSQL(PG)认证
每日看点!RX 7900 XT悄然降价:国行回归7399元
【环球播资讯】AMD锐龙7000送上史上最强核显!频率3GHz 超越所有独显
世界播报:上海一家网吧春节促销:300元包20天 玩家签“生死状”
头条:风靡全国后 老头乐要席卷世界了
【天天报资讯】AcWing.1175 最大半连通子图
如何给所有的 await async 函数添加try/catch?
世界微资讯!mybatis使用postgresql中的jsonb数据类型
世界报道:2022年新能源车销量出炉:每卖出3辆车就有1辆新能源
全球动态:高分国漫《中国奇谭》B站播放量破1800万 网友:碾压《三体》动画
今年上映!国产航空大片《长空之王》新海报:尖端战机亮眼
超过6万台!国产龙芯CPU采购大单拿到手软
四川女子回娘家屋旁偶遇大熊猫直言激动 并不怕人:圆滚滚超可爱
学习笔记——书城项目第五阶段之购物项加号、购物项减号
【世界快播报】记一次2022某地HVV中的逆向分析
全球看点:2022年押注特斯拉亏大了!50支重仓基金惨不忍睹
环球视讯!加州新法实施 特斯拉仍宣传“全自动驾驶”:或被罚数千万美元
当前资讯!15分钟出结果 快速检测试剂盒:25份到手74.9元
司机酒后睡着 原地踩油门致车辆起火:烧成废墟
焦点播报:奇瑞营销公司总经理:自家2.0T发动机能与奔驰、宝马媲美
docker network
比亚迪高端品牌“仰望”发布 超级技术叩开百万级新能源市场大门
观察:首次集成AI引擎 AMD对锐龙7000移动版极其自信:超越苹果不是问题
新年微信红包封面领取攻略 谁还没有几个红包皮呢?
大桶更尽兴 溜溜梅六味青梅宝藏桶480g 25.1元
世界快看点丨【甘特图软件部件】上海道宁与DlhSoft助力您的Windows与移动应用程序开发
世界百事通!学习笔记——CommonResult工具、书城项目第五阶段(清空购物车、删除购物项、对数量的修改)
环球热点评!百万级U8、U9双双亮相!比亚迪已注册多个仰望品牌商标
环球资讯:笔记本显示屏变天了!OLED面板大爆发:加速淘汰LCD
一加11在京东抢购一空!3999元定价震撼整个手机行业
七彩虹RTX 4070 Ti 6499元起开卖:兔年惊喜礼盒 不加1分钱
副业不小心干成了主业!新东方在线拟更名为东方甄选控股有限公司
java中的多线程
2022 最新版 JDK 17 下载与安装 步骤演示 (图示版)
世界热讯:【验证码逆向专栏】某验四代滑块验证码逆向分析
世界讯息:Dubbo 3 端口协议复用
水里也能开!仰望U8核心系统支持IP68防水:可浮水行驶
百万级纯电性能超跑!比亚迪仰望U9来了:零百加速2秒级、电动蝴蝶门
对标比亚迪仰望U8 东风猛士M-Terrain官图发布:超级硬汉
时隔18年再出续篇!经典老片《神话》续集定名《传说》
144MB缓存性能无解!Zen4架构AMD锐龙9 7950X3D比酷睿i9-13900K快了52%
每日快看:浅谈多项式与生成函数
hive调优之参数设置
如何接入畅联云平台管理物联网设备?
【速看料】IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf
荣耀Magic 5系列镜头模组曝光:经典圆形设计、配100X长焦
每日观点:地表最快!realme宣布首发量产240W满级秒充:充满不到10分钟
李国庆称腾讯京东有大公司病 当当就是失败的案例
98年哥哥返乡给15个弟妹买一车礼物:塞满整个后备箱
荣耀MagicOS获新浪2022科技风云榜年度智能操作系统奖
统计B站番剧真实评分
基础可视化图表之分组条形图
锐龙9 6900HX加持!魔方M600迷你主机图赏
【世界报资讯】便宜还好用:绿联iPhone全系钢化膜冲量3.6元/张
世界速看:折叠屏我只认OPPO Find N2:安卓阵营独一无二
环球聚焦:宝马展示i Vision Dee概念汽车:可变换车身颜色 有科幻味了
全球视点!员工:不怕大家拿任何手机跟一加11比精致度和质感
天天消息!RHEL/CentOS yum 源问题
记 对接拼多多官方代报 辽宁电子口岸联达通客户端 ic卡加签版
天天视讯!透过现象看本质,我找到了Netty粘包与半包的这几种解决方案。
天天快资讯丨天府可乐因破产传闻销量暴增 民族品牌不会轻易垮:请理性消费
144MB暴力缓存!AMD锐龙7000 3D缓存版杀来:16核心神奇120W
马斯克最“惨” 福布斯:2022年美国亿万富翁身价创纪录暴跌