问题
最近帮客户做服务器的基线扫描以及渗透测试,遇到一个比较奇怪的问题。问题如下:
要求:关闭root
直接登录且开放固定用户组可使用su
命令切换到root
账号
问题:关闭root
直接登录,在使用su root
指令时提示Authentication failure
。最开始我以为是密码错误,修改密码后还是提示这个信息,我就知道问题没那么简单了,后续百度出来几乎所有人都是同一个答案,让你使用sudo passwd root
修改密码然后再登录,显然不是我这种情况。
分析过程
密码认证问题一般出现在这些情况:
- 密码错误(此处不是这种情况)
- PAM配置错误
- 密码文件访问问题
排查
PAM配置错误,我有一台相同的服务器却可以成功过
su root
,认真比对两边服务器的PAM配置,发现全部一致,直接排除PAM配置错误密码文件访问问题,
/etc/shadow
此文件为系统密码存放的文件,为了防止密码泄露,一般只有root
权限能够查看。查看下文件权限
1
2
3ls -l /etc/shadow
----------. 1 root root 1079 Aug 21 03:01 /etc/shadow
正常服务器的都是没有任何权限的看上去好像没什么太大的问题。
我们使用
strace
指令来跟踪下(strace
常用来跟踪进程执行时的系统调用和所接收的信号)1
2
3
4
5运行此命令后照常输入 root密码
strace -f -e open -o su_fail_strace.txt su - root
Password:
su: Authentication failure
此时会生成一个文件在当前目录,文件名:su_fail_strace.txt查看
su_fail_strace.txt
文件文件较大,我只截取了需要关注的部分(其中返回值为 -1 的则为错误信息)
1
2
3
4
5
6
7
8
9
10
11
12
13......
52293 open("/etc/shadow", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
52293 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
52293 open("/lib64/libnss_sss.so.2", O_RDONLY|O_CLOEXEC) = 3
52293 open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
......
52119 open("/lib64/libnss_sss.so.2", O_RDONLY|O_CLOEXEC) = 6
52119 open("/var/lib/sss/mc/passwd", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
52119 open("/var/lib/sss/mc/passwd", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
52119 open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 6
52119 open("/var/log/btmp", O_WRONLY) = -1 EACCES (Permission denied)
52119 open("/etc/defaults/su", O_RDONLY) = -1 ENOENT (No such file or directory)
52119 open("/etc/login.defs", O_RDONLY) = 5看到我截取的文件的第一行
open("/etc/shadow", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
,可以确定是su
切换账号时读取密码文件的时候由于权限不足导致校验密码失败已经知道了问题所在是因为权限不足。
简单粗暴的方法就是直接把
/etc/shadow
的权限改为777,但正常的服务器的此文件权限不是777。而且你会发现
/etc/shadow
的权限显示为:----------. 1 root root 1079 Aug 21 03:01 /etc/shadow
,为什么修改密码可以成功呢?其实最终的权限应该是在
passwd
命令或者su
命令上,这两个命令的权限决定了其读取/etc/shadow
文件的权限。对比正常和非正常服务器的
passwd
以及su
命令的权限情况1
2
3
4
5
6
7
8执行命令查看权限
ls -l `which passwd` `which su`
# 正常服务器的情况
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
-rwsr-xr-x. 1 root root 32208 Oct 31 2018 /usr/bin/su
# 无法正常su root服务器的情况
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
-r--rwxr-x. 1 root root 32096 8月 4 2017 /usr/bin/su可以看到无法正常
su root
的服务器,su
命令的权限缺少了特殊权限位s
。
解决
给su
命令加上特殊权限:s
1 | chmod +s `which su` |
再次使用su root
切换到root
1 | su root |
成功切换到root