总字符数: 58.63K

代码: 37.36K, 文本: 13.63K

预计阅读时间: 3.69 小时

  • 身份认证
    • 禁止明文传输密码
    • 每次认证使用HASH算法加密密码传输(HASH算法加密容易、解密困难)
    • 服务器端用户数据库应加盐加密保存
  • 破解思路
    • 嗅探获取密码HASH
    • 利用漏洞登录服务器并从用户数据库获取密码HASH
    • 识别HASH类型
      • 长度字符集
    • 利用离线破解工具碰撞密码HASH
  • 优势
    • 离线不会触发密码锁定机制
    • 不会产生大量登录失败日志引起管理员注意

哈希-密码基础

专业术语

术语 解释
Plaintext:明文 加密或进行哈希计算之前的数据,通常是文本.但不总是,因为它可以是一张照片或其他文件.
Encoding:编码 这不是一种加密形式,只是一种数据表示形式.如 base64或十六进制.
Hash:哈希 hash意译是散列,音译是哈希,哈希值是散列函数的输出.哈希也可以用作动词:to hash,意思是生成某些数据的hash(散列) 值.
Brute force:暴力破解 通过尝试每个不同的密码或每个不同的密钥来破解加密
Cryptanalysis:密码分析 通过发现基础数学的弱点来攻击密码学(通过发现基数的弱点来攻击密码加密技术)

哈希(散列)函数是什么?

哈希函数介绍

​ Hash函数,又称杂凑函数、散列函数,它能够将任意长度的信息转换成固定长度的哈希值(数字摘要),并且任意不同长度消息或者文件所生成的哈希值是不一样的.

  1. 不可逆性: hash函数是没有key的,所以哈希函数是不可逆的,这意味着很难或不可能从哈希函数的输出返回到输入.即使对于相同的输入,好的哈希函数也应该产生唯一的哈希值.
  2. 固定输出大小: 哈希函数的输出是固定大小的,不论输入数据的大小.这有助于确保输出的一致性,无论输入是多大.
  3. 雪崩效应:在哈希函数或密码散列函数中,微小的输入变化会引起输出完全不同的现象.具体来说,如果输入数据发生了细微的修改,其对应的哈希值将会有很大的差异.
  4. 无碰撞性:在输入空间中的任意两个不同的输入值生成的哈希值是唯一的,不会产生碰撞
  5. 输出的编码: 哈希函数的输出通常是原始字节,可以通过不同的编码方式进行呈现,例如以64为基数的base64编码或十六进制形式.这样的编码不提供有关原始数据的有用信息.

常见的Hash算法有:

  • MD5算法:以512位数据块为单位来处理输入,产生128位的信息摘要.常用于文件校验.
  • SHA算法:以512位数据块为单位来处理输入,产生160位的哈希值,具有比MD5更强的安全性
  • SM3国产算法:消息分组长度为512比特,输出256位摘要

hash碰撞

哈希碰撞是指两个不同的输入经过哈希函数后产生相同的输出.哈希函数的设计目标是尽可能避免碰撞,但由于输入空间大于输出空间,必然存在某些输入将会产生相同的输出.然而,好的哈希算法应该使得找到碰撞变得非常困难.

MD5和SHA-1确实已经受到攻击,且存在能够制造哈希碰撞的技术,使得它们不再被认为是安全的哈希算法.在实际应用中,特别是对于密码存储等敏感场景,推荐使用更安全的哈希算法,如SHA-256、SHA-3等.

由于哈希碰撞的存在,确实不应该完全依赖于哈希算法来确保密码或数据的安全性.在密码存储中,推荐使用强大且抗碰撞能力较强的哈希算法,并结合适当的安全措施.

例如:使用盐(salt)来增加密码的复杂性。

哈希的用途

哈希用于网络安全的两个主要目的:

  1. 验证数据的完整性

  2. 验证密码

使用hash进行密码验证

​ 网络应用程序通常需要验证用户密码,明文存储密码会导致安全问题,如数据库泄露.数据泄露中常见的密码字典rockyou.txt源于明文存储的MySpace密码.密码明文存储使得攻击者能够轻松获得用户密码.

哈希函数是密码存储的安全选择,它是不可逆的,且不需要存储密钥.哈希碰撞是两个不同输入产生相同输出的情况,而彩虹表可用于快速查找哈希值对应的原始密码.为了防范相同密码的问题,可以使用增加哈希的复杂性.

Crackstation(哈希破解网站) 这样的网站内部会使用巨大的彩虹表为无盐哈希(散列)提供快速的密码破解.在已排序的哈希列表中进行查找确实非常快,比尝试直接破解哈希要快得多.

防范彩虹表

​ 为了应对彩虹表破解hash,我们可以在密码中添加一个 Salt(加盐操作).

Salt是随机生成并存储在数据库中的值,对于每个用户都是独一无二的.

​ 理论上,你可以对所有用户使用相同的salt,但这意味着重复的密码仍然具有相同的hash,并且仍然可以使用该salt创建特定的密码.

Salt被添加到密码的开头或结尾,然后进行哈希计算,这意味着即使每个用户都有相同的密码,他们也会有不同的密码哈希.像bcryptsha512crypt这样的哈希(散列)函数会自动进行加盐,盐不需要保密.

实际PHP代码中如何使用Salt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php
// 数据库参数配置
$host = 'localhost';
$dbUser = 'root';
$dbPassword = '123456';
$dbName = 'mydatabase';

// 使用mysqli对象方式创建数据库连接
$conn = new mysqli($host, $dbUser, $dbPassword);

// 检查数据库连接是否成功
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error . "</br>");
}

// 检查数据库是否存在
$db_selected = mysqli_select_db($conn, $dbName);
if (!$db_selected) {
// SQL语句,如果数据库不存在则创建数据库
$sql = "CREATE DATABASE IF NOT EXISTS $dbName";
if ($conn->query($sql) === TRUE) {
echo "Database created successfully</br>";
} else {
die("Error creating database: " . $conn->error . "</br>");
}
}

// 选择连接的数据库
$conn->select_db($dbName);

// 检查数据表是否存在
$result = $conn->query("SHOW TABLES LIKE 'users'");
if ($result->num_rows == 0) {
// SQL语句,创建一个名为users的表,如果该表不存在的话
$sql = "CREATE TABLE IF NOT EXISTS users (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL,
password VARCHAR(255) NOT NULL,
registration_date TIMESTAMP
)";

// 执行创建表的SQL语句并检查是否成功
if ($conn->query($sql) === TRUE) {
echo "Table users created successfully</br>";
} else {
die("Error creating table: " . $conn->error . "</br>");
}
}

// 获取GET请求中的参数
$action = $_GET['action']; // 获取名为'action'的GET参数,该参数用来决定是执行注册还是登录操作
$username = $_GET['username']; // 获取名为'username'的GET参数
$password = $_GET['password']; // 获取名为'password'的GET参数

// 注册用户的逻辑处理
if ($action == 'register') {
$registration_date = date('Y-m-d H:i:s'); // 获取当前时间作为注册时间
// 使用MD5加密算法对密码和注册时间进行拼接加密
$encryptedPassword = md5($password . $registration_date);

// 准备SQL语句进行插入操作
$stmt = $conn->prepare("INSERT INTO users (username, password, registration_date) VALUES (?, ?, ?)");
// 绑定参数到预处理语句
$stmt->bind_param("sss", $username, $encryptedPassword, $registration_date);
// 执行预处理语句并检查是否成功
if ($stmt->execute()) {
echo "New record created successfully</br>"; // 用户注册成功的消息
} else {
echo "Error: " . $stmt->error; // 如果注册失败,则显示错误消息
}
// 关闭预处理语句
$stmt->close();
}

// 登录用户的逻辑处理
if ($action == 'login') {
// 准备SQL语句进行用户信息检索
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
// 绑定参数到预处理语句
$stmt->bind_param("s", $username);
// 执行预处理语句
$stmt->execute();
// 获取结果集
$result = $stmt->get_result();
// 检查结果集中是否有记录(即是否有匹配的用户)
if ($result->num_rows > 0) {
// 提取结果集中的用户数据
$user = $result->fetch_assoc();
// 为了登录验证,将提交的密码和用户的注册时间再次进行MD5加密
$encryptedPassword = md5($password . $user['registration_date']);
// 比较数据库中的密码和加密后提交的密码是否一致
if ($user['password'] === $encryptedPassword) {
echo "User logged in successfully</br>"; // 用户登录成功的消息
} else {
echo "Invalid username or password</br>"; // 如果密码不匹配,则显示无效的用户名或密码
}
} else {
echo "Invalid username or password</br>"; // 如果没有匹配的用户记录,则显示无效的用户名或密码
}
// 关闭预处理语句
$stmt->close();
}

// 关闭数据库连接
$conn->close();
?>

http://127.0.0.1/salt.php?action=register&username=kill3r&password=password

http://127.0.0.1/salt.php?action=login&username=kill3r&password=password

PasswordSaltMD5 Hash
password(无salt)5f4dcc3b5aa765d61d8327deb882cf99
password2024-02-02 20:25:528b79ff043c42bcb1e287d8353418979c

不过为了提高代码的安全性,还可以考虑使用编程语言提供的密码存储和验证机制如PHP中的password_hash()password_verify()函数.并且通过POST而非GET方法传输敏感数据

彩虹表-密码基础

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法)

特点是不可逆的,一般解密不了.那有没有想过,为什么各种工具网站都可以进行MD5解密呢?

彩虹表,了解一下.

如何存储密码才是安全的?

密码存储有几种方式:

  • 直接存储密码明文m
  • 存储密码明文的哈希值hash(m)
  • 存储密码明文的加盐哈希hash(m+salt),这里的Salt可以是用户名,手机号等,但必须保证每个用户的Salt都不一样才是安全的.

如果数据库被入侵

  1. 第一种方式:明文存储,无安全性可言.
  2. 第二种方式:虽然是入侵者得到的是Hash值,但由于彩虹表的存在,也很容易批量还原出密码明文来.
  3. 只有第三种方式才是相对安全的.

彩虹表不是 密码–>明文 的简单存储

