python实现zip密码爆破
生活随笔
收集整理的這篇文章主要介紹了
python实现zip密码爆破
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
zip文件密碼破解
這是python絕技的第一章最后的一個程序。
Python 的標(biāo)準(zhǔn)庫提供了 ZIP 文件的提取壓縮模塊 zipfile,現(xiàn)在讓我們試著用這個模塊,暴力破解出加密的 ZIP 文件!我們可以用extractall()這個函數(shù)抽取文件,密碼正確則返回正確,密碼錯誤測拋出異常。
# -*-coding:utf-8-*- import zipfile import optparse from threading import Thread#zFile = zipfile.ZipFile("evil.zip") #zFile.extractall(pwd=secret) def extractFile(zFile,password):'''破解方法:param zfile:需要破解的文件:param password:嘗試代碼:return:'''#如果口令正確,輸出口令,如果錯誤,拋出異常并測試下一個口令try:zFile.extractall(pwd=password)print("Found Password:",password)#event.set()return passwordexcept:#event.wait()passdef main():'''主函數(shù)'''parser = optparse.OptionParser("usage%prog "+"-f <zipfile> -d <dictionary>")parser.add_option('-f',dest = 'zname',type = 'string',help = 'specify zip file ')parser.add_option('-d',dest = 'dname',type = 'string',help = 'specify dictionary file')(options,args) = parser.parse_args()if (options.zname == None) | (options.dname == None):print parser.usageexit(0)else:zname = options.znamedname = options.dnamezFile = zipfile.ZipFile(zname)#實例化類passFile = open(dname)#打開字典文件for line in passFile.readlines():'''if event.isSet():print "END"returnelse:'''password = line.strip('\n')#t = threading.Thread(target=extractFile,args=(zFile,password))t = Thread(target=extractFile,args=(zFile,password))t.start()if __name__=='__main__':#event = threading.Event()main()這里為了簡便一點,所以自制了一個簡單的字典和壓縮文件做測試:
初始情況??如上圖,其中dict.txt為實驗用的字典文件,readme.txt是我自己做的筆記,文件的使用方式。evil.zip文件是這次測試的壓縮文件,壓縮密碼為secret。
字典內(nèi)容
- 開始測試
- 測試完成
端口掃描器
因為在之前,在windows上安裝nmap的時候,導(dǎo)致我的電腦不得不重裝系統(tǒng),重裝之后很多東西都需要重新配置,所以浪費了不少時間,第二章就沒有看多少,只是勉強完成了基于TCP鏈接的端口掃描,害怕再次安裝nmap使電腦又出問題,所以就沒有做nmap掃描器。
# -*- coding: utf-8 -*- #此程序為基于TCP連接的對TCP端口進行掃描的程序 import optparse from socket import * from threading import *screenLock = Semaphore(value=1)''' 第二步:我們生成兩個函數(shù):connScan和portScan.portScan函數(shù)以參數(shù)的形式接受主機名和目標(biāo)端口列表首先嘗試用gethostbyname()函數(shù)確定主機名對應(yīng)的IP地址,然后用connScan函數(shù)輸出主機名(或IP地址),并使用connScan函數(shù)嘗試逐個連接我們要連接的每個端口connScan函數(shù)接收兩個參數(shù):tgtHost和tgtPort,他會去嘗試建立與目標(biāo)主機和端口的連接,如果成功,將打印出端口開放的消息,否則打印出關(guān)閉 第三步:為了抓取目標(biāo)主機上應(yīng)用的Banner,我們必須先在connScan函數(shù)中插入一些新增的代碼。找到開放的端口后我們向他發(fā)送一個數(shù)據(jù)串并等待回應(yīng),跟進收集到的響應(yīng),我們就能推斷出目標(biāo)主機和端口上的應(yīng)用 第四步:添加線程,為提高效率我們必須引入python多線程,線程是一種能提供這類同時執(zhí)行多項任務(wù)的方法。具體到我們這個掃描器,我們要修改的是portScan()函數(shù)中迭代循環(huán)里的代碼。此處我們將connScan函數(shù)作為線程來調(diào)用。這樣迭代中創(chuàng)建的每個線程就能同時執(zhí)行第五步:速度有了提升之后,還有一個缺點。connScan函數(shù)會在屏幕上打印一個輸出。如果多個線程同時打印輸出,可能會出現(xiàn)亂碼和失序。為了讓一個函數(shù)獲得完整的屏幕控制權(quán),需要使用一個信號量semaphore。一個簡單的信號量就能阻止其他線程運行。在打印輸出前,我們執(zhí)行一個枷鎖操作(screenLock.acquire())。如果信號量還沒被鎖上,線程就有群繼續(xù)運行,并輸出打印到屏幕上。如果信號量已經(jīng)被鎖定,我們就只能等待知道有信號量的線程釋放信號量通過利用信號量,我們現(xiàn)在能夠確保在任何給定的時間點上只有一個線程可以打印屏幕。在異常處理代碼中,位于finally關(guān)鍵字前面的是種植阻塞(其他線程)之前需要執(zhí)行的代碼。 ''' def connScan(tgtHost, tgtPort):try:connSkt = socket(AF_INET, SOCK_STREAM)connSkt.connect((tgtHost, tgtPort))#向端口發(fā)送數(shù)據(jù)串并等待回應(yīng)connSkt.send('ViolentPython\r\n')results = connSkt.recv(100)#加鎖操作screenLock.acquire()print '[+]%d/tcp open' % tgtPortprint '[+]' + str(results)except:screenLock.acquire()print '[-]%d/tcp closed'% tgtPortfinally:screenLock.release()connSkt.close()def portScan(tgtHost,tgtPorts):try:tgtIP = gethostbyname(tgtHost)except:print "[-] Cannot Resolve'%s': Unknown host"% tgtHostreturntry:tgtName = gethostbyaddr(tgtIP)print '\n[+] Scan Results for: '+ tgtNmae[0]except:print '\n[+] Scan Results for: '+ tgtIPsetdefaulttimeout(1)for tgtPort in tgtPorts:t = Thread(target=connScan,args=(tgtHost,int(tgtPort)))t.start()#print 'Scaning port: ' + tgtPort#connScan(tgtHost,int(tgtPort)) ''' 第一步: 這是從用戶那里獲得主機名和端口,optparse庫解析命令行參數(shù) 調(diào)用optparse.OptionParser()會生成一個參數(shù)解析器(option parser) 的實例,接著在parser.add_option中指定這個腳本具體要解析哪個 命令行參數(shù) ''' def main():parser = optparse.OptionParser('usage %prog '+\'-H <target host> -p <target port>')parser.add_option('-H', dest = 'tgtHost', type = 'string',\help = 'specify target host')parser.add_option('-p', dest = 'tgtPort', type = 'string',\help = 'specify taret port[s] separated by comma')(options, args) = parser.parse_args()tgtHost = options.tgtHosttgtPorts = str(options.tgtPort).split(',')if (tgtHost == None) | (tgtPorts[0] == None):print parser.usageexit(0)portScan(tgtHost, tgtPorts)if __name__ == '__main__':main()- 運行情況
- 本機端口開放情況
21號端口,我自己打開了一個FTP服務(wù)器,檢測了出來,但是135端口并沒有檢測出來,我不是很懂,是因為沒有返回banner嗎?這是一個暫時還遺留的問題,有待解決。
總結(jié)
確實這周事情比較多,所以做的并不是很多,也不是很好。以后繼續(xù)努力。
總結(jié)
以上是生活随笔為你收集整理的python实现zip密码爆破的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 35. 并行和并发有什么区别?
- 下一篇: Python实现摄像头状态巡检