Linux 下的密码 Hash——加密方式与破解方法的技术整理
0x00 前言
Linux 系统下,用户的密码会被加密保存在文件 /etc/shadow
中,关于密码的加密方式与破解方法有哪些呢?本文尝试对这一部分内容进行整理,介绍相关基础知识,测试常用方法,帮助大家对此有更直观的认识。
0x01 简介
本文将要介绍以下内容:
- Linux 下用户密码的保存格式
- Linux 下用户密码的加密方法
- 破解用户密码 hash 的常用工具和方法
0x02 Linux 下用户密码的保存格式
Linux 密码信息保存在两个文件中,分别为: /etc/passwd
和 /etc/shadow
/etc/passwd:
普通用户权限能够查看
保存用户信息,每一行代表一个用户,每一行通过冒号 :
分为七个部分
- 用户名
- 密码,x 表示密码保存在
/etc/shadow
- UID,0 代表 root
- GID,表示所在组
- 描述信息,依次为 Full Name、Room Number、Work Phone、Home Phone 和 Other
- 用户主目录
- 默认 shell 类型
eg.
test2:x:1001:1001:test2,11111,111111-11,222222-22,test:/home/test2:/bin/bash
- 用户名:test2
- 密码保存在
/etc/shadow
- UID 为 1001
- GID 为 1001
- 描述信息: Full Name []: test2 Room Number []: 11111 Work Phone []: 111111-11 Home Phone []: 222222-22 Other []: test
- 用户主目录为
/home/test2
- 默认 shell 为
/bin/bash
/etc/shadow:
只有 root 用户权限能够查看
保存加密后的密码和用户的相关密码信息,每一行代表一个用户,每一行通过冒号 :
分为九个部分
- 用户名
- 加密后的密码
- 上次修改密码的时间(从 1970.1.1 开始的总天数)
- 两次修改密码间隔的最少天数,如果为 0,则没有限制
- 两次修改密码间隔最多的天数,表示该用户的密码会在多少天后过期,如果为 99999 则没有限制
- 提前多少天警告用户密码将过期
- 在密码过期之后多少天禁用此用户
- 用户过期日期(从 1970.1.1 开始的总天数),如果为 0,则该用户永久可用
- 保留
注:参数说明可通过 man shadow
获取
eg.
test2:$6$C/vGzhVe$aKK6QGdhzTmYyxp8.E68gCBkPhlWQ4W7/OpCFQYV.qsCtKaV00bToWh286yy73jedg6i0qSlZkZqQy.wmiUdj0:17470:0:99999:7:::
- 用户名:test2
- 加密后的密码:
$6$C/vGzhVe$aKK6QGdhzTmYyxp8.E68gCBkPhlWQ4W7/OpCFQYV.qsCtKaV00bToWh286yy73jedg6i0qSlZkZqQy.wmiUdj0
- 上次修改密码的时间(从 1970.1.1 开始的总天数为 17470)
- 两次修改密码间隔:没有限制
- 两次修改密码间隔最多的天数:没有限制
- 提前 7 天警告用户密码将过期
- 该用户永久可用
由示例可知,加密的密码具有固定格式:$id$salt$encrypted
id 表示加密算法,1 代表 MD5
,5 代表 SHA-256
,6 代表 SHA-512
salt 表示密码学中的 Salt,系统随机生成 encrypted 表示密码的 hash
0x03 破解用户密码 hash 的常用工具和方法
由于 Linux 的密码加密使用了 Salt,所以无法使用彩虹表的方式进行破解,常用的方法为字典破解和暴力破解
字典破解和暴力破解的常用工具:
1、John the Ripper
(1) 字典破解
Kali2.0 集成了 John the Ripper
字典文件位于 /usr/share/john/password.lst
使用 Kali Linux 上的 John 自带的密码列表。路径为 /usr/share/john/password.lst
使用字典破解:
john --wordlist=/usr/share/john/password.lst ./shadow
注:也可使用其他字典
(2) 暴力破解:
john ./shadow
列出已破解的明文密码:
john --show ./shadow
结果如下图
2、hashcat
Kali2.0 集成了 hashcat
字典文件使用 /usr/share/john/password.lst
修改 hash 格式:只保留 $salt$encrypted
eg.
原 hash:
test2:$6$C/vGzhVe$aKK6QGdhzTmYyxp8.E68gCBkPhlWQ4W7/OpCFQYV.qsCtKaV00bToWh286yy73jedg6i0qSlZkZqQy.wmiUdj0:17470:0:99999:7:::
修改后:
$6$C/vGzhVe$aKK6QGdhzTmYyxp8.E68gCBkPhlWQ4W7/OpCFQYV.qsCtKaV00bToWh286yy73jedg6i0qSlZkZqQy.wmiUdj0
(1) 字典破解:
hashcat -m 1800 -o found1.txt --remove shadow /usr/share/john/password.lst
参数说明:
-m:hash-type,1800 对应 SHA-512
详细参数可查表: https://hashcat.net/wiki/doku.php?id=example_hashes -o:输出文件 --remove:表示 hash 被破解后将从 hash 文件移除 shadow:代表 hash 文件 /usr/share/john/password.lst:代表字典文件
成功破解出 2 个 hash,如下图
(2) 暴力破解:
hashcat -m 1800 -a 3 -o found2.txt shadow ?l?l?l?l --force
参数说明: -a:attack-mode,默认为 0,3 代表 Brute-force,即暴力破解 ?l:表示小写字母,即 abcdefghijklmnopqrstuvwxyz,4 个?l 代表暴力破解的长度为 4 ?u:表示大写字母,即 ABCDEFGHIJKLMNOPQRSTUVWXYZ ?h:代表十六进制字符小写,即 0123456789 ?H:代表十六进制字符大写,即 0123456789abcdef ?s:表示特殊符号,即!"#$%&'()*+,-./:;<=>?@[]^_`{|}~ ?a:表示所有字符,即?l?u?d?s ?b:表示十六进制,即 0x00 - 0xff
成功暴力破解出 hash,结果如下图
3、在线网站
HCE 分布式计算平台,需要积分才能使用
目前暂不支持 SHA-512
4、mimipenguin
下载地址:https://github.com/huntergregal/mimipenguin
原理类似于 mimikatz,通过内存导出明文密码
0x04 小结
本文介绍了 Linux 下的密码保存格式,测试了两款常用工具:John the Ripper 和 hashcat,分别使用字典和暴力两种破解方法。作为一篇总结基础知识的文章,希望能够尽可能的做到简洁实用,欢迎读者补充,后续也会对这部分内容不断进行完善。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 利用 BDF 向 DLL 文件植入后门
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论