在上一篇文章《Python网络安全基础:一、编写一个简单的端口扫描器》 中,我们介绍了端口扫描的作用,并使用Python编写了一个简单的端口识别扫描器。那个端口识别扫描器实在是过于简单,所以在本篇文章中,我们来完善一下它。

本篇文章所使用的靶机还是来自于metasploitable2虚拟机,没有下载安装的小伙伴可以提前下载安装好。

一、端口与端口范围

在上一篇我们知道,计算机上的每一个服务都有对应的端口号,比如Web服务使用80端口号,SSH服务使用22端口号,DNS服务使用25端口号等等。

一般而言,我们要是知道了计算机上有什么服务,就很容易得知其使用的端口是多少,进而通过对端口进行连接获得相应服务的旗标。但是如果我们不知道一台计算机上运行了什么服务呢?

那就需要对所有的端口号进行扫描了。安装计算机网络的定义和规范,网络端口从1开始,到65535为止。其中:

1~1023号端口为公共端口,这个区间段的端口号是众所周知、约定俗成定义好的指定给了特定的网络服务,默认被分配给了各个特定的网络服务,比如Web服务的80端口,FTP服务的21端口等。当然,这些服务也可以使用其他的端口号进行服务的绑定。

1024~49151,这个区间段的端口为注册端口,用于分配给用户进程或应用程序。

49152~65535,这个区间段的端口为动态端口,这些端口号一般不固定分配某种服务,而是根据实际的使用情况动态地进行分配。

二、批量扫描端口

在了解了端口范围的相关知识后,我们如果想要对一个主机所有的端口进行扫描,最简单的做法就是,生成一个端口列表,然后对端口列表进行遍历,将遍历出来的每一个端口进行扫描。

上一篇文章中,我们的端口扫描器代码如下所示:

# coding:utf-8

importsocket

s=socket.socket()

s.settimeout(3)

port=input("请输入端口号:")

try:

s.connect(('192.168.194.131',int(port)))

print(s.recv(1024))

s.close()

exceptExceptionase:

print(">>>扫描错误:",e)

上面的代码要我们输入一个端口号,就扫描一个端口号。下面我们将其改造成一次扫描一个区间的端口号:

# coding:utf-8

'''

批量扫描 - 州的先生 zmister.com

'''

importsocket

start_port=int(input("请输入起始端口,最小为1:"))

end_port=int(input("请输入结束端口号,最大为65535:"))

print(">>>州的先生zmister.com 端口扫描器 Beta0.1")

forportinrange(start_port,end_port):

try:

s=socket.socket()

s.settimeout(3)

s.connect(('192.168.194.131',int(port)))

print(">>>端口号:",port)

print(s.recv(1024))

s.close()

exceptExceptionase:

pass

# print(">>>扫描错误:",e)

print("扫描完成!")

运行这份代码,我们需要输入起始的端口号和截止的端口号,然后通过range()方法生成一个列表进行遍历,对每一个端口号进行扫描。

我们使用20~30区间的端口号进行测试,看上去效果还不错,但是大家有没有想过,如果我们需要从端口号1扫描到端口号65535呢?

简单的for循环肯定是低效的,非常地耗时间,要想提高扫描速度,又不想漏过一些端口的扫描,我们只能使用并发手段来提高扫描效率。

三、使用多线程提高扫描效率

在Python中可以使用的并发手段有很多,比如多进程、多线程、协程、异步等等。在这里,我们使用线程池来multiprocessing库中的ThreadPool线程池。修改后的代码如下所示:

# coding:utf-8

frommultiprocessing.poolimportThreadPool

importsocket

importtime

defscan_port(port):

try:

s=socket.socket()

s.settimeout(2)

s.connect(('192.168.194.131',int(port)))

print("+++端口号:",port)

print(s.recv(1024))

s.close()

exceptExceptionase:

# print(">>>端口号关闭:",port)

pass

if__name__=='__main__':

print(">>>州的先生zmister.com 端口扫描器 Beta0.2")

start_port=int(input("请输入起始端口,最小为1:"))

end_port=int(input("请输入结束端口号,最大为65535:"))

start_time=time.time()

pool=ThreadPool(processes=500)

pool.map_async(scan_port,range(start_port,end_port))

pool.close()

pool.join()

end_time=time.time()

print("扫描耗时:",end_time-start_time)

我们在线程池中使用了500个线程来对端口进行扫描处理,当然也可以使用input()函数接收一个值作为指定的线程数,在这里作为演示,我们就写死了。运行后效果如下所示:

在程序里面我们简单的使用了time.time()计算了一下扫描所有的耗时,结果为一百多秒:

65535个端口只花了两分多钟就扫描完了,还是很快的。

这样,我们的端口批量扫描器就完成了。有什么问题欢迎留言讨论。

