添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在 /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/

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

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

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

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

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

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

# coding=utf-8
import crypt
shadow_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

文章目录1 密文解析2 手动生成密文3 暴力破解 SHA-512 加密密码在 /etc/shadow 文件中我们可以看到如下行lilei:$6$zvt9aWzy$aoZDNPL0.mXFfsJczn.9gZtHZwmFTAFIbe4qHZd48zeB1mIka7jOsrmGvGMBV8LUV.iUdr6bk0hQZyGSOPiTy/:18420:0:99999:7:::文件中每行代表一个用户,使用 “:” 分隔,每行的用户信息有 9 个字段,格式如下:用户名:加密密码:最后一次修改时间:最小修改时 文件的格式为: {用户名}:{加密后的口令密码}:{口令最后修改时间距原点(1970-1-1)的天数}:{口令最小修改间隔(防止修改口令,如果时限未到,将恢复至旧口令):{口令最大修改间隔}:{口令失效前的警告天数}:{账户不活动天数}:{账号失效天数}:{保留} 其中{加密后的口令密码}的格式 哈希,英文叫做 hash。 哈希函数(hash function)可以把 任意长度的数据(字节串)计算出一个为固定长度的结果数据。 我们习惯把 要计算 的数据称之为 源数据, 计算后的结果数据称之为 哈希值(hash value)或者 摘要(digests)。 有好几种哈希函数,对应不同的算法, 常见有的 MD5, S... Python暴力破解者-SHA1 该项目旨在演示Python的暴力破解。 有三个版本。 它们的工作原理相同。 蛮力散列函数-将进行SHA1散列,并将其与前10,000个最不知名的用户密码的SHA1散列进行比较,如果找到,则会打印正确的密码。 运行“ pip3 install -r requirements.txt”运行 “ python3 NBspecial.py” 对于28行版本,或 “ python3 SHA1BruteForce3Lines.py” 适用于3线版本。 它的工作原理相同。 “ python3 SHA1BruteForce1Line.py” 1行版本。 也一样。 若要查看其工作原理,可以查看NBspecial.py文件中记录的代码。 如果收到读取错误:urllib.error.URLError:<urlopen错误[SSL:CERTIFI
注意:目前没找到可用的在线解码工具,若有伙伴有,麻烦发我一下 一、/etc/passwd /etc/passwd中一行记录对应着一个用户,每行记录又被冒号(😃 分隔为7个字段,其格式和具体含义如下: 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell 注意: /etc/passwd 文件是所有用户都可读的 2用户的密码原来直接存储在第二字段,但是为了安全,最后专门有了/etc/shadow文件,现在默认用x替代 用户的uid ,一般情况下root为0,1-499 默认为系统账号
首先,要实现 sha-3 加密,需要了解 sha-3 算法的基本原理和流程。 SHA-3(Secure Hash Algorithm 3)是一种密码散列函数,用于对输入数据(称为消息)生成唯一的较短的校验和(称为消息摘要)。与其他散列函数(如 SHA-1 和 MD5)相比,SHA-3 在保持较高安全性的同时,有更高的执行效率。 基本流程如下: 1. 对输入数据进行填充,使其满足特定的长度要求。 2. 对填充后的数据进行分块,每块大小为 b 位(b 为特定的常数)。 3. 对每一块进行哈希计算,并将结果添加到哈希值的末尾。 4. 重复步骤 3,直到处理完所有的块。 5. 对哈希值进行压缩,得到最终的消息摘要。 下面是使用 C 语言实现 sha-3 加密的一个简单示例(使用了 Keccak 算法,该算法是 SHA-3 的最终选手之一): #include <stdio.h> #include <stdlib.h> #include <string.h> #define NROUNDS 24 #define KECCAK_RATE 168 const unsigned char KeccakF_RoundConstants[NROUNDS] = { 0x01, 0x82, 0x8a, 0x00, 0x8b, 0x01, 0x81, 0x09,