当前位置:WooYun(白帽子技术社区) >> 英文文档翻译 >> 《Violent Python》第一章Introduction (UNIX密码破解器及ZIP密码破解器的编写)中文版(乌云python,英文爱好者翻译)

《Violent Python》第一章Introduction (UNIX密码破解器及ZIP密码破解器的编写)中文版(乌云python,英文爱好者翻译)

crown丶prince (我用双手成就你的梦想) | 2015-09-26 19:47

原作者: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》第二章!

分享到:
  1. 1#
    回复此人 感谢
    crown丶prince (我用双手成就你的梦想) | 2015-09-27 08:49

    希望能得到大家的回复与支持!同时翻译中的小错误欢迎大家指出,相互学习
    译者的话
    《Violent Python》第一章就到此结束了,感谢乌云和乌云的小伙伴们的支持!欢迎大家提供建议。
    同时,下周同一时间,请关注我们的《Violent Python》第二章!

  2. 2#
    回复此人 感谢
    F1uYu4n | 2015-09-29 16:34

    >>>import crypt
    >>>crypt.crypt(‘egg’, ‘HX’)
    “HX9LLTdc/jiDE”
    >>>

    这种加密方式从没见过啊,这啥时候的书啊

  3. 3#
    回复此人 感谢
    crown丶prince (我用双手成就你的梦想) | 2015-09-30 14:45

    @F1uYu4n 你好 首先很感谢你的关注
    这段代码原文中的解释:
    我们只需要用标准库中的crypt模块的crypt()函数。传入密码和盐即可。
    让我们赶快试一试用crypt()函数哈希一个密码试试,我们输入密码”egg”和盐”HX”,返回的哈希密码值是”HX9LLTdc/jiDE”


    而在这里我们假设了我们的salt只有两位。

    对于crypt,crypt属于python的标准库,加密算法基于DES的改进算法,主要用于UNIX

  4. 4#
    回复此人 感谢
    North | 2015-11-07 16:19

    如果是这样的sha512加密的*nix的密文,salt是O/5m1/kN这个么?
    root:$6$O/5m1/kN$GREyMnyVE7tCmBMSgJTszz/yuHcb0ZPe56qMfCJ041r4rwOu4iC78rpfdkYr9dvKdhz5l550419KBNWqAA04C1:16662:0:99999:7:::
    加密是通过hashlib.sha512("123456"+salt)这样出来的么?

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录