《Violent Python》第一章Introduction (UNIX密码破解器及

  • A+
所属分类:WooYun-Zone

原作者: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)这样出来的么?