身份认证
禁止明文传输密码
每次认证使用HASH算法加密密码传输(HASH算法加密容易、解密困难)
服务器端用户数据库应加盐加密保存
破解思路
嗅探获取密码HASH
利用漏洞登录服务器并从用户数据库获取密码HASH
识别HASH类型
利用离线破解工具碰撞密码HASH
优势
离线不会触发密码锁定机制
不会产生大量登录失败日志引起管理员注意
哈希-密码基础 专业术语
术语
解释
Plaintext
:明文
加密或进行哈希计算之前的数据,通常是文本.但不总是,因为它可以是一张照片或其他文件.
Encoding
:编码
这不是一种加密形式,只是一种数据表示形式.如 base64或十六进制.
Hash
:哈希
hash
意译是散列,音译是哈希,哈希值是散列函数的输出.哈希也可以用作动词:to hash
,意思是生成某些数据的hash
(散列) 值.
Brute force
:暴力破解
通过尝试每个不同的密码或每个不同的密钥来破解加密
Cryptanalysis
:密码分析
通过发现基础数学的弱点来攻击密码学(通过发现基数的弱点来攻击密码加密技术)
哈希(散列)函数是什么? 哈希函数介绍
Hash函数,又称杂凑函数、散列函数 ,它能够将任意长度的信息转换成固定长度的哈希值 (数字摘要),并且任意不同长度消息或者文件所生成的哈希值是不一样的.
不可逆性: hash函数是没有key的,所以哈希函数是不可逆的,这意味着很难或不可能从哈希函数的输出返回到输入.即使对于相同的输入,好的哈希函数也应该产生唯一的哈希值.
固定输出大小: 哈希函数的输出是固定大小的,不论输入数据的大小.这有助于确保输出的一致性,无论输入是多大.
雪崩效应 :在哈希函数或密码散列函数中,微小的输入变化会引起输出完全不同的现象.具体来说,如果输入数据发生了细微的修改,其对应的哈希值将会有很大的差异.
无碰撞性 :在输入空间中的任意两个不同的输入值生成的哈希值是唯一的,不会产生碰撞
输出的编码: 哈希函数的输出通常是原始字节,可以通过不同的编码方式进行呈现,例如以64为基数的base64编码或十六进制形式.这样的编码不提供有关原始数据的有用信息.
常见的Hash算法有:
MD5算法:以512位数据块为单位来处理输入,产生128 位的信息摘要.常用于文件校验.
SHA算法:以512位数据块为单位来处理输入,产生160 位的哈希值,具有比MD5更强的安全性
SM3国产算法:消息分组长度为512比特,输出256 位摘要
hash碰撞
哈希碰撞是指两个不同的输入经过哈希函数后产生相同的输出.哈希函数的设计目标是尽可能避免碰撞,但由于输入空间大于输出空间,必然存在某些输入将会产生相同的输出.然而,好的哈希算法应该使得找到碰撞变得非常困难.
MD5和SHA-1确实已经受到攻击,且存在能够制造哈希碰撞的技术,使得它们不再被认为是安全的哈希算法.在实际应用中,特别是对于密码存储等敏感场景,推荐使用更安全的哈希算法,如SHA-256、SHA-3等.
由于哈希碰撞的存在,确实不应该完全依赖于哈希算法来确保密码或数据的安全性.在密码存储中,推荐使用强大且抗碰撞能力较强的哈希算法,并结合适当的安全措施.
哈希的用途 哈希用于网络安全的两个主要目的:
验证数据的完整性
验证密码
使用hash进行密码验证 网络应用程序通常需要验证用户密码,明文存储密码会导致安全问题,如数据库泄露.数据泄露中常见的密码字典rockyou.txt
源于明文存储的MySpace密码.密码明文存储使得攻击者能够轻松获得用户密码.
哈希函数是密码存储的安全选择,它是不可逆的,且不需要存储密钥.哈希碰撞是两个不同输入产生相同输出的情况,而彩虹表可用于快速查找哈希值对应的原始密码.为了防范相同密码的问题,可以使用盐
增加哈希的复杂性.
像Crackstation
(哈希破解网站) 这样的网站内部会使用巨大的彩虹表为无盐哈希(散列)提供快速的密码破解.在已排序的哈希列表中进行查找确实非常快,比尝试直接破解哈希要快得多.
防范彩虹表 为了应对彩虹表破解hash
,我们可以在密码中添加一个 Salt(加盐操作)
.
Salt
是随机生成并存储在数据库中的值,对于每个用户都是独一无二的.
理论上,你可以对所有用户使用相同的salt
,但这意味着重复的密码仍然具有相同的hash
,并且仍然可以使用该salt
创建特定的密码.
Salt
被添加到密码的开头或结尾,然后进行哈希计算,这意味着即使每个用户都有相同的密码,他们也会有不同的密码哈希.像bcrypt
和sha512crypt
这样的哈希(散列)函数会自动进行加盐,盐不需要保密.
实际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' ;$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 = "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 = "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 )" ; if ($conn ->query ($sql ) === TRUE ) { echo "Table users created successfully</br>" ; } else { die ("Error creating table: " . $conn ->error . "</br>" ); } } $action = $_GET ['action' ]; $username = $_GET ['username' ]; $password = $_GET ['password' ]; if ($action == 'register' ) { $registration_date = date ('Y-m-d H:i:s' ); $encryptedPassword = md5 ($password . $registration_date ); $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' ) { $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 (); $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
Password Salt MD5 Hash password (无salt) 5f4dcc3b5aa765d61d8327deb882cf99 password 2024-02-02 20:25:52 8b79ff043c42bcb1e287d8353418979c
不过为了提高代码的安全性,还可以考虑使用编程语言提供的密码存储和验证机制如PHP中的password_hash()
和password_verify()
函数.并且通过POST而非GET方法传输敏感数据
彩虹表-密码基础
MD5的全称是Message-Digest Algorithm 5
(信息-摘要算法)
特点是不可逆的,一般解密不了.那有没有想过,为什么各种工具网站都可以进行MD5解密呢?
彩虹表,了解一下.
如何存储密码才是安全的? 密码存储有几种方式:
直接存储密码明文m
存储密码明文的哈希值hash(m)
存储密码明文的加盐哈希hash(m+salt)
,这里的Salt
可以是用户名,手机号等,但必须保证每个用户的Salt
都不一样才是安全的.
如果数据库被入侵
第一种方式:明文存储,无安全性可言.
第二种方式:虽然是入侵者得到的是Hash
值,但由于彩虹表的存在,也很容易批量还原出密码明文来.
只有第三种方式才是相对安全的.
彩虹表不是 密码–>明文 的简单存储 要从c=hash(m)
逆向得到原始明文m,有三种办法:
暴力破解法:时间成本太高.
字典法:提前构建一个明文->密文
对应关系的一个大型数据库,破解时通过密文直接反查明文.但存储一个这样的数据库,空间成本是惊人的.
构建彩虹表:在字典法的基础上改进,以时间换空间.是现在破解哈希常用的办法.
彩虹表的前身–预先计算的散列链 预先计算的散列链 既然存储所有的明文密码对需要的空间太大,密码学家们想出了一种以计算时间降低存储空间的办法:预计算的哈希链集
(Precomputed hash chains
). 这是一条k=2
哈希链:
K的取值不是严格规定的,而是根据具体需求和安全性考虑选择的.在密码学中,K表示哈希链的长度,即链中节点的数量.较长的哈希链可以提供更高的安全性,但会增加存储和验证的开销.
选择适当的K值需要综合考虑以下因素:
安全性要求:安全性要求较高的应用通常需要更长的哈希链来增加破解的难度. 存储空间:更长的哈希链会占用更多的存储空间,因此需要考虑存储成本和可扩展性. 验证速度:验证一个密码时,需要在哈希链上执行多次哈希运算.较长的哈希链会增加验证的时间开销. 一般而言,选择K值是一个权衡取舍的过程,根据具体应用的需求和限制来确定.不同的场景可能需要不同的K值来平衡安全性和效率.
实际应用中,可以采用除了单一的哈希函数之外的更复杂的哈希结构、加盐等技术来增加密码的安全性.K的取值范围可以根据具体需求和应用场景来确定,通常从2开始,而常见的范围可以是2到数十之间.较小的K值适用于需要较低计算和存储开销的场景,但相对较弱于攻击.较大的K值可以提供更高的安全性,但会增加计算和存储的负担.
哈希链
这条链是这样生成的:
随机选择初始明文 aaaaaa
,通过哈希函数H(aaaaaa)
进行哈希运算,得到哈希值281DAF40
哈希函数H()
是一个确定性函数,将输入数据(在这种情况下是明文 aaaaaa
)转换为具有固定长度的哈希值.哈希函数的特点是单向不可逆的,即无法从哈希值逆向计算出原始数据.因此,通过应用H()
函数,我们可以将 aaaaaa
处理成哈希值 281DAF40
. 使用约简函数 R()
,将哈希值 281DAF40
约简为与原文相同格式的值,得到明文 sgfnyd
.约简函数 R() 是一个定义在哈希值空间上的函数,其作用是将哈希值映射回与原始明文相同格式的值.这样做是为了使哈希链中的后续哈希值能够继续通过哈希函数生成新的哈希值. 在这个例子中,``R()函数将哈希值
281DAF40约简为明文
sgfnyd,并确保明文的格式与最初的输入
aaaaaa` 相匹配. 将明文 sgfnyd
再次通过哈希函数 H() 进行哈希运算,得到哈希值 920ECF10
.现在,我们使用哈希函数 H() 处理明文 sgfnyd
,并得到哈希值 920ECF10
.这个哈希值将用作哈希链中的下一个节点,它与先前的哈希值 281DAF40
相关联. 使用约简函数 R(),将哈希值 920ECF10
约简为明文 kiebgt
.再次使用约简函数 R(),我们将哈希值 920ECF10
约简为明文 kiebgt
.这样可以确保链中的明文保持一致,并且与之前的处理结果相匹配. 通过这些步骤的迭代,您可以构建一个哈希链,其中每个明文都通过哈希函数 H() 和约简函数 R() 相互关联.这种链的目的是验证数据的完整性和防篡改.
请注意,哈希函数的选择和约简函数的定义需要根据具体的安全需求进行.此外,在构建哈希链过程中,确保选择适当的哈希算法、安全策略和密钥管理等因素也是非常重要的.
预计算的哈希链集的使用 当刚好得到的哈希值是 920ECF10
,我们可以进行以下步骤来判断是否破解了哈希链集中的(aaaaaa
,kiebgt
)链条.
破解成功的情况:
首先,我们对哈希值 920ECF10
进行一次约简运算,得到明文 kiebgt
.
接下来,我们发现刚好命中了哈希链集中的(aaaaaa
,kiebgt
)链条.这意味着我们通过哈希链的计算过程,从初始明文 aaaaaa
开始重复计算,最终得到的哈希值恰好与目标哈希值 920ECF10
相匹配.
要判断是否命中了哈希链集中的(aaaaaa
,kiebgt
)链条,需要按照以下步骤进行判断:首先,将明文 aaaaaa
输入哈希函数 H() 进行哈希运算得到哈希值 281DAF40
,然后再输入约简函数 R(),得到约简值 sgfnyd
. 将约简值 sgfnyd
输入哈希函数 H() 进行哈希运算,得到哈希值 920ECF10
. 比较得到的哈希值 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函数举例
常见的彩虹表
R函数举例:假设明文为5位数字,则R函数是取哈希值中前5个数字.
彩虹表的获取 可以自己编程生成彩虹表,也可以使用RainbowCrack
或Cain
等软件来生成.彩虹表的生成时间与字符集的大小、哈希链的长度成正比,如下图中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:::
当Windows用户密码≤14个字符,SAM文件中是LM Hash值+NTLM-Hash值
当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 nthashprint (nthash.hash ('admin' ))
一定要保护好自己的SAM文件 ,现在的PE去密码也是这种方式
本地认证中用来处理用户输入密码的进程即lsass.exe
,密码会在这个进程中明文保存,供该进程将密码计算成NTLM Hash
与SAM
进行比对
我们使用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 31323341424300000000000000 31323341424300000000000000001 31323341424300->(转换为二进制) 110001001100100011001101000001010000100100001100000000->(补足56Bit) 00110001001100100011001101000001010000100100001100000000 00110000100110001000110001101000000101000001001000001100 00000000 30988C6814120000->DES(30988C6814120C00)->48-D7-EB-91-2F-5E-69-7C AA-D3-B4-35-B5-14-04-EE 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 网络认证) 在内网渗透中,经常遇到工作组环境,而工作组环境是一个逻辑上的网络环境(工作区),隶属于工作组的机器之间无法互相建立一个完美的信任机制,只能点对点,是比较落后的认证方式,没有信托机构
NTLM(NT LAN Manager) 协议 早期SMB协议在网络上传输明文口令.后来出现LAN Manager Challenge/Response验证机制,简称LM,它是如此简单以至很容易就被破解 微软提出了WindowsNT挑战/响应验证机制,称之为NTLM.现在已经有了更新的NTLMv2以及Kerberos验证体系.
挑战/响应–协商
客户端主要在这一步向服务器确认协议的版本,是v1还是v2
挑战/响应–质询
客户端向服务器端发送用户信息(用户名)请求
服务器接受到请求,生成一个16位的随机数,被称之为Challenge
,使用登录用户名对应的NTLM Hash
加密Challenge(16位随机字符)
生成Challenge1
.同时,生成Challenge1
后,将Challenge(16位随机字符)
发送给客户端Net NTLM Hash=NTLM Hash(Challenge)
客户端接受到Challenge
后,使用将要登录到账户对应的NTLM Hash
加密Challenge
生成Response
,然后将Response
发送至服务器端.
服务器端收到客户端的Response
后,比对Chanllenge1
与Response
是否相等,若相等,则认证通过.
挑战/响应–认证
挑战/响应–认证流程
注意:
Chanllenge
是Server产生的一个16字节的随机数,每次认证都不同
Response
的表现形式是Net-NTLM Hash
,他是由客户端提供的密码Hash加密Server返回的Chanllenge产生的结果
NTLM V2协议 NTLM v1
与NTLM V2
最显著的区别就是Challenge
.与加密算法不同,共同点就是加密的原料都是NTLM Hash
.不同点:
Challage:NTLM V1
的Challenge
有8位,NTLM V2
的Challenge
为16位.
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 ------------------------------------------------------------------------- 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识别用于加密数据的不同类型的哈希算法 用法: 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] └─ 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] └─ 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 0 | Straight (字典破解) 1 | Combination (组合破解) 3 | Brute-force (掩码暴力破解) 6 | Hybrid Wordlist + Mask(字典+掩码破解) 7 | Hybrid Mask + Wordlist(掩码+字典破解)
1 2 3 4 5 1 | CPU 2 | GPU 3 | FPGA, DSP, Co-Processor
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 注意: –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 对照表 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 9720 | MS Office <= 2003 $0 /$1 , MD5 + RC4, collider 9800 | MS Office <= 2003 $3 /$4 , SHA1 + RC4 | Documents 9810 | MS Office <= 2003 $3 , SHA1 + RC4, collider 9820 | MS Office <= 2003 $3 , SHA1 + RC4, collider 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 10420 | PDF 1.1 - 1.3 (Acrobat 2 - 4), collider 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值
使用字典进行破解:hashcat -m 0 -a 0 0192023a7bbd73250516f069df18b500 top3000.txt --force --show
使用指定字符集进行破解:hashcat -a 3 -m 0 63a9f0ea7bb98050796b649e85481845 ?l?l?l?l --force --show
使用字典+掩码进行破解:hashcat -a 6 -m 0 1844156d4166d94387f1a4ad031ca5fa rockyou.txt ?d?d?d --force
使用掩码+字典进行破解: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 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] └─ ┌──(root㉿kill3r)-[/home/kill3r] └─ 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 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] └─ ?: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] └─ ┌──(root㉿kill3r)-[/home/kill3r] └─ 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] └─ ?: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 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文件的哈希值
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] └─ ┌──(root㉿kill3r)-[/opt/pwcrack] └─ ┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework] └─ ┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework] └─ ┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework] └─ ┌──(root㉿kill3r)-[/opt/pwcrack/pwcrack-framework] └─ "$$$$$$'' '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] └─ [+] 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] └─ [+] 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] └─ 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
以生成为abcdefghjklmnopqrstuvwxyz
的rainbow 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 ┌──(root㉿kill3r)-[/usr/share/rainbowcrack] └─ rainbow table md5_loweralpha hash algorithm: md5hash length: 16charset 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] └─ ┌──(root㉿kill3r)-[/usr/share/rainbowcrack] └─ rainbow table md5_loweralpha hash algorithm: md5hash length: 16charset 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] └─ rainbow table md5_loweralpha hash algorithm: md5hash length: 16charset 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] └─ rainbow table md5_loweralpha hash algorithm: md5hash length: 16charset 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] └─ ./md5_loweralpha 3139784704 bytes memory available loading data... sorting data... writing sorted data... ./md5_loweralpha 3139784704 bytes memory available loading data... sorting data... writing sorted data... ./md5_loweralpha 3139784704 bytes memory available loading data... sorting data... writing sorted data... ./md5_loweralpha 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] └─ 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] └─ 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 disk: ./md5_loweralpha disk: ./md5_loweralpha disk: ./md5_loweralpha 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: 3996000hash & reduce calculation of alarm check: 896number of alarm: 130 performance of chain traverse: 10.22 million/s performance of alarm check: 0.45 million/s result ---------------------------------------------------------------- 21232f297a57a5a743894a0e4a801fc3 admin hex:61646d696e