port scanner【python】

该文档来自维基百科(WIKI)

端口扫描工具(Port Scanner):指用于探测服务器或主机开放端口情况的工具。常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务。

端口扫描定义是客户端向一定范围的服务器端口发送对应请求,以此确认可使用的端口。虽然其本身并不是恶意的网络活动,但也是网络攻击者探测目标主机服务,以利用该服务的已知漏洞的重要手段。[1]端口扫描的主要用途仍然只是确认远程机器某个服务的可用性。

类型

TCP扫描
最简单的端口扫描工具使用操作系统原生的网络功能,且通常作为SYN扫描的替代选项。Nmap将这种模式称为连接扫描,因为使用了类似Unix系统的connect()命令。如果该端口是开放的,操作系统就能完成TCP三次握手,然后端口扫描工具会立即关闭刚建立的该连接,防止拒绝服务攻击。[3]这种扫描模式的优势是用户无需特殊权限。但使用操作系统原生网络功能不能实现底层控制,因此这种扫描方式并不流行。并且TCP扫描很容易被发现,尤其作为端口清扫的手段:这些服务会记录发送者的IP地址,入侵检测系统可能触发警报。

SYN扫描
SYN扫描是另一种TCP扫描。端口扫描工具不使用操作系统原生网络功能,而是自行生成、发送IP数据包,并监控其回应。这种扫描模式被称为“半开放扫描”,因为它从不建立完整的TCP连接。端口扫描工具生成一个SYN包,如果目标端口开放,则会返回SYN-ACK包。扫描端回应一个RST包,然后在握手完成前关闭连接。[3]如果端口关闭了但未使用过滤,目标端口应该会持续返回RST包。

这种粗略的网络利用方式有几个优点:给扫描工具全权控制数据包发送和等待回应时长的权力,允许更详细的回应分析。关于哪一种对目标主机的扫描方式更不具备入侵性存在一些争议,但SYN扫描的优势是从不会建立完整的连接。然而,RST包可能导致网络堵塞,尤其是一些简单如打印机之类的网络设备。

UDP扫描
UDP扫描也是可能的,尽管存在一些技术挑战。 UDP是无连接协议,因此没有等同于TCP SYN的数据包。但是,如果将UDP数据包发送到未打开的端口,目标系统将响应ICMP端口不可达的消息。大多数UDP端口扫描器都使用这种扫描方法,并使用缺少响应来推断端口是否打开。但是,如果端口被防火墙阻止,则此方法将错误地报告端口已打开。如果端口不可达消息被阻塞,则所有端口将显示为打开。这种方法也受到ICMP速率限制的影响。

另一种方法是发送特定于应用程序的UDP数据包,希望生成应用层响应。例如,如果DNS服务器存在,向端口53发送DNS查询将导致响应。这种方法在识别开放端口方面更加可靠。然而,它仅限于应用程序特定的探测包可用时的端口扫描。一些工具(例如,NMAP)通常具有少于20个UDP服务的探针,而一些商业工具(例如,NESUS)有多达70个。在某些情况下,服务能在端口上被侦听,但被配置为不响应特定的探测包.

ACK扫描
ACK扫描是比较不常见的扫描类型之一,因为它不能确切地确定端口是打开的还是关闭的,但是可以确定端口是过滤的还是未过滤的。当尝试探测防火墙及其规则集的存在性时,这尤其有用。简单的包过滤将允许建立连接(带有ACK位集的包),而更复杂的有状态防火墙可能不允许

下面是python简单实现端口scanner
TCP连接测试:
在实现TCP通讯的时候,我们知道可以在客户端socket中输入主机名和端口号码连接服务器,同样我们也可以使用这种方法来尝试连接一定范围内的服务器端口:

from socket import socket,AF_INET,SOCK_STREAM
ports = range(10,10000)

for port in ports:
    s = socket(AF_INET,SOCK_STREAM)
    s.settimeout(10)
    ##s.connect_ex进行连接,如果连接成功返回0,
    ##其中主机名为:localhost可以替代其他主机的名称或者IP地址
    if not s.connect_ex(('localhost',port)):
        print(f"Opened Port:{port}")
    else:
        print(f"该端口:{port}无法连接")    

参数讲解:
AF_INET 是一个地址族,用于指定您的套接字可以与之通信的地址类型(在本例中为 Internet 协议 v4 地址)。创建套接字时,必须指定其地址族,然后只能将该类型的地址与套接字一起使用。例如,Linux内核支持29个其他地址族,如UNIX(AF_UNIX)套接字和IPX(AF_IPX),还支持与IrDA和蓝牙(AF_IrDA和AF_Bluetooth,但您是否会在如此低的级别使用这些地址系列)的通信。
所有套接字都是使用关联的地址族(即用于Internet协议的AF_INET)和通用协议类型(即SOCK_STREAM)创建的。使用SOCK_STREAM和AF_INET,它们彼此支持。
SOCK_STREAM 提供有序的、可靠的、全双工的、基于连接的字节流。可以支持带外数据传输机制。

测试结果:
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

践行~渐远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值