首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Simple /etc/shadow Cracker

Simple /etc/shadow Cracker
EN

Stack Overflow用户
提问于 2016-08-12 07:08:55
回答 1查看 621关注 0票数 0

我试图让这个影子文件破解程序工作,但我总是得到一个TypeError: integer required。

我确信这就是我使用bytearray函数的方式。我试着用bytearray为"word“和"salt”创建一个新的对象,但是没有用。于是,我尝试将字节数组构造函数传递给pbkdf2函数,但仍然一无所获。我将发布以下代码:

代码语言:javascript
复制
#!/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()

输出:

代码语言:javascript
复制
[+] 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
EN

回答 1

Stack Overflow用户

发布于 2016-08-12 07:25:42

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

代码语言:javascript
复制
rounds = int(cryptPass.split("$")[2].strip('rounds='))

此外,strip()可能不是删除前导"rounds=“的最佳方法。它可以工作,但它剥离了一组字符,而不是一个字符串。一种稍微好一点的方法是:

代码语言:javascript
复制
rounds = int(cryptPass.split("$")[2].split("=")[1])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38907450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档