Python 语言 用 Scapy 编写简单的端口扫描器 检测开放端口 + 服务版本

Python阿木 发布于 3 天前 6 次阅读


Scapy 编写的 Python 端口扫描器:检测开放端口与服务版本

端口扫描是网络安全领域的一项基本技能,它可以帮助我们了解目标主机的开放端口和服务信息。Scapy 是一个强大的 Python 库,可以用来构建、发送和分析网络数据包。本文将使用 Scapy 编写一个简单的端口扫描器,用于检测目标主机的开放端口并获取其服务版本信息。

Scapy 简介

Scapy 是一个交互式数据包处理程序,可以用来构建、发送、捕获、分析和操作网络数据包。它支持多种协议,包括 TCP、UDP、ICMP、ARP 等,并且可以自定义协议。Scapy 的强大之处在于它的灵活性和可扩展性,使得它可以用于各种网络分析任务。

端口扫描原理

端口扫描的基本原理是通过发送特定的网络数据包到目标主机的端口,然后根据端口的状态(开放、关闭、过滤等)来判断该端口是否开放。常见的端口扫描方法包括 TCP SYN 扫描、TCP ACK 扫描、UDP 扫描等。

Scapy 端口扫描器实现

以下是一个使用 Scapy 编写的简单端口扫描器,它可以检测目标主机的开放端口并获取其服务版本信息。

python
from scapy.all import

def scan_port(ip, port):
创建一个 TCP SYN 数据包
packet = IP(dst=ip) / TCP(dport=port, flags='S')

发送数据包并接收响应
response = sr1(packet, timeout=1, verbose=0)

检查端口状态
if response:
if response.haslayer(TCP):
if response.getlayer(TCP).flags == 0x12: SYN/ACK
print(f"Port {port} is open.")
获取服务版本信息
if response.haslayer(TCP).seq:
print(f"Service version: {response.getlayer(TCP).seq}")
elif response.getlayer(TCP).flags == 0x14: RST/ACK
print(f"Port {port} is closed.")
else:
print(f"Port {port} is filtered.")
else:
print(f"Port {port} is closed or filtered.")

def main():
target_ip = input("Enter the target IP address: ")
start_port = int(input("Enter the start port: "))
end_port = int(input("Enter the end port: "))

for port in range(start_port, end_port + 1):
scan_port(target_ip, port)

if __name__ == "__main__":
main()

代码解析

1. 导入 Scapy 库:我们需要导入 Scapy 库中的所有模块。

2. 定义 scan_port 函数:该函数负责扫描单个端口。它创建一个 TCP SYN 数据包,并发送到目标主机的指定端口。然后,它检查响应数据包,以确定端口的状态。

3. 发送数据包并接收响应:使用 `sr1` 函数发送数据包并接收响应。`timeout` 参数设置超时时间,`verbose` 参数设置输出级别。

4. 检查端口状态:根据响应数据包中的 TCP 标志位,判断端口状态。如果收到 SYN/ACK 响应,则端口开放;如果收到 RST/ACK 响应,则端口关闭;如果未收到任何响应,则端口可能被过滤。

5. 获取服务版本信息:如果端口开放,我们可以尝试获取服务版本信息。这通常需要发送特定的探测数据包,并分析响应。

6. 定义 main 函数:该函数负责获取用户输入的目标 IP 地址和端口范围,并调用 scan_port 函数扫描每个端口。

总结

本文介绍了使用 Scapy 编写 Python 端口扫描器的过程。通过发送 TCP SYN 数据包并分析响应,我们可以检测目标主机的开放端口并获取其服务版本信息。这个简单的端口扫描器可以帮助我们了解目标主机的网络配置和服务信息,从而为网络安全分析提供基础。