抱歉,你查看的文章不存在

嗖嗖嗖!在Python中进行批量端口扫描 | 网络安全

编程应用、实战教程,不容错过

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

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

一、端口与端口范围

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

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

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

  • 1~1023号端口为公共端口,这个区间段的端口号是众所周知、约定俗成定义好的指定给了特定的网络服务,默认被分配给了各个特定的网络服务,比如Web服务的80端口,FTP服务的21端口等。当然,这些服务也可以使用其他的端口号进行服务的绑定。
  • 1024~49151,这个区间段的端口为注册端口,用于分配给用户进程或应用程序。
  • 49152~65535,这个区间段的端口为动态端口,这些端口号一般不固定分配某种服务,而是根据实际的使用情况动态地进行分配。

二、批量扫描端口

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

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

# coding:utf-8
import socket

s = socket.socket()
s.settimeout(3)

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

try:
    s.connect(('192.168.194.131',int(port)))
    print(s.recv(1024))
    s.close()
except Exception as e:
    print(">>>扫描错误:",e)

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

# coding:utf-8

'''
    批量扫描 - 州的先生 zmister.com
'''
import socket
start_port = int(input("请输入起始端口,最小为1:"))
end_port = int(input("请输入结束端口号,最大为65535:"))
print(">>>州的先生zmister.com 端口扫描器 Beta0.1")
for port in range(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()
    except Exception as e:
        pass
        # print(">>>扫描错误:",e)
print("扫描完成!")

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

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

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

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

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

# coding:utf-8
from multiprocessing.pool import ThreadPool
import socket
import time

def scan_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()
    except Exception as e:
        # 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个端口只花了两分多钟就扫描完了,还是很快的。

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

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2018-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

州的先生

1 篇文章54 人订阅

相关文章

来自专栏北京马哥教育

案例+解读,来自有道大神的17个常用Linux命令深度解析

命令后带(Mac)标记的,表示该命令在Mac OSX下测试,其它的在Debian下测试。 1. grep命令 文本查找命令, 能够使用正则表达式的方式搜索文本...

3245
来自专栏along的开发之旅

windows下chardet的安装

最近在读<<可爱的Python>>,CDays-1有个习题是:自动判定你自个儿/或是朋友的Blog 是什么编码的?

1186
来自专栏漫漫全栈路

Python开发环境—— jupyter Notebook 安装使用

这篇说一下 Linux 下配置一个 Python 的 jupyter Notebook并可以外网访问进行开发的方法,这样就可以随时轻松的使用 jupyter N...

57511
来自专栏柠檬先生

jquery 操作ajax 相关方法

jQuery.get()   使用一个HTTP GET 请求从服务器加载数据。   jQuery.get(url [,data] [,success(dat...

30510
来自专栏CRPER折腾记

Docker折腾记: (2)基于docker-compose构建yapi容器

这篇主要是用docker-compose来编排我们第一篇的内容,顺便谈谈docekr-compose的好处

1733
来自专栏coder修行路

关于python中pika模块的问题

工作中经常用到rabbitmq,而用的语言主要是python,所以也就经常会用到python中的pika模块,但是这个模块的使用,也给我带了很多问题,这里整理一...

2432
来自专栏以南小隐-数通那些事儿

Nginx1.8.1开启防盗链

1222
来自专栏封碎

android监听文件和目录的创建删除移动等事件 博客分类: Android AndroidLinuxOSAccess

      android.os下的FileObserver类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于linux的inotify。 F...

1783
来自专栏Python与爬虫

爬虫入门到精通-mongodb的基本使用

在之前我们讲解了如何爬取网页(不管是异步加载的还是普通的),但是爬取下来的数据该如何保存呢? 保存到文本文件? 可能有人会说那我保存在文本文件里面,这样也是可以...

3597
来自专栏老九学堂

编码秘籍,Java程序员必看的调试技巧

调试可以帮助我们识别和解决应用程序缺陷,老九君下面介绍的调试方法基本都是通用的,有了下面的这些技巧在开发中会让我们在编程中事半功倍,避免浪费时间! 1.条件断点...

4036

扫码关注云+社区

领取腾讯云代金券