《Violent Python》第一章Introduction (UNIX密码破解器及ZIP密码破解器的编写)中文版(乌云python,英文爱好者翻译)
原作者:Chris Katsaropoulos
第一译者:@草帽小子-DJ
第二译者:crown丶prince
你的的第一个Python程序
随着了解了如何构建python脚本,让我们开始写我们的第一个程序。在我们向前迈进前,我们将描述一些轶闻轶事,强调我们的脚本的需要。
为你的第一个程序设立个平台:
杜鹃蛋的故事
C. Stoll的《杜鹃蛋》(1989)堪称新派武侠的开山之作。它第一次把黑客活动与国家安全联系在一起。黑客极具破坏性的黑暗面也浮出海面,并且永远改变了黑客的形象。迄今仍是经久不衰的畅销书。Stoll是劳伦斯伯克利实验室的天文学家和系统管理员。1986年夏,一个区区75美分的帐目错误引起了他的警觉,在追查这次未经授权的入侵过程中,他开始卷入一个错综复杂的电脑间谍案。神秘的入侵者是西德混沌俱乐部的成员。他们潜入美国,窃取敏感的军事和安全情报。出售给克格勃,以换取现金及可卡因。一场网络跨国大搜索开始了,并牵涉出FBI、CIA、克格勃、西德邮电部等。《杜鹃蛋》为后来的黑客作品奠定了一个主题:追捕与反追捕的惊险故事。而且也开始了新模式:一个坚韧和智慧的孤胆英雄,成为国家安全力量的化身,与狡猾的对手展开传奇的较量。
(该故事已经有经典的翻译版本,可以直接参考)
下载地址:http://pan.baidu.com/s/1kTCNwMF 密码ug42
你的第一个程序,一个UNIX密码破解器!
我们只需要用标准库中的crypt模块的crypt()函数。传入密码和盐即可。
让我们赶快试一试用crypt()函数哈希一个密码试试,我们输入密码”egg”和盐”HX”,返回的哈希密码值是”HX9LLTdc/jiDE”,现在我们可以遍历整个字典,试图用常用的盐来匹配破解哈希密码!
>>>import crypt
>>>crypt.crypt(‘egg’, ‘HX’)
“HX9LLTdc/jiDE”
>>>
注意:哈希密码的前两位就是盐的前两位,这里我们假设盐只有两位。
程序分两部分,一部分是打开字典,另一部分是哈希匹配密码,
代码如下:
# coding=UTF-8
"""
暴力破解UNIX的密码,需要输入字典文件和UNIX的密码文件
"""
import crypt
def testPass(cryptPass):
salt = cryptPass[0:2]
dictfile = open('dictionary.txt', 'r') #打开字典文件
for word in dictfile.readlines():
word = word.strip('\n') #保留原始的字符,不去空格
cryptWord = crypt.crypt(word, salt)
if cryptPass == cryptWord:
print('Found passed : ', word)
return
print('Password not found !')
return
def main():
passfile = open('passwords.txt', 'r') #读取密码文件
for line in passfile.readlines():
user = line.split(':')[0]
cryptPass = line.split(':')[1].strip('')
print("Cracking Password For :", user)
testPass(cryptPass)
if __name__ == '__main__':
main()
但是现代的×NIX系统将密码存储在/etc/shadow文件中,提供了个更安全的哈希散列算法SHA-512算法,Python的标准库中hashlib模块提供了此算法,我们可以更新我们的脚本,破解SHA-512哈希散列加密算法的密码。
root@DJ-PC:/home/dj# cat /etc/shadow | grep root
root:$6$t0dy7TXs$mJxj1Ydfx83Eg0b7ry1etUQA8g7GliedT2DlnlLhiEunizJ1AAzSzQLfzV5J17D0MsZVwUVjP/0KHGV5Ue33F1:16411:0:99999:7:::
你的第二个程序:ZIP文件密码破解
Python的标准库提供了ZIP文件的提取压缩模块zipfile,现在让我们试着用这个模块,暴力破解出加密的ZIP文件!
我们可以用extractall()这个函数抽取文件,密码正确则返回正确,密码错误测抛出异常。
现在我们可以增加一些功能,将上面的单线程程序变成多线程的程序,来提高破解速度。
两个程序代码如下,注释处为单线程代码:
# coding=UTF-8
"""
用字典暴力破解ZIP压缩文件密码
"""
import zipfile
import threading
def extractFile(zFile, password):
try:
zFile.extractall(pwd=password)
print("Found Passwd : ", password)
return password
except:
pass
def main():
zFile = zipfile.ZipFile('unzip.zip')
passFile = open('dictionary.txt')
for line in passFile.readlines():
password = line.strip('\n')
t = threading.Thread(target=extractFile, args=(zFile, password))
t.start()
"""
guess = extractFile(zFile, password)
if guess:
print('Password = ', password)
return
else:
print("can't find password")
return
"""
if __name__ == '__main__':
main()
现在,我们想用户可以指定要破解的文件和字典,我们需要借助Python标准库中的optparse模块来指定参数,具体的讲解将在下一章讲解,这里我们只提供本例的代码:
# coding=UTF-8
"""
ZIP压缩文件破解程序加强版,用户可以自己指定想要破解的文件和破解字典,多线程破解
"""
import zipfile
import threading
import optparse
def extractFile(zFile, password):
try:
zFile.extractall(pwd=password)
print("Found Passwd : ", password)
except:
pass
def 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.usage)
exit(0)
else:
zname = options.zname
dname = options.dname
zFile = zipfile.ZipFile(zname)
dFile = open(dname, 'r')
for line in dFile.readlines():
password = line.strip('\n')
t = threading.Thread(target=extractFile, args=(zFile, password))
t.start()
if __name__ == '__main__':
main()
本章总结
本章我们就认识了Python的基本用法,写了一个UNIX的密码破解器和ZIP文件密码破解器,下一章我们将用Python做进一步的渗透测试!
译者的话:
《Violent Python》第一章就到此结束了,感谢乌云和乌云的小伙伴们的支持!欢迎大家提供建议。
同时,下周同一时间,请关注我们的《Violent Python》第二章!