要从c=hash(m)逆向得到原始明文m,有三种办法:

  • 暴力破解法:时间成本太高.
  • 字典法:提前构建一个明文->密文对应关系的一个大型数据库,破解时通过密文直接反查明文.但存储一个这样的数据库,空间成本是惊人的.
  • 构建彩虹表:在字典法的基础上改进,以时间换空间.是现在破解哈希常用的办法.

彩虹表的前身–预先计算的散列链

预先计算的散列链

既然存储所有的明文密码对需要的空间太大,密码学家们想出了一种以计算时间降低存储空间的办法:预计算的哈希链集(Precomputed hash chains).
这是一条k=2哈希链:

K的取值不是严格规定的,而是根据具体需求和安全性考虑选择的.在密码学中,K表示哈希链的长度,即链中节点的数量.较长的哈希链可以提供更高的安全性,但会增加存储和验证的开销.

选择适当的K值需要综合考虑以下因素:

  1. 安全性要求:安全性要求较高的应用通常需要更长的哈希链来增加破解的难度.
  2. 存储空间:更长的哈希链会占用更多的存储空间,因此需要考虑存储成本和可扩展性.
  3. 验证速度:验证一个密码时,需要在哈希链上执行多次哈希运算.较长的哈希链会增加验证的时间开销.

一般而言,选择K值是一个权衡取舍的过程,根据具体应用的需求和限制来确定.不同的场景可能需要不同的K值来平衡安全性和效率.

实际应用中,可以采用除了单一的哈希函数之外的更复杂的哈希结构、加盐等技术来增加密码的安全性.K的取值范围可以根据具体需求和应用场景来确定,通常从2开始,而常见的范围可以是2到数十之间.较小的K值适用于需要较低计算和存储开销的场景,但相对较弱于攻击.较大的K值可以提供更高的安全性,但会增加计算和存储的负担.

哈希链

  • H函数就是要破解的哈希函数.

  • 约简函数(reduction function)R函数是构建这条链的时候定义的一个函数:它的值域和定义域与H函数相反.通过该函数可以将哈希值约简为一个与原文相同格式的值.

    约简函数(reduction function)又称归约函数.是彩虹表技术中的关键组成部分之一.它在散列链的构建和使用过程中发挥着重要作用.约简函数的主要目的是将散列值(密码的哈希结果)映射回原始明文密码的空间,从而在彩虹表中实现存储和破解密码的有效性和效率.

