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 password
	except:
		#event.wait()
		pass


def main():
	'''
	主函数
	'''
	parser = optparse.OptionParser("usage%prog "+"-f  -d ")
	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.usage
		exit(0)
	else:
		zname = options.zname
		dname = options.dname
	zFile = zipfile.ZipFile(zname)#实例化类
	passFile = open(dname)#打开字典文件
	for line in passFile.readlines():
		'''if event.isSet():
			print "END"
			return
		else:'''
		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()

这里为了简便一点,所以自制了一个简单的字典和压缩文件做测试:

  • 初始情况 python实现zip密码爆破_第1张图片 如上图,其中dict.txt为实验用的字典文件,readme.txt是我自己做的笔记,文件的使用方式。evil.zip文件是这次测试的压缩文件,压缩密码为secret。

  • 字典内容

python实现zip密码爆破_第2张图片

  • 开始测试

image

  • 测试完成

python实现zip密码爆破_第3张图片


端口扫描器


因为在之前,在windows上安装nmap的时候,导致我的电脑不得不重装系统,重装之后很多东西都需要重新配置,所以浪费了不少时间,第二章就没有看多少,只是勉强完成了基于TCP链接的端口扫描,害怕再次安装nmap使电脑又出问题,所以就没有做nmap扫描器。

# -*- coding: utf-8 -*- 

#此程序为基于TCP连接的对TCP端口进行扫描的程序
import optparse
from socket import *
from threading import *

screenLock = Semaphore(value=1)


'''
第二步:
	我们生成两个函数:connScanportScan.
	portScan函数以参数的形式接受主机名和目标端口列表
	首先尝试用gethostbyname()函数确定主机名对应的IP
	地址,然后用connScan函数输出主机名(IP地址),并
	使用connScan函数尝试逐个连接我们要连接的每个端口
	connScan函数接收两个参数:tgtHosttgtPort,他会去
	尝试建立与目标主机和端口的连接,如果成功,将打印
	出端口开放的消息,否则打印出关闭
第三步:
	为了抓取目标主机上应用的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' % tgtPort
		print '[+]' + str(results)
		

	except:
		screenLock.acquire()
		print '[-]%d/tcp closed'% tgtPort
	finally:
		screenLock.release()
		connSkt.close()

def portScan(tgtHost,tgtPorts):
	try:
		tgtIP = gethostbyname(tgtHost)
	except:
		print "[-] Cannot Resolve'%s': Unknown host"% tgtHost
		return
	try:
		tgtName = gethostbyaddr(tgtIP)
		print '\n[+] Scan Results for: '+ tgtNmae[0]
	except:
		print '\n[+] Scan Results for: '+ tgtIP
	setdefaulttimeout(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  -p ')
	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.tgtHost
	tgtPorts = str(options.tgtPort).split(',')
	if (tgtHost == None) | (tgtPorts[0] == None):
		print parser.usage
		exit(0)

	portScan(tgtHost, tgtPorts)

	
if __name__ == '__main__':
	main()



  • 运行情况

python实现zip密码爆破_第4张图片

  • 本机端口开放情况

python实现zip密码爆破_第5张图片

21号端口,我自己打开了一个FTP服务器,检测了出来,但是135端口并没有检测出来,我不是很懂,是因为没有返回banner吗?这是一个暂时还遗留的问题,有待解决。

总结

确实这周事情比较多,所以做的并不是很多,也不是很好。以后继续努力。


你可能感兴趣的:(python-工具编写,安全)