简单的/ etc / shadow Cracker

时间:2016-08-11 23:08:55

标签: linux python-2.7

我正试图让这个影子文件破解程序工作,但我一直得到一个TypeError:整数需要。

我确定它是我使用bytearray函数的方式。我尝试使用bytearray为“word”和“salt”创建一个新对象,但无济于事。那么我尝试将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()

输出:

[+] 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

1 个答案:

答案 0 :(得分:0)

rounds变量必须是整数,而不是字符串。正确的行应该是:

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

此外,strip()可能不是删除前导“rounds =”的最佳方法。它会工作,但它会删除一组字符而不是字符串。一个稍好的方法是:

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