这条链是这样生成的:

  1. 随机选择初始明文 aaaaaa,通过哈希函数H(aaaaaa)进行哈希运算,得到哈希值281DAF40
    • 哈希函数H() 是一个确定性函数,将输入数据(在这种情况下是明文 aaaaaa)转换为具有固定长度的哈希值.哈希函数的特点是单向不可逆的,即无法从哈希值逆向计算出原始数据.因此,通过应用H()函数,我们可以将 aaaaaa 处理成哈希值 281DAF40.
  2. 使用约简函数 R(),将哈希值 281DAF40 约简为与原文相同格式的值,得到明文 sgfnyd.
    • 约简函数 R() 是一个定义在哈希值空间上的函数,其作用是将哈希值映射回与原始明文相同格式的值.这样做是为了使哈希链中的后续哈希值能够继续通过哈希函数生成新的哈希值.
    • 在这个例子中,``R()函数将哈希值281DAF40约简为明文sgfnyd,并确保明文的格式与最初的输入 aaaaaa` 相匹配.
  3. 将明文 sgfnyd 再次通过哈希函数 H() 进行哈希运算,得到哈希值 920ECF10.
    • 现在,我们使用哈希函数 H() 处理明文 sgfnyd,并得到哈希值 920ECF10.这个哈希值将用作哈希链中的下一个节点,它与先前的哈希值 281DAF40 相关联.
  4. 使用约简函数 R(),将哈希值 920ECF10 约简为明文 kiebgt.
    • 再次使用约简函数 R(),我们将哈希值 920ECF10 约简为明文 kiebgt.这样可以确保链中的明文保持一致,并且与之前的处理结果相匹配.

通过这些步骤的迭代,您可以构建一个哈希链,其中每个明文都通过哈希函数 H() 和约简函数 R() 相互关联.这种链的目的是验证数据的完整性和防篡改.

请注意,哈希函数的选择和约简函数的定义需要根据具体的安全需求进行.此外,在构建哈希链过程中,确保选择适当的哈希算法、安全策略和密钥管理等因素也是非常重要的.

预计算的哈希链集的使用

当刚好得到的哈希值是 920ECF10,我们可以进行以下步骤来判断是否破解了哈希链集中的(aaaaaa,kiebgt)链条.

破解成功的情况:

  • 首先,我们对哈希值 920ECF10 进行一次约简运算,得到明文 kiebgt.

  • 接下来,我们发现刚好命中了哈希链集中的(aaaaaa,kiebgt)链条.这意味着我们通过哈希链的计算过程,从初始明文 aaaaaa 开始重复计算,最终得到的哈希值恰好与目标哈希值 920ECF10 相匹配.

    • 要判断是否命中了哈希链集中的(aaaaaa,kiebgt)链条,需要按照以下步骤进行判断:
      1. 首先,将明文 aaaaaa输入哈希函数 H() 进行哈希运算得到哈希值 281DAF40,然后再输入约简函数 R(),得到约简值 sgfnyd.
      2. 将约简值 sgfnyd 输入哈希函数 H() 进行哈希运算,得到哈希值 920ECF10.
      3. 比较得到的哈希值 920ECF10 是否与输入的哈希值相同.如果相同,则说明命中了哈希链集中的(aaaaaa,kiebgt)链条.这意味着输入的哈希值与链条中的下一个哈希值相匹配,并且通过约简函数 R() 可以得到与链条中的下一个明文相匹配的约简值.
  • 由于哈希函数的单向性质,我们无法直接从哈希值逆推出原始明文.但根据我们的破解过程,我们已经确定了明文 aaaaaa 经过哈希链计算后得到的哈希值是 920ECF10,因此,我们可以说在这个特定的哈希链中,明文 aaaaaa 对应的哈希值就是 920ECF10.

  • 所以,我们可以说在这种情况下,破解成功,并确定明文 aaaaaa 对应的哈希值以及整个哈希链.

破解失败的情况:

  • “密文不是 920ECF10 而是 281DAF40“:原来我们误以为目标哈希值是 920ECF10,但实际上它是 281DAF40.
  • “第一次 R 运算后的结果并未在末节点中找到”:我们进行第一次约简运算(R 运算),但得到的结果没有在哈希链的末节点中找到对应的值.
  • “则再重复一次 H 运算+R运算”:因此,我们再进行一次哈希运算(H 运算)和约简运算(R 运算).
  • “这时又得到了末节点中的值 kiebgt“:这次在末节点中找到了值 kiebgt.
  • “于是再从头开始运算”:由于找到了目标值 kiebgt,我们可以从初始明文 aaaaaa 开始重新进行哈希链计算.
  • “可知 aaaaaa 刚好可哈希值为 281DAF40“:经过重新计算,我们确认明文 aaaaaa 对应的哈希值确实是 281DAF40.

另外,如果在重复了 k(=2)次之后仍然没有在末节点中找到对应的值,那么破解被认为失败.

预计算的哈希链集的意义

在哈希链攻击中,我们通过预先生成一组包含多条哈希链的集合,每条链的长度为k.当需要破解一个特定的哈希值时,只需要从预计算的哈希链集中找到与目标哈希值匹配的哈希链.由于每次破解只需要进行k次哈希运算,计算次数不会超过k.因此,相比于暴力破解方法,哈希链攻击能够大大节约时间.

另外,预计算的哈希链集中,每条链只保存了链的起始节点和结束节点,而不保存链中间的所有哈希值.这样相比于存储所有可能的明文哈希值,哈希链集所需的存储空间仅约为总哈希链数的倒数,即1/k.因此,哈希链攻击也大大节约了存储空间的使用.

R函数的问题

在预计算的哈希链集中,为了最大限度地发挥其作用,需要选择一个分布均匀的约简函数 R.当约简函数 R 不是分布均匀的时候,也就是当出现碰撞(两个不同的输入值得到相同的哈希值)时,就会出现下面这种情况

1
2
111 --H--> EDEDED --R--> 222 --H--> FEDEFE --R--> 333 --H--> FEFEDC --R--> 444
454 --H--> FEDECE --R--> 333 --H--> FEFEDC --R--> 444 -H--> FEGEDC --R--> 555

当两条哈希链发生重叠时,它们能够解密的明文数量远小于理论上的明文数量(即2×k).由于预计算的哈希链集只保存链条的首节点和末节点,而不保存中间的所有哈希值,因此无法快速发现这种重叠的链条.

假设有两条重叠的哈希链A和B,它们共享相同的哈希值.在解密过程中,只要找到任意一条哈希链的首节点和末节点,就可以通过逆向约简运算得到明文.然而,当存在重叠的哈希链时,其中一条链的首节点和末节点可能与另一条链的首节点和末节点相同.这意味着,在预计算的哈希链集中,实际上只能得到一条有效的链,而另一条链则被”覆盖”了,无法被利用解密其对应的明文.

因此,当发生重叠的链条时,能够解密的明文数量远小于理论上的明文数.由于预计算的哈希链集只保留了链条的首节点和末节点,无法直接检测到重复链条,因此这种重叠链条的存在需要特别注意.

彩虹表

彩虹表的出现确实解决了哈希链攻击中的链重叠问题.在传统的哈希链攻击中,通过使用相同的R函数进行多次哈希迭代,不同链中的部分哈希值可能会发生重叠,导致无法正确匹配目标哈希值.

而彩虹表引入了多个不同的R函数(R1、R2、…、Rk)来进行每一步的哈希运算.这样,在生成每条哈希链时,使用不同的R函数可以避免链重叠问题.每个R函数都会产生不同的哈希映射,从而确保生成的哈希链之间没有重叠部分.

​ 彩虹表是一种用于破解密码的方法,上图中的k=3表示每条哈希链由三个步骤组成.

​ 为了降低R函数(映射函数)的冲突概率,彩虹表使用k个不同的R函数来执行每一步的操作.

​ 具体来说,在每次迭代中,我们使用不同的R函数将哈希值映射回密码取值空间.这种密码破解方法称为彩虹表攻击.

实际的彩虹表中,哈希链通常比上面的示例要长得多.例如,在我们的例子中,全部84亿亿个sha256哈希值无法存储在彩虹表中.因此,我们可以将其转化为840亿个长度为1千万的哈希链.

在互联网上,甚至有一些预先计算好的彩虹表可以直接使用.因此,直接保存用户密码的sha256哈希值是非常不安全的做法.

这样一来,及时发生碰撞,通常会是下面的情况:

1
2
3
4
# 链条一
111 --H--> EDEDED --R1--> 222 --H--> FEDEFE --R2--> 333 --H--> FEFEDC --R3--> 444
# 链条二
454 --H--> FEDECE --R1--> 333 --H--> FEFEDC --R2--> 474 -H--> FERFDC --R3--> 909

链条1和链条2,这两个链条在某个位置上发生了碰撞,意味着它们的哈希值相同.

例如,在链条1的第二步操作后得到的哈希值与链条2的第一步操作后得到的哈希值相同.

然而,彩虹表在处理哈希碰撞时采用了一种特殊的策略.在彩虹表中,通过比较链条的末节点(即最后一个密码值),我们可以检测到碰撞,并且区分开这两个链条.换句话说,尽管它们在某个位置上产生了哈希碰撞,但由于它们最终的密码值不同,我们可以知道它们是不同的链条.

彩虹表的使用

彩虹表的使用比哈希链集稍微麻烦一些.

  • 首先,我们要假设待破解的密文位于某个哈希链的第k-1位置处.我们使用Rk函数对该密文进行逆向映射,得到一个中间值.
  • 然后,我们在彩虹表的末节点中查找这个中间值是否存在.如果找到了相应的末节点,我们可以使用起始密码验证其正确性.
  • 如果没有找到匹配的末节点,我们需要继续向前推进.我们假设密文位于第k-2位置处,然后进行Rk-1,H,Rk三步运算,得到新的中间值.
  • 然后,我们再次在彩虹表的末节点中查找这个新的中间值.如果找到匹配的末节点,我们可以使用起始密码验证其正确性.
  • 如果还是没有找到匹配的末节点,我们需要重复这个过程,每次向前推进一步,即进行Rk-1,H,Rk三步运算,直到达到最不利的情况,即需要执行完整的R1,H,…,Rk运算才能得出结论.

如果无法在当前位置找到匹配的末节点,我们需要尝试不同的推进路径,以确保最终能够覆盖所有可能性.这种迭代操作的目的是确定给定的密文是否存在于彩虹表中,并找到相应的起始密码.

彩虹表中时间、空间的平衡

对于哈希链集而言,最大计算次数是k,即在最坏情况下,需要进行k次哈希运算才能找到匹配.平均计算次数为k/2,因为每个明文经过哈希运算后,会得到两个结果,即起始密码和末节点.

而对于彩虹表来说,最大计算次数是1+2+3+...+k,即k(k-1)/2.这是因为彩虹表的每一列都需要经过不同次数的迭代运算.平均计算次数为[(k+2) * (k+1)]/6,这是根据彩虹表的结构和长度的数学推导得出的.

​ 当k值较大时,彩虹表所需要的存储空间较小,因为它的每一列只需存储起始密码和末节点.而哈希链集在相同的密文数量下,需要存储更多的中间结果.因此,相对而言,彩虹表占用的空间较小.

​ 但是,彩虹表在破解时间上可能会更长,尤其在k较大的情况下.这是因为彩虹表的计算次数较多,需要进行多次迭代运算才能找到匹配.而哈希链集由于每个明文只需要进行一次哈希运算,所以在相同的密文数量下,破解时间可能会相对较短.

因此,在选择使用哈希链集还是彩虹表时,需要综合考虑空间占用和破解时间之间的权衡.如果空间资源有限,可以选择使用彩虹表;如果追求更短的破解时间,可以选择使用哈希链集.

常见的彩虹表和R函数举例

  1. 常见的彩虹表

  2. R函数举例:假设明文为5位数字,则R函数是取哈希值中前5个数字.

彩虹表的获取

可以自己编程生成彩虹表,也可以使用RainbowCrackCain等软件来生成.彩虹表的生成时间与字符集的大小、哈希链的长度成正比,如下图中7位密码、全部字符集、哈希链长度为2万的彩虹表大小为32G,本地生成大约需要332天,而从网上下载只需要2个小时左右,主流的彩虹表的大小普遍在100G以上,想要自己生成是几乎不可能的事.

彩虹表确实像它的名字一样美好,至少黑客眼里是这样.

上表是7位以内密码在不同字符集下构造出的彩虹表的情况,彩虹表中哈希链的长度和个数随着字符集的增长而增长,彩虹表的大小和生成时间也随之成倍增加.

7位数字组合在彩虹表面前简直就是秒破,即使最复杂的7位密码不到一个小时就能破解,如果采用普通的暴力攻击,破解时间可能需要三周.

如何防御彩虹表

虽然彩虹表有着如此惊人的破解效率,但网站的安全人员仍然有办法防御彩虹表.最有效的方法就是加盐,加盐后的密码经过哈希加密得到的哈希串与加盐前的哈希串完全不同,黑客用彩虹表得到的密码根本就不是真正的密码.

即使黑客知道了的内容、加盐的位置,还需要对H函数R函数进行修改,彩虹表也需要重新生成,因此加盐能大大增加利用彩虹表攻击的难度.

归约函数

约简函数(reduction function)又称归约函数.

归约函数是一种抽象的函数概念,它用于将散列值映射回明文密码.具体的归约函数可以有不同的实现方式,但其基本目标是通过运算将散列值还原为明文密码.

一种常见的归约函数是简单的模运算.例如,可以将散列值对密码空间的大小取模,以得到还原后的明文密码.这样的归约函数可以表示为:

1
reduced_password = hash_value % password_space_size

其中,hash_value是散列值,password_space_size是密码空间的大小.

除了简单的模运算外,还可以使用其他更复杂的归约函数,例如异或运算、位移运算等.具体选择哪种归约函数取决于实际应用和安全需求.

需要注意的是,归约函数被设计为非可逆的,即从散列值到明文密码的还原过程是不可逆的.这是为了防止破解者能够轻易地通过逆向计算找到原始的明文密码.

因此,在彩虹表中,归约函数起到一个重要的作用,它影响着链的长度和破解的效率.通过选择合适的归约函数,可以在存储空间和破解速度之间做出权衡,以满足实际需求.

前置

彩虹表之所以能够实现快速破解散列值,是因为它采用了预先计算大量散列值的方式.首先,将明文密码进行散列加密,生成初始的散列值.然后,通过应用归约函数对散列值进行处理,得到新的明文密码.接着,再次进行散列加密,重复该过程多次,直到生成足够数量的散列值.

通过计算足够数量的散列值并存储在彩虹表中,可以提高破解成功的概率.当需要破解某个散列值时,只需在彩虹表中查找是否存在对应的散列值,如果存在,则可以通过归约函数逆向推导出原始明文密码.

因此,理解归约函数的作用是彩虹表技术的核心.归约函数通过将散列值映射回明文密码,使得破解过程能够倒退回原始的密码空间.通过对散列值反复应用归约函数,可以生成一条包含明文密码和散列值的数据链.通过这种方式,彩虹表实现了在较小的存储空间内存储大量散列值和对应的明文密码,从而加快了破解的速度.

作用

散列函数将原始明文密码映射为散列值,而归约函数则在彩虹表技术中将散列值映射回原始明文密码.然而,经过归约函数处理后的明文与生成该散列值的原始明文之间没有任何相似之处.

在彩虹表技术中,归约函数起到一个重要的作用,它通过一系列的操作将散列值还原为明文密码的近似值,使得破解者能够在彩虹表中查找对应的散列值.但需要明确的是,通过归约函数处理后的明文只是一个近似值,与生成该散列值的原始明文可能不完全相同.

这是因为归约函数是设计成非可逆的,即无法从散列值逆向计算出完全准确的原始明文密码.因此,经过归约函数处理后的明文密码仅仅是一个接近原始明文的候选值,而不是完全一致的结果.

彩虹表利用了归约函数的这个特性,通过存储和匹配大量的散列值和对应的归约函数处理后的明文密码,实现了快速的密码破解.破解者可以通过比对彩虹表中的散列值与归约函数处理后的明文密码,来寻找原始明文密码的近似值.

阐述归约过程

对于彩虹表技术而言,生成一条数据链的过程包括多次迭代散列和归约操作,以构建包含明文和散列值的数据序列.这样的数据链可以用来快速破解散列值,并找到原始明文密码.

rtgen工具是一个用于生成彩虹表的工具,它会执行上述的迭代过程.首先,从一个明文密码开始,通过散列函数将其转换为散列值,然后使用归约函数将散列值映射回明文密码.接下来,再次使用散列函数对归约后的明文密码进行散列,再次使用归约函数映射回明文密码.如此反复进行多次迭代操作,直到生成数据链的长度满足需求.

在生成数据链时,仅需记录数据链的第一个节点(起始明文密码和对应的散列值)和最后一个节点(最终归约后的明文密码和对应的散列值).因为在彩虹表攻击中,只需要从起始节点开始,依次进行散列和归约操作,就可以在数据链中匹配到与目标散列值相同的散列值,并获取对应的明文密码.

需要注意的是,由于归约函数是非可逆的,生成的数据链中的明文密码是经过归约函数处理后的近似值,并不与原始明文密码完全相同.因此,在使用彩虹表进行破解时,需要对近似值进行一定的容错处理,以确保找到正确的明文密码.

彩虹表破解散列值的基本思想

基于以上观察,我们可以得出以下结论:

在彩虹表技术中,为了增加破解的效率和减小空间消耗,通常会采用多个不同的归约函数.不同位置的节点会对应不同的归约函数,这是为了增加数据链的多样性和覆盖范围.

具体而言,每个数据链上的节点都包含一个明文密码和对应的散列值.每个节点通过特定的归约函数进行映射.当从链的起始节点开始进行散列和归约操作时,每次迭代都会应用不同的归约函数.

通过使用多个归约函数,可以生成多条具有不同规律和特性的数据链.这样做的目的是增加破解时的搜索空间,避免过于依赖单一的归约函数.由于不同的归约函数可能导致不同的映射结果,这意味着即使同一明文密码经过不同位置的节点进行归约,最终得到的散列值也可能不相同.

因此,通过在不同位置使用不同的归约函数,彩虹表能够覆盖更广泛的明文密码和散列值组合,提高破解效率.这样的设计能够减少数据链之间的冲突,并且可以通过使用多条数据链来提供更好的覆盖范围,提高破解成功的概率.

总结

在目前的彩虹表技术中,通常会将归约函数的数量设置为与数据链的长度相等.这意味着每个彩虹表都对应一个归约函数,并且不同的归约函数会导致相同明文生成不同的散列结果.这种设计使得彩虹表中的散列结果具有更多的随机性和多样性.

通过使用不同的归约函数,彩虹表能够更好地覆盖明文密码和散列值的组合空间,增加破解时的搜索范围.由于不同的归约函数会导致不同的映射关系,相同的明文密码经过不同位置的节点进行归约后得到的散列值也会有所不同.这意味着即使在同一数据链上,相同的明文密码也可能对应多个不同的散列值.

因此,采用不同的归约函数可以为彩虹表提供更大的随机性和覆盖范围,增加破解过程中成功匹配散列值的概率.通过引入更多的归约函数,彩虹表可以更好地抵抗针对特定归约函数的攻击,提高密码破解的难度和耗费更多的计算资源.总之,归约函数的多样性是彩虹表技术中重要的设计因素之一,为破解散列值提供了更大的挑战.

Windows 认证-密码基础

Windows Hash

分类如下:

  • LM Hash

  • NTLM Hash

  • Net-NTLM Hash

Windows Hash简介

  • Windows系统内部不保存用户的明文密码,只保存密码的Hash值

  • 本机用户的密码Hash是存放SAM%SystemRoot%\system32\config\sam文件中

  • 域内用户的密码Hash是存在域控的NTDS.DIT文件中

    • 数据库文件夹:C:\\Windows\NTDS
    • 日志文件文件夹:C:\\Windows\NTDS
    • SYSVOL文件夹:C:\\Windows\SYSVOL

Windows系统导出密码的格式如下:

1
2
用户名:RID:LM-Hash:NTLM-Hash
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
  1. 当Windows用户密码≤14个字符,SAM文件中是LM Hash值+NTLM-Hash值

  2. 当Windows用户密码>14个字符,SAM文件中是NTLM-Hash值

NTLM Hash

NTLM Hash是支持Net NTLM认证协议及本地认证过程中的一个重要参与物,其长度为32位,由数字与字母组成.

当我们登录系统的时候,系统会将用户输入的密码计算成NTLM Hash,然后与sam数据库中该用户的哈希比对,匹配则登陆成功,不匹配则登陆失败

这里提到的NTLM哈希,是一种单向哈希算法,Windows将用户的密码计算成NTLM哈希之后才存储在电脑中,对于这个概念一定要牢牢记住,因为后面NTLM Hash会经常出现

大致的运算流程为:

1
用户密码->HEX编码->Unicode编码->MD4

用python计算密码’admin’的NTLM哈希:

1
2
from passlib.hash import nthash
print(nthash.hash('admin'))
一定要保护好自己的SAM文件,现在的PE去密码也是这种方式

本地认证中用来处理用户输入密码的进程即lsass.exe,密码会在这个进程中明文保存,供该进程将密码计算成NTLM HashSAM进行比对

我们使用mimikatz来获取的明文密码,便是在这个进程中读取到的

LM Hash

  • 用户口令全部转为大写老的windows的用户名密码不区分大小写

  • 用户口令转为16进制之后不足14个字符(28位)长度,用0补足

  • 把密码的16进制字符串分成两个7byte部分

  • 每部分转换成比特流,并且长度为56bt,长度不足使用0在左边补齐长度

  • 再分7bit为一组末尾加0,转换为16进制,组成新的编码

  • 分别用key为KGS!@#$%(4B47532140232425)进行DES加密

  • 最后将二组DES加密后的编码拼接,获得LM-HASH值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 将所有小写字母转换为大写字母
123ABC #未达到7个字符
# 将密码转化为16进制,分两组,填充为14个字符,空余位使用0x00字符填补
31323341424300000000000000
# 将密码分割为两组7个字节的块
31323341424300000000000000001 # 16进制
# 将每组转化为比特流,不足56Bit则在左边加0
31323341424300->(转换为二进制)
110001001100100011001101000001010000100100001100000000->(补足56Bit)
00110001001100100011001101000001010000100100001100000000
# 将比特流按照7比特一组,分出8组,末尾加0

# 由于后者都为0,结果可想而知,都是0
# 将每组比特流转换为16进制作为被加密的值,使用DES加密,字符串"KGS!@#$%"(0x4B47532140232425)为Key,得到8个结果,每个结果转换为16进制
00110000100110001000110001101000000101000001001000001100
00000000

30988C6814120000->DES(30988C6814120C00)->48-D7-EB-91-2F-5E-69-7C
# 由于我们的密码不超过7字节,所以后面的一半是固定的:
AA-D3-B4-35-B5-14-04-EE
# 连接两个DES加密字符串.这是LM哈希.
48-D7-EB-91-2F-5E-69-7C-AA-D3-B4-35-B5-14-04-EE

本地认证流程

Windows Logon Process(即Winlogon.exe),是Windows NT用户登录程序,用于管理用户登录和退出

Lsass用于微软Windows系统的安全机制.它用于本地安全和登录策略

Net NTLM Hash(Windows 网络认证)

在内网渗透中,经常遇到工作组环境,而工作组环境是一个逻辑上的网络环境(工作区),隶属于工作组的机器之间无法互相建立一个完美的信任机制,只能点对点,是比较落后的认证方式,没有信托机构

  • 假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过
    认证才能够访问B主机上的资源

  • 最常见的服务:SMB服务端口:445

NTLM(NT LAN Manager) 协议

早期SMB协议在网络上传输明文口令.后来出现LAN Manager Challenge/Response验证机制,简称LM,它是如此简单以至很容易就被破解
微软提出了WindowsNT挑战/响应验证机制,称之为NTLM.现在已经有了更新的NTLMv2以及Kerberos验证体系.

  1. 挑战/响应–协商

​ 客户端主要在这一步向服务器确认协议的版本,是v1还是v2

  1. 挑战/响应–质询

    • 客户端向服务器端发送用户信息(用户名)请求

    • 服务器接受到请求,生成一个16位的随机数,被称之为Challenge,使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符)
      生成Challenge1.同时,生成Challenge1后,将Challenge(16位随机字符)发送给客户端Net NTLM Hash=NTLM Hash(Challenge)

    • 客户端接受到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端.

    • 服务器端收到客户端的Response后,比对Chanllenge1Response是否相等,若相等,则认证通过.

  2. 挑战/响应–认证

  3. 挑战/响应–认证流程

注意:

  1. Chanllenge是Server产生的一个16字节的随机数,每次认证都不同

  2. Response的表现形式是Net-NTLM Hash,他是由客户端提供的密码Hash加密Server返回的Chanllenge产生的结果

NTLM V2协议

NTLM v1NTLM V2最显著的区别就是Challenge.与加密算法不同,共同点就是加密的原料都是NTLM Hash.
不同点:

  1. Challage:NTLM V1Challenge有8位,NTLM V2Challenge为16位.

  2. Net-NTLM Hash:NTLM V1的主要加密算法是DES,NTLM V2的主要加密算法是HMAC-MD5

哈希类型识别

Hash-identifier

hash-identifier是一个用于识别哈希类型的工具.它可以根据输入的哈希值自动推断出哈希算法的类型.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 hash-identifier 
#########################################################################
# __ __ __ ______ _____ #
# /\ \/\ \ /\ \ /\__ _\ /\ _ `\ #
# \ \ \_\ \ __ ____ \ \ \___ \/_/\ \/ \ \ \/\ \ #
# \ \ _ \ /'__`\ / ,__\ \ \ _ `\ \ \ \ \ \ \ \ \ #
# \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \ \_\ \__ \ \ \_\ \ #
# \ \_\ \_\ \___ \_\/\____/ \ \_\ \_\ /\_____\ \ \____/ #
# \/_/\/_/\/__/\/_/\/___/ \/_/\/_/ \/_____/ \/___/ v1.1 #
# By Zion3R #
# www.Blackploit.com #
# Root@Blackploit.com #
#########################################################################

