TCP全连接端口扫描器是一种利用TCP协议进行端口扫描的工具,通过模拟TCP连接,对目标主机的所有端口进行扫描,并分析响应数据,从而确定目标主机开放了哪些端口。
本文将详细介绍如何使用Python编写TCP全连接端口扫描器。
确定目标主机
首先,需要确定目标主机的IP地址或域名。可以使用Python中的socket模块中的gethostbyname函数将域名解析为IP地址。
import socket
ip = socket.gethostbyname('www.baidu.com')
print(ip)
连接目标主机
确定了目标主机的IP地址之后,我们需要连接目标主机。这里使用Python中的socket模块中的socket函数创建一个套接字,然后使用connect函数连接目标主机。
import socket
ip = '192.168.1.1'
port = 80
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ip, port))
发送数据
连接目标主机成功之后,我们需要发送数据来模拟TCP连接。这里我们可以向目标主机发送一个空的数据包。因为在TCP协议中,连接建立后,客户端与服务器端会互相发送一些数据,以确认连接是否真的建立成功。
import socket
ip = '192.168.1.1'
port = 80
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ip, port))
client_socket.send(b'') # 发送一个空的数据包
接收数据
发送空的数据包之后,我们需要等待目标主机的响应。如果目标主机端口开放,它会返回一个带有特定标识符的数据包。我们可以使用recv函数接收目标主机返回的数据包。
import socket
ip = '192.168.1.1'
port = 80
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ip, port))
client_socket.send(b'') # 发送一个空的数据包
data = client_socket.recv(1024)
print(data)
整合代码
最后,我们将发送数据和接收数据的代码整合起来,用循环实现对目标主机的端口扫描。例如,扫描目标主机的1~1024端口。
import socket
ip = '192.168.1.1'
for port in range(1, 1025):
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.settimeout(0.1)
try:
client_socket.connect((ip, port))
client_socket.send(b'')
data = client_socket.recv(1024)
print(f"Port {port} is open")
except:
pass
finally:
client_socket.close()
上述代码中,我们使用了settimeout函数来设置连接超时时间,避免程序一直等待未响应的端口。
示例说明
下面是两个示例说明,用于演示如何使用Python编写TCP全连接端口扫描器。
示例1:扫描本地主机80端口
import socket
ip = '127.0.0.1'
port = 80
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.settimeout(0.1)
try:
client_socket.connect((ip, port))
client_socket.send(b'')
data = client_socket.recv(1024)
print(f"Port {port} is open")
except:
print(f"Port {port} is closed")
finally:
client_socket.close()
运行上述代码,如果本地主机80端口开放,将打印“Port 80 is open”,否则打印“Port 80 is closed”。
示例2:扫描本地主机1~1024端口
import socket
ip = '127.0.0.1'
for port in range(1, 1025):
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.settimeout(0.1)
try:
client_socket.connect((ip, port))
client_socket.send(b'')
data = client_socket.recv(1024)
print(f"Port {port} is open")
except:
pass
finally:
client_socket.close()
运行上述代码,将扫描本地主机1~1024端口,并输出开放的端口号。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python写安全小工具之TCP全连接端口扫描器 - Python技术站