2016-08-11 56 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])