原理
加密算法(明文,盐值) = 密文
上面是shadow文件中密码的加密公式,我们可以用Python中的crypt()函数进行上述运算,如果得出的密文与原来的一致,说明密码爆破成功。
关于盐值和shadow文件的字段详解,请移步我的这篇博客:用户、权限和组
步骤
查看shadow文件的root用户的字段:
将root用户的字段复制出来,赋给一个变量shadow_line:
shadow_line="root:$y$j9T$uEgezfJhn7Ov5naU8bzZt.$9qIqkWYObaXajS5iLDA43uFhdrtt4ZfbmiZjkZFYve2:18711:0:99999:7:::"
从shadow文件中,提取密码密文:
用split()函数分割,指定分隔符为:,取第二段字符串
crypt_text=shadow_line.split(":")[1]
从密码密文中,提取盐值:
rindex()函数从右取指定符号,输出它所在的位置
salt=crypt_text[0:crypt_text.rindex("$")]
从密码字典中,读取密码,这里没有密码字典,直接给一个值:
password="root"
将读取的密码与盐值进行加密运算,得到猜测的密码密文:
new_crypt_text=crypt.crypt(password,salt)
将得出的密码密文与原来的做对比,如果一致,说明密码猜对了:
if new_crypt_text == crypt_text:
print(f"[+] password found:{password}"")
else:
print(f"[+] password not found!")
将这些代码组成完整代码,放到一个pj.py文件中:
import crypt
shadow_line="root:$y$j9T$uEgezfJhn7Ov5naU8bzZt.$9qIqkWYObaXajS5iLDA43uFhdrtt4ZfbmiZjkZFYve2:18711:0:99999:7:::"
print(f"[+] The shadow line is {shadow_line}")
crypt_text=shadow_line.split(":")[1]
print(f"[+] The crypt text is {crypt_text}")
salt=crypt_text[0:crypt_text.rindex("$")]
print(f"[+] The salt is {salt}")
password="root"
new_crypt_text=crypt.crypt(password,salt)
if new_crypt_text == crypt_text:
print(f"[+] password is {password}"")
else:
print(f"[+] password not found!")
执行该文件,破解出密码是root: