Python 端口扫描器:检测开放端口与服务
端口扫描是网络安全领域的一项基本技能,它可以帮助我们了解目标主机的开放端口和服务。通过端口扫描,我们可以发现潜在的安全漏洞,评估系统的安全性,并为后续的安全防护措施提供依据。本文将使用 Python 编写一个简单的端口扫描器,用于检测开放端口及其对应的服务。
端口扫描原理
端口扫描是一种网络探测技术,通过向目标主机的端口发送特定的数据包,并根据返回的数据包来判断端口的状态。常见的端口扫描方法有:
1. TCP SYN 扫描:发送一个 SYN 数据包,如果目标端口开放,则会收到一个 SYN-ACK 数据包,否则会收到一个 RST 数据包。
2. TCP FIN 扫描:发送一个 FIN 数据包,如果目标端口开放,则会收到一个 RST 数据包,否则不会收到任何响应。
3. TCP Xmas 扫描:发送一个包含所有控制位的 TCP 数据包,如果目标端口开放,则会收到一个 RST 数据包,否则不会收到任何响应。
4. UDP 扫描:发送一个 UDP 数据包,如果目标端口开放,则会收到一个 ICMP 错误消息,否则不会收到任何响应。
Python 端口扫描器实现
下面我们将使用 Python 的 `socket` 库来实现一个简单的 TCP SYN 扫描器。
1. 导入必要的库
python
import socket
import threading
import time
2. 定义端口扫描函数
python
def scan_port(ip, port):
try:
创建一个 socket 对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
设置超时时间
sock.settimeout(1)
尝试连接目标端口
result = sock.connect_ex((ip, port))
if result == 0:
print(f"Port {port} is open, service: {get_service(ip, port)}")
else:
print(f"Port {port} is closed")
except Exception as e:
print(f"Error scanning port {port}: {e}")
finally:
关闭 socket 连接
sock.close()
3. 获取服务名称
python
def get_service(ip, port):
try:
创建一个 socket 对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
连接到 DNS 服务器
sock.connect((ip, 53))
发送 DNS 查询请求
sock.sendall(b"NS " + ip.encode() + b"x00x01x00x00x00x01x00x00")
接收响应
data = sock.recv(1024)
解析 DNS 响应
records = parse_dns_response(data)
获取服务名称
for record in records:
if record['type'] == 1:
return record['data']
return "Unknown"
except Exception as e:
print(f"Error getting service for port {port}: {e}")
finally:
关闭 socket 连接
sock.close()
4. 解析 DNS 响应
python
def parse_dns_response(data):
解析 DNS 响应
records = []
offset = 0
while offset < len(data):
获取记录类型
record_type = data[offset]
offset += 1
获取记录类
record_class = data[offset]
offset += 1
获取记录时间
record_time = data[offset:offset+4]
offset += 4
获取记录数据长度
record_data_length = data[offset:offset+2]
offset += 2
record_data_length = int.from_bytes(record_data_length, byteorder='big')
获取记录数据
record_data = data[offset:offset+record_data_length]
offset += record_data_length
解析记录
record = {
'type': record_type,
'class': record_class,
'time': record_time,
'data': record_data.decode()
}
records.append(record)
return records
5. 主函数
python
def main():
ip = input("Enter the target IP address: ")
start_port = int(input("Enter the start port: "))
end_port = int(input("Enter the end port: "))
threads = []
for port in range(start_port, end_port + 1):
创建一个线程
thread = threading.Thread(target=scan_port, args=(ip, port))
启动线程
thread.start()
将线程添加到列表
threads.append(thread)
等待所有线程完成
for thread in threads:
thread.join()
print("Port scanning completed.")
if __name__ == "__main__":
main()
总结
本文使用 Python 编写了一个简单的端口扫描器,通过 TCP SYN 扫描技术检测目标主机的开放端口及其对应的服务。在实际应用中,我们可以根据需要扩展功能,例如支持其他扫描方法、添加进度条显示扫描进度等。希望本文能帮助你了解端口扫描的基本原理和实现方法。
Comments NOTHING