python实现zip密码爆破
生活随笔
收集整理的這篇文章主要介紹了
python实现zip密码爆破
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
zip文件密碼破解
這是python絕技的第一章最后的一個程序。
Python 的標準庫提供了 ZIP 文件的提取壓縮模塊 zipfile,現在讓我們試著用這個模塊,暴力破解出加密的 ZIP 文件!我們可以用extractall()這個函數抽取文件,密碼正確則返回正確,密碼錯誤測拋出異常。
# -*-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():'''主函數'''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。
字典內容
- 開始測試
- 測試完成
端口掃描器
因為在之前,在windows上安裝nmap的時候,導致我的電腦不得不重裝系統,重裝之后很多東西都需要重新配置,所以浪費了不少時間,第二章就沒有看多少,只是勉強完成了基于TCP鏈接的端口掃描,害怕再次安裝nmap使電腦又出問題,所以就沒有做nmap掃描器。
# -*- coding: utf-8 -*- #此程序為基于TCP連接的對TCP端口進行掃描的程序 import optparse from socket import * from threading import *screenLock = Semaphore(value=1)''' 第二步:我們生成兩個函數:connScan和portScan.portScan函數以參數的形式接受主機名和目標端口列表首先嘗試用gethostbyname()函數確定主機名對應的IP地址,然后用connScan函數輸出主機名(或IP地址),并使用connScan函數嘗試逐個連接我們要連接的每個端口connScan函數接收兩個參數:tgtHost和tgtPort,他會去嘗試建立與目標主機和端口的連接,如果成功,將打印出端口開放的消息,否則打印出關閉 第三步:為了抓取目標主機上應用的Banner,我們必須先在connScan函數中插入一些新增的代碼。找到開放的端口后我們向他發送一個數據串并等待回應,跟進收集到的響應,我們就能推斷出目標主機和端口上的應用 第四步:添加線程,為提高效率我們必須引入python多線程,線程是一種能提供這類同時執行多項任務的方法。具體到我們這個掃描器,我們要修改的是portScan()函數中迭代循環里的代碼。此處我們將connScan函數作為線程來調用。這樣迭代中創建的每個線程就能同時執行第五步:速度有了提升之后,還有一個缺點。connScan函數會在屏幕上打印一個輸出。如果多個線程同時打印輸出,可能會出現亂碼和失序。為了讓一個函數獲得完整的屏幕控制權,需要使用一個信號量semaphore。一個簡單的信號量就能阻止其他線程運行。在打印輸出前,我們執行一個枷鎖操作(screenLock.acquire())。如果信號量還沒被鎖上,線程就有群繼續運行,并輸出打印到屏幕上。如果信號量已經被鎖定,我們就只能等待知道有信號量的線程釋放信號量通過利用信號量,我們現在能夠確保在任何給定的時間點上只有一個線程可以打印屏幕。在異常處理代碼中,位于finally關鍵字前面的是種植阻塞(其他線程)之前需要執行的代碼。 ''' def connScan(tgtHost, tgtPort):try:connSkt = socket(AF_INET, SOCK_STREAM)connSkt.connect((tgtHost, tgtPort))#向端口發送數據串并等待回應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庫解析命令行參數 調用optparse.OptionParser()會生成一個參數解析器(option parser) 的實例,接著在parser.add_option中指定這個腳本具體要解析哪個 命令行參數 ''' 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服務器,檢測了出來,但是135端口并沒有檢測出來,我不是很懂,是因為沒有返回banner嗎?這是一個暫時還遺留的問題,有待解決。
總結
確實這周事情比較多,所以做的并不是很多,也不是很好。以后繼續努力。
總結
以上是生活随笔為你收集整理的python实现zip密码爆破的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 35. 并行和并发有什么区别?
- 下一篇: 二维码扫描器-客户端