0X01 SSH的建立
我想,第一步先实现简单的ssh通信再说,类似其他那种高端的C&C将逐步研究
对于ssh,python有个module叫paramiko,对没错看起来像日语单词
The introductions of some modules are as follow:
1、SSHClient类 SHClient类是SSH服务会话的高级表示,封装了传输、通道以及SFTPClient的校验、建立方法,通常用于执行命令。 1)connect方法 connect(self,hostname,port=22,username=None,password=None,pkey=None,key_filename=None,timeout=None,allow_agent=True,look_for_keys=True,compress=False) 参数说明: hostname:连接目标的主机地址 port:连接目录的端口,默认为22 username:用户名 password:密码 pkey:私钥方式用户验证 key_filename:私钥文件名 timeout:连接超时时间 allow_agent:是否允许使用ssh代理 look_for_keys:是否允许搜索私钥文件 compress:打开时是否压缩 2)exec_command方法 exec_command(self,command,bufsize=-1) 参数说明: command:执行的的指令 bufsize:文件缓冲区大小,-1不限制 3)load_system_host_keys方法 load_system_host_keys(self,filename=None) 参数说明: filename:指定远程主机的公钥文件,默认为.ssh目录下的known_hosts文件 4)set_missing_host_key_policy方法 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 参数说明: AutoAddPolicy:自动添加主机名及密钥到本地并保存,不依赖load_system_host_keys()配置,即如果known_hosts里没有远程主机的公钥时,默认连接会提示yes/no,自动yes RejectPolicy:自动拒绝未知主机名和密钥,依赖load_system_host_keys() WarnningPlicy:功能与AutoAddPolicy相同,但是未知主机会提示yes/no
2、SFTPClient类 根据SSH传输协议的sftp会话,实现远程文件上传、下载等操作。 1)from_transport方法 classmethod from_transport(cls,t) 参数说明: t:一个已通过验证的传输对象 示例:
>>> import paramiko >>> a = paramiko.Transport((“127.0.0.1″,2222)) >>> a.connect(username=”root”, password=’123456′) >>> sftp = paramiko.SFTPClient.from_transport(a)
2)put方法 put(self,localpath,remotepath,callback=None,confirm=True) 参数说明: localpath:上传源文件的本地路径 remotepath:目标路径 callback:获取接收与总传输字节数 confirm:上传完毕后是否调用stat()方法,以便确认文件大小 示例:
>>> localpath=’ftp-test.log’ >>> remotepath=’/data/ftp-test.log’ >>> sftp.put(localpath,remotepath)
3)get方法 get(self, remotepath, localpath, callback=None) 参数说明: remotepath:需要下载的远程文件 localpath:本地存储路径 callback:同put方法 4)其他方法 mkdir:用于创建目录 remove:删除目录 rename:重命名 stat:获取文件信息 listdir:获取目录列表 了解完模块,我们先尝试实现一下连接ssh:
import paramiko import datetime import os hostname = \"47.10.84.\" port=22 username = \"root\" password = \"\" ssh = paramiko.SSHClient() #创建一个ssh连接 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #目的是接受不在本地已知主机文件下的主机。missing host key很明显可以看出是指在丢失主机密钥的情况下做出什么动作,
即自动添加相应的策略
ssh.connect(hostname=hostname,port=22,username=username,password=password) stdin,stdout,stderr = ssh.exec_command(\'ls\') #传送指令 res,err = stdout.read(),stderr.read() result = res if res else err print(result) ssh.close()
很不幸的是,这种方式只能分次传送指令,下面我介绍一下另一种方式