-------------------------------------------------------------------------
HASH: 46ea1712d4b13b55b3f680cc5b8b54e8

Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))

Hashid

这个工具取代了已经过时的hash-identifier!

hashID是一个使用正则表达式支持识别超过220种独特哈希类型的工具,它由Python 3编写而成.支持的哈希类型的详细列表可以在这里找到.

它能够识别单个哈希值,解析文件或读取目录中的多个文件,并识别其中的哈希值.hashID还能够在输出中包含相应的hashcat模式和/或JohnTheRipper格式.

hashID可以在任何平台上使用Python 2 ≥ 2.7.x或Python 3 ≥ 3.3,并且可以即插即用.

在Linux操作系统中识别哈希值时,请使用单引号以防止插值发生.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(root㉿kill3r)-[/opt]
└─# hashid -h

使用hashid识别用于加密数据的不同类型的哈希算法

用法:
hashid.py [-h] [-e] [-m] [-j] [-o FILE] [--version] INPUT

位置参数:
INPUT 要分析的输入(默认为STDIN)

选项:
-e, --extended 列出包括加盐密码在内的所有可能的哈希算法
-m, --mode 在输出中显示相应的Hashcat模式
-j, --john 在输出中显示相应的JohnTheRipper格式
-o FILE, --outfile FILE 将输出写入文件
-h, --help 显示此帮助消息并退出
--version 显示程序的版本号并退出

许可证: GPLv3+: GNU通用公共许可证第3版或更高版<http://gnu.org/licenses/gpl.html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
┌──(root㉿kill3r)-[/opt]
└─# hashid '0192023a7bbd73250516f069df18b500' -m
Analyzing '0192023a7bbd73250516f069df18b500'
[+] MD2
[+] MD5 [Hashcat Mode: 0]
[+] MD4 [Hashcat Mode: 900]
[+] Double MD5 [Hashcat Mode: 2600]
[+] LM [Hashcat Mode: 3000]
[+] RIPEMD-128
[+] Haval-128
[+] Tiger-128
[+] Skein-256(128)
[+] Skein-512(128)
[+] Lotus Notes/Domino 5 [Hashcat Mode: 8600]
[+] Skype [Hashcat Mode: 23]
[+] Snefru-128
[+] NTLM [Hashcat Mode: 1000]
[+] Domain Cached Credentials [Hashcat Mode: 1100]
[+] Domain Cached Credentials 2 [Hashcat Mode: 2100]
[+] DNSSEC(NSEC3) [Hashcat Mode: 8300]
[+] RAdmin v2.x [Hashcat Mode: 9900]


