linux下SHA-512加密及暴力破解

news/2024/11/24 3:52:47/

文章目录

    • 1 密文解析
    • 2 手动生成密文
    • 3 暴力破解 SHA-512 加密密码

在 /etc/shadow 文件中我们可以看到如下行

lilei:$6$zvt9aWzy$aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/:18420:0:99999:7:::

文件中每行代表一个用户,使用 “:” 分隔,每行的用户信息有 9 个字段,格式如下:

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

第二段为加密密文,这段密文是怎么来的呢,我们来分析下

1 密文解析

我们拿到了加密密文,以上面的为例,密文如下:

"$6$zvt9aWzy$aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/"

首先了解 下这段密文代表什么含义:

密文由 3 部分组成,以”$”分隔,第一部分为 ID,第二部分为盐值,第三部分为加密密文

什么是ID?

ID 用来表示加密的方法,如下图
1 表示加密方法使用 MD5,5 表示 加密方法使用 SHA-2566,6 表示加密方法使用 SHA-512

密文示例:  
"$6$zvt9aWzy$aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/"$id$salt$encrypted
采用方法  盐值   加密密文  ——————————————   
ID   加密方法
1   MD5  
5   SHA-256
6   SHA-512
——————————————    

什么是盐值(salt)?

盐值就是使用随机字符码混合密码加密算法所产生的密码,作用就是即使是同一个密码,使用同一种加密方式,所产生的密文值也不同
如上面提到的密文示例:

什么是密文?

上面示例中这一段就是密文了

aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/

2 手动生成密文

了解了密文的含义,我们根据明文密码手动生成一个密文来,生成密文需要用到 python 下的 crypt 这个库,这个库下的 .crypt 方法可以根据明文密码和盐值来生成加密后的完整密文

我们还是以上面示例中密文为例,手动生成这个密文,如下所示

#coding=utf-8
import crypt
passwd = "$6$zvt9aWzy$aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/"
salt = "$6$zvt9aWzy"							# 盐值,包括前面的ID
cry_passwd = crypt.crypt("111111",salt)			# 111111 是明文密码,传入明文和盐值就可以生成密文了
print(cry_passwd)
print(cry_passwd == passwd)

结果如下:

$6$zvt9aWzy$aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/
True

可以看到生成的密文和 /etc/passwd 中的密文完全一样

3 暴力破解 SHA-512 加密密码

知道了如果生成加密密文,下面讲一下如何破解密码:

  1. 获取到盐值
  2. 将获取的盐值和猜想的密码通过 crypt.crypt() 加密后生成的密文与系统中存储的密文进行对比,如果密文相同,则输出对应的用户和密码

其实就是给出很多猜测密码,然后一个个去尝试

/home/skx/pra/wordlist.txt 存放着猜测的明文密码
/etc/shadow 存放着系统的密码

# coding=utf-8
import cryptshadow_file = "/etc/shadow"                   # 获取系统密码路径
password_file = "/home/skx/pra/wordlist.txt"    # 自己的密码文件,里面放的是明文密码def get_pass(shadow_file):used = {}                           # key是用户,value是对应的密文f = open(shadow_file, "r")        # 读取系统密码文件userline = f.readlines()            # 将该文件转换为列表格式f.close()for item in userline:                  # 遍历列表里的内容if len(item.split(":")[1]) > 3:    # 以":"分割,取第二个元素的长度,也就是完整密文值的长度,如果大于3,我们认定它有密码,把它取出来used[item.split(":")[0]] = item.split(":")[1]  # 我们将取出的密文给了相应的用户,这里的used[i.split(":")[0]]是字典的key,也就是系统中的用户名,后面的i.split(":")[1]是用户名后的加密密文return used# 提取自己的密码文件中的明文密码
def look_d(password_file):f = open(password_file, 'r')mwlist = f.readlines()              # 将读取的内容转换为列表f.close()for i, item in enumerate(mwlist):mwlist[i] = item.strip("\n")    # 去除每一行的换行符return mwlist  # 返回这个列表# 根据密文是否相同判断出对应的用户和密码
def main(user_passfile, zidian):used = get_pass(user_passfile)      # 获取用户和对用的加密密文mingwen = look_d(zidian)            # 获取所有的明文密码for user in used:passwd = used[user]             # 一次遍历每个用户的密文salt = "$6$" + passwd.split("$")[2]  # 获取盐值for passwdmw in mingwen:        # 遍历系统中的每个完整密文if passwd == crypt.crypt(passwdmw.rstrip(), salt):  # 如果我们猜想的密文与系统中的密文相同,输入它的用户名和密码print("userName:%s passWord:%s" % (user, passwdmw.rstrip()))if __name__ == "__main__":main(shadow_file, password_file)
  • wordlist.txt
111111
123456

执行结果如下:

userName:lilei passWord:111111

可以看到这样密码就被我们破解了

参考:https://blog.csdn.net/key_book/article/details/80439243


http://www.ppmy.cn/news/903654.html

相关文章

使用JohnTheRipper对有密码加密的ZIP压缩包文件进行暴力破解

背景 对加密的ZIP压缩包进行密码破解的方式有很多,网上也有很多文章,今天只介绍一种——JohnTheRipper。 JohnTheRipper 摘自百度百科: John the Ripper,是一个快速的密码破解工具,用于在已知密文的情况下尝试破解出…

实验二:文件破解(zip密码/zip伪加密/doc密码)

一、实验目的 学会使用Advanced ZIP Password Recovery、Free Word Excel password recovery wizard等工具,了解并掌握DOC、ZIP文件破解的方法 二、实验题目 2.1 破解zip密码 破解压缩包 01.zip 的密码,获取压缩包中 flag.txt 中的内容 提示&#xf…

exew文件加密:利用破解版exe文件加密器对exe文件进行加密保护(图文教程)

exew文件加密:利用破解版exe文件加密器对exe文件进行加密保护(图文教程) 目录 加密过程步骤 解密过程步骤 加密过程步骤 解密过程步骤

【每日一题Day262】LC1911最大子序列交替和 | dp

最大子序列交替和【LC1911】 一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说,数组 [4,2,5,3] 的交替和为 (4 5) - (2 3) 4 。 给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 &am…

fpga4fun.com/Music box

1.Simple beep 先做一个简单地蜂鸣器,原理是晶振通过不同的分频器分成不同的频率,通过电路发出音调不同的声音。 例子中Pluto FPGA板子有25Mhz的时钟频率,采用16位计数器(可以产生65536个不同的数值),则最…

WITH( NOLOCK)

在select查询的时候,有时为了提高查询的效率会引用入 WITH( NOLOCK) ,但是这样会引起脏读数据 eg:SELECT * FROM table1 WITH( NOLOCK) LEFT JOIN table2 WITH( NOLOCK) ON table1.atable2.b 这篇感觉不错http://www.cnblogs.com/hsapph…

锁+LOCK

--锁 总结锁(LOCKING)是最常用的并发控制机构。是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。锁是事务对某个数据库中的资源(如表和记录)存取前,先向系统提出请求,封锁该资源&#xff0…

关于Lock锁

Synchronized锁的缺陷 Synchronized不会手动释放锁资源,当线程发生阻塞后,其他线程只能眼睁睁的等着,不会分别是读线程和写线程,读问题并不会引发高并发,但是synchronized锁不能识别是读线程还是锁线程 ,遇…