python开发端口扫描从入门到入狱

python开发端口扫描从入门到入狱

1. 前言

在很多时候编写程序工具的时候,能够熟练的使用库中的函数是很好的,但是也并非需要背下来,那么多的参数背下来也不容易,而且正常情况下我们不是主要搞开发的,背下来你不经常使用也会忘记,我想需要做到的应该是不懂后能够通过百度搜索函数来获取知识,看懂即可。

2. 端口扫描方式

端口扫描是网络安全领域中的一种技术,用于检测目标主机上哪些端口是开放的,从而了解目标主机上可能运行的服务和潜在的安全风险。端口扫描的方式多种多样,主要包括以下几种:

2.1. TCP扫描(全连接扫描)

原理:利用TCP协议的三次握手过程,扫描器尝试与目标主机的每个端口建立完整的TCP连接。如果连接成功,则认为该端口是开放的;如果连接失败(如被拒绝或超时),则认为该端口是关闭的。

优点:实现简单,不需要特殊权限,扫描速度快。

缺点:容易被目标主机上的防火墙或入侵检测系统(IDS)发现并记录,从而暴露扫描行为。

2.2. SYN扫描(半开放扫描)

原理:扫描器向目标端口发送一个SYN数据包(TCP三次握手中的第一个数据包),但不完成后续的三次握手过程。如果目标端口开放,会回应一个SYN-ACK数据包;如果端口关闭,会回应一个RST数据包。扫描器根据收到的回应来判断端口状态。

优点:隐蔽性较高,因为不建立完整的TCP连接,所以不会在目标主机的日志中留下记录。

缺点:需要攻击者拥有客户机的root权限,且可能被一些高级防火墙或IDS检测出来。

2.3. UDP扫描

原理:由于UDP是无连接的协议,扫描器向目标端口发送UDP数据包,并根据目标主机的回应来判断端口状态。如果目标端口未开放,通常会返回一个ICMP端口不可达消息;如果端口开放但没有相应服务监听,则可能不会有任何回应。

优点:可以扫描UDP端口,补充TCP扫描的不足。

缺点:UDP扫描的可靠性较低,因为UDP是无连接的协议,数据包可能会丢失或不被处理。此外,一些网络设备或防火墙可能会过滤或修改ICMP消息,导致扫描结果不准确。

2.4. ICMP扫描

原理:通过发送ICMP Echo请求(Ping)来检测目标主机是否在线。虽然这不是直接的端口扫描方式,但可以用来确定哪些IP地址是活动的,从而缩小后续端口扫描的范围。

优点:实现简单,可以快速确定目标网络中的活动主机。

缺点:容易被防火墙或路由器过滤掉ICMP请求和回应。

3. python编写端口扫描

现在有很多的工具都可以实现端口扫描,而很多情况下我们默认使用别人提供的工具来使用,而很少知道原理或者底层,而这次希望能够用最简单的方式来实现端口扫描,跨出脚本小子,虽然该用工具还是用工具,至少我们要懂得底层的原理是什么。

3.1. socket库

socket库是 Python 标准库中的一个重要部分,它提供了对底层网络接口的访问。通过使用 socket库,Python 程序可以创建网络连接、发送和接收数据。这使得 Python 能够实现各种网络应用,包括客户端和服务器程序、网络爬虫、聊天应用等。

3.1.1. socket库常用参数

3.1.1.1. socket.socket() 参数

family(地址族): 指定地址族,最常用的有 socket.AF_INET(IPv4 地址)和 socket.AF_INET6(IPv6 地址)。

type(套接字类型): 指定套接字类型,常用的有 socket.SOCK_STREAM(TCP 套接字,面向连接的)和 socket.SOCK_DGRAM(UDP 套接字,无连接的)。

proto(协议号): 大多数情况下,该参数为 0,因为协议是由地址族和套接字类型自动选择的。但在某些特殊情况下,可能需要显式指定协议号。

3.1.1.2. socket.bind() 参数

address(地址): 一个包含主机名和端口号的元组,用于将套接字绑定到一个特定的地址和端口上。对于 IPv4 地址,主机名可以是一个点分十进制的 IP 地址(如 '192.168.1.1')或特殊值 '0.0.0.0'(表示绑定到所有可用的网络接口)。对于 IPv6 地址,主机名应该是一个包含 IPv6 地址的字符串,并可能包括作用域 ID(对于链路本地地址)。

3.1.1.3. socket.listen() 参数

backlog(监听队列大小): 指定在拒绝连接之前,系统应该为等待接受的连接请求排队的最大数量。大多数情况下,这个值设置为 5 到 10 就足够了,但在高负载情况下可能需要更高的值。有些系统可能会忽略这个参数,并使用默认值。

3.1.1.4. socket.connect() 参数

address(地址): 一个包含服务器地址和端口号的元组,用于建立到服务器的连接。对于客户端程序,这是连接到服务器所必需的。

3.1.1.5. socket.send()socket.recv() 参数

buffer(缓冲区): 要发送或接收的数据的字节对象(bytes)。send() 方法将这个缓冲区中的数据发送到连接的套接字,而 recv() 方法从套接字接收最多 buffersize 字节的数据。

buffersize(缓冲区大小): recv() 方法的一个可选参数,指定要接收的最大字节数。如果省略此参数,则通常使用默认值(通常是 8192 字节或更大)。

3.1.1.6. 其他参数

虽然不直接作为 socket 方法的参数,但在使用 socket 库时还会遇到其他一些与套接字行为相关的参数,例如:

timeout(超时时间): 可以通过 socket.settimeout(timeout) 方法设置套接字的超时时间(以秒为单位)。如果在指定的时间内没有发生 I/O 操作,则 socket 将抛出一个 socket.timeout 异常。如果设置为 None,则表示套接字没有超时限制。

reuse_addr(地址重用): 可以通过 socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 来设置地址重用选项。这允许在同一端口上启动服务器程序的新实例,即使旧实例仍在其超时时间范围内处于 TIME_WAIT 状态。

 

 

 

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 共3条

请登录后发表评论

    请登录后查看评论内容