┌──(root㉿kill3r)-[/opt]
└─# hashid '$P$8ohUJ.1sdFw09/bMaAQPTGDNi2BIUt1' -m
Analyzing '$P$8ohUJ.1sdFw09/bMaAQPTGDNi2BIUt1'
[+] Wordpress ≥ v2.6.2 [Hashcat Mode: 400]
[+] Joomla ≥ v2.5.18 [Hashcat Mode: 400]
[+] PHPass' Portable Hash [Hashcat Mode: 400]


┌──(root㉿kill3r)-[/opt]
└─# hashid '$racf$*AAAAAAAA*3c44ee7f409c9a9b' -m
Analyzing '$racf$*AAAAAAAA*3c44ee7f409c9a9b'
[+] RACF [Hashcat Mode: 8500]

HashCat

hashcat简介

Hashcat是自称世界上最快的密码恢复工具.它在2015年之前拥有专有代码库,但现在作为免费软件发布.适用于Linux,OS X和Windows的版本可以使用基于CPU或基于GPU的变体.支持hashcat的散列算法有Microsoft LM哈希,MD4,MD5,SHA系列,Unix加密格式,MySQL和Cisco PIX等.

hashcat支持多种计算核心:

1
2
3
4
5
6
GPU
CPU
APU
DSP
FPGA
Coprocessor

GPU的驱动要求

1
2
3
4
5
6
AMD GPUs on Linux require "RadeonOpenCompute (ROCm)" Software Platform (1.6.180 or later)
AMD GPUs on Windows require "AMD Radeon Software Crimson Edition" (15.12 or later)
Intel CPUs require "OpenCL Runtime for Intel Core and Intel Xeon Processors" (16.1.1 or later)
Intel GPUs on Linux require "OpenCL 2.0 GPU Driver Package for Linux" (2.0 or later)
Intel GPUs on Windows require "OpenCL Driver for Intel Iris and Intel HD Graphics"
NVIDIA GPUs require "NVIDIA Driver" (367.x or later)

hashcat常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-r 使用自定义破解规则 
-o 指定破解成功后的 hash 及所对应的明文密码的存放位置
-m 指定要破解的 hash 类型,如果不指定类型,则默认是 MD5
-a 指定要使用的破解模式,其值参考后面对参数."-a 0" 字典攻击,"-a 1" 组合攻击;"-a 3" 掩码攻击
-D 指定 opencl 的设备类型
--show 显示已经破解的 hash 及该 hash 所对应的明文
--force 忽略破解过程中的警告信息,跑单条 hash 可能需要加上此选项
--remove 删除已被破解成功的 hash
--username 忽略 hash 文件中的指定的用户名,在破解 linux 系统用户密码 hash 可能会用到
--increment 启用增量破解模式,你可以利用此模式让 hashcat 在指定的密码长度范围内执行破解过程
--increment-min 密码最小长度,后面直接等于一个整数即可,配置 increment 模式一起使用
--increment-max 密码最大长度,同上
--outfile-format 指定破解结果的输出格式 id ,默认是 3
--self-test-disable 关闭启动自检
1
2
3
4
5
6
# -a 破解模式:
0 | Straight (字典破解)
1 | Combination (组合破解)
3 | Brute-force (掩码暴力破解)
6 | Hybrid Wordlist + Mask(字典+掩码破解)
7 | Hybrid Mask + Wordlist(掩码+字典破解)
1
2
3
4
5
# -D 指定设备类型:
1 | CPU
2 | GPU
3 | FPGA, DSP, Co-Processor
# 一般使用 -D 2 指定 GPU 破解
1
2
3
4
5
6
7
8
9
# 掩码设置:
l | abcdefghijklmnopqrstuvwxyz 纯小写字母
u | ABCDEFGHIJKLMNOPQRSTUVWXYZ 纯大写字母
d | 0123456789 纯数字
h | 0123456789abcdef 十六进制小写字母和数字
H | 0123456789ABCDEF 十六进制大写字母和数字
s | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 特殊字符
a | ?l?u?d?s 键盘上所有可见的字符
b | 0x00 - 0xff 匹配密码空格
1
2
3
4
5
6
7
8
# 掩码设置举例:
八位数字密码: ?d?d?d?d?d?d?d?d
八位未知密码: ?a?a?a?a?a?a?a?a
前四位为大写字母,后面四位为数字: ?u?u?u?u?d?d?d?d
前四位为数字或者是小写字母,后四位为大写字母或者数字: ?h?h?h?h?H?H?H?H
前三个字符未知,中间为admin,后三位未知: ?a?a?aadmin?a?a?a
6-8位数字密码: --increment --increment-min 6 --increment-max 8 ?d?d?d?d?d?d?d?d
6-8位数字+小写字母密码: --increment --increment-min 6 --increment-max 8 ?h?h?h?h?h?h?h?h
1
2
3
4
5
6
7
8
9
10
# 自定义掩码规则:
--custom-charset1 [chars]等价于 -1
--custom-charset2 [chars]等价于 -2
--custom-charset3 [chars]等价于 -3
--custom-charset4 [chars]等价于 -4

# 在掩码中用 ?1、?2、?3、?4 来表示
注意:
–custom-charset1 abcd ?1?1?1?1?1 等价于 -1 abcd ?1?1?1?1?1
-3 abcdef -4 123456 ?3?3?3?3?4?4?4?4 表示前四位可能是 adbcdef,后四位可能是 123456