如果觉得本文对你有所启发和价值,欢迎动动手指转发到朋友圈;每周日统计前15日分享榜前3名,小州君有薄礼相送

python 端口扫描 东京_嗖嗖嗖!在Python中进行批量端口扫描 | 网络安全相关推荐

  1. 使用opencv和python进行智能图像处理_使用OpenCV在Python中进行图像处理

    编辑推荐: 本文将先讨论一些图像处理,然后再继续介绍可以方便使用图像处理的不同应用程序/场景,希望对您的学习有所帮助. 本文来自于tecdat ,由火龙果软件Alice编辑.推荐. 介绍 在本教程中, ...

  2. 用python写web网页_从零开始,使用python快速开发web站点(1) | 学步园

    环境:ubuntu 12.04 python版本:  2.73 ok,首先,既然是从零开始,我们需要的是一台可以运行的python的计算机环境,并且假设你已经安装好了python, 然后,既然是快速开 ...

  3. 用python写管理系统局域网_详解用python -m http.server搭一个简易的本地局域网

    工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一 ...

  4. python交互式环境执行_如何在交互式环境中执行Python程序

    如何在交互式环境中执行Python程序 相信接触过Python的小伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同C d ...

  5. python怎么打日志_怎样调试 日志 python 代码

    展开全部 使用 pdb 进行调试 pdb 是 python 自带e5a48de588b662616964757a686964616f31333361306366的一个包,为 python 程序提供了一 ...

  6. python常用库教程_这几个python常用的库你必须知道!

    随着人工智能时代的到来,python变得更加流行.受欢迎,功能强大.简单易学.容易入门.应用广泛等,掀起了学习热潮,现在越来越多人转行都会学习python语言.为了让大家快速掌握python,今天为大 ...

  7. python入门第一课_入门第一课 Python入门涉及的问题及简单示例

    很多初学者都在问:我想自学Python,该怎样入门?入门选择哪些书籍? 下面,我以自己的理解作出解答. 1.先说明大体的学习进度. Python确实入门较为容易,语法清晰易懂.一旦入了门再想提高就和其 ...

  8. python国内书籍推荐_这些都是Python官方推荐的最好的书籍

    转行学Python有前途吗?这个答案是肯定的,AI课程都已经进入小学教材了,未来Python趋势无疑是光明的,但是如何学习Python,很多Python小白都来问小编有什么适合的Python入门书籍推 ...

  9. python编码转换语句_好程序员Python教程之字符串编码知识小结

    好程序员Python教程之字符串编码知识小结,提及Python字符串,你会想到什么?是ASCII,还是Unicode?他们之间是如何转换的?字符串编码和字符串有什么区别?接下来好程序员Python教程 ...

最新文章

  1. 进入Android Dalvik虚拟机之Dalvik指令集
  2. laravel5.6 数组传递到前端
  3. 将原生SQL功能休眠到您的Spring Data Repository中
  4. ps图像压缩插件:TinyPNG and TinyJPG for Mac 支持ps2021
  5. android 图片文字布局,Android自定义控件图片+文字布局
  6. TurboMail成功建设某省建工集团邮件系统
  7. server宕机监控、检測、报警程序(139绑定手机短信报警)monitor_down.sh
  8. python 画三角函数_如何用python表示三角函数
  9. Liunx学习笔记--基本网络设定(测试内容)
  10. 微信小程序开发-模仿“优优老师”课程日历
  11. 产品从0~1第一步——市场分析
  12. 《RabbitMQ实战》7.warren和Shovel:故障转移和复制
  13. Debug Hacks中文版——深入调试的技术和工具
  14. wps excel查找不定位_【WPS神技能】如何在WPSExcel表格中批量查找两列数据的不同?...
  15. HTML5编写百度搜索网页,零基础打造一款属于自己的网页搜索引擎
  16. Kafka SASL SCRAM授权java开发demo
  17. PMSM的发展及研究现状
  18. 太吾绘卷加载卡54_太吾绘卷支持度卡40%解决技巧详解_可可网
  19. 陈天桥和那些散落江湖的盛大“遗珠”丨价值封面人物
  20. 基于springboot高校闲置物品交易系统微信小程序源码和论文

热门文章

  1. python动态交互式图表库_干货 | 使用pyecharts绘制交互式动态地图
  2. 大数据笔记--SparkSQL(第一篇)
  3. 如何在Microsoft Outlook中延迟传递电子邮件
  4. Android lua编辑工具,mlua app下载
  5. 电子标签芯片的组成及功能
  6. 课设舵机狗总结文——CubeMX+STM32F4+FreeRTOS+USART2+幻尔舵机控制板 实现动作组稳定运动
  7. python二维码,条形码识别
  8. 实验室认证认可辅助管理应用系统
  9. aj-report 报表设计器如何添加组件
  10. >>技术应用:用于 REST API 开发和测试的 10 大工具