2016-08-11 55 views
0

我试图让这个影子文件饼干工作,但我不断收到TypeError:所需的整数。简单的/ etc/shadow饼干

我确定它是我使用bytearray函数的方式。我已经尝试用bytearray创建一个新的对象用于“单词”和“盐”,但无济于事。所以然后我尝试将bytearray构造函数传递给pbkdf2函数,但仍然没有任何结果。我会张贴代码:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import hashlib, binascii 
import os,sys 
import crypt 
import codecs 
from datetime import datetime,timedelta 
import argparse 
today = datetime.today() 

# Takes in user and the encrypted passwords and does a simple 
# Brute Force Attack useing the '==' operator. SHA* is defined by 
# a number b/w $, the char's b/w the next $ marker would be the 
# rounds, then the salt, and after that the hashed password. 
# object.split("some symbol or char")[#], where # is the 
# location/index within the list 
def testPass(cryptPass,user): 

digest = hashlib.sha512 
dicFile = open ('Dictionary.txt','r') 
ctype = cryptPass.split("$")[1] 
if ctype == '6': 
print "[+] Hash type SHA-512 detected ..." 
print "[+] Be patien ..." 
rounds = cryptPass.split("$")[2].strip('rounds=') 
salt = cryptPass.split("$")[3] 
print "[DEBUG]: " + rounds 
print "[DEBUG]: " + salt 
# insalt = "$" + ctype + "$" + salt + "$" << COMMENTED THIS OUT 
for word in dicFile.readlines(): 
word = word.strip('\n') 
print "[DEBUG]: " + word 
cryptWord = hashlib.pbkdf2_hmac(digest().name,bytearray(word, 'utf-8'),bytearray(salt, 'utf-8'), rounds) 
if (cryptWord == cryptPass): 
    time = time = str(datetime.today() - today) 
    print "[+] Found password for the user: " + user + " ====> " + word + " Time: "+time+"\n" 
    return 
else: 
    print "Nothing found, bye!!" 
    exit 

# argparse is used in main to parse arguments pass by the user. 
# Path to shadow file is required as a argument. 
def main(): 

parse = argparse.ArgumentParser(description='A simple brute force /etc/shadow .') 
parse.add_argument('-f', action='store', dest='path', help='Path to shadow file, example: \'/etc/shadow\'') 
argus=parse.parse_args() 
if argus.path == None: 
    parse.print_help() 
    exit 
else: 
    passFile = open (argus.path,'r', 1) # ADDING A 1 INDICATES A BUFFER OF A 
for line in passFile.readlines(): # SINGLE LINE '1<=INDICATES 
line = line.replace("\n","").split(":") # EXACT BUFFER SIZE 
if not line[1] in [ 'x', '*','!' ]: 
    user = line[0] 
    cryptPass = line[1] 
    testPass(cryptPass,user) 

if __name__=="__main__": 
main() 

OUTPUT:

[+] Hash type SHA-512 detected ... 
[+] Be patien ... 
[DEBUG]: 65536 
[DEBUG]: A9UiC2ng 
[DEBUG]: hellocat 
Traceback (most recent call last): 
File "ShadowFileCracker.py", line 63, in <module> 
    main() 
    File "ShadowFileCracker.py", line 60, in main 
    testPass(cryptPass,user) 
    File "ShadowFileCracker.py", line 34, in testPass 
    cryptWord = hashlib.pbkdf2_hmac(digest().name,bytearray(word, 'utf-8'),bytearray(salt, 'utf-8'), rounds) 
TypeError: an integer is required 

回答

0

rounds变量需要是一个整数,而不是字符串。正确的路线应该是:

rounds = int(cryptPass.split("$")[2].strip('rounds=')) 

此外,strip()可能不去除领先的“轮=”最好的方法。它会起作用,但它会去掉一组字符而不是一个字符串。稍好的方法是:

rounds = int(cryptPass.split("$")[2].split("=")[1])