hash id 对照表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
因为实在是太多了,所有我就贴一部分常见的hash类型,要想了解所有的参数可到hashcat的Wiki上去看,或者直接hashcat --help查看hash对照表
# | Name | Category
900 | MD4 | Raw Hash
0 | MD5 | Raw Hash
5100 | Half MD5 | Raw Hash
100 | SHA1 | Raw Hash
1300 | SHA2-224 | Raw Hash
1400 | SHA2-256 | Raw Hash
10800 | SHA2-384 | Raw Hash
1700 | SHA2-512 | Raw Hash
17300 | SHA3-224 | Raw Hash
17400 | SHA3-256 | Raw Hash
17500 | SHA3-384 | Raw Hash
17600 | SHA3-512 | Raw Hash
10 | md5($pass.$salt) | Raw Hash, Salted and/or Iterated
20 | md5($salt.$pass) | Raw Hash, Salted and/or Iterated
30 | md5(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated
40 | md5($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated
3800 | md5($salt.$pass.$salt) | Raw Hash, Salted and/or Iterated
3710 | md5($salt.md5($pass)) | Raw Hash, Salted and/or Iterated
4010 | md5($salt.md5($salt.$pass)) | Raw Hash, Salted and/or Iterated
4110 | md5($salt.md5($pass.$salt)) | Raw Hash, Salted and/or Iterated
2600 | md5(md5($pass)) | Raw Hash, Salted and/or Iterated
3910 | md5(md5($pass).md5($salt)) | Raw Hash, Salted and/or Iterated
4300 | md5(strtoupper(md5($pass))) | Raw Hash, Salted and/or Iterated
4400 | md5(sha1($pass)) | Raw Hash, Salted and/or Iterated
110 | sha1($pass.$salt) | Raw Hash, Salted and/or Iterated
120 | sha1($salt.$pass) | Raw Hash, Salted and/or Iterated
130 | sha1(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated
140 | sha1($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated
4500 | sha1(sha1($pass)) | Raw Hash, Salted and/or Iterated
4520 | sha1($salt.sha1($pass)) | Raw Hash, Salted and/or Iterated
4700 | sha1(md5($pass)) | Raw Hash, Salted and/or Iterated
4900 | sha1($salt.$pass.$salt) | Raw Hash, Salted and/or Iterated
14400 | sha1(CX) | Raw Hash, Salted and/or Iterated
1410 | sha256($pass.$salt) | Raw Hash, Salted and/or Iterated
1420 | sha256($salt.$pass) | Raw Hash, Salted and/or Iterated
1430 | sha256(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated
1440 | sha256($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated
1710 | sha512($pass.$salt) | Raw Hash, Salted and/or Iterated
1720 | sha512($salt.$pass) | Raw Hash, Salted and/or Iterated
1730 | sha512(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated
1740 | sha512($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated
14000 | DES (PT = $salt, key = $pass) | Raw Cipher, Known-Plaintext attack
14100 | 3DES (PT = $salt, key = $pass) | Raw Cipher, Known-Plaintext attack
14900 | Skip32 (PT = $salt, key = $pass) | Raw Cipher, Known-Plaintext attack
15400 | ChaCha20 | Raw Cipher, Known-Plaintext attack
2500 | WPA-EAPOL-PBKDF2 | Network Protocols
2501 | WPA-EAPOL-PMK | Network Protocols
16800 | WPA-PMKID-PBKDF2 | Network Protocols
16801 | WPA-PMKID-PMK | Network Protocols
7300 | IPMI2 RAKP HMAC-SHA1 | Network Protocols
7500 | Kerberos 5 AS-REQ Pre-Auth etype 23 | Network Protocols
8300 | DNSSEC (NSEC3) | Network Protocols
10200 | CRAM-MD5 | Network Protocols
11100 | PostgreSQL CRAM (MD5) | Network Protocols
11200 | MySQL CRAM (SHA1) | Network Protocols
16100 | TACACS+ | Network Protocols
16500 | JWT (JSON Web Token) | Network Protocols
121 | SMF (Simple Machines Forum) > v1.1 | Forums, CMS, E-Commerce, Frameworks
400 | phpBB3 (MD5) | Forums, CMS, E-Commerce, Frameworks
2811 | MyBB 1.2+ | Forums, CMS, E-Commerce, Frameworks
2811 | IPB2+ (Invision Power Board) | Forums, CMS, E-Commerce, Frameworks
8400 | WBB3 (Woltlab Burning Board) | Forums, CMS, E-Commerce, Frameworks
11 | Joomla < 2.5.18 | Forums, CMS, E-Commerce, Frameworks
400 | Joomla >= 2.5.18 (MD5) | Forums, CMS, E-Commerce, Frameworks
400 | WordPress (MD5) | Forums, CMS, E-Commerce, Frameworks
2612 | PHPS | Forums, CMS, E-Commerce, Frameworks
7900 | Drupal7 | Forums, CMS, E-Commerce, Frameworks
21 | osCommerce | Forums, CMS, E-Commerce, Frameworks
21 | xt:Commerce | Forums, CMS, E-Commerce, Frameworks
11000 | PrestaShop | Forums, CMS, E-Commerce, Frameworks
124 | Django (SHA-1) | Forums, CMS, E-Commerce, Frameworks
10000 | Django (PBKDF2-SHA256) | Forums, CMS, E-Commerce, Frameworks
12 | PostgreSQL | Database Server
131 | MSSQL (2000) | Database Server
132 | MSSQL (2005) | Database Server
1731 | MSSQL (2012, 2014) | Database Server
200 | MySQL323 | Database Server
300 | MySQL4.1/MySQL5 | Database Server
3100 | Oracle H: Type (Oracle 7+) | Database Server
112 | Oracle S: Type (Oracle 11+) | Database Server
12300 | Oracle T: Type (Oracle 12+) | Database Server
8000 | Sybase ASE | Database Server
15000 | FileZilla Server >= 0.9.55 | FTP Server
11500 | CRC32 | Checksums
3000 | LM | Operating Systems
1000 | NTLM | Operating Systems
500 | md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) | Operating Systems
3200 | bcrypt $2*$, Blowfish (Unix) | Operating Systems
7400 | sha256crypt $5$, SHA256 (Unix) | Operating Systems
1800 | sha512crypt $6$, SHA512 (Unix) | Operating Systems
122 | macOS v10.4, MacOS v10.5, MacOS v10.6 | Operating Systems
1722 | macOS v10.7 | Operating Systems
7100 | macOS v10.8+ (PBKDF2-SHA512) | Operating Systems
11600 | 7-Zip | Archives
12500 | RAR3-hp | Archives
13000 | RAR5 | Archives
13600 | WinZip | Archives
9700 | MS Office <= 2003 $0/$1, MD5 + RC4 | Documents
9710 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #1 | Documents
9720 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #2 | Documents
9800 | MS Office <= 2003 $3/$4, SHA1 + RC4 | Documents
9810 | MS Office <= 2003 $3, SHA1 + RC4, collider #1 | Documents
9820 | MS Office <= 2003 $3, SHA1 + RC4, collider #2 | Documents
9400 | MS Office 2007 | Documents
9500 | MS Office 2010 | Documents
9600 | MS Office 2013 | Documents
10400 | PDF 1.1 - 1.3 (Acrobat 2 - 4) | Documents
10410 | PDF 1.1 - 1.3 (Acrobat 2 - 4), collider #1 | Documents
10420 | PDF 1.1 - 1.3 (Acrobat 2 - 4), collider #2 | Documents
10500 | PDF 1.4 - 1.6 (Acrobat 5 - 8) | Documents
10600 | PDF 1.7 Level 3 (Acrobat 9) | Documents
10700 | PDF 1.7 Level 8 (Acrobat 10 - 11) | Documents
99999 | Plaintext | Plaintext

暴力破解MD5值

  1. 使用字典进行破解:hashcat -m 0 -a 0 0192023a7bbd73250516f069df18b500 top3000.txt --force --show
  1. 使用指定字符集进行破解:hashcat -a 3 -m 0 63a9f0ea7bb98050796b649e85481845 ?l?l?l?l --force --show
  1. 使用字典+掩码进行破解:hashcat -a 6 -m 0 1844156d4166d94387f1a4ad031ca5fa rockyou.txt ?d?d?d --force
  1. 使用掩码+字典进行破解:hashcat -a 7 -m 0 1844156d4166d94387f1a4ad031ca5fa ?d?d?d rockyou.txt --force

    经过测试,这里的掩码+字典组合破解,不是说简单的将掩码和字典的内容合并去重形成 1 个字典进行去重,而是说掩码的内容加上字典的内容组合成一个字典

如果破解时间太长,我们可以按s键查看破解进度,p键暂停,r键继续破解,q键退出破解

破解windows系统密码

首先,执行以下命令通过reg的save选项将注册表中的SAM、System文件导出到本地磁盘.

以管理员权限运行cmd!!!
1
2
3
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save

将这三个文件拷贝到kali中

执行以下命令获取计算机账号原始Hash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
┌──(root㉿kill3r)-[/home/kill3r]
└─# impacket-secretsdump -sam sam.save -system system.save -security security.save LOCAL
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Target system bootKey: 0xe7af37b33872d8355dd3e7d06a54a2de
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:ef04605d66ffa6396d535bb157a6f802:::
test:1001:aad3b435b51404eeaad3b435b51404ee:0cb6948805f797bf2a82807973b89537:::
[*] Dumping cached domain logon information (domain/username:hash)
[*] Dumping LSA Secrets
[*] DPAPI_SYSTEM
dpapi_machinekey:0xad14af85abe351048c63c486067b2428ce493627
dpapi_userkey:0x46711e623e1d8e4ceec4413a89ee518dd0160c44
[*] NL$KM
0000 53 0A 12 4E 1F E9 1C 75 E0 AD A1 A5 2A 74 BC C7 S..N...u....*t..
0010 2B 19 06 05 9F D1 48 BA E8 53 36 17 46 FC 5F 6E +.....H..S6.F._n
0020 5D C1 27 D5 71 57 7A 5D BA 3B 76 45 02 92 0D 50 ].'.qWz].;vE...P
0030 AA F5 D2 BC C8 11 26 FF BA 4D 64 3A CD EA 9F B1 ......&..Md:....
NL$KM:530a124e1fe91c75e0ada1a52a74bcc72b1906059fd148bae853361746fc5f6e5dc127d571577a5dba3b764502920d50aaf5d2bcc81126ffba4d643acdea9fb1
[*] Cleaning up...




test:1001:aad3b435b51404eeaad3b435b51404ee:0cb6948805f797bf2a82807973b89537:::


用户名:在这种情况下,用户名是 "test".
密码哈希:NTLM 哈希是 "aad3b435b51404eeaad3b435b51404ee".
LM 哈希:LM 哈希被表示为空,即 "31d6cfe0d16ae931b73c59d7e0c089c0".
1
2
3
4
5
┌──(root㉿kill3r)-[/home/kill3r]
└─# hashcat -a 0 -m 1000 0cb6948805f797bf2a82807973b89537 /opt/PasswordDic/用户名和密码/密码/15w密码字典.txt
┌──(root㉿kill3r)-[/home/kill3r]
└─# hashcat -a 0 -m 1000 0cb6948805f797bf2a82807973b89537 /opt/PasswordDic/用户名和密码/密码/15w密码字典.txt --show
0cb6948805f797bf2a82807973b89537:test

John the Ripper

John

John the Ripper是一个快速的密码破解工具,用于在已知密文的情况下尝试破解出明文,支持目前大多数的加密算法,如DES、MD4、MD5等.它支持多种不同类型的系统架构,包括Unix、Linux、Windows、DOS模式、BeOS和OpenVMS,主要目的是破解不够牢固的Unix/Linux系统密码.除了在各种Unix系统上最常见的几种密码哈希类型之外,它还支持Windows LM散列,以及社区增强版本中的许多其他哈希和密码.它是一款开源软件.Kali中自带John

  • 可执行文件位置: /usr/sbin/john
  • 密码字典所在目录: /usr/share/john/

john - John the Ripper密码破解器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
┌──(root㉿kill3r)-[/opt]
└─# john
John the Ripper密码破解器,版本: 1.7.9-jumbo-7_omp [linux-x86-sse2]
版权所有 (c) 1996-2012 Solar Designer和其他人
主页: http://www.openwall.com/john/

用法: john [选项] [密码文件]
--config=FILE 使用FILE而不是john.conf或john.ini
--single[=SECTION] "single crack"模式
--wordlist[=FILE] --stdin 从文件或stdin读取单词的wordlist模式
--pipe 像--stdin一样,但批量读取,并允许规则
--loopback[=FILE] 类似于--wordlist,但从.pot文件中获取单词
--dupe-suppression 在wordlist中禁止所有重复项(并强制预加载)
--encoding=NAME 输入数据为非ASCII(例如UTF-8,ISO-8859-1).
要查看NAME的完整列表,请使用--list=encodings
--rules[=SECTION] 启用wordlist模式的单词篡改规则
--incremental[=MODE] "incremental"模式[使用节MODE]
--markov[=OPTIONS] "Markov"模式(参见doc/MARKOV)
--external=MODE 外部模式或单词过滤器
--stdout[=LENGTH] 仅输出候选密码[最多LENGTH个字符]
--restore[=NAME] 恢复中断的会话[名为NAME]
--session=NAME 为新会话指定名称NAME
--status[=NAME] 打印会话的状态[名为NAME]
--make-charset=FILE 创建字符集文件.它将被覆盖
--show[=LEFT] 显示破解的密码[如果=LEFT,则未破解]
--test[=TIME] 运行测试和基准,每个测试持续TIME秒
--users=[-]LOGIN|UID[,..] [不]仅加载此(这些)用户
--groups=[-]GID[,..] [不]仅加载具有此(这些)组的用户
--shells=[-]SHELL[,..] [不]仅加载具有此(这些)shell的用户
--salts=[-]COUNT[:MAX] [无]加载COUNT [至MAX]个哈希的盐
--pot=NAME 要使用的pot文件
--format=NAME 强制使用哈希类型NAME: afs bf bfegg bsdi crc32 crypt
des django dmd5 dominosec dragonfly3-32 dragonfly3-64
dragonfly4-32 dragonfly4-64 drupal7 dummy dynamic_n
epi episerver gost hdaa hmac-md5 hmac-sha1
hmac-sha224 hmac-sha256 hmac-sha384 hmac-sha512
hmailserver ipb2 keepass keychain krb4 krb5 lm lotus5
md4-gen md5 md5ns mediawiki mscash mscash2 mschapv2
mskrb5 mssql mssql05 mysql mysql-sha1 nethalflm netlm
netlmv2 netntlm netntlmv2 nsldap nt nt2 odf office
oracle oracle11 osc pdf phpass phps pix-md5 pkzip po
pwsafe racf rar raw-md4 raw-md5 raw-md5u raw-sha
raw-sha1 raw-sha1-linkedin raw-sha1-ng raw-sha224
raw-sha256 raw-sha384 raw-sha512 salted-sha1 sapb
sapg sha1-gen sha256crypt sha512crypt sip ssh
sybasease trip vnc wbb3 wpapsk xsha xsha512 zip
--list=WHAT 列出功能,参见--list=help或doc/OPTIONS
--save-memory=LEVEL 启用内存节省,在LEVEL 1..3之间
--mem-file-size=SIZE 用于wordlist预加载的大小阈值(默认为5 MB)
--nolog 禁止创建和写入john.log文件
--crack-status 每次破解密码时发出状态行
--max-run-time=N 在N秒后平滑退出
--regen-lost-salts=N 重新生成丢失的盐(参见doc/OPTIONS)
--plugin=NAME[,..] 加载此(这些)动态插件

john 使用示例

1
2
3
4
5
6
echo '$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu' >1
┌──(root㉿kill3r)-[/opt]
└─# john 1 --show
?:snoopy

1 password hash cracked, 0 left

john 破解windows密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──(root㉿kill3r)-[/home/kill3r]
└─# echo '0cb6948805f797bf2a82807973b89537' > 1.txt
# 执行以下命令进行破解
┌──(root㉿kill3r)-[/home/kill3r]
└─# john 1.txt -format=NT
Using default input encoding: UTF-8
Loaded 1 password hash (NT [MD4 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=4
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst
test (?)
1g 0:00:00:00 DONE 2/3 (2023-08-15 18:08) 100.0g/s 38400p/s 38400c/s 38400C/s lacrosse..larry
Use the "--show --format=NT" options to display all of the cracked passwords reliably
Session completed.

┌──(root㉿kill3r)-[/home/kill3r]
└─# john 1 -format=NT --show
?:test

1 password hash cracked, 0 left

Ophcrack

Ophcrack 是一款流行的开源密码破解工具,用于恢复 Windows 系统用户密码.Ophcrack 使用预先计算的彩虹表(rainbow table)来加快密码破解过程.彩虹表是一种密码哈希值和对应明文密码的大规模预计算表格,可以显著提高密码破解效率.

简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
┌──(root㉿kill3r)-[/opt/PasswordDic/密码]
└─# ophcrack-cli
ophcrack 3.8.0由Objectif Securite(http://www.objectif-securite.ch)开发

用法:ophcrack [OPTIONS]
使用彩虹表破解Windows密码
-a 禁用审计模式(默认)
-A 启用审计模式
-b 禁用暴力破解
-B 启用暴力破解(默认)
-c config_file 指定要使用的配置文件
-D 显示(大量的!)调试信息
-d dir 指定表的基本目录
-e 不显示空密码
-f file 从指定的文件加载哈希值(pwdump或会话)
-g 禁用图形用户界面(GUI)
-h 显示此信息
-i 隐藏用户名
-I 显示用户名(默认)
-l file 将所有输出记录到指定的文件
-n num 指定要使用的线程数
-o file 将破解结果以pwdump格式写入文件
-p num 预加载(0无,1索引,2索引+结束,3全部默认)
-q 静默模式
-r 在ophcrack启动时启动破解(仅限GUI)
-s 禁用会话自动保存
-S session_file 指定用于自动保存搜索进度的文件
-u 破解结束时显示统计信息
-t table1[,a[,b,...]][:table2[,a[,b,...]]]
指定要在-d给出的目录中使用的表
-v 冗长模式
-w dir 从目录dir中的加密SAM文件加载哈希值
-x file 将数据以CSV格式导出到文件

示例:ophcrack -g -d /path/to/tables -t xp_free_fast,0,3:vista_free -f in.txt

使用命令行启动ophcrack,使用路径/path/to/tables/xp_free_fast中的表0和3以及路径/path/to/tables/vista_free中的所有表,并破解来自in.txt文件的哈希值
# tables可通过https://ophcrack.sourceforge.io/tables.php下载

pwcrack-framework

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
┌──(root㉿kill3r)-[/opt/pwcrack]
└─# git clone https://github.com/L-codes/pwcrack-framework
┌──(root㉿kill3r)-[/opt/pwcrack]
└─# cd pwcrack-framework
┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework]
└─# bundle update
┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework]
└─# bundle install
┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework]
└─# banner view
┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework]
└─# ./pwcrack banner


"$$$$$$'' 'M$ '$$$@m
:$$$$$$$$$$$$$$''$$$$'
'$' 'JZI'$$& $$$$'
'$$$ '$$$$
$$$$ J$$$$'
m$$$$ $$$$,
$$$$@ '$$$$_ pwcrack-framework
'1t$$$$' '$$$$<
'$$$$$$$$$$' $$$$ version 1.19.0
'@$$$$' $$$$'
'$$$$ '$$$@
'z$$$$$$ @$$$
r$$$ $$|
'$$v c$$
'$$v $$v$$$$$$$$$#
$$x$$$$$$$$$twelve$$$@$'
@$$$@L ' '<@$$$$$$$$`
$$ '$$$


[ Github ] https://github.com/L-codes/pwcrack-framework

[ Plugin Count ]

Online Plugin: 23 Offline Plugin: 37
supporting algorithms: 60

[ Algorithm Plugin Count ]

serv_u: 21 md5: 21 sha1: 13
dedecms: 10 md5_16: 10 mysql: 8
ntlm: 7 sha512: 7 sha256: 7
mysql3: 6 md4: 4 lm: 4
sha384: 3 mssql: 2 zfsoft: 1
xshell: 1 xftp: 1 websphere: 1
uportal2800: 1 trswcm: 1 signer: 1
seeyon_nc: 1 seeyon_analyze_icloud: 1 seeyon_a8: 1
securecrt_v2: 1 securecrt: 1 richmail: 1
qizhi_php: 1 navicat12: 1 navicat11: 1
mobaxterm: 1 mac_osx_vnc: 1 lsrunase: 1
landray_ekp: 1 juniper_type9: 1 interlib: 1
h3c_imc: 1 h3c_huawei: 1 h3c_cvm: 1
grafana: 1 gpp: 1 foxmail: 1
foxmail6: 1 flashfxp: 1 finereport: 1
finalshell: 1 filezilla: 1 druid_rsa: 1
dongao_rc4: 1 whirlpool: 1 sha224: 1
ripemd320: 1 ripemd256: 1 ripemd160: 1
ripemd128: 1 mdc2: 1 md2: 1
dahan_jis: 1 d3des_vnc: 1 cisco_vpn: 1
cisco_type7: 1

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
用法: ./pwcrack [选项] (密文|获取|横幅|初始化数据库) [算法...]
-q, --quiet 发现明文后立即退出
-t, --timeout 秒 指定请求超时时间 [默认值: 4]
-o, --open-timeout 秒 指定TCP打开超时时间 [默认值: 8]
-r, --retry 次数 重试次数 [默认值: 1]
-i, --retry-interval 秒 重试间隔秒数 [默认值: 0.5]
-s, --select 插件名称 指定插件 (插件1[,插件2...])
-x, --proxy "协议://IP:端口" 设置代理
-v, --verbose 以详细模式运行
-d, --debug 以调试模式运行
--nocolor 禁用彩色输出
--version 显示版本

使用示例:
./pwcrack banner
./pwcrack initdb
./pwcrack e10adc3949ba59abbe56e057f20f883e
./pwcrack e10adc3949ba59abbe56e057f20f883e md5
./pwcrack base64:ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UK -s pmd5

简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework]
└─# ./pwcrack e10adc3949ba59abbe56e057f20f883e
[+] Cipher Algorithm: MD2 or MD4 or MD5 or MDC2 or LM or NTLM or RIPEMD128 or RICHMAIL or UPORTAL2800 or NAVICAT12 or INTERLIB or FOXMAIL or FOXMAIL6 or FLASHFXP or NAVICAT11 or SECURECRT or D3DES_VNC or SEEYON_NC or SEEYON_ANALYZE_ICLOUD

( 0.69s) bugbank: 123456
( 0.69s) cmd5la: 包含123456的字符串
( 0.64s) ttmd5: 123456
( 0.78s) localdb: 123456
( 2.09s) hashes: 123456
( 2.18s) gromweb: 123456
( 2.22s) md5_my_addr: 123456
( 2.87s) dehash: 123456
( 2.88s) md5cracker: 123456

[+] PWCrack (9/33) in 21.21 seconds.



┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework]
└─# ./pwcrack e10adc3949ba59abbe56e057f20f883e md5
[+] Cipher Algorithm: MD5

( 0.40s) cmd5la: 包含123456的字符串
( 0.45s) localdb: 123456
( 0.38s) ttmd5: 123456
( 0.41s) bugbank: 123456
( 0.74s) cmd5: 123456
( 1.00s) cmd5en: 123456
( 1.17s) md5_my_addr: 123456
( 1.85s) gromweb: 123456
( 1.84s) md5cracker: 123456
( 4.13s) hashes: 123456
( 6.30s) dehash: 123456

[+] PWCrack (11/21) in 20.61 seconds.

RainbowCrack

  • 基于时间记忆权衡技术生成彩虹表
  • 提前计算密码的HASH值,通过比对HASH值破解密码
  • 计算HASH的速度很慢,修改版支持CUDA GPU
  • Kali中包含的RainbowCrack工具
    • rtgen:预计算,生成彩虹表,耗时的阶段
    • rtsort:对rtgen生成的彩虹表进行排序
    • tcrack:查找彩虹表破解密码
    • 以上命令必须顺序使用

简介

彩虹表攻击(RainbowCrack)是利用彩虹表破解哈希数据的工具.它实现了由PhILippe Oechslin提倡的”以空间换时间”的技术思想

在进行彩虹表离线破解时,我们需要拥有目标Hash散列值

暴力破解

这种密码破解的方式有别于暴力破解,暴力破解攻击首先计算密码的备选值(字典里的密码)的Hash值,然后再将计算出来的Hash与获取到的Hash进行对比,如果这两个值相等,则确定Hash的原始内容即是密码;否则就说明密码不正确

彩虹表破解法

彩虹表破解的效率也高于暴力破解法,因为暴力破解法必须计算字典内容的Hash值然后进行匹配,而使用"以空间换时间"技术的彩虹表破解法,实现就计算好了字典各项的Hash值,破解过程只是简单的数值比较,所以效率更高

彩虹表的组成方式

彩虹表的组成方式实际是以指定数量,或者无数条彩虹链组成的

RainbowCrack implements

Kali Linux收录了RainbowCrack的三大工具.在破解Hash时,您必须依次使用这些工具.

  • rtgen:生成彩虹表的程序.生成彩虹表的计算过程也被称为彩虹表的预计算阶段.彩虹表包含字典、哈希值、哈希算法、字符集以及字典的长度范围.彩虹表的预计算相当费时.但是生成彩虹表之后,彩虹表破解法将比暴力破解法的效率要高上不少.rtgen程序支持的算法有LanMan、NTLM、MD2、MD4、MD5、SHA1以及RIPEMD160
  • rtsort:对rtgen生成的彩虹表进行排序的工具
  • rcrack:利用彩虹表查找哈希值的工具

而Windows端我们使用rainbowcrack即可

rtgen生成

rtgen支持算法:LanMan、NTLM、MD2、MD4、MD5、SHA1以及RIPEMD160

本次操作实例为使用rtgen生成MD5彩虹表

在Kali Linux中使用rtgen生成的彩虹表都默认保存在该目录下:/usr/share/rainbowcrack

运行该工具输出帮助命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rtgen
RainbowCrack 1.8
版权所有2020年彩虹表项目.保留所有权利.
http://project-rainbowcrack.com/

用法:
rtgen 哈希算法 字符集 最小明文长度 最大明文长度 表索引 链长度 链数量 分块索引
rtgen 哈希算法 字符集 最小明文长度 最大明文长度 表索引 -bench

已实现的哈希算法:
lm HashLen=8 PlaintextLen=0-7
ntlm HashLen=16 PlaintextLen=0-15
md5 HashLen=16 PlaintextLen=0-15
sha1 HashLen=20 PlaintextLen=0-20
sha256 HashLen=32 PlaintextLen=0-20

示例:
rtgen md5 loweralpha 1 7 0 1000 1000 0
rtgen md5 loweralpha 1 7 0 -bench

可以分析看到,rtgen通过不同的数字限制操作生成的彩虹表面积

同时指定loweralpha以生成为abcdefghjklmnopqrstuvwxyzrainbow tables

参数分析

code explanation
hash_algorithm 该参数以指定Hash算法目前rtgen支持算法如下:lm、ntlm、md5、sha1、mysqlsha1、halflmchall、ntlmchall、oracle-SYSTEM和md5-half
charset 该参数以指定不同的字符集,包括了明文所有可能字符,该参数在配置文件/usr/share/rainbowcrack/charset.txt中被定义,其中包括其他指定
plaintext_len_min 该参数指定为使用明文生成的最小长度
plaintext_len_max 该参数指定为使用明文生成的最大长度,两个参数是共同作用,如果我们指定为loweralpha 1 7 那么则会生成a-f的不同长度彩虹链
table_index 该参数指定归约函数,关于归约函数的概念我们上方提过了,以及简述生成彩虹表的归约函数不同又有什么作用
chain_len 该参数指定每一条彩虹链的长度,更长的彩虹链存储更多的明文,需要更长的时间来生成
chain_num 该参数指定要生成彩虹链的数量,彩虹表只是彩虹链的阵列.每个彩虹链的大小为16个字节
part_index 该参数意义忽视即可,在生成彩虹表时,均以0值操作
生成彩虹表

通常情况下,我们会生成彩虹表使用不同的归约函数,来代替庞大的彩虹链数量,以节省时间,同时提高成功率

这里就生成两张彩虹表参考即可

最终生成的彩虹表会在其默认目录下/usr/share/rainbowcrack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 生成以MD5散列值、明文组合为a-z最小长度为1,最大长度为10的彩虹表,并且每一条彩虹链长度为2000,增加我们生成的彩虹表大小,生成8000个彩虹链,最终组成彩虹表
┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rtgen md5 loweralpha 1 10 0 2000 80000 0
rainbow table md5_loweralpha#1-10_0_2000x80000_0.rt parameters
hash algorithm: md5
hash length: 16
charset name: loweralpha
charset data: abcdefghijklmnopqrstuvwxyz
charset data in hex: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a
charset length: 26
plaintext length range: 1 - 10
reduce offset: 0x00000000
plaintext total: 146813779479510

sequential starting point begin from 0 (0x0000000000000000)
generating...
80000 of 80000 rainbow chains generated (0 m 15.2 s)

# 我们同样可以猜测密码长度...这只是时间问题和大小问题罢了
┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rtgen md5 loweralpha 4 5 0 2000 80000 0
# 使用不同的归约函数
┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rtgen md5 loweralpha 4 5 1 2000 80000 0
rainbow table md5_loweralpha#4-5_1_2000x80000_0.rt parameters
hash algorithm: md5
hash length: 16
charset name: loweralpha
charset data: abcdefghijklmnopqrstuvwxyz
charset data in hex: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a
charset length: 26
plaintext length range: 4 - 5
reduce offset: 0x00010000
plaintext total: 12338352

sequential starting point begin from 0 (0x0000000000000000)
generating...
80000 of 80000 rainbow chains generated (0 m 12.2 s)
┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rtgen md5 loweralpha 4 5 2 2000 80000 0
rainbow table md5_loweralpha#4-5_2_2000x80000_0.rt parameters
hash algorithm: md5
hash length: 16
charset name: loweralpha
charset data: abcdefghijklmnopqrstuvwxyz
charset data in hex: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a
charset length: 26
plaintext length range: 4 - 5
reduce offset: 0x00020000
plaintext total: 12338352

sequential starting point begin from 0 (0x0000000000000000)
generating...
80000 of 80000 rainbow chains generated (0 m 12.0 s)

┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rtgen md5 loweralpha 4 5 3 2000 80000 0
rainbow table md5_loweralpha#4-5_3_2000x80000_0.rt parameters
hash algorithm: md5
hash length: 16
charset name: loweralpha
charset data: abcdefghijklmnopqrstuvwxyz
charset data in hex: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a
charset length: 26
plaintext length range: 4 - 5
reduce offset: 0x00030000
plaintext total: 12338352

sequential starting point begin from 0 (0x0000000000000000)
generating...
80000 of 80000 rainbow chains generated (0 m 12.1 s)
rtsort 排序

生成好了彩虹表,我们应当对其进行排序,以帮助我们更快速的破解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 这里有个坑,指定文件名无法排序
┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rtsort .
./md5_loweralpha#4-5_2_2000x80000_0.rt:
3139784704 bytes memory available
loading data...
sorting data...
writing sorted data...

./md5_loweralpha#4-5_3_2000x80000_0.rt:
3139784704 bytes memory available
loading data...
sorting data...
writing sorted data...

./md5_loweralpha#4-5_1_2000x80000_0.rt:
3139784704 bytes memory available
loading data...
sorting data...
writing sorted data...

./md5_loweralpha#1-10_0_2000x80000_0.rt:
3139784704 bytes memory available
loading data...
sorting data...
writing sorted data...
rcrcak破解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rcrack -h
RainbowCrack 1.8
Copyright 2020 RainbowCrack Project. All rights reserved.
http://project-rainbowcrack.com/

usage: ./rcrack path [path] [...] -h hash
./rcrack path [path] [...] -l hash_list_file
./rcrack path [path] [...] -lm pwdump_file
./rcrack path [path] [...] -ntlm pwdump_file
path: directory where rainbow tables (*.rt, *.rtc) are stored
-h hash: load single hash
-l hash_list_file: load hashes from a file, each hash in a line
-lm pwdump_file: load lm hashes from pwdump file
-ntlm pwdump_file: load ntlm hashes from pwdump file

implemented hash algorithms:
lm HashLen=8 PlaintextLen=0-7
ntlm HashLen=16 PlaintextLen=0-15
md5 HashLen=16 PlaintextLen=0-15
sha1 HashLen=20 PlaintextLen=0-20
sha256 HashLen=32 PlaintextLen=0-20

examples:
./rcrack . -h 5d41402abc4b2a76b9719d911017c592
./rcrack . -l hash.txt
参数 释义
-h -h指定单个散列值破解
-l 若散列Hash值较多,可以保存在一个文件中,-l指定读取散列值文件内的散列进行破解
-lm 加载有关Windows 2003内比较老的机器的系统散列值加密算法lm散列文件,与上一个指令相同,他的不同就在于:若破解有关的lm的多个散列组成的文件,需要指定
-ntlm -lm相同,ntlm是Windows现如今流行的系统加密算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
┌──(root㉿kill3r)-[/usr/share/rainbowcrack]
└─# rcrack . -h 21232f297a57a5a743894a0e4a801fc3
4 rainbow tables found
memory available: 2510874214 bytes
memory for rainbow chain traverse: 32000 bytes per hash, 32000 bytes for 1 hashes
memory for rainbow table buffer: 4 x 1280016 bytes
disk: ./md5_loweralpha#1-10_0_2000x80000_0.rt: 1280000 bytes read
disk: ./md5_loweralpha#4-5_1_2000x80000_0.rt: 1280000 bytes read
disk: ./md5_loweralpha#4-5_2_2000x80000_0.rt: 1280000 bytes read
disk: ./md5_loweralpha#4-5_3_2000x80000_0.rt: 1280000 bytes read
disk: finished reading all files
plaintext of 21232f297a57a5a743894a0e4a801fc3 is admin

statistics
----------------------------------------------------------------
plaintext found: 1 of 1
total time: 0.40 s
time of chain traverse: 0.39 s
time of alarm check: 0.00 s
time of disk read: 0.01 s
hash & reduce calculation of chain traverse: 3996000
hash & reduce calculation of alarm check: 896
number of alarm: 130
performance of chain traverse: 10.22 million/s
performance of alarm check: 0.45 million/s

result
----------------------------------------------------------------
21232f297a57a5a743894a0e4a801fc3 admin hex:61646d696e