su鉴权故障

问题

最近帮客户做服务器的基线扫描以及渗透测试,遇到一个比较奇怪的问题。问题如下:

要求:关闭root直接登录且开放固定用户组可使用su命令切换到root账号

问题:关闭root直接登录,在使用su root指令时提示Authentication failure。最开始我以为是密码错误,修改密码后还是提示这个信息,我就知道问题没那么简单了,后续百度出来几乎所有人都是同一个答案,让你使用sudo passwd root修改密码然后再登录,显然不是我这种情况。

分析过程

密码认证问题一般出现在这些情况:

  • 密码错误(此处不是这种情况)
  • PAM配置错误
  • 密码文件访问问题

排查

  1. PAM配置错误,我有一台相同的服务器却可以成功过su root,认真比对两边服务器的PAM配置,发现全部一致,直接排除PAM配置错误

  2. 密码文件访问问题,/etc/shadow此文件为系统密码存放的文件,为了防止密码泄露,一般只有root权限能够查看。

    • 查看下文件权限

      1
      2
      3
      ls -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
2
3
su root
# Password
# [root@localhost ~]#

成功切换到root

文章作者: imxushuai
文章链接: https://www.imxushuai.com/2021/12/23/45.su鉴权故障/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 imxushuai
支付宝打赏
